FUNCTION_BLOCK "塊_1"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      p值 : Real;
      積分 : Real;
      反饋值 : Int;
      設(shè)定值 : Real;
      PID死區(qū) : Real;
      PID上限 : Real;
      PID下限 : Real;
   END_VAR
   VAR_OUTPUT 
      輸出控制值 : Real;
      反饋過(guò)程值 : Real;
      PID輸出 : Int;
   END_VAR
   VAR_TEMP 
      當(dāng)前誤差 : Real;
      上次誤差 : Real;
      計(jì)算當(dāng)前輸出值 : Real;
      計(jì)算上次輸出值 : Real;
      反饋過(guò)程值臨時(shí)存儲(chǔ) : Real;
      輸出過(guò)程值臨時(shí)存儲(chǔ) : Real;
   END_VAR
BEGIN
    
    #反饋過(guò)程值臨時(shí)存儲(chǔ) := INT_TO_REAL(#反饋值);//反饋值轉(zhuǎn)成浮點(diǎn)數(shù)存入到臨時(shí)存儲(chǔ)區(qū)。
    #反饋過(guò)程值 := (#反饋過(guò)程值臨時(shí)存儲(chǔ) - 0.0) / 27648.0 * (#PID上限 - #PID下限) + #PID下限;//反饋過(guò)程值處理公式。
    #當(dāng)前誤差 := #設(shè)定值 - #反饋過(guò)程值;//算出當(dāng)前誤差值。
    IF  ABS(#當(dāng)前誤差)<#PID死區(qū) THEN//PID死區(qū)大于當(dāng)前誤差的絕對(duì)值時(shí)。(使用絕對(duì)值表示無(wú)論是整數(shù)還是負(fù)數(shù)都不允許超出比較范圍)。
        #計(jì)算當(dāng)前輸出值 := 0;      //如果上述條件成立,當(dāng)前輸出值為0.
    ELSIF  ABS(#當(dāng)前誤差)>=#PID死區(qū) THEN//PID死區(qū)小于等于當(dāng)前誤差,執(zhí)行下面公式。
        #計(jì)算當(dāng)前輸出值 := #p值 * (#當(dāng)前誤差 - #上次誤差) + #積分 * #當(dāng)前誤差;//此公式在S7-200PID課程有講,PID輸出=p值*(當(dāng)前誤差-上次誤差)+積分*當(dāng)前誤差。
    END_IF;
    #輸出控制值 := #計(jì)算當(dāng)前輸出值;//將當(dāng)前值輸出值傳送到輸出控制值,再進(jìn)行下一步處理。
    IF #輸出控制值 > #PID上限 THEN//如果輸出控制值大于PID上限值。
        #輸出控制值 := #PID上限;//將上限值寫(xiě)入輸出控制值。
    ELSIF #輸出控制值 < #PID下限 THEN//如果輸出控制值小于PID下限值。
        #輸出控制值 := #PID下限;//將下限值寫(xiě)入輸出控制值。
    END_IF;
    #上次誤差 := #當(dāng)前誤差;//處理完成將當(dāng)前誤差寫(xiě)入上次誤差。
    #計(jì)算上次輸出值 := #輸出控制值;//處理完成將輸出控制值寫(xiě)入上次輸出值。
    #輸出過(guò)程值臨時(shí)存儲(chǔ) := (#輸出控制值 - #PID下限) / (#PID上限 - #PID下限) * 27648.0 + 0.0;//PID輸出處理成0.0--27648.0范圍。
    #PID輸出 := REAL_TO_INT(#輸出過(guò)程值臨時(shí)存儲(chǔ));//再小數(shù)0.0--27648.0轉(zhuǎn)換成16位整數(shù)0-27648范圍。
END_FUNCTION_BLOCK