定落地:從仿真到現(xiàn)場的高效轉(zhuǎn)化)
搞控制的人最舒服的狀態(tài)是什么模型在 Simulink 里建好仿真曲線跑通然后一鍵把代碼生成到 PLC 里現(xiàn)場設(shè)備的實際數(shù)據(jù)和仿真幾乎重合。但真實情況往往是模型只能留在電腦里算法要靠手工翻譯成 SCL 或者結(jié)構(gòu)化文本翻譯完了還得處理數(shù)據(jù)類型、時序、初始化一堆問題調(diào)試到天亮都未必對得上。近兩年我在幾個部署項目里反復(fù)做 Simulink 轉(zhuǎn)博圖TIA Portal的工作踩了不少坑也慢慢摸出了一套能穩(wěn)定落地的流程。這篇就把最重要的核心要點梳理一遍適合手頭已經(jīng)有 Simulink 模型、準備部署到 S7 系列 PLC 的人也適合第一次接這種任務(wù)、連從哪下手都不知道的新手。我不去講那些細枝末節(jié)只聊能直接拿來用的東西模型側(cè)要做什么、代碼生成怎么配、博圖里怎么導、現(xiàn)場運行怎么調(diào)。1. 整體思路與方案取舍先分清要不要自動生成1.1 這個事到底是什么Simulink 轉(zhuǎn) PLC本質(zhì)上解決一件事把在 MATLAB 環(huán)境里建模、仿真、驗證過的控制算法變成可以在 PLC 上周期執(zhí)行的代碼。PLC 的執(zhí)行模型和 Simulink 完全不一樣。Simulink 里時間可以自由推進有連續(xù)求解器、變步長、事件觸發(fā)而 PLC 只有一個固定的循環(huán)節(jié)拍物理上只能每隔一定時間掃描一次程序在這個節(jié)拍內(nèi)把所有任務(wù)執(zhí)行完。所以“轉(zhuǎn)換”這個動作不只是語法翻譯而是把一種以“模塊圖 時間連續(xù)”為核心的計算方式映射到“周期掃描 函數(shù)調(diào)用”的工業(yè)執(zhí)行環(huán)境里。這個過程繞不開的中間層是代碼生成器。Simulink PLC Coder 是官方提供的工具能生成結(jié)構(gòu)化文本ST/SCL代碼也可以生成 C 代碼。博圖TIA Portal這邊對 ST 代碼的支持靠的就是 SCL 語言TIA Portal 可以直接導入外部源文件把 ST 代碼編譯成可執(zhí)行對象。整條鏈路就是Simulink 模型 → PLC Coder 生成 ST 代碼 → TIA Portal 導入 → 外層封裝成功能塊 → 由 PLC 周期調(diào)用。注意這里談的“適配博圖”指的就是 SCL 這一環(huán)的兼容性而不是說 PLC 里能直接跑 Simulink 的二進制模型這種概念上的區(qū)分很多人一開始沒意識到后面就會瞎折騰。還有一點值得先說清楚為什么不是直接轉(zhuǎn)成梯形圖梯形圖擅長開關(guān)邏輯、互鎖、電氣回路但你讓它去表達一個卡爾曼濾波的狀態(tài)更新方程寫出來會非常痛苦而且可讀性極差。SCL 是文本語言能寫復(fù)雜的數(shù)學表達式、數(shù)組運算、循環(huán)本質(zhì)上接近通用編程語言。這也是為什么自動生成路徑幾乎都會選 ST/SCL 作為輸出語言而不是梯形圖。認清這一點你才不會在工具配置里找半天“梯形圖生成選項”。1.2 自動生成和手寫移植怎么選這是最應(yīng)該想清楚的問題也是最容易被忽略的問題。很多人一上來就想著把整個模型全部生成到 PLC結(jié)果生成的代碼量巨大、運行周期撐不住最后又退回手寫。我個人的判斷標準很簡單。如果算法涉及大量矩陣運算、狀態(tài)空間求解、觀測器、濾波器、預(yù)測控制這類數(shù)值密集型計算自動生成幾乎是最好的選擇。因為手寫這類數(shù)學邏輯非常容易出錯而且很難保證和仿真結(jié)果一致。Simulink 模型本身就是經(jīng)過驗證的算法描述自動生成相當于把這份描述直接翻譯成目標代碼一致性遠高于人工轉(zhuǎn)譯。如果控制邏輯就是簡單的開關(guān)邏輯、順序控制、布爾判斷那自動生成不僅不劃算還會因為生成的代碼結(jié)構(gòu)復(fù)雜而拖慢掃描周期。比如一個電機起保停電路手寫 SCL 十行以內(nèi)生成出來可能幾百行完全沒必要。而且生成的代碼內(nèi)部包含了大量臨時變量和輔助函數(shù)資源占用高純邏輯控制場景根本吃不消。還有一個折中方案我在這幾個項目里用得最多把模型里最核心的算法部分做自動生成外圍的 IO 處理、使能邏輯、故障診斷仍然手寫。這樣做的好處是復(fù)雜計算交給可靠的生成器外圍邏輯保持人的靈活控制既保證核心算法不出錯也把代碼規(guī)??刂圃诤侠矸秶_x自動生成之前要做一次可行性審查模型是否離散化、采樣時間是否合理、數(shù)據(jù)類型是否已收斂、生成代碼有沒有用到 PLC 不支持的動態(tài)內(nèi)存、指針、遞歸調(diào)用。這些檢查最好在動手前完成否則配置做到一半才發(fā)現(xiàn)模型根本不適合生成前面功夫全白費。2. 模型側(cè)準備與代碼生成配置決定成敗的第一步2.1 模型離散化與采樣時間的設(shè)定PLC 是周期執(zhí)行模型必須工作在離散狀態(tài)。這一點怎么強調(diào)都不過分。如果在模型里用了連續(xù)積分環(huán)節(jié)或者連續(xù)求解器生成的代碼即便編譯通過運行起來也會因為缺少真實積分環(huán)境而出現(xiàn)各種怪異現(xiàn)象。比如明明是個穩(wěn)定的閉環(huán)一到 PLC 里就震蕩或者某個狀態(tài)變量不斷累積漂移幾分鐘后直接飽和。所以第一步就是檢查模型里的所有積分環(huán)節(jié)全部改成離散版本。常用的做法是用零階保持器離散化或者在 Simulink 里把求解器設(shè)置為固定步長離散求解器先仿真確認行為不偏差太大再進入代碼生成流程。采樣時間的設(shè)定是另一個關(guān)鍵。理論上采樣時間要滿足控制帶寬的需求至少比被控對象中最高頻的動態(tài)過程快 5 到 10 倍。比如你的對象動態(tài)響應(yīng)最快是 100ms 級別采樣步長保守起見就取 10ms 到 20ms。PLC 側(cè)還要考慮掃描周期。如果 PLC 的循環(huán)中斷周期是 10ms模型采樣周期最好不要設(shè)成 25ms 這種非整數(shù)倍關(guān)系否則會產(chǎn)生相位抖動。工程上常見做法是采樣步長取 PLC 掃描周期的整數(shù)倍比如 1 倍、2 倍、5 倍這樣每次調(diào)用時機都是確定的不會累積偏移。還有一個細節(jié)固定步長求解器的類型選擇。離散模型最穩(wěn)妥的是選“單任務(wù)離散”SingleTasking模式或者把求解器類型直接選為離散。如果在配置里還保留連續(xù)求解器代碼生成時會自動插入一些連續(xù)求解器的支持代碼這些代碼在 PLC 里根本用不上只會白白增加體積和計算開銷。我見過有人生成的代碼里帶了完整的 ODE 求解器輔助函數(shù)原因就是模型里殘留了連續(xù)模塊。2.2 PLC 代碼生成的幾項關(guān)鍵配置配置這一步不同人用的工具版本不一樣界面可能略有差異但邏輯基本一致。我一般會走這么幾個步驟。第一步在模型的 Configuration Parameters 里選擇 PLC Coder 作為代碼生成目標目標平臺選擇和你實際部署的 PLC 類型匹配這里就是選 S7 系列相關(guān)支持。第二步語言選擇結(jié)構(gòu)化文本 ST。這里要確認一下生成模式有些版本會默認生成 C 代碼而不是 ST需要手動切過去。切過去以后代碼生成報告里的輸出文件后綴就會變成 .scl 或 .st。第三步函數(shù)封裝方式。通常選生成一個 step 函數(shù)和一個 initialize 函數(shù)。推薦關(guān)閉“生成單獨文件”的選項讓代碼整體打包方便導入 TIA Portal。因為如果拆成多個小文件導入博圖時要逐個處理文件之間如果有相互引用編譯順序稍不對就報錯。第四步代碼優(yōu)化級別。優(yōu)化要打開可以減少代碼體積和局部變量但不要開到最高級。最高級可能會改變某些內(nèi)部計算的順序在數(shù)值敏感算法里會產(chǎn)生微小偏差比如一個矩陣連乘展開以后浮點累加順序變了結(jié)果就差幾個單位。對控制算法來說這種差隨迭代會累積非常不好排查。第五步注釋和文檔選項。生成的代碼里默認帶一堆注釋不影響執(zhí)行但導入博圖后代碼體積會明顯變大。建議把注釋量降到最低尤其是那些“Generated by Simulink”之類的頭部注釋。真正運行的時候沒人看這些PLc 內(nèi)存才是硬約束。2.3 數(shù)據(jù)類型和接口的預(yù)處理代碼生成之前模型里所有和外部交互的信號都應(yīng)該明確數(shù)據(jù)類型和維度。我見到最多的問題就是 double 類型。Simulink 里默認數(shù)據(jù)類型是 double也就是雙精度浮點64 位。S7 系列 PLC 里的浮點數(shù)是 REAL單精度32 位。這個映射關(guān)一旦處理不好仿真結(jié)果和現(xiàn)場數(shù)值對不上是必然的不是差一點而是能差出一個數(shù)量級。我的做法是建模階段就把關(guān)鍵信號的數(shù)據(jù)類型顯式設(shè)置成 single然后在仿真時也用 single 跑。這樣仿真時看到的精度表現(xiàn)就是將來 PLC 里實際運行的精度表現(xiàn)沒有任何意外。Code Generation 本身的自動映射也有但我從來只把它當作兜底而不是依賴。還有一個容易被忽略的地方是模擬量輸入輸出的范圍。Simulink 里你隨便定義一個 0 到 100 的百分比信號PLC 側(cè)對應(yīng)的可能是 0 到 27648 的整數(shù)編碼。這類縮放關(guān)系必須在模型側(cè)用 Gain 模塊提前處理而不是部署到 PLC 以后再手動換算。為什么堅持在模型側(cè)處理因為模型側(cè)處理完之后仿真結(jié)果和現(xiàn)場實際值可以直接對得上排查問題少繞一大圈。如果你讓 PLC 側(cè)做線性轉(zhuǎn)換仿真輸出和現(xiàn)場實際之間永遠隔著一層換算每次調(diào)試都要同時看兩邊效率極低。3. 工具鏈與目標平臺適配搞清楚你手上的“博圖”是什么3.1 博圖版本與 SCL 支持差異同一個“博圖”名稱下面不同版本的 SCL 編譯能力差別不小。較新版本對復(fù)雜數(shù)組、結(jié)構(gòu)體、字符串處理的支持明顯更好編譯速度和診斷信息也完善得多。早期版本有時會出現(xiàn)對某個 ST 語法報“不支持的表達式”但同樣一段代碼換到新版上就能正常編譯。所以做這類項目我強烈建議先把博圖版本確認清楚再決定模型里怎么組織代碼。如果手頭的博圖版本比較舊那模型側(cè)就要盡量避免生成過于前沿的語法結(jié)構(gòu)比如避免在內(nèi)部代碼里使用復(fù)雜的嵌套 FOR 循環(huán)或動態(tài)數(shù)組訪問。這里有個教訓有一次我把目標平臺配置成了某個比較新的 PLC 型號生成的 ST 代碼里嵌了一段針對長數(shù)組的初始化指令。導入到現(xiàn)場那臺版本偏舊的 TIA Portal 里編譯直接掛掉。后來只能回到 Simulink 里把數(shù)組拆成標量接口重新生成一遍才勉強通過。所以版本適配不是到了博圖側(cè)才想的模型生成配置階段就要把現(xiàn)場環(huán)境一起考慮進去。3.2 S7-1200 與 S7-1500 的資源邊界S7 系列里最常見的是 1200 和 1500 兩個子系列它們的資源邊界差異很大。S7-1500 的浮點運算能力強內(nèi)存也大適合跑帶有大量矩陣運算或狀態(tài)觀測器的模型。S7-1200 是小中型 PLCCPU 主頻有限內(nèi)存也小跑比較大的生成代碼會非常吃力。我有一個測算習慣先把生成的 ST 代碼行數(shù)拿到再估算里面需要多少字節(jié)的靜態(tài)變量區(qū)。一般來說超過幾千行帶浮點運算的代碼就不太建議往 S7-1200 里塞了硬塞進去要么掃描周期暴漲要么編譯時報內(nèi)存不足。如果項目還沒定 PLC 型號我的建議是只要模型里有超過幾十個狀態(tài)變量的算法優(yōu)先選 1500 系列留足余量。不要為了省幾百塊硬件成本讓后面的算法優(yōu)化和代碼瘦身占用大量調(diào)試時間。硬件選型省下來的錢遠遠不夠覆蓋現(xiàn)場調(diào)試的人工成本。3.3 ST 代碼與 C 代碼的選擇除了 ST 代碼PLC Coder 也能生成 C 代碼。很多人會在這一步糾結(jié)。我直接給結(jié)論在 S7 系列 PLC 上標準路徑就是 ST/SCL不用考慮 C 代碼。原因很簡單常規(guī) S7 CPU 沒有開放 C 運行時環(huán)境C 代碼不能直接作為 PLC 程序運行除非設(shè)備本身是帶操作系統(tǒng)的工業(yè) PC 或者軟 PLC 方案那就不是傳統(tǒng)意義上的博圖項目了。ST 代碼則是 TIA Portal 原生支持的語言之一導入、編譯、下載都是順暢的。所以路徑選擇其實是平臺決定的而不是個人偏好。如果你確認將來要部署到基于 PC 的軟 PLC 或帶實時系統(tǒng)的控制器上再考慮 C 代碼的路徑也不遲。但在普通的 S7 項目里談 C 代碼只會繞遠路。工具鏈的適配就到此為止明白這些邊界之后再進博圖做集成會順很多。4. 博圖適配與集成落地代碼只是開始4.1 生成的代碼長什么樣用 PLC Coder 生成的 ST 代碼結(jié)構(gòu)上一般包含兩個核心函數(shù)一個是初始化函數(shù)負責把內(nèi)部狀態(tài)變量設(shè)置成初始值另一個是 step 函數(shù)也就是周期執(zhí)行的主計算函數(shù)。step 函數(shù)的輸入?yún)?shù)對應(yīng)模型中的輸入端輸出參數(shù)對應(yīng)模型中的輸出端。函數(shù)內(nèi)部通常會有很多臨時變量代碼結(jié)構(gòu)看起來像一個比較大的 SCL 程序塊。下面是個簡化的結(jié)構(gòu)示意// 示意結(jié)構(gòu)實際代碼會比這個多很多 FUNCTION_BLOCK FB_ModelWrapper VAR_INPUT u : REAL; // 模型輸入 END_VAR VAR_OUTPUT y : REAL; // 模型輸出 END_VAR VAR x : ARRAY[0..9] OF REAL; // 模型內(nèi)部狀態(tài) tmp : REAL; // 臨時變量 END_VAR BEGIN // --- 這里粘貼 Step 生成代碼 --- // y : ...; // tmp : ...; // 狀態(tài)更新邏輯 END_FUNCTION_BLOCK在 TIA Portal 里你不會直接把這段代碼當成主程序運行而是先建一個 FB功能塊在 FB 的聲明區(qū)里定義好輸入、輸出和靜態(tài)變量然后把生成的 step 函數(shù)代碼整體復(fù)制到 FB 的代碼區(qū)。這個 FB 就是模型的外殼上層 OB 只需要周期調(diào)用這個 FB 就行。初始化函數(shù)可以在 FB 的初始化部分調(diào)用一次或者用 FB 靜態(tài)變量的默認值來實現(xiàn)。這樣外層結(jié)構(gòu)非常清晰輸入輸出全部暴露在 FB 的接口上想監(jiān)控哪個變量都方便查問題的時候不用去翻一大堆內(nèi)部局部變量。4.2 TIA Portal 導入與外層功能塊封裝在博圖里導入 ST 代碼有兩條路。第一條是用“外部源文件”功能在項目樹里右鍵添加新源文件選 .scl 后綴把生成的代碼貼進去編譯完成后可以生成一個功能塊。這個方式適合代碼量大、結(jié)構(gòu)完整的工程。第二條是手動處理新建一個 FB把變量聲明區(qū)先按代碼里的輸入輸出補齊再把代碼粘貼到實現(xiàn)區(qū)然后編譯。如果代碼規(guī)模不大我更喜歡第二種因為變量聲明和注釋都掌握在自己手里排查問題順手。無論走哪條路有三件事必須注意。變量命名沖突是高頻問題。生成的代碼內(nèi)部變量名可能帶有特殊前綴博圖不保證完全兼容遇到報錯就改變量名但建議在生成前就在 Simulink 側(cè)做一個全局命名前綴設(shè)置統(tǒng)一加個短前綴比如 mdl_能避免大多數(shù)沖突。數(shù)組下標習慣也要統(tǒng)一。博圖數(shù)組可以自定義上下界我一般統(tǒng)一用 LOWER_BOUND 0 來對齊 C/ST 習慣這樣從代碼里復(fù)制過來的數(shù)組訪問邏輯不用改。如果 Simulink 側(cè)的數(shù)組默認是 1 基索引生成的代碼里可能會差一個下標這種錯誤編譯能通過但運行結(jié)果完全不對非常隱蔽。FB 的調(diào)用方式同樣要注意。封裝好的 FB 不能直接往 OB1 里一放就完事還要確定調(diào)用位置。建議單獨建一個技術(shù)功能塊專門負責周期調(diào)用便于運行監(jiān)控。直接把算法 FB 散落在 OB1 的各個角落后面想測量這段代碼的執(zhí)行時間都很難操作。4.3 輪詢調(diào)用與周期設(shè)計PLC 運行模型算法絕對不能直接掛在 OB1 上。OB1 的掃描周期和程序復(fù)雜度強相關(guān)同一段代碼在不同掃描周期里執(zhí)行到的位置可能完全不同時序不穩(wěn)定對算法來說是災(zāi)難。我的做法是建一個循環(huán)中斷 OB設(shè)置固定中斷周期比如 10ms再在中斷里調(diào)用封裝好的 FB。這樣模型的計算頻率是精確可控的不受主程序其他邏輯影響。循環(huán)中斷的周期要和模型采樣步長保持一致性。如果模型采樣時間是 20ms而 PLC 循環(huán)中斷是 10ms那 step 函數(shù)每執(zhí)行一次需要等待兩個中斷周期邏輯上也能跑但復(fù)雜狀態(tài)下容易出現(xiàn)狀態(tài)滯后和時序抖動。更好的做法是循環(huán)中斷周期等于模型采樣步長或者采樣步長是中斷周期的整數(shù)倍。如果是整數(shù)倍關(guān)系step 函數(shù)外層要加一個計數(shù)邏輯只有計數(shù)滿時才真正執(zhí)行 step。這個執(zhí)行標志位可以作為 FB 的輸出暴露出來方便監(jiān)控。實際部署時還要留一個性能余量參數(shù)step 函數(shù)的平均執(zhí)行時間占循環(huán)中斷周期最好控制在 50% 以內(nèi)。如果占太高后續(xù)模型迭代加功能或者現(xiàn)場負載增加時很容易超時觸發(fā) PLC 的循環(huán)超時報警。這個參數(shù)建議在上線前就測好別等到現(xiàn)場出了問題再抓瞎。5. 部署中的常見問題與排查技巧實錄5.1 導入編譯階段的經(jīng)典報錯我把實際過程中碰到的問題整理成一個速查表方便對照現(xiàn)象原因處理辦法導入時提示語法不支持生成了特定平臺擴展語法或源文件編碼不符合預(yù)期檢查生成選項把平臺相關(guān)選項全部取消確認編碼為 UTF-8函數(shù)名重復(fù)step 函數(shù)名與博圖已有對象重名生成前在代碼接口里配置函數(shù)命名前綴數(shù)組越界多維數(shù)組拍平后下標錯位統(tǒng)一數(shù)組定義上下界用 LOWER_BOUND 0數(shù)據(jù)類型不匹配double 被映射為 REAL 后某些接口還要和 DINT 對接在模型側(cè)顯式把接口轉(zhuǎn)換成需要的類型表格里每一條都可以展開。就拿第一類來說我遇到過生成的 ST 文件里帶了一些由代碼生成工具額外加上的平臺宏定義博圖轉(zhuǎn)譯的時候直接報“未知標識符”最后只能把代碼里無關(guān)的部分刪掉再編譯。所以導入之前先打開源文件掃一眼是很有必要的習慣。不要指望一鍵導入永遠順利多留出十分鐘做檢查能省出一個晚上的排查時間。數(shù)組越界這類問題最典型的場景是 Simulink 側(cè)用了一個二維矩陣接口生成到 ST 里變成二維數(shù)組。如果模型里對矩陣的索引方式用的是 C 語言習慣從 0 開始而你在博圖里不小心把數(shù)組下限定義為了 1那每一個訪問都會錯位運行結(jié)果完全不可理喻。排查時可以先把所有數(shù)組下限改成 0如果現(xiàn)象立刻消失那就是索引約定不一致。5.2 運行階段的偏差、時序與資源問題編譯通過不代表運行就對。最典型的問題是仿真曲線和現(xiàn)場曲線對不上不是差一星半點而是趨勢都對不上。這時候先不要懷疑代碼生成有 bug90% 的概率是采樣時間不一致或者模型側(cè)和 PLC 側(cè)的數(shù)據(jù)類型精度不一致。我的排查順序是先確認循環(huán)中斷周期和采樣步長再檢查所有接口數(shù)據(jù)的類型和縮放最后再對比關(guān)鍵中間變量的數(shù)值。中間變量對比這一招最有用它能幫你在模型內(nèi)部定位到第一個產(chǎn)生偏差的位置而不是在輸出端猜原因。第二個高頻問題是 CPU 占用過高。生成代碼雖然看起來是一堆文本但里面常常有大量嵌套循環(huán)和矩陣計算。S7-1200 這類小型 PLC 跑起來尤其吃力。建議在上線前做一個性能估算把 step 函數(shù)平均執(zhí)行時間控制在循環(huán)中斷周期的 50% 以內(nèi)。如果超了優(yōu)先優(yōu)化模型里的矩陣運算比如用直接公式替代復(fù)雜的矩陣求逆而不是去優(yōu)化代碼結(jié)構(gòu)本身。第三個問題是狀態(tài)初始化。生成的初始化函數(shù)只在 FB 首次調(diào)用時執(zhí)行一次如果中途修改過模型并重新下載 PLC 程序老的狀態(tài)可能殘留導致輸出跳變。解決辦法是在 FB 里加一個“模型復(fù)位”輸入或者用啟動 OB 里的觸發(fā)邏輯把初始化函數(shù)強制調(diào)用一次。這個細節(jié)很多文檔不會寫但現(xiàn)場基本都會遇到提前設(shè)計好能少很多麻煩。5.3 一套我實測好用的推進流程最后分享一個自己反復(fù)用的推進順序。拿到模型后我不會先去做代碼生成而是先把模型里所有可能引起部署問題的地方標記出來包括連續(xù)積分環(huán)節(jié)、int 型接口、上升沿檢測模塊、維度不明確的信號。然后把任務(wù)分成兩類一類需要在模型側(cè)修改另一類可以在 PLC 側(cè)通過外層封裝解決。這樣就不會在工具配置里反復(fù)返工。具體流程大概是模型離散化檢查 → 采樣周期確定 → 接口數(shù)據(jù)類型規(guī)范化 → 代碼生成 → 導入博圖 → FB 封裝 → 循環(huán)中斷部署 → 空載仿真對比 → 連接 IO 實機驗證。每一步都有對應(yīng)的輸出物比如采樣周期確定后就寫進項目文檔這樣后續(xù)迭代時有據(jù)可查。尤其是代碼生成那一步建議先生成一個最簡單的測試模型比如一個增益模塊加一個積分器把整個鏈路從生成到博圖運行完整跑通再換成真實模型。很多人一上來直接拿完整模型去生成到最后一步出問題定位范圍會非常大。我個人習慣在每一步切換前都做一次“目標環(huán)境對照”問自己這段邏輯在 PLC 里會以什么頻率執(zhí)行、有什么資源限制、和模型里的仿真假設(shè)是否一致。把這個問題想清楚比記住任何具體配置項都重要。工具只是執(zhí)行者真正決定成敗的是對兩個平臺差異的理解。我自己在這幾輪項目里最深的體會是Simulink 轉(zhuǎn) PLC 這件事最磨人的不是工具鏈而是心態(tài)。總覺得自動生成就應(yīng)該是一鍵完成卻忘了 PLC 和 Simulink 是兩種執(zhí)行模型一個時間自由一個嚴格周期。把模型離散化、把數(shù)據(jù)類型顯式收斂、把采樣時間對齊這三件事做到位后面基本是水到渠成。順便分享一個最后的小技巧在上線前把生成代碼里的所有常量調(diào)出來和 Simulink 模型里的參數(shù)逐個核對一遍經(jīng)常會有意外收獲。我至少碰到過兩次模型中某處還是默認的 0.5、1.0而實際工程參數(shù)應(yīng)該是 0.05、10 的情況。這類問題不會報錯但會讓現(xiàn)場的曲線非常難看多留這一步能幫你省掉大量排查時間。