湛藍小爾
工控交流 Q703935819
級別: 家園常客
|
謝謝分享,我需要的 |
|
---|---|---|
|
hoojjj
級別: 正式會員
|
FUNCTION_BLOCK "塊_1" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT p值 : Real; 積分 : Real; 反饋值 : Int; 設定值 : Real; PID死區(qū) : Real; PID上限 : Real; PID下限 : Real; END_VAR VAR_OUTPUT 輸出控制值 : Real; 反饋過程值 : Real; PID輸出 : Int; END_VAR VAR_TEMP 當前誤差 : Real; 上次誤差 : Real; 計算當前輸出值 : Real; 計算上次輸出值 : Real; 反饋過程值臨時存儲 : Real; 輸出過程值臨時存儲 : Real; END_VAR BEGIN #反饋過程值臨時存儲 := INT_TO_REAL(#反饋值);//反饋值轉成浮點數存入到臨時存儲區(qū)。 #反饋過程值 := (#反饋過程值臨時存儲 - 0.0) / 27648.0 * (#PID上限 - #PID下限) + #PID下限;//反饋過程值處理公式。 #當前誤差 := #設定值 - #反饋過程值;//算出當前誤差值。 IF ABS(#當前誤差)<#PID死區(qū) THEN//PID死區(qū)大于當前誤差的絕對值時。(使用絕對值表示無論是整數還是負數都不允許超出比較范圍)。 #計算當前輸出值 := 0; //如果上述條件成立,當前輸出值為0. ELSIF ABS(#當前誤差)>=#PID死區(qū) THEN//PID死區(qū)小于等于當前誤差,執(zhí)行下面公式。 #計算當前輸出值 := #p值 * (#當前誤差 - #上次誤差) + #積分 * #當前誤差;//此公式在S7-200PID課程有講,PID輸出=p值*(當前誤差-上次誤差)+積分*當前誤差。 END_IF; #輸出控制值 := #計算當前輸出值;//將當前值輸出值傳送到輸出控制值,再進行下一步處理。 IF #輸出控制值 > #PID上限 THEN//如果輸出控制值大于PID上限值。 #輸出控制值 := #PID上限;//將上限值寫入輸出控制值。 ELSIF #輸出控制值 < #PID下限 THEN//如果輸出控制值小于PID下限值。 #輸出控制值 := #PID下限;//將下限值寫入輸出控制值。 END_IF; #上次誤差 := #當前誤差;//處理完成將當前誤差寫入上次誤差。 #計算上次輸出值 := #輸出控制值;//處理完成將輸出控制值寫入上次輸出值。 #輸出過程值臨時存儲 := (#輸出控制值 - #PID下限) / (#PID上限 - #PID下限) * 27648.0 + 0.0;//PID輸出處理成0.0--27648.0范圍。 #PID輸出 := REAL_TO_INT(#輸出過程值臨時存儲);//再小數0.0--27648.0轉換成16位整數0-27648范圍。 END_FUNCTION_BLOCK |
---|---|
|
hoojjj
級別: 正式會員
|
#計算當前輸出值 := #p值 * (#當前誤差 - #上次誤差) + #積分 * #當前誤差; 這PID 有點問題, 好像不是很純正 還是感謝分享 |
---|---|
|
hoojjj
級別: 正式會員
|
正確的PD 控制器如下計算方式 #計算當前輸出值 := #p值 * #當前誤差+ #微分 * (#當前誤差 - #上次誤差) |
---|---|
|