
這次我們來看 Simulink 常用模塊庫中的一對特殊模塊Goto 和 From。它們不是計(jì)算模塊不產(chǎn)生任何數(shù)學(xué)輸出但在真實(shí)模型里出現(xiàn)頻率極高尤其是以子系統(tǒng)為核心的大型控制模型、整車模型、電力電子模型里幾乎到處都能看到。Goto 和 From 解決的是同一個(gè)問題信號怎么在模型的不同位置之間傳遞。如果你剛接觸 Simulink看到連線交叉、信號繞行、子系統(tǒng)嵌套時(shí)不知所措那這篇就是給你寫的。本文會先說明 Goto/From 模塊的具體功能和三種可見性設(shè)置然后在 Simulink 里搭建一個(gè)完整的信號傳遞示例從模塊拖拽開始到 Tag 配置、可見性切換、Scope 驗(yàn)證結(jié)果再延伸到與 Data Store Memory、全局變量的對比以及在實(shí)際工程建模中的使用建議和排查方法。內(nèi)容偏入門到進(jìn)階適合正在學(xué)習(xí) Simulink 常用模塊庫的讀者。1. Goto/From 模塊核心能力速覽能力項(xiàng)說明模塊分類Simulink 常用模塊庫Simulink Signal Routing信號路由核心作用通過標(biāo)簽傳遞信號替代跨區(qū)域物理連線Goto 模塊職責(zé)從輸入端口接收信號按標(biāo)簽發(fā)送給一個(gè)或多個(gè) From 模塊From 模塊職責(zé)根據(jù)標(biāo)簽從對應(yīng)的 Goto 模塊接收信號可見性類型local局部、scoped作用域、global全局?jǐn)?shù)據(jù)支持標(biāo)量、向量、矩陣、總線信號均可傳遞是否支持批量一個(gè) Goto 可以對應(yīng)多個(gè) From這是最常見的批量分發(fā)場景是否需要額外硬件不需要屬于純建模功能適用版本常見 MATLAB/Simulink 版本均可使用配置方式基本一致簡單說Goto 負(fù)責(zé)“發(fā)信號”From 負(fù)責(zé)“收信號”兩者通過同一個(gè)標(biāo)簽名建立聯(lián)系。2. 適用場景與使用邊界2.1 適合解決什么問題Goto/From 模塊最主要的價(jià)值是讓同一個(gè)信號可以跨區(qū)域、跨子系統(tǒng)傳遞同時(shí)避免模型中大量連線交叉。例如在整車模型中車速信號可能被發(fā)動(dòng)機(jī)控制器、剎車控制器、儀表盤模型等多個(gè)模塊使用如果全部通過物理連線引出圖中會出現(xiàn)大量橫向長線視覺上很難維護(hù)。另一種典型場景是子系統(tǒng)層級嵌套。當(dāng)信號需要從頂層傳遞到三層以下的子系統(tǒng)或者從很深的子系統(tǒng)向上傳遞時(shí)用連線會特別別扭因?yàn)檫B線要穿過每一層子系統(tǒng)端口。Goto/From 可以跳過這些層級限制直接建立信號通路。2.2 不適用或者需要謹(jǐn)慎的場景需要注意Goto/From 模塊并不是萬能方案。如果信號的生成和使用都在同一個(gè)模型層級且位置相鄰直接連線可讀性更高。過度使用 Goto/From 會導(dǎo)致模型失去顯式的數(shù)據(jù)流依賴閱讀者需要到處搜索標(biāo)簽名才能搞清楚信號從哪里來、到哪里去維護(hù)成本反而增加。另外如果用 Goto/From 代替真正的數(shù)據(jù)共享機(jī)制比如在多個(gè)不同模型之間交換狀態(tài)數(shù)據(jù)這不是它該承擔(dān)的任務(wù)??缒P?、跨工作區(qū)的數(shù)據(jù)共享應(yīng)該使用數(shù)據(jù)存儲或模型接口機(jī)制。2.3 版權(quán)、合規(guī)與建模規(guī)范提醒在工程環(huán)境中清晰的信號流路徑有助于代碼審查、測試和認(rèn)證。如果模型用于生成生產(chǎn)代碼一些行業(yè)標(biāo)準(zhǔn)或項(xiàng)目規(guī)范會對 Goto/From 的使用有額外要求建議先查看所在團(tuán)隊(duì)或項(xiàng)目的建模規(guī)范。自己學(xué)習(xí)時(shí)保持標(biāo)簽命名清晰、可見性設(shè)置合理即可。3. 環(huán)境準(zhǔn)備與前置條件開始演示之前確保本地具備以下基礎(chǔ)環(huán)境檢查項(xiàng)要求操作系統(tǒng)Windows / Linux / macOS 均可常見操作相同MATLAB 版本建議 R2020b 及以上版本界面布局更友好Simulink 模塊需安裝 Simulink 基礎(chǔ)組件Signal Routing 庫為內(nèi)置模塊磁盤空間安裝 MATLAB 后通常即可無額外模型文件依賴建模基礎(chǔ)熟悉子系統(tǒng)的創(chuàng)建與信號連線基本操作本次演示不需要額外工具箱不需要 GPU也不需要安裝第三方模塊庫。Goto/From 屬于 Simulink 自帶的基礎(chǔ)信號路由模塊。4. 從模塊庫添加 Goto 和 From 模塊4.1 打開模型并進(jìn)入模塊庫在 MATLAB 命令行輸入simulink打開 Simulink 起始頁點(diǎn)擊“Blank Model”空白模型創(chuàng)建新模型。也直接在命令行輸入new_system(GotoFromDemo); open_system(GotoFromDemo);接著在模型編輯器中點(diǎn)擊庫瀏覽器圖標(biāo)或者按快捷鍵CtrlShiftL打開 Library Browser。4.2 找到模塊位置在 Library Browser 中按以下路徑展開Simulink Signal Routing Goto Simulink Signal Routing FromSignal Routing 庫中還有 Mux、Demux、Goto Tag Visibility、Data Store Memory、Switch 等模塊本次只關(guān)注 Goto 與 From。4.3 拖入初始模塊從庫中拖入以下模塊到模型中一個(gè) Sine Wave正弦波信號源路徑Simulink Sources Sine Wave一個(gè) Goto 模塊一個(gè) From 模塊一個(gè) Scope示波器路徑Simulink Sinks Scope初始連線方式Sine Wave 輸出連接 Goto 輸入。From 輸出連接 Scope 輸入。此時(shí) Goto 和 From 之間還沒有建立聯(lián)系。這一步做完模型里實(shí)際上有兩個(gè)斷開的信號段運(yùn)行不會報(bào)錯(cuò)但 From 輸出的信號一直為空。5. 配置 Goto 標(biāo)簽三種可見性詳解5.1 Tag標(biāo)簽是什么Goto 和 From 之間不通過物理連線而是通過“標(biāo)簽名”識別。比如把 Goto 的 Tag 設(shè)置為speed那么所有 Tag 設(shè)置為speed的 From 模塊都會收到這個(gè)信號。雙擊 Goto 模塊彈出參數(shù)對話框Goto Block Parameters Goto tag: speed Tag visibility: localTag 名稱不能有歧義常見的命名風(fēng)格包括小駝峰、下劃線或全小寫加單位例如engineSpeed、voltage_dc、current_phase_a。這里用speed作為示例。5.2 local局部可見性local是默認(rèn)可見性。使用 local 時(shí)Goto 和對應(yīng)的 From 必須在同一個(gè)子系統(tǒng)內(nèi)部或者在沒有子系統(tǒng)的同級區(qū)域中。如果模型中只有頂層沒有任何子系統(tǒng)那么 local 等價(jià)于“只在當(dāng)前模型層級內(nèi)有效”。配置步驟雙擊 Goto設(shè)置 Tag 為speedTag visibility 保持local雙擊 From對話框里可以直接在下拉列表中選擇speed標(biāo)簽運(yùn)行模型Scope 能看到正弦波形如果嘗試把相同 Tag 的 Goto 和 From 放在不同層級比如 Goto 在頂層、From 在子系統(tǒng)內(nèi)部編譯時(shí)會報(bào)錯(cuò)提示找不到對應(yīng)的 Goto 標(biāo)簽。5.3 scoped作用域可見性當(dāng) Goto 模塊被放置在某個(gè)子系統(tǒng)內(nèi)部并且可見性設(shè)置為scoped時(shí)這個(gè) Goto 發(fā)出的信號可以被以下范圍讀取該子系統(tǒng)本身內(nèi)部的 From該子系統(tǒng)內(nèi)部所有嵌套子系統(tǒng)的 From但不能被該子系統(tǒng)外部的兄弟子系統(tǒng)讀取也不能被上級系統(tǒng)讀取。作用域范圍是“Goto 所在的子系統(tǒng)及其下方的所有層次”。在模型中搭建一個(gè)測試場景模型頂層 ├── 子系統(tǒng) A │ ├── Goto (Tag speed, Visibility scoped) │ └── 子系統(tǒng) A1 │ └── From (Tag speed) └── 子系統(tǒng) B └── From (Tag speed) % 編譯報(bào)錯(cuò)找不到子系統(tǒng) A1 內(nèi)的 From 可以正常讀取子系統(tǒng) B 內(nèi)的 From 會報(bào)錯(cuò)。這就是 scoped 的“向下可見”規(guī)則。5.4 global全局可見性當(dāng) Goto 模塊的可見性設(shè)置為global時(shí)整個(gè)模型內(nèi)所有層級的 From 模塊只要 Tag 相同都能收到信號。這會極大地簡化跨層級信號傳遞但也會讓信號的來源變得不那么直觀因?yàn)槿魏蔚胤降?From 都可能依賴于某個(gè)遠(yuǎn)處的全局 Goto。配置步驟雙擊 GotoTag 設(shè)置為speedTag visibility 選擇global雙擊任意層級的 FromTag 選擇speed運(yùn)行模型整個(gè)模型層級中所有匹配的 From 都能輸出該信號global 適合以下場景一個(gè)信號被多個(gè)子系統(tǒng)廣泛使用例如全局時(shí)鐘、全局開關(guān)狀態(tài)、公共參考值模型層級非常深不想一層層加端口傳遞信號建模初期快速驗(yàn)證后期可以再重構(gòu)全局標(biāo)簽雖然方便但要注意重名覆蓋風(fēng)險(xiǎn)。如果同一個(gè)模型中存在多個(gè) Tag 相同且可見性為 global 的 Goto 模塊Simulink 會報(bào)錯(cuò)因?yàn)槿謽?biāo)簽是唯一的。5.5 Goto Tag Visibility 模塊與標(biāo)簽可視化在 Signal Routing 庫中還有一個(gè)配套模塊Goto Tag Visibility。它可以將某個(gè)標(biāo)簽的可見性范圍可視化地放置到子系統(tǒng)層級中。使用方式在需要限制 scoped 標(biāo)簽可見性的子系統(tǒng)邊界處放置一個(gè) Goto Tag Visibility 模塊雙擊設(shè)置 Tag 名稱。這樣可以明確告訴閱讀者該標(biāo)簽從這一層開始可見。其作用是讓模型中的標(biāo)簽信號流更容易被追蹤。6. 功能測試與效果驗(yàn)證6.1 搭建基礎(chǔ)測試模型下面搭建一個(gè)完整示例一個(gè)正弦波信號被 Goto 發(fā)送兩個(gè) From 分別在相同層級和子系統(tǒng)內(nèi)部接收通過兩個(gè) Scope 同時(shí)觀察信號是否一致。模型結(jié)構(gòu)模型頂層 ├── Sine Wave -- Goto (Tag speed, Visibility global) ├── From (Tag speed) -- Scope1 └── 子系統(tǒng) A └── From (Tag speed) -- Scope2操作步驟拖入 Sine Wave、Goto、From、Scope雙擊 GotoTag 設(shè)為speedVisibility 設(shè)為global拖入一個(gè) Subsystem 模塊在子系統(tǒng)內(nèi)部再添加 From 和 Scope2雙擊 subsystems 內(nèi)部的 FromTag 設(shè)為speed將 Sine Wave 連接到 GotoFrom 連接到 Scope1子系統(tǒng)內(nèi)部的 From 連接到 Scope2點(diǎn)擊 Run 運(yùn)行預(yù)期結(jié)果Scope1 輸出標(biāo)準(zhǔn)正弦波Scope2 輸出相同的正弦波兩個(gè)波形在時(shí)間上一致幅度相同判斷標(biāo)準(zhǔn)從 Scope 中看到兩個(gè)波形完全重合說明 Goto/From 信號傳遞成功。6.2 測試局部可見性報(bào)錯(cuò)把上一步的 Goto Visibility 從global改為local并且 Goto 在頂層、From 在子系統(tǒng)內(nèi)部編譯時(shí)會出現(xiàn)錯(cuò)誤Block GotoFromDemo/Subsystem/From cannot find corresponding Goto block for tag speed解決方案把 From 移到頂層或者把 Goto 移入同一個(gè)層級也可以把 Goto 可見性改為 global 或 scoped。6.3 測試一個(gè) Goto 對應(yīng)多個(gè) From把模型改為Sine Wave -- Goto (Tag speed, Visibility global) From1 (Tag speed) -- Scope1 From2 (Tag speed) -- Scope2 From3 (Tag speed) -- Scope3運(yùn)行后三個(gè) Scope 顯示同一波形。這種“多發(fā)多收”的場景在控制模型中很常見同一轉(zhuǎn)速或電壓信號被多個(gè)邏輯模塊使用。6.4 測試向量和總線信號Goto/From 不僅支持標(biāo)量信號也支持向量信號和總線信號。將 Sine Wave 替換為 Constant 模塊并設(shè)置為[1; 2; 3]然后連接 Goto/From用 Display 模塊查看輸出可以看到完整的向量數(shù)據(jù)被傳遞。如果模型中使用 Bus Creator 創(chuàng)建總線信號Goto/From 同樣可以直接傳遞整個(gè)總線對象前提是源端和接收端的信號結(jié)構(gòu)一致。6.5 測試失敗時(shí)排查什么現(xiàn)象可能原因排查方式編譯報(bào)錯(cuò)“找不到 Goto”Tag 名不匹配或可見性超出范圍檢查 Goto 的可見性設(shè)置與所屬層級From 下拉列表里看不到 Tag打開順序或緩存問題先確認(rèn) Goto 已設(shè)置好 Tag再雙擊 FromScope 顯示信號全為 0Goto/From 未正確連接或信號源未輸出檢查 Goto 輸入端口是否連接From 輸出是否接入 Scope兩個(gè)全局 Goto 同名全局標(biāo)簽唯一性沖突修改其中一個(gè) Tag 名稱7. Goto/From 與其他信號傳遞方式對比在 Simulink 中跨區(qū)域傳遞信號不止 Goto/From 一種方式下面列出常見的幾種對比。7.1 直接連線直接連線是最直觀的方式信號從源模塊輸出端口連接到目標(biāo)模塊輸入端口。這種方式數(shù)據(jù)流清晰適合同一個(gè)層級內(nèi)的短距離傳遞。缺點(diǎn)是當(dāng)信號需要傳遞到遠(yuǎn)處或深層子系統(tǒng)時(shí)連線會變得很長且容易交叉模型可讀性下降。7.2 子系統(tǒng)端口Inport/Outport信號從子系統(tǒng)內(nèi)部傳出或從外部傳入時(shí)最規(guī)范的方式是使用子系統(tǒng)的輸入輸出端口。這種方式定義了明確的接口邊界適合模型分層設(shè)計(jì)和代碼生成場景。缺點(diǎn)是信號每經(jīng)過一層子系統(tǒng)都要在對應(yīng)層級增加一個(gè)端口層級很深時(shí)端口數(shù)量會明顯增加。7.3 Goto/FromGoto/From 適合信號在多個(gè)位置被消費(fèi)或從深層子系統(tǒng)向上傳遞的場景。它減少了端口數(shù)量避免了長連線但代價(jià)是信號的數(shù)據(jù)流依賴不再顯式可見閱讀者必須通過標(biāo)簽名來追蹤。7.4 Data Store Memory / Data Store Read / Data Store WriteData Store Memory 在 Simulink 中相當(dāng)于共享內(nèi)存變量可以通過 Data Store Write 寫入、Data Store Read 讀取。它適合在條件子系統(tǒng)之間共享狀態(tài)例如模型中的計(jì)數(shù)器、運(yùn)行狀態(tài)標(biāo)志位等。與 Goto/From 的主要區(qū)別對比項(xiàng)Goto/FromData Store Memory傳遞內(nèi)容周期性的信號流每個(gè)仿真步傳遞數(shù)值存儲在內(nèi)存中的共享變量可跨步保存狀態(tài)可見性local / scoped / global在指定數(shù)據(jù)存儲區(qū)域可見典型場景信號復(fù)制和分發(fā)狀態(tài)量讀寫和跨模塊數(shù)據(jù)共享代碼生成行為信號傳遞類似于變量賦值生成對應(yīng)的全局變量或內(nèi)存訪問代碼需注意初始化如果只是傳遞一個(gè)連續(xù)計(jì)算的數(shù)值Goto/From 就夠了。如果需要存儲一個(gè)可變狀態(tài)并且在多個(gè)模塊中讀寫Data Store 更合適。7.5 模型引用與總線對象跨模型或跨引用模型傳遞信號時(shí)更推薦使用模型引用接口和總線對象。這超出了本文范圍但值得了解Goto/From 主要是模型內(nèi)部信號路由不是跨模型通信的第一選擇。8. 常見問題與排查方法問題現(xiàn)象可能原因排查方式解決方案編譯報(bào)錯(cuò)Cannot find Goto block for tagFrom 的 Tag 與 Goto 不匹配或可見性范圍不夠雙擊 From查看 Tag 下拉列表是否有對應(yīng)標(biāo)簽修正 Tag 名將 Goto Visibility 改為 scoped 或 global編譯報(bào)錯(cuò)Duplicate Tag存在多個(gè)同名的 Goto 或 Goto Tag Visibility 模塊在模型編輯器中按CtrlF搜索 Tag 名修改其中一個(gè) Tag 名運(yùn)行時(shí) From 輸出為 0Goto 輸入端未連接信號源檢查 Goto 輸入線的箭頭是否確實(shí)有信號輸入連接信號源或檢查源模塊輸出是否正常Scope 波形為常數(shù) 0 或 NaN源模塊參數(shù)異?;蛐盘栴愋筒黄ヅ湓?Goto 輸入端前加 Display 查看信號數(shù)值檢查源模塊參數(shù)設(shè)置例如 Sine Wave 的頻率與幅度子系統(tǒng)內(nèi)的 From 讀取不到外部 GotoGoto 可見性為 local作用域不包含該子系統(tǒng)查看 Goto 所在層級與被測子系統(tǒng)的關(guān)系改用 scoped 或 global 可見性模型引用或代碼生成后信號丟失某些建模規(guī)范禁止全局 Goto/From查看代碼生成報(bào)告和日志改用 Inport/Outport 或 Data Store MemoryGoto/From 無法傳遞總線信號總線對象定義不一致檢查 Bus 對象類型確保源端和接收端結(jié)構(gòu)一致統(tǒng)一使用 Bus Editor 定義的總線對象這里單獨(dú)說明一個(gè)常見誤區(qū)很多人以為 Goto/From 能像無線網(wǎng)絡(luò)一樣讓信號自動(dòng)“廣播”在任何地方都能隨便接收。實(shí)際上除了global可見性之外local和scoped都有明確的作用域限制。作用域設(shè)計(jì)是為了防止標(biāo)簽名沖突也是 Simulink 可讀性和可維護(hù)性的關(guān)鍵。9. 最佳實(shí)踐與使用建議9.1 標(biāo)簽命名規(guī)范盡量統(tǒng)一工程建模時(shí)標(biāo)簽命名建議與信號命名保持同一套規(guī)則。例如使用engineSpeed_rpm、dcBusVoltage_V、pwmDutyRatio這類包含信號含義和單位的名稱。命名要能直接說明物理含義避免sig1、out2這種無意義命名。9.2 優(yōu)先使用 scoped謹(jǐn)慎使用 global雖然 global 用起來最方便但全模型內(nèi)可見會讓信號的依賴關(guān)系變得難以追蹤。更穩(wěn)妥的做法是如果信號只在某個(gè)子系統(tǒng)及其子層級內(nèi)使用用 scoped只有在多個(gè)不相關(guān)子系統(tǒng)都需要同一個(gè)信號時(shí)才用 global建模規(guī)范允許的情況下盡量用 Inport/Outport 定義子系統(tǒng)接口9.3 一個(gè) Goto 對應(yīng)多個(gè) From 時(shí)保持層級清晰當(dāng)一個(gè) Goto 對應(yīng)多個(gè) From 時(shí)可以在模型中用 Goto Tag Visibility 模塊標(biāo)出標(biāo)簽的可見范圍幫助閱讀者快速理解信號從哪里開始分發(fā)。在大型模型中這比在模型每個(gè)角落放置 From 然后到處搜索標(biāo)簽更可控。9.4 定期檢查未使用的標(biāo)簽Simulink 支持在模型編譯時(shí)報(bào)告標(biāo)簽使用情況。如果發(fā)現(xiàn)某些 Goto 沒有對應(yīng)的 From或者某些 From 長期沒有實(shí)際模塊消費(fèi)信號說明建模過程中存在多余的信號路由應(yīng)當(dāng)清理。9.5 與需求追蹤工具配合時(shí)保留信號名如果模型用于生成 C 代碼Goto/From 對應(yīng)的信號名會直接影響代碼中的變量命名。標(biāo)簽命名盡量與需求文檔中的信號名保持一致這樣可以減少后續(xù)代碼閱讀和標(biāo)定的成本。9.6 涉及代碼生成時(shí)注意塊依賴生成嵌入式代碼時(shí)Goto/From 通常會被編譯器優(yōu)化為普通的變量賦值性能影響較小。但某些自動(dòng)代碼生成配置下全局 Goto 可能被識別為全局變量在并發(fā)執(zhí)行或多核生成場景下要特別留意。穩(wěn)妥做法是查看生成的代碼確認(rèn)信號傳遞對應(yīng)的中間變量是否在可接受范圍。如果項(xiàng)目有 MISRA-C 等安全規(guī)范要求還需確認(rèn)是否允許使用對應(yīng)的 Simulink 模塊配置。10. 總結(jié)與下一步Goto/From 是 Simulink 常用模塊庫中看似簡單、實(shí)際作用非常關(guān)鍵的信號路由模塊。掌握它們可以解決大型模型中信號跨層級傳遞、多處分發(fā)、連線交叉等問題。核心掌握三個(gè)點(diǎn)即可Tag 是唯一識別標(biāo)識Goto 和 From 通過相同的 Tag 建立連接可見性決定作用范圍local、scoped、global 分別對應(yīng)局部、向下作用域、全模型使用要克制優(yōu)先考慮數(shù)據(jù)流清晰度再?zèng)Q定是否使用 Goto/From下一步建議你動(dòng)手搭建一個(gè)三層嵌套子系統(tǒng)模型把同一個(gè)正弦波信號通過 Goto/From 從頂層傳到第二層再從第二層傳到第三層然后切換三種可見性觀察編譯結(jié)果。這個(gè)練習(xí)能幫你快速建立對作用域規(guī)則的空間直覺比只看文檔印象深得多。之后可以繼續(xù)學(xué)習(xí) Signal Routing 庫中的 Mux、Demux、Selector、Switch 等模塊和 Goto/From 配合使用能覆蓋絕大多數(shù)信號路由需求。