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