huyou
級別: 略有小成
|
在學習PID指令時,雖然有框圖,但理解還是感覺比較吃力,花了許多功夫最終還是用不好PID指令。對某些有自整定參數功能的PID指令如何實現所謂“自整定參數”的功能也是一頭霧水。反反復復地看了許多關于PID方面的文章,也琢磨了一些自己的理解,下面是用S7-300的“STL源文件”編寫的一段程序,純粹當作練習: FUNCTION_BLOCK FB 1 TITLE = //KNOW_HOW_PROTECT VERSION : 0.1 VAR_INPUT PV : REAL ; END_VAR VAR_OUTPUT out : INT ; END_VAR VAR I : INT ; //積分時間(0.1s) Kp : REAL ; //比例 Kd : REAL ; //微分增益 PV0 : REAL ; //上次過程值 SP : REAL ; //設定點 MV : REAL ; //輸出值 _1 : BOOL ; _2 : BOOL ; EV : REAL ; //靜差 END_VAR VAR_TEMP temp0 : REAL ; temp1 : REAL ; temp2 : BOOL ; temp3 : BOOL ; END_VAR BEGIN NETWORK TITLE = //積分時間設定:每次運算的周期 A M 0.0; //0.1s脈沖 CD C 0; A #_1; //設定時間值 L #I; S C 0; AN C 0; FP #_2; = #_1; NETWORK TITLE = //PID運算:MV=MV+Kp{(SP-PV)-Kd(PV-PV0)} // A #_1; JNB _001; L #PV; L #PV0; -R ; L #Kd; *R ; T #temp0; L #SP; L #PV; -R ; T #EV; L #temp0; -R ; L #Kp; *R ; T #temp1; L #MV; +R ; T #MV; _001: NOP 0; NETWORK TITLE = //設置上限為100% //運算結果超出上限是無意義的,例如當結果為150%時,實際上執行的是100%,更重要的是從 //150%返回到100%會使反應緩慢。 A( ; L #MV; L 1.000000e+002; >=R ; ) ; JNB _002; L 1.000000e+002; T #MV; _002: NOP 0; NETWORK TITLE = A( ; L #MV; L 0.000000e+000; <=R ; ) ; JNB _003; L 0.000000e+000; T #MV; _003: NOP 0; NETWORK TITLE = //將工程量(如溫度值)轉換為數字量輸出,供數/模轉換(模擬量輸出) L #MV; L 2.764800e+002; *R ; RND ; T #out; NETWORK TITLE = //將本次過程值寫入“上次過程值”,以準備下次運算 // ------刷新 L #PV; T #PV0; END_FUNCTION_BLOCK |
|
---|---|---|
|