FUNCTION_BLOCK FB 2 TITLE = VERSION : 0.1 VAR_INPUT procesval : INT ; //proces value [MW202]{1/10deg} setpoint : INT ; //setpoint [MW200][1200]{1/10deg} GAIN : REAL ; //gain [1.5] RESETRATE : REAL ; //resetrate [0.1] DERIVATIVE : REAL ; //derivative [40.0] direct : BOOL ; //0 for heating [FALSE] auto : BOOL ; //auto [M100.0][TRUE] tim : TIMER ; //cycle timer [T100] cycl : S5TIME ; END_VAR VAR_OUTPUT Output : INT ; //output for PWM [MW20]{1/10%} Err_D : INT ; //for adjusting [MW22] END_VAR VAR PVD : REAL ; PVLAST : REAL ; ERR : REAL ; FEEDBACK : REAL ; temp_cycl : BOOL ; END_VAR VAR_TEMP OUTTEMP : REAL ; PV : REAL ; SP : REAL ; TEMP0 : BOOL ; out_conv : DINT ; END_VAR BEGIN NETWORK TITLE = // timer voor de cyclustijd UN #temp_cycl; L #cycl; SE #tim; U #tim; = #temp_cycl; UN #temp_cycl; SPB eind; NETWORK TITLE = L #procesval; ITD ; DTR ; T #PV; L #setpoint; ITD ; DTR ; T #SP; NETWORK TITLE = //1. IF AUTO = true THEN U #auto; SPBN auto; //2. PV_D = PV +(PV - PV_last) * Derivative L #PV; L #PVLAST; -R ; L #DERIVATIVE; *R ; L #PV; +R ; T #PVD; //3. PV_last = PV L #PV; T #PVLAST; //4. ERR = SP - PV_D L #SP; L #PVD; -R ; T #ERR; //5. IF Direct = true THEN Err =0 Err //Change sign if direct. U #direct; SPBN dir; L 0; L #ERR; -R ; T #ERR; //6. ENDIF dir: NOP 0; //ERR naar buiten brengen voor afregelen L #ERR; RND ; T #Err_D; //7. out_temp = Err * Gain + Feedb //Calc gain time the error and add // the feedback. L #ERR; L #GAIN; *R ; L #FEEDBACK; +R ; T #OUTTEMP; //8. IF Out_Temp > 100 THEN Out_Temp =100 //Limit output L #OUTTEMP; L 1.000000e+003; >R ; SPBN gr; T #OUTTEMP; gr: NOP 0; //9. IF Out_Temp < 0 THEN Out_Temp =0 // 0 and 100 percent. L #OUTTEMP; L 0;