部PID閉環(huán)仿真:西門子S7-1200/1500虛擬對象整定實戰(zhàn))
做過過程控制的人都有體會PID參數(shù)看著就三個調(diào)起來是真要命。比例大了震蕩積分小了余差壓不住微分用過頭又會被噪聲搞得神經(jīng)兮兮。更尷尬的是很多場合根本沒有真實被控對象設(shè)備還在廠家沒到場或者現(xiàn)場流程不允許反復(fù)折騰。這時候手里有一套能在PLC內(nèi)部完成的PID調(diào)節(jié)仿真程序情況就完全不同了。這篇文章要聊的這套西門子S7-1200和S7-1500通用的PID仿真方案思路其實很樸實——不要加熱爐不要水箱不要變頻器帶電機甚至不需要模擬量模塊直接用一個PLC實物在CPU內(nèi)部搭一個數(shù)學(xué)模型被控對象和PID指令組成閉環(huán)。它能讓你在有PLC的環(huán)境里就把一個過程的響應(yīng)曲線跑出來把現(xiàn)場要用的PID參數(shù)提前整定好。我搞電氣和自動化調(diào)試多年這類仿真幫我避了不少雷。下文從方案原理、對象建模、整定流程到踩坑記錄一次講透適合剛學(xué)PID的工程師、售后調(diào)試人員和想低成本驗證控制方案的開發(fā)者。1. 方案的本質(zhì)在PLC內(nèi)部搭一個“虛擬被控對象”1.1 為什么非要虛擬對象先講痛點。剛接觸PID時我踩過最深的坑就是“盒子里的參數(shù)調(diào)不出感覺”對著書本上P、I、D的公式推導(dǎo)能理解概念但一上設(shè)備就懵完全不知道把參數(shù)放到現(xiàn)場會變成什么曲線。更現(xiàn)實的問題是調(diào)試項目經(jīng)常遇到設(shè)備還沒進場、對象被別的工序占用、或者對象本身不允許反復(fù)試錯的情況。比如之前參與過一個溫控項目加熱管功率很大現(xiàn)場操作員明確說“你這參數(shù)試多了會燒東西”。那怎么辦只能靠經(jīng)驗估一版參數(shù)再小心翼翼地投自動整個過程壓力極大。仿真程序解決的就是這個問題。所謂“虛擬被控對象”是把真實過程——溫度的慣性、液位的容量、流量的滯后——抽象成一個數(shù)學(xué)模型用PLC里的指令算出來。PID指令的輸出進模型模型的輸出作為過程值反饋給PID指令閉環(huán)在CPU內(nèi)部就完成了。你不需要任何真實的傳感器、執(zhí)行器、被控設(shè)備只要PLC是通電的整個控制回路就跑起來了。從學(xué)習(xí)角度看這種方案還解決了一個關(guān)鍵問題可復(fù)現(xiàn)性。真實對象每次試驗條件都不同室溫、風(fēng)、負載都在變但虛擬對象每次跑出來都一樣。你可以放心大膽地把P整整大一百倍看它怎么發(fā)散再把I去掉看余差到底長什么樣。這種“作死”式練習(xí)在真實設(shè)備上根本沒法做在仿真里反而成了最高效的學(xué)習(xí)路徑。1.2 閉環(huán)里到底有哪幾塊整套方案在程序上就三塊東西邏輯非常清晰第一塊是PID控制指令。我用的是TIA Portal自帶的PID_Compact V3這是1200和1500平臺共用的工藝指令不需要額外買庫。它負責(zé)接收設(shè)定值SP和過程值PV按照內(nèi)部算法算出操縱變量Y。第二塊是虛擬被控對象的FB函數(shù)塊。這個塊是整套程序的核心它接收PID指令輸出的操縱變量經(jīng)過數(shù)學(xué)模型運算輸出一個過程值。說白了它扮演的就是那個“被控設(shè)備”。第三塊是循環(huán)中斷組織塊OB。PID控制必須按固定周期調(diào)用所以我把PID_Compact和虛擬對象FB都放在同一個循環(huán)中斷OB里比如OB30設(shè)定周期為500毫秒。這樣每次掃描模型按固定時間步長遞推一次PID也同步計算一次整個閉環(huán)的時序就是確定的。這三塊連接起來的數(shù)據(jù)流是PID_Compact的Output連接到虛擬對象FB的輸入虛擬對象FB的y_PV輸出反饋回PID_Compact的Input設(shè)定值SP由單獨的數(shù)據(jù)塊給定。全程沒有硬件I/O參與所有變量都是PLC內(nèi)部存儲器上的數(shù)據(jù)??聪旅孢@個接線關(guān)系就明白了SP設(shè)定值 → [PID_Compact] → 執(zhí)行器開度 → [虛擬對象FB] → 過程值PV → 回到PID_Compact輸入這個結(jié)構(gòu)跟真實系統(tǒng)的信息流一模一樣。區(qū)別只在于真實系統(tǒng)里執(zhí)行器開度要經(jīng)模擬量輸出模塊變成物理信號被控對象是真實的加熱器或水箱過程值要經(jīng)過變送器和模擬量輸入模塊讀回來?,F(xiàn)在這一步全省了直接在內(nèi)存里完成閉環(huán)所以題目說“只需一個PLC實物”是成立的。1.3 為什么默認選“一階慣性純滯后”模型很多人會問你那個虛擬對象FB里用的什么數(shù)學(xué)模型我的回答是絕大部分過程控制系統(tǒng)都可以用“一階慣性純滯后”來近似。溫度控制是典型的一階慣性加滯后加熱器升溫存在時間常數(shù)溫度探頭離加熱端又有距離信號傳遞有延遲。液位控制也類似進水量變化后液位不會突變要等液體慢慢積累。壓力、流量、濃度這些也一樣。這個模型在控制理論里的表達式是G(s) K * e^(-τs) / (T * s 1)其中K是靜態(tài)增益T是時間常數(shù)τ是純滯后時間。這三個參數(shù)就能大致描出一個真實過程的性格。比如加熱器功率大、測溫點近K就大而τ小水箱容量大T就大響應(yīng)慢管道長、介質(zhì)流速慢τ就大。用這三個參數(shù)模擬出來的響應(yīng)曲線跟真實過程非常接近足夠用于PID整定和邏輯驗證。如果遇到更復(fù)雜的對象比如雙容水箱、溫度串級控制里的二階對象也可以在FB里再疊加一個慣性環(huán)節(jié)把模型擴展成二階。但基礎(chǔ)版本先用一階慣性加滯后理解難度小參數(shù)好認整定規(guī)律也更直觀。2. “1200和1500通用”是怎么做到的2.1 同一個PID指令體系是關(guān)鍵很多人一聽“1200和1500通用”第一反應(yīng)是不信一個主打小型應(yīng)用一個是中高端設(shè)備程序怎么可能直接共用其實西門子從TIA Portal這一代開始1200和1500就在同一個工程框架下很多工藝指令都是同一個版本。PID_Compact V3就是這樣1200能用1500也能用指令外形、參數(shù)結(jié)構(gòu)、背景數(shù)據(jù)塊布局完全一致。這意味著你在1200里編寫好的PID調(diào)用邏輯拖到1500的項目里可以直接復(fù)用不用改指令名不用重新配置參數(shù)。唯一要留意的是CPU固件版本。PID_Compact V3對固件版本有要求S7-1200建議V4.4以上S7-1500建議V2.5以上太老的朋友先更新固件再折騰。虛擬對象FB就更容易了。我自己寫的那個FB_Virtual_Temp用的是標(biāo)準(zhǔn)SCL語言里面沒有任何硬件地址依賴不訪問I/O模塊不調(diào)用通信指令純數(shù)學(xué)運算。這種FB天生就是跨PLC可移植的。只要把兩個塊復(fù)制到新項目的程序文件夾里把OB30也帶過去下載運行就能跑。2.2 程序結(jié)構(gòu)與硬件解耦為了讓兩個平臺真正通用我在寫程序時堅持一條原則所有參與閉環(huán)的變量都用符號訪問不直接用絕對地址。設(shè)定值SP、PID輸出、模型輸出、模型參數(shù)全部放在一個獨立的數(shù)據(jù)塊里通過符號名來引用。舉個例子我不會在PID_Compact的Setpoint引腳上直接填一個常數(shù)或者一個I/O地址而是接一個全局數(shù)據(jù)塊里的變量比如“DB_Ctrl”.SP。這樣換平臺時數(shù)據(jù)塊的布局不變程序邏輯完全不用動。如果直接用了某個I/O地址比如IW64到了1500上地址范圍發(fā)生變化程序就得跟著改那就談不上通用了。還有一點值得注意PID_Compact的背景數(shù)據(jù)塊是優(yōu)化訪問模式時在線監(jiān)控某些成員會不太方便。我習(xí)慣把背景DB的訪問模式改成“標(biāo)準(zhǔn)訪問”這樣在監(jiān)控表里可以直接查看和修改PID參數(shù)。不過1500上更推薦保留優(yōu)化訪問性能更好。折中方案是通過我自己的全局數(shù)據(jù)塊中轉(zhuǎn)參數(shù)不讓程序直接操作PID背景DB。這個細節(jié)后面還會細說。2.3 移植時的三個小坑雖然程序能通用但我在實際操作中還是踩了幾個跟平臺差異有關(guān)的坑。第一個是循環(huán)中斷OB的分配。S7-1200默認支持多個循環(huán)中斷OB但周期設(shè)置范圍和數(shù)量有限制。1500在這方面更寬裕。把1200項目換成1500時檢查一下OB30是否被正確導(dǎo)入周期設(shè)置有沒有被重置。第二個是保持性數(shù)據(jù)的差異。虛擬對象FB里的緩沖區(qū)如果被標(biāo)記為保持性下載程序后會有初始值行為差異。1500對保持性數(shù)據(jù)的管理更靈活1200則需要指定保持性存儲區(qū)范圍。我給FB里的數(shù)組變量設(shè)置的是非保持性這樣上電后模型一定從零開始避免緩沖區(qū)里殘留舊數(shù)據(jù)導(dǎo)致PV突變。第三個是HMI和監(jiān)控方式差異。1200常用精簡系列面板1500項目可能配WinCC專業(yè)版變量映射方式不同。但在純仿真場景下我一般不用HMI直接用TIA Portal的監(jiān)控表加PID調(diào)試面板就夠了這兩個平臺都支持不需要為不同面板額外組態(tài)。3. 虛擬被控對象建模與SCL實現(xiàn)3.1 從傳遞函數(shù)到差分方程要想在PLC里算出模型響應(yīng)不能直接用連續(xù)世界的傳遞函數(shù)得把它變成離散世界的差分方程。這個過程叫離散化。以溫度對象為例一階慣性系統(tǒng)的微分方程是T * dy/dt y K * u其中y是過程值u是PID輸出的操縱變量K是增益T是時間常數(shù)。把這個微分方程用前向歐拉法離散化采樣周期為Ts就得到y(tǒng)(k) y(k-1) (Ts/T) * [K * u(k-1) - y(k-1)]這個式子非常好理解下一拍的過程值等于上一拍的值加上一個增量。增量的大小取決于時間常數(shù)T和采樣周期Ts的比值以及目標(biāo)值和當(dāng)前值的差距。如果Ts相對T足夠小這個近似的精度就足夠高。通常工程上取Ts小于T的十分之一就很好用了。純滯后τ的處理更直接它就是把輸出延遲若干個周期。如果采樣周期是500毫秒滯后是5秒那就相當(dāng)于讓輸出晚10個周期再對外呈現(xiàn)。用一個環(huán)形緩沖隊列就能實現(xiàn)。3.2 純滯后實現(xiàn)環(huán)形緩沖區(qū)環(huán)形緩沖區(qū)很像一個旋轉(zhuǎn)的寄存隊列。我開辟一個長度為N的數(shù)組N等于滯后時間除以采樣周期即τ/Ts。每個采樣周期做三步操作先從當(dāng)前指針指向的位置讀出最舊的數(shù)值作為滯后后的輸出然后把最新計算值寫入這個位置覆蓋舊值最后指針后移一位移到尾部就繞回頭部。打個比方就像在傳送帶上放了一排桶每拍往一個桶里放一個當(dāng)前值然后從另一個位置取出最早的那個桶里的值給外面看。從外部看看到的值永遠比當(dāng)前計算值晚N拍。這樣實現(xiàn)邏輯簡單計算量也不大。50個元素的數(shù)組對1200來說毫無壓力在1500上更是小菜一碟。3.3 一個可直接抄的虛擬溫度對象FB下面這個FB就是整套仿真程序的核心我把它完整貼出來已經(jīng)過在線測試可以直接使用。FUNCTION_BLOCK FB_Virtual_Temp { S7_Optimized_Access : TRUE } TITLE : 虛擬一階慣性純滯后被控對象 AUTHOR : PLC_DIY VERSION : 0.1 VAR_INPUT u_Cmd : Real; // 來自PID的操縱變量范圍0~100相當(dāng)于執(zhí)行機構(gòu)開度(%) END_VAR VAR_OUTPUT y_PV : Real; // 過程值模擬溫度/液位/壓力等被控量 END_VAR VAR y_Last : Real; buf_Delay : Array[0..49] of Real; pIdx : Int; END_VAR VAR_TEMP K_Obj : Real; T_Obj : Real; Ts_Obj : Real; dY : Real; iLoop : Int; END_VAR BEGIN // 模型參數(shù)按實際被控對象修改 K_Obj : 1.5; // 靜態(tài)增益開度變化1%穩(wěn)態(tài)值變化1.5 T_Obj : 30.0; // 時間常數(shù)單位秒 Ts_Obj : 0.5; // 采樣周期與OB30周期保持一致 // 一階慣性離散遞推 dY : (K_Obj * u_Cmd - y_Last) * Ts_Obj / T_Obj; y_Last : y_Last dY; // 環(huán)形緩沖實現(xiàn)純滯后 y_PV : buf_Delay[pIdx]; // 取出最舊的歷史值作為當(dāng)前輸出 buf_Delay[pIdx] : y_Last; // 寫入當(dāng)前最新值 pIdx : pIdx 1; IF pIdx 49 THEN pIdx : 0; END_IF; END_FUNCTION_BLOCK這段代碼我解釋幾個關(guān)鍵設(shè)計模型參數(shù)K、T、Ts我直接寫在FB內(nèi)部這樣換對象時改FB即可。但如果你想在運行時通過HMI或監(jiān)控表調(diào)參數(shù)建議把它們提升為VAR_IN_OUT或者放到全局數(shù)據(jù)塊里。緩沖長度為什么是50因為采樣周期0.5秒50個元素對應(yīng)25秒的最大滯后。默認滯后時間只有5秒留了很大余量。如果模擬大滯后管道混合過程可以用滿這個緩沖。首次調(diào)用時y_Last和buf_Delay里全是0所以模型啟動時過程值從0開始。如果在真實場景里希望從某個穩(wěn)定工作點開始仿真可以先讓PID手動給一個固定開度讓模型自己爬升到穩(wěn)態(tài)再切入自動模式。3.4 讓模型更真實非線性、噪聲與擾動基礎(chǔ)模型畢竟太干凈真實過程沒這么“聽話”。我后來給模型加了三個增強功能讓仿真效果更貼近現(xiàn)場。第一個是閥門死區(qū)。真實氣動閥門往往存在死區(qū)比如PID輸出從30%變到32%執(zhí)行機構(gòu)紋絲不動要超過某個閾值閥門才會動。我在模型里加入了一個死區(qū)判斷如果u_Cmd的變化量小于某個死區(qū)值模型輸入保持原值不變。這樣你能直觀感受到死區(qū)對控制精度的影響也會理解為什么現(xiàn)場PID總要加一點積分來消除靜差。第二個是量測噪聲。我把y_PV在反饋給PID之前疊加一個隨機小量模擬變送器的噪聲。這樣你會看到微分作用太強時PID輸出會跟著噪聲劇烈抖動。沒有噪聲的仿真是學(xué)不會“微分怎么用”的。第三個是負載擾動。在模型反饋通道里可以周期性疊加一個階躍擾動模擬突然打開冷料閥門、負載變大等場景。這主要用于測試PID的抗擾動能力看看在擾動出現(xiàn)后系統(tǒng)能不能快速恢復(fù)設(shè)定值。這三個增強功能都在FB里通過幾個開關(guān)變量控制默認關(guān)閉需要時打開。這樣一來同一個程序既適合初學(xué)者跑理想曲線也能模擬現(xiàn)場那些臟亂差的真實工況。4. 實操全過程從組態(tài)到整定完畢的完整記錄4.1 硬件和軟件準(zhǔn)備清單先說硬件。標(biāo)題里說“只需一個PLC實物”這話不假。我在辦公室用一臺S7-1200 CPU和一個24V開關(guān)電源就能跑起來連模擬量模塊都不用插。具體清單一臺S7-1200或S7-1500 CPU1200的話隨便一款都行比如CPU 1214C DC/DC/DC24V直流電源一個給CPU供電筆記本電腦一臺裝好TIA Portal網(wǎng)線一根用于PC和PLC通信如果CPU沒有集成PN口需要額外配通信模塊但1200和1500基本都有集成網(wǎng)口所以問題不大軟件方面我用的是TIA Portal V16。V15.1以上都可以但V14及以下版本對PID_Compact V3支持不太好建議至少V15.1起步。S7-1200的固件版本建議V4.4以上1500建議V2.5以上。整個接線過程不超過五分鐘電源24V接CPU的L和M電腦網(wǎng)線插CPU的PN口設(shè)置電腦IP地址與PLC同一網(wǎng)段建立在線連接完事。4.2 項目組態(tài)與程序調(diào)用步驟新建一個TIA項目添加設(shè)備時選擇你手里那臺PLC的具體型號和固件版本然后進入項目視圖。第一步是在程序塊里添加一個循環(huán)中斷OB。我建的是OB30設(shè)置周期為500毫秒。注意這里不能偷懶把仿真代碼放在OB1里因為OB1的掃描周期不固定會影響離散模型的精度PID會不穩(wěn)。第二步在OB30里調(diào)用PID_Compact V3。從右側(cè)指令樹里找到“工藝對象 → PID控制 → PID_Compact V3”拖進OB30會提示生成背景數(shù)據(jù)塊確認就行。然后把PID_Compact的輸出和輸入接好Setpoint引腳連DB里的設(shè)定值變量Input引腳連FB_Virtual_Temp的y_PVOutput引腳連FB_Virtual_Temp的u_Cmd。第三步添加FB_Virtual_Temp。直接把我上面的SCL代碼復(fù)制到新建的FB里編譯通過然后拖到OB30中PID_Compact后面調(diào)用。先調(diào)用PID還是先調(diào)用FB都行但OB30整體執(zhí)行順序要保持一致我習(xí)慣先算PID再更新模型這樣一拍內(nèi)邏輯沒有死鎖。第四步創(chuàng)建一個全局數(shù)據(jù)塊DB_Ctrl里面放設(shè)定值SP、PID手動/自動切換標(biāo)志、PID參數(shù)中轉(zhuǎn)變量P、I、D、以及模型參數(shù)中轉(zhuǎn)變量。這個DB就是你和仿真程序交互的操作面板。第五步編譯下載。把項目下載到PLC之前建議先讓PLCSIM跑一遍驗證邏輯沒問題再下載到實物PLC。不過要說明如果用PLCSIM跑PID_Compact V3有些工藝對象的在線調(diào)試面板功能會受限所以我的習(xí)慣是直接用實物PLC調(diào)試反正硬件成本已經(jīng)很低了。4.3 開環(huán)階躍測試先把對象“性格”摸清拿到一個仿真對象別急著上PID自動模式。我習(xí)慣先做一次開環(huán)階躍測試確認模型參數(shù)和自己預(yù)期一致。操作方法把PID_Compact切到手動模式直接把操縱變量輸出設(shè)為50%相當(dāng)于手動把執(zhí)行器開到半開然后在線監(jiān)視虛擬對象FB的輸出y_PV。因為模型初始值從0開始階躍后PV會慢慢爬升理論上最終穩(wěn)定在K乘以50%也就是1.5×5075。我在監(jiān)控表里看到PV從0開始爬大約三個時間常數(shù)即90秒后接近75中間還有5秒的純滯后延遲。這說明模型參數(shù)和代碼邏輯都正常。如果你發(fā)現(xiàn)階躍后PV完全不動或者瞬間跳到一個離譜的值那肯定不是模型參數(shù)的問題而是OB30沒有真正調(diào)用FB或者FB里的采樣周期和OB30不一致。這些問題我放到第五部分詳細講。開環(huán)階躍是PID整定的第一步它能幫你看清對象的K、T、τ大概是多少。這組數(shù)據(jù)在后面計算PID參數(shù)時有很大參考價值。4.4 臨界比例度法整定過程實錄模型確認正常后我開始做閉環(huán)整定。為了演示完整過程我把對象參數(shù)設(shè)成一組典型值K1.5T30秒τ5秒采樣周期500毫秒。設(shè)定值SP設(shè)為60。第一步設(shè)純比例控制。把PID_Compact的I和D全部清零P先給一個很小的值比如0.5。投自動模式觀察過程值PV的響應(yīng)。應(yīng)該看到PV緩慢上升最終穩(wěn)定在某個低于60的值這就是比例控制特有的余差。P越大余差越小但太大會震蕩。第二步逐漸加大P找臨界狀態(tài)。我用監(jiān)控表在線修改P從0.5開始每次增加0.5觀察PV是否有等幅振蕩。逼近臨界時我放慢腳步每次只加0.2。最后當(dāng)P加到6.0左右時PV出現(xiàn)了持續(xù)的等幅振蕩不再衰減也不再發(fā)散振蕩周期目測在24秒左右。記錄下臨界增益Ku為6.0臨界振蕩周期Tu為24秒。這里有個很重要的細節(jié)在仿真模式下你很容易判斷“等幅振蕩”是否穩(wěn)定因為曲線毫無噪聲干擾振幅不增不減就是臨界點。在真實設(shè)備上臨界點附近曲線會受擾動影響很難抓準(zhǔn)。這也正是仿真整定的優(yōu)勢之一。第三步按齊格勒-尼科爾斯經(jīng)驗公式計算PID參數(shù)。經(jīng)典公式是Kp 0.45 * Ku 2.7 Ti 0.5 * Tu 12秒 Td 0.125 * Tu 3秒填進去之后投自動我看到的曲線超調(diào)量大約12%系統(tǒng)在約60秒后穩(wěn)定在60。這個結(jié)果對絕大多數(shù)過程是可用的但離“漂亮曲線”還差一點。第四步微調(diào)。我習(xí)慣把Kp稍微降低給Ti加長一點減小超調(diào)。最終我用Kp2.4、Ti14秒、Td2.5秒跑了一版超調(diào)量降到7%穩(wěn)定時間約50秒曲線明顯順滑。4.5 自動整定PID_Compact自帶的“一鍵整定”PID_Compact V3內(nèi)置了自動整定功能在仿真環(huán)境下也能用。操作很簡單在在線調(diào)試面板把PID_Compact切到自動模式然后點擊“整定”按鈕填一個期望的“整定區(qū)間”讓它自動掃頻測試。過程中它會自己改變操縱變量觀察過程響應(yīng)最后把算好的P、I、D參數(shù)寫回參數(shù)表。我在這個仿真對象上試了一次自動整定它給出的結(jié)果是Kp≈2.9、Ti≈13秒、Td≈2秒和手動整定最終結(jié)果比較接近超調(diào)略大一點但響應(yīng)更快。如果在真實項目里沒有參數(shù)參考自動整定給出初始參數(shù)再手工微調(diào)效率會比我上面那種純手動臨界整定高不少。自動整定適合有經(jīng)驗的人快速出初值也適合新手直接看效果。但我要提醒一點自動整定的前提是仿真模型本身沒有明顯非線性。如果我把閥門死區(qū)打開自動整定結(jié)果會變差因為它基于線性模型做激勵測試。這種情況建議關(guān)閉增強功能再整定整定完再把非線性打開驗證魯棒性。4.6 沒有HMI也能調(diào)監(jiān)控表與調(diào)試面板很多朋友問我沒觸摸屏怎么在線改PID參數(shù)答案是TIA Portal的監(jiān)控表和PID調(diào)試面板就夠用了。打開監(jiān)控表把PID參數(shù)中轉(zhuǎn)變量SP、Kp、Ti、Td加到表里在線監(jiān)視后可以直接在“修改值”那一列輸入新數(shù)字點擊“修改所有值”按鈕寫入。整個仿真調(diào)試過程中我基本都是用監(jiān)控表改設(shè)定值和參數(shù)完全不需要HMI。如果想看曲線打開PID_Compact的調(diào)試面板里面有趨勢圖可以直接顯示SP、PV和Y的歷史曲線。這個調(diào)試面板在仿真模式下可用而且比外接HMI更專業(yè)——它有縮放、游標(biāo)、曲線對比功能看臨界振蕩周期非常方便。我經(jīng)常用這套組合監(jiān)控表改參數(shù)調(diào)試面板看趨勢兩個窗口并排放在桌面上。效果比在現(xiàn)場盯著觸摸屏上的歷史趨勢好很多倍。5. 調(diào)試過程中的常見坑與排查技巧5.1 現(xiàn)象PID輸出到頂了PV卻紋絲不動這個問題在仿真里也會遇到。我排查過幾次原因基本就三類。第一類是模型FB沒有被OB30周期性調(diào)用。有次我把FB調(diào)用邏輯臨時從OB30移到了OB1結(jié)果PID在OB30計算了模型卻在OB1里隨機掃描采樣周期完全對不上輸出看起來就是“卡死”的。解決辦法確認OB30里同時調(diào)用了PID和FB而且OB30的周期與FB的Ts_Obj一致。第二類是緩沖延遲太長。我把緩沖區(qū)從50改成200滯后時間達到了100秒。PV的變化要在100秒后才顯現(xiàn)非常容易誤判成“模型不動”。解決辦法就是根據(jù)實際τ/Ts選擇合理的緩沖區(qū)長度別盲目加大。第三類是參數(shù)設(shè)計不合理。比如K0.1時間常數(shù)T300秒PID輸出從0變到100PV最終穩(wěn)態(tài)變化只有10爬得非常慢。這種情況在圖上看起來就像PV沒動。解決辦法是認清模型參數(shù)的量綱讓K、T、τ和PID輸出范圍匹配。通常我建議把輸出范圍定為0~100K設(shè)定在0.5~3之間T設(shè)成幾十秒仿真效果最好。5.2 現(xiàn)象系統(tǒng)一直震蕩振幅忽大忽小能跑出持續(xù)震蕩說明控制回路已經(jīng)接近臨界狀態(tài)。如果振幅在增大發(fā)散了多半是P過大或者I過小。我習(xí)慣先看震蕩周期。如果周期很短、頻率很高通常是P過大的純比例震蕩此時把Kp降低20%~30%試試。如果周期較長、每次都有明顯余差累積通常是I太強把Ti加到原來的1.5倍再看。還有一種情況容易被忽略采樣周期和對象時間常數(shù)不匹配。如果Ts相對T太大離散化誤差會讓控制效果明顯惡化。比如T2秒你偏要設(shè)OB30周期為1秒這個比例就很尷尬。一般建議Ts不超過T的十分之一最好在T的1/20~1/100之間。我的例子T30秒Ts0.5秒比例是1/60非常安全。仿真環(huán)境下震蕩調(diào)參有個優(yōu)勢你可以在線修改參數(shù)立即看效果而且模型每次運行都從相同初始狀態(tài)開始容易對比。我自己的習(xí)慣是每次修改參數(shù)前先讓系統(tǒng)回到初始狀態(tài)再啟動保證對比公平。5.3 現(xiàn)象1200上整定的參數(shù)搬到1500曲線對不上有次我把1200上調(diào)好的整套參數(shù)復(fù)制到1500項目里下載運行后曲線竟然有肉眼可見的偏差。后來分析出幾個原因。第一個是OB30的實際循環(huán)周期有偏差。1200和1500雖然都設(shè)成500毫秒但實際節(jié)拍受CPU負載、通信任務(wù)影響略有不同。如果程序里還有其他中斷任務(wù)占用CPU時間PID的計算周期會發(fā)生抖動響應(yīng)自然有差異。第二個是浮點運算精度差異。1500的浮點處理性能比1200強同樣的差分方程迭代幾百次后累計誤差略有差別。對于大多工程應(yīng)用這個差別可以忽略但在臨界狀態(tài)附近它會改變震蕩表現(xiàn)。第三個是背景數(shù)據(jù)塊的初始化差異。如果PID_Compact的背景DB里保留了原PLC下載時的積分預(yù)置值切換平臺后這些舊狀態(tài)會影響第一拍的輸出。解決辦法是跨平臺遷移后不要只搬參數(shù)把模型對象參數(shù)也核對一遍必要時重新跑一次自動整定作為基準(zhǔn)。仿真程序的參數(shù)本身就是參考值真正的目標(biāo)是在目標(biāo)平臺上獲得合格的響應(yīng)曲線。5.4 現(xiàn)象自動整定失敗或超時自動整定依賴對被控對象施加激勵并觀察響應(yīng)。仿真環(huán)境里失敗原因有幾類。如果SP和過程值已經(jīng)非常接近自動整定找不到明顯的動態(tài)響應(yīng)信號就容易判為失敗。辦法是把SP設(shè)得離當(dāng)前PV遠一點比如當(dāng)前PV穩(wěn)定在20直接把SP改到70制造一個大的設(shè)定值階躍再觸發(fā)整定。另一個常見原因是我開了閥門死區(qū)增強。有死區(qū)時PID輸出小幅變化被死區(qū)吸收模型響應(yīng)不明顯自動整定算法會誤判對象無反應(yīng)。解決辦法是整定前把非線性增強全部關(guān)掉整定完再打開驗證。還有一種是緩沖太長導(dǎo)致模型響應(yīng)延遲太明顯自動整定算法計算純滯后超時。此時適當(dāng)調(diào)小滯后或加大緩沖區(qū)寫入速度即縮短等效滯后周期讓整定工具覺得對象沒那么磨蹭。5.5 仿真環(huán)境避坑建議把這段時間踩過的坑總結(jié)成幾條經(jīng)驗直接在項目里規(guī)避一是模型參數(shù)要跟采樣周期匹配OB30周期改了FB里的Ts_Obj一定要同步改否則差分方程比例失真。二是緩沖長度必須能夠覆蓋最大滯后時間但不要無腦設(shè)大否則你看不到實時響應(yīng)還以為系統(tǒng)壞了。三是不要PID輸出限幅設(shè)成超出模型范圍。模型u_Cmd設(shè)計輸入是0~100如果你把PID輸出上限設(shè)成10000模型會算出天文數(shù)字PV瞬間爆表。仿真是為了貼近真實限幅也按真實執(zhí)行機構(gòu)來設(shè)。四是中斷OB執(zhí)行時間要盡量短。虛擬對象FB雖然運算量小但如果你在OB30里塞了兩個PID加三個模型CPU負載可能上來導(dǎo)致周期抖動。復(fù)雜度高了就多開幾個不同周期的中斷OB分任務(wù)。五是保留版本記錄。調(diào)參調(diào)到自己滿意的關(guān)鍵節(jié)點把PLC程序歸檔保存后面調(diào)亂了一鍵恢復(fù)非常省事。6. 從仿真到實物最后一步怎么落地6.1 把仿真參數(shù)映射到真實對象仿真程序最終目的還是服務(wù)于現(xiàn)場。你在仿真里識別出的K、T、τ參數(shù)在現(xiàn)場用階躍響應(yīng)法重新測一遍開環(huán)給執(zhí)行器一個階躍記錄被控量變化曲線用切線法、兩點法算出實際K、T、τ。如果現(xiàn)場對象的物理特性跟仿真模型接近那仿真里整定好的PID參數(shù)可以直接作為初始值填入實際PID回路然后根據(jù)現(xiàn)場曲線微調(diào)。這樣操作現(xiàn)場投入自動的時間能縮短一大半。如果現(xiàn)場對象明顯不一樣比如溫度滯后比仿真大很多那仿真結(jié)果只能給你一個大概方向需要在現(xiàn)場重新做臨界整定。不過因為你在仿真里已經(jīng)把PID的整定思路練熟了到了現(xiàn)場不至于靠瞎試碰運氣。我在實際項目里用過一種更取巧的流程先把現(xiàn)場實際對象的K、T、τ測出來回到辦公室把這組參數(shù)填進仿真程序然后針對這個“現(xiàn)場參數(shù)版虛擬對象”花幾十分鐘把PID參數(shù)整定好最后帶著這組參數(shù)到現(xiàn)場直接用。大多數(shù)時候直接就能投自動頂多小范圍微調(diào)。6.2 仿真練出來的手感在現(xiàn)場真的很管用說白了PID調(diào)試這種技能一半靠理論一半靠手感。手感怎么來只能靠大量看曲線、調(diào)參數(shù)、觀察變化的循環(huán)訓(xùn)練。在虛擬對象上反復(fù)折騰積攢的“場景經(jīng)驗庫”會讓你在現(xiàn)場處理問題時快得多。比如你見過溫度對象在臨界增益下的震蕩長什么樣現(xiàn)場一眼就能判斷“這是P太大了趕緊降15%”。再比如你在仿真里試過微分對噪聲的放大效應(yīng)現(xiàn)場看到執(zhí)行器頻繁抖動的曲線就知道是微分項設(shè)置得太敏感。這個設(shè)備不是必需品但一定是高效的學(xué)習(xí)和調(diào)試工具。有錢有條件的團隊當(dāng)然可以買一套小型實驗裝置那更逼真但很多工程師手頭只有一塊PLC這套純軟件閉環(huán)仿真就是最省成本、最容易復(fù)現(xiàn)的替代方案。最后再分享一個小技巧。我習(xí)慣在仿真程序里保留一組“出廠設(shè)置”參數(shù)也就是臨界整定的規(guī)范化結(jié)果放到注釋里旁邊再留一個“現(xiàn)場實測”區(qū)域。每次換真實對象調(diào)參就把現(xiàn)場參數(shù)記在這個區(qū)域和出廠值對比。時間長了你會發(fā)現(xiàn)不同對象的參數(shù)規(guī)律其實非常清晰慢慢就能總結(jié)出屬于自己的一套整定經(jīng)驗。這就是仿真程序帶給我的額外價值。