子PID塊FB58源程序深度解析:從調(diào)用黑匣子到看懂每一行)
簡(jiǎn)介這份資源是西門(mén)子S7系列PLC中PID功能塊FB58的源程序包面向工業(yè)自動(dòng)化領(lǐng)域的PLC編程人員、過(guò)程控制工程師及自動(dòng)化專(zhuān)業(yè)學(xué)習(xí)者用于解決溫度、壓力、流量等過(guò)程控制中PID算法實(shí)現(xiàn)與參數(shù)整定的問(wèn)題。壓縮包共3個(gè)文件約1.04MB包含一份PDF技術(shù)文檔、一份TXT補(bǔ)充說(shuō)明和一份C語(yǔ)言源文件分別對(duì)應(yīng)原理講解、使用備注與算法代碼實(shí)現(xiàn)便于對(duì)照理解FB58的內(nèi)部邏輯。資源重點(diǎn)圍繞PID自整定展開(kāi)涵蓋比例、積分、微分三部分的增益調(diào)節(jié)思路以及搜索與優(yōu)化兩階段的自整定過(guò)程讀者可借此掌握FB58的參數(shù)設(shè)置、階躍響應(yīng)分析與自定義配置方法。目前已有1751人學(xué)習(xí)下載適合希望深入理解西門(mén)子PID控制邏輯、提升過(guò)程控制精度與調(diào)試能力的工程師參考使用。1. 西門(mén)子PID塊FB58源程序從調(diào)用黑匣子到看懂每一行很多做過(guò)程控制的朋友第一次在博途或STEP 7里拖出FB58時(shí)心里其實(shí)是沒(méi)底的。它不像自己手寫(xiě)一段PID那樣每一行都看得見(jiàn)調(diào)用起來(lái)只要填幾個(gè)引腳剩下的全在背景數(shù)據(jù)塊里跑。溫度、壓力、流量這些慢過(guò)程用它確實(shí)穩(wěn)但一旦超調(diào)、振蕩或者輸出不動(dòng)翻遍在線(xiàn)幫助也未必找得到原因。FB58是西門(mén)子為連續(xù)過(guò)程控制提供的標(biāo)準(zhǔn)PID功能塊支持帶自整定、死區(qū)、前饋和手自動(dòng)無(wú)擾切換源程序的意義就在于把這些封裝邏輯攤開(kāi)讓你知道每個(gè)參數(shù)到底作用在哪一步。這篇文章面向已經(jīng)會(huì)用PID但被FB58坑過(guò)的電氣和自控工程師從塊結(jié)構(gòu)、參數(shù)含義、調(diào)用步驟一路講到整定和排錯(cuò)目標(biāo)是你照著能復(fù)現(xiàn)一個(gè)可用的回路也能在出問(wèn)題時(shí)知道去哪一行找答案。2. FB58的塊結(jié)構(gòu)與參數(shù)體系先搞清楚它在算什么2.1 從源程序看FB58的輸入輸出分區(qū)FB58的源程序通常以STL或SCL形式存在打開(kāi)后第一眼不要急著看算法先按區(qū)域把引腳分清楚。它大致分成四組設(shè)定值與過(guò)程值輸入、PID參數(shù)、輸出與手自動(dòng)控制、報(bào)警與狀態(tài)。源程序里這些引腳不是隨便排的順序基本對(duì)應(yīng)內(nèi)部運(yùn)算的先后。比如SP_INT和PV_IN進(jìn)來(lái)后先做量程轉(zhuǎn)換和濾波再進(jìn)偏差計(jì)算最后才輪到PID運(yùn)算和輸出限幅。你如果連輸入?yún)^(qū)都沒(méi)分清調(diào)參就是盲調(diào)。常見(jiàn)做法是先把源程序里所有以_IN結(jié)尾的輸入、以_OUT結(jié)尾的輸出、以及_PAR類(lèi)參數(shù)各抄一張表。下面這段SCL片段是FB58內(nèi)部偏差和積分分離的典型寫(xiě)法不是原廠源碼但結(jié)構(gòu)一致方便你對(duì)照理解// 偏差計(jì)算與死區(qū)處理 IF PV_PER_ON THEN PV PV_PER * 100.0 / 27648.0; // 外設(shè)輸入歸一化到0-100% ELSE PV PV_IN; END_IF; ERR SP_INT - PV; // 原始偏差 IF ABS(ERR) DEADB_W THEN ERR 0.0; // 死區(qū)防止小偏差引起輸出抖動(dòng) END_IF; // 積分分離偏差大時(shí)先不積分避免超調(diào) IF ABS(ERR) INT_HOLD_LIM THEN I_ACTIVE FALSE; ELSE I_ACTIVE TRUE; END_IF;邏輯說(shuō)明PV_PER_ON決定過(guò)程值是來(lái)自外設(shè)通道還是浮點(diǎn)輸入歸一化系數(shù)27648對(duì)應(yīng)西門(mén)子模擬量滿(mǎn)量程。DEAD_B_W是死區(qū)寬度單位與PV一致。INT_HOLD_LIM是積分分離閾值偏差超過(guò)它時(shí)積分項(xiàng)暫停這是FB58抑制大偏差超調(diào)的關(guān)鍵機(jī)制。參數(shù)說(shuō)明PV_PER是外設(shè)輸入字PV_IN是浮點(diǎn)過(guò)程值SP_INT是內(nèi)部設(shè)定值DEAD_B_W一般設(shè)量程的0.5%到2%INT_HOLD_LIM設(shè)量程的5%到10%。2.2 PID三項(xiàng)在源程序里的實(shí)現(xiàn)順序與限幅位置FB58內(nèi)部運(yùn)算順序是比例、積分、微分但輸出限幅和抗積分飽和的位置比順序更重要。源程序里通常先算P項(xiàng)和D項(xiàng)再算I項(xiàng)最后三項(xiàng)相加后做上下限幅同時(shí)把限幅后的差值反饋回去修正積分器。這個(gè)反饋路徑就是抗積分飽和的核心。如果你自己手寫(xiě)PID最容易漏的就是這一步結(jié)果就是設(shè)定值階躍后輸出頂在限幅上半天回不來(lái)。在源程序里找積分器更新那幾行通常會(huì)看到類(lèi)似I_TERM I_TERM GAIN * T_S / T_I * ERR的寫(xiě)法緊接著就是限幅判斷。T_S是采樣時(shí)間必須和OB35或循環(huán)中斷的周期一致否則積分和微分的時(shí)間尺度全錯(cuò)。我一般會(huì)在調(diào)用FB58前先確認(rèn)OB35周期再把這個(gè)值填到CYCLE引腳而不是用默認(rèn)值。2.3 手自動(dòng)切換在源程序里是怎么做到無(wú)擾的無(wú)擾切換是FB58比很多自制PID強(qiáng)的地方。源程序里手動(dòng)模式時(shí)積分器不是停止而是被強(qiáng)制跟蹤手動(dòng)輸出值這樣切回自動(dòng)的瞬間偏差為零輸出不會(huì)跳。具體實(shí)現(xiàn)通常是手動(dòng)時(shí)I_TERM MAN_OUT - P_TERM - D_TERM自動(dòng)時(shí)恢復(fù)正常積分。你如果發(fā)現(xiàn)切自動(dòng)時(shí)閥門(mén)猛動(dòng)一下八成是積分器沒(méi)跟蹤或者跟蹤使能位沒(méi)置對(duì)。調(diào)用時(shí)對(duì)應(yīng)的是MAN_ON和MAN兩個(gè)引腳MAN_ON為T(mén)RUE時(shí)進(jìn)入手動(dòng)MAN給手動(dòng)輸出值。注意MAN的量程要和輸出量程一致源程序里不會(huì)幫你做二次轉(zhuǎn)換。有些現(xiàn)場(chǎng)把MAN當(dāng)百分比給但輸出是0到27648的整數(shù)結(jié)果就是手動(dòng)時(shí)閥門(mén)只開(kāi)一點(diǎn)點(diǎn)切自動(dòng)后直接沖上去。3. 在STEP 7里調(diào)用FB58從建背景塊到跑通第一個(gè)回路3.1 生成背景數(shù)據(jù)塊并綁定循環(huán)中斷FB58是功能塊必須配一個(gè)背景數(shù)據(jù)塊。在STEP 7里插入FB58后系統(tǒng)會(huì)提示生成DB命名建議帶回路號(hào)比如DB100_TIC101。生成后不要急著寫(xiě)程序先把OB35的周期定下來(lái)。溫度回路一般500ms到1s流量回路可以200ms到500ms。周期越短微分項(xiàng)對(duì)噪聲越敏感所以流量回路往往要把D項(xiàng)關(guān)掉或加濾波。// OB35中調(diào)用FB58的典型STL寫(xiě)法 CALL FB 58, DB100_TIC101 SP_INT : MD200 // 內(nèi)部設(shè)定值浮點(diǎn) PV_IN : MD204 // 過(guò)程值浮點(diǎn) PV_PER : PIW256 // 外設(shè)輸入可選 MAN_ON : M10.0 // 手動(dòng)使能 MAN : MD208 // 手動(dòng)輸出值 GAIN : 2.0 // 比例增益 T_I : TD300 // 積分時(shí)間秒 T_D : TD304 // 微分時(shí)間秒 CYCLE : T#500MS // 采樣周期與OB35一致 LMN_HLM: 100.0 // 輸出上限% LMN_LLM: 0.0 // 輸出下限% LMN : MD212 // 輸出值 LMN_PER: PQW256 // 外設(shè)輸出 QLMN_HLM: M20.0 // 上限報(bào)警 QLMN_LLM: M20.1 // 下限報(bào)警邏輯說(shuō)明CALL FB 58后面跟背景DB號(hào)每個(gè)引腳按實(shí)際地址填。SP_INT和PV_IN用浮點(diǎn)PV_PER和LMN_PER用外設(shè)地址兩者選其一即可。CYCLE必須和OB35周期一致否則時(shí)間參數(shù)全亂。參數(shù)說(shuō)明GAIN是比例增益T_I和T_D單位是秒LMN_HLM和LMN_LLM是輸出限幅QLMN_HLM和QLMN_LLM是到達(dá)限幅時(shí)的報(bào)警位。3.2 量程轉(zhuǎn)換與PV_PER的歸一化處理如果過(guò)程值走模擬量輸入PV_PER是0到27648的整數(shù)。FB58內(nèi)部會(huì)按PV_FAC和PV_OFF做線(xiàn)性變換公式是PV PV_PER * PV_FAC PV_OFF。很多人只填PV_PER不填PV_FAC結(jié)果PV一直是0到27648偏差大得離譜輸出直接頂死。正確做法是PV_FAC設(shè)量程上限除以27648PV_OFF設(shè)量程下限。比如變送器4到20mA對(duì)應(yīng)0到100度PV_FAC就是100/27648PV_OFF是0。如果是-50到150度PV_FAC是200/27648PV_OFF是-50。這兩個(gè)參數(shù)在源程序里參與的是最前面的歸一化填錯(cuò)后面全錯(cuò)。我一般會(huì)在變量表里單獨(dú)建兩個(gè)浮點(diǎn)變量存這兩個(gè)系數(shù)方便在線(xiàn)修改。3.3 輸出限幅與手動(dòng)值的量程對(duì)齊輸出側(cè)同理LMN是浮點(diǎn)百分比LMN_PER是外設(shè)整數(shù)。如果閥門(mén)走模擬量輸出LMN_PER會(huì)按LMN_PER LMN * 27648 / 100轉(zhuǎn)換。但前提是LMN_HLM和LMN_LLM設(shè)成0和100。如果你把LMN_HLM設(shè)成50那輸出最大只到50%對(duì)應(yīng)外設(shè)值13824。手動(dòng)值MAN也要按這個(gè)量程給否則切自動(dòng)時(shí)會(huì)有跳變。現(xiàn)場(chǎng)調(diào)試時(shí)我習(xí)慣先把MAN_ON置TRUE手動(dòng)給幾個(gè)值看閥門(mén)動(dòng)作是否線(xiàn)性再切自動(dòng)。切之前把SP_INT設(shè)成當(dāng)前PV值這樣偏差為零切換瞬間輸出不會(huì)動(dòng)。等穩(wěn)定后再慢慢改設(shè)定值觀察超調(diào)和振蕩。4. 參數(shù)整定與自整定FB58的調(diào)參順序和邊界4.1 先比例后積分再微分的實(shí)操順序FB58支持自整定但自整定不是萬(wàn)能的尤其是大滯后對(duì)象。我一般先手動(dòng)粗調(diào)T_I設(shè)很大T_D設(shè)0GAIN從小往大加直到輸出開(kāi)始等幅振蕩記下臨界增益和周期再按經(jīng)驗(yàn)公式折算出GAIN、T_I、T_D。溫度回路T_I通常在幾十秒到幾百秒流量回路T_I在幾秒到幾十秒。T_D一般取T_I的1/4到1/8噪聲大的場(chǎng)合直接關(guān)掉。源程序里GAIN、T_I、T_D是直接參與運(yùn)算的沒(méi)有隱藏系數(shù)。你改多少就是多少不像有些塊內(nèi)部還乘個(gè)0.1。所以調(diào)參時(shí)心里要有數(shù)GAIN給10和給1差別巨大。我見(jiàn)過(guò)有人把GAIN給到100輸出直接方波振蕩還以為是塊壞了。4.2 自整定啟動(dòng)條件與常見(jiàn)失敗原因FB58的自整定通過(guò)START引腳觸發(fā)但有幾個(gè)前提回路必須處于自動(dòng)、輸出不能限幅、偏差要足夠小。如果PV和SP差太遠(yuǎn)自整定會(huì)等很久甚至報(bào)錯(cuò)。常見(jiàn)失敗原因是輸出到了限幅自整定算法認(rèn)為對(duì)象不可控就退出。所以啟動(dòng)前先把SP設(shè)到當(dāng)前PV附近手動(dòng)把輸出穩(wěn)在一個(gè)中間值再切自動(dòng)并啟動(dòng)自整定。自整定過(guò)程中不要改任何參數(shù)也不要切手動(dòng)。整定完成后GAIN、T_I、T_D會(huì)被自動(dòng)寫(xiě)入你可以對(duì)比整定前后的值。如果整定結(jié)果GAIN特別小、T_I特別大說(shuō)明對(duì)象響應(yīng)太慢或者測(cè)量有滯后這時(shí)候要考慮是不是傳感器安裝位置不對(duì)而不是繼續(xù)調(diào)PID。4.3 死區(qū)、濾波與微分項(xiàng)的配合FB58的DEAD_B_W死區(qū)能抑制小偏差下的輸出抖動(dòng)但設(shè)太大會(huì)導(dǎo)致穩(wěn)態(tài)誤差。一般設(shè)量程的0.5%到1%。PV_FILT是過(guò)程值一階濾波時(shí)間常數(shù)流量和壓力信號(hào)噪聲大時(shí)設(shè)1到5秒溫度可以設(shè)0。微分項(xiàng)對(duì)噪聲最敏感如果PV_FILT開(kāi)了T_D可以適當(dāng)保留如果沒(méi)開(kāi)濾波T_D最好關(guān)掉。源程序里濾波和死區(qū)的順序是先濾波再算偏差所以濾波時(shí)間會(huì)影響相位滯后。T_D本身也引入超前兩者要配合。我一般先不加濾波調(diào)好PI再看噪聲情況決定是否加濾波和D。加了濾波后GAIN可以適當(dāng)加大因?yàn)樵肼暠粔鹤×恕?. 避坑與排查FB58現(xiàn)場(chǎng)翻車(chē)的五個(gè)典型場(chǎng)景5.1 輸出不動(dòng)或一直頂在限幅現(xiàn)象自動(dòng)模式下LMN始終為0或100閥門(mén)沒(méi)反應(yīng)。原因PV_FAC或PV_OFF填錯(cuò)導(dǎo)致PV遠(yuǎn)大于或遠(yuǎn)小于SP偏差始終一個(gè)方向。解決在線(xiàn)監(jiān)控PV和SP的實(shí)際值確認(rèn)量程轉(zhuǎn)換正確。如果PV_PER有值但PV為0檢查PV_FAC是否漏填。5.2 切自動(dòng)瞬間輸出跳變現(xiàn)象手動(dòng)切自動(dòng)時(shí)閥門(mén)猛動(dòng)。原因積分器未跟蹤手動(dòng)輸出或者M(jìn)AN量程與輸出量程不一致。解決確認(rèn)MAN_ON為T(mén)RUE時(shí)積分器跟蹤邏輯生效檢查MAN值是否按0到100給。源程序里跟蹤是自動(dòng)的但前提是MAN_ON正確置位。5.3 自整定報(bào)錯(cuò)或長(zhǎng)時(shí)間不結(jié)束現(xiàn)象START置位后自整定不完成或報(bào)錯(cuò)退出。原因輸出限幅、偏差過(guò)大、過(guò)程值波動(dòng)。解決先把SP設(shè)到PV附近手動(dòng)穩(wěn)定輸出再啟動(dòng)自整定。檢查L(zhǎng)MN_HLM和LMN_LLM是否設(shè)得太窄導(dǎo)致自整定過(guò)程中輸出受限。5.4 穩(wěn)態(tài)下輸出周期性波動(dòng)現(xiàn)象PV穩(wěn)定但LMN來(lái)回?cái)[動(dòng)。原因GAIN太大、T_I太小、死區(qū)太小、微分噪聲。解決先加大T_I再減小GAIN適當(dāng)加死區(qū)或PV_FILT。如果波動(dòng)周期和采樣周期接近可能是CYCLE設(shè)錯(cuò)檢查OB35周期。5.5 手自動(dòng)切換后積分飽和現(xiàn)象手動(dòng)時(shí)輸出頂在限幅切自動(dòng)后很久才回落。原因手動(dòng)期間積分器沒(méi)有跟蹤或者跟蹤被禁用。解決確認(rèn)MAN_ON為T(mén)RUE時(shí)I_TERM被強(qiáng)制賦值源程序里這部分邏輯通常在手動(dòng)分支里。如果自己改過(guò)源程序檢查跟蹤那幾行是否被注釋掉。6. 把FB58源程序當(dāng)模板改一個(gè)自己的PID塊FB58源程序最大的價(jià)值不是讓你照抄而是讓你看清一個(gè)工業(yè)級(jí)PID該有哪些東西。我后來(lái)自己寫(xiě)PID塊時(shí)基本按它的結(jié)構(gòu)來(lái)輸入歸一化、濾波、死區(qū)、偏差計(jì)算、積分分離、P/I/D三項(xiàng)、輸出限幅、抗積分飽和、手自動(dòng)無(wú)擾切換、報(bào)警。少任何一項(xiàng)現(xiàn)場(chǎng)都可能出問(wèn)題。如果你想基于FB58改一個(gè)適合自己對(duì)象的塊建議先做減法把用不到的前饋、報(bào)警、自整定去掉保留核心的PID和手自動(dòng)。然后用一個(gè)一階慣性對(duì)象做仿真階躍響應(yīng)看超調(diào)和調(diào)節(jié)時(shí)間。仿真通過(guò)后再下到現(xiàn)場(chǎng)先用MAN_ON手動(dòng)模式驗(yàn)證輸出通道再切自動(dòng)小步調(diào)參。一個(gè)具體技巧是在源程序里把積分器單獨(dú)拉一個(gè)靜態(tài)變量出來(lái)在線(xiàn)監(jiān)控它的值。正常穩(wěn)態(tài)時(shí)積分器應(yīng)該穩(wěn)定在一個(gè)值附近如果它一直在爬說(shuō)明輸出沒(méi)到穩(wěn)態(tài)或者有持續(xù)偏差。這個(gè)變量比LMN更早暴露問(wèn)題。我現(xiàn)在的習(xí)慣是每個(gè)PID回路都監(jiān)控積分器、偏差和輸出三個(gè)量調(diào)參時(shí)心里有數(shù)出問(wèn)題時(shí)也能快速定位。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取