123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- <?xml version="1.0" encoding="utf-8"?>
- <TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
- <POU Name="Temp_controller" Id="{4c2be164-6e65-4759-af6b-8990e1c679db}" SpecialFunc="None">
- <Declaration><![CDATA[FUNCTION_BLOCK Temp_controller
- VAR_INPUT
- ENABLE:BOOL;
- AUTO_TUNE:BOOL;
- AUTO_TUNE_OUTPUT:REAL;
- //FILTER_ENABLE:BOOL;
- TEMP_SV:REAL;
- TEMP_ACTUAL:REAL;
-
- TEMP_RATE:REAL;
-
- PID_P:REAL;
- PID_I:REAL;
- PID_D:REAL;
- PID_Dp:REAL;
- PID_Feedforward:REAL;
- PID_Output_Limit:REAL;
- END_VAR
- VAR_OUTPUT
- PID_AUTO_TUNE_P,
- PID_AUTO_TUNE_I,
- PID_AUTO_TUNE_D:REAL;
- PID_AUTO_TUNE_DONE:BOOL;
- SCR_OUT: REAL;
- SSR_ON:BOOL;
- END_VAR
- VAR
- SAMPLING_TIME:TIME:=T#1S; //采样时间
-
- PID_NM : FB_CTRL_PID;
- PID_PARAMS:ST_CTRL_PID_PARAMS;
- PID_MODE:E_CTRL_MODE;
- PID_OUTPUT:LREAL;
- PID_FUC_STATE:E_CTRL_STATE;
- PID_ERRID:E_CTRL_ERRORCODES;
- PID_ERR:BOOL;
- PID_TASKTIME:TIME:=T#800MS;
- PID_CYCLETIME:TIME:=T#800MS;
-
- SSR_ON_PERCENT:REAL;
-
- TEMP_DATA_ARR : ARRAY[1..10] OF REAL; //FIFO
-
- FIRST_RUN:R_TRIG;
-
- SAMPLING_TON1:TON;
- SAMPLING_TON2:TON;
- SAMPLING_TON1_EN:BOOL;
- SAMPLING_TON2_EN:BOOL;
-
- TEMP_AVERAGE:REAL;
-
- i: INT;
-
- SSR_ON_TIME:TIME;
- SSR_RESET_TIME:TIME;
- SSR_ON_TON:TON;
- SSR_RESET_TON:TON;
- SSR_ON_ENABLE:BOOL;
- SSR_RESET_ENABLE:BOOL;
-
- PID_AUTO_TUNE:PID_AutoTune;
-
- TON_FOR_RATE:TON;
- CACHE_TEMP_SV:REAL;
- TEMP_SV_TO_PID:REAL;
- EACH_STEP_TEMP:REAL;
- END_VAR
- ]]></Declaration>
- <Implementation>
- <ST><![CDATA[//TEMP_RATE
- EACH_STEP_TEMP:=TEMP_RATE/10;
- IF TEMP_RATE=0 THEN
- TEMP_SV_TO_PID:=TEMP_SV;
- ELSE
- IF ENABLE AND TON_FOR_RATE.IN=FALSE AND CACHE_TEMP_SV<TEMP_SV THEN
- TON_FOR_RATE.IN:=TRUE;
- END_IF
- IF TON_FOR_RATE.Q THEN
- CACHE_TEMP_SV:=CACHE_TEMP_SV+EACH_STEP_TEMP;
- TON_FOR_RATE.IN:=FALSE;
- END_IF
- TON_FOR_RATE(IN:=, PT:= T#6S, Q=> , ET=> );
- IF CACHE_TEMP_SV<TEMP_SV THEN
- TEMP_SV_TO_PID:=CACHE_TEMP_SV;
- ELSE
- TEMP_SV_TO_PID:=TEMP_SV;
- END_IF
- END_IF
- IF TEMP_RATE=0 OR NOT ENABLE THEN
- CACHE_TEMP_SV:=0;
- END_IF
- IF (TEMP_RATE<>0) AND ENABLE AND (CACHE_TEMP_SV=0 OR CACHE_TEMP_SV>TEMP_SV) THEN
- CACHE_TEMP_SV:=TEMP_AVERAGE+EACH_STEP_TEMP;
- END_IF
- //数组数据初始化
- FIRST_RUN(CLK:=ENABLE,Q=> );
- IF FIRST_RUN.Q
- THEN
- SAMPLING_TON1_EN:=TRUE;
- FOR i:=1 TO 10 BY 1
- DO
- TEMP_DATA_ARR[i] := TEMP_ACTUAL;
- END_FOR;
- END_IF;
- //产生采样脉冲
- SAMPLING_TON1(IN:=SAMPLING_TON1_EN , PT:=SAMPLING_TIME , Q=> , ET=> );
- IF SAMPLING_TON1.Q
- THEN
- SAMPLING_TON1_EN:=0;
- SAMPLING_TON2_EN:=1;
- END_IF;
- SAMPLING_TON2(IN:=SAMPLING_TON2_EN , PT:=SAMPLING_TIME , Q=> , ET=> );
- IF SAMPLING_TON2.Q
- THEN
- SAMPLING_TON1_EN:=1;
- SAMPLING_TON2_EN:=0;
- END_IF;
- //数组右移一位
- IF SAMPLING_TON1.Q OR SAMPLING_TON2.Q
- THEN
- TEMP_DATA_ARR[10] := TEMP_DATA_ARR[9];
- TEMP_DATA_ARR[9] := TEMP_DATA_ARR[8];
- TEMP_DATA_ARR[8] := TEMP_DATA_ARR[7];
- TEMP_DATA_ARR[7] := TEMP_DATA_ARR[6];
- TEMP_DATA_ARR[6] := TEMP_DATA_ARR[5];
- TEMP_DATA_ARR[5] := TEMP_DATA_ARR[4];
- TEMP_DATA_ARR[4] := TEMP_DATA_ARR[3];
- TEMP_DATA_ARR[3] := TEMP_DATA_ARR[2];
- TEMP_DATA_ARR[2] := TEMP_DATA_ARR[1];
- TEMP_DATA_ARR[1] := TEMP_ACTUAL;
- END_IF
- //取平均数,前两个数据权重为0.5,中间4位权重为0.3,最后4位权重为0.2。原则上,时间越久,权重越小
- TEMP_AVERAGE:=0.5*(TEMP_DATA_ARR[1]+TEMP_DATA_ARR[2])/2
- +0.3*(TEMP_DATA_ARR[3]+TEMP_DATA_ARR[4]+TEMP_DATA_ARR[5]+TEMP_DATA_ARR[6])/4
- +0.2*(TEMP_DATA_ARR[7]+TEMP_DATA_ARR[8]+TEMP_DATA_ARR[9]+TEMP_DATA_ARR[10])/4;
- IF AUTO_TUNE
- THEN
- PID_MODE:=0;
- ELSE
- PID_MODE:=2;
- END_IF;
- PID_AUTO_TUNE(
- PV:= TEMP_ACTUAL,
- AutoTuneActive:= AUTO_TUNE,
- StepResponseAmplitude:=AUTO_TUNE_OUTPUT,
- Output=> ,
- Kp=> PID_AUTO_TUNE_P,
- Ki=> PID_AUTO_TUNE_I,
- Kd=> PID_AUTO_TUNE_D,
- Done=> PID_AUTO_TUNE_DONE);
-
- //*******PID的背景数据块 G(S)=Kp[1+1/Tn+Tv/(1+Td)]
- PID_PARAMS.tTaskCycleTime :=T#10MS; //任务周期
- PID_PARAMS.tCtrlCycleTime :=T#500MS; //控制循环时间
- PID_PARAMS.fKp :=PID_P; //P
- PID_PARAMS.tTn :=REAL_TO_TIME(PID_I); //I
- PID_PARAMS.tTv :=REAL_TO_TIME(PID_D); //D
- PID_PARAMS.tTd :=REAL_TO_TIME(PID_Dp); //DAMP阻尼时间
- PID_PARAMS.fOutMaxLimit :=100; //输出上限
- PID_PARAMS.fOutMinLimit :=0; //输出下限
- PID_PARAMS.bPInTheFeedbackPath :=FALSE; //P有效
- PID_PARAMS.bDInTheFeedbackPath :=FALSE; //D有效
- PID_PARAMS.bARWOnIPartOnly :=FALSE; //I有效
- //PID函数
- PID_NM(
- fSetpointValue:= TEMP_SV_TO_PID, //设定值
- fActualValue:= TEMP_AVERAGE, //实际值
- fManSyncValue:= , //操作值
- bSync:= , //上升沿时,操作值有效
- eMode:= PID_MODE, //函数的运行模式,0:空闲,1:PASSIVE,2:ACTIVE,3:RESET,4:MANUAL,5:AUTO,6:SELF-TUNING,7:SYNC同步模式
- bHold:= , //TRUE时,保持当前的内部状态
- fOut=> PID_OUTPUT, //输出值
- bARWactive=> , //TRUE时,表示PID输出值被限制
- eState=> PID_FUC_STATE, //函数状态
- eErrorId=> PID_ERRID, //ERR代码
- bError=> PID_ERR, //PID发生错误
- stParams:=PID_PARAMS );
-
- IF AUTO_TUNE
- THEN
- SSR_ON_PERCENT:=PID_AUTO_TUNE.Output+PID_Feedforward;
- ELSE
- SSR_ON_PERCENT:=LREAL_TO_REAL(PID_OUTPUT+PID_Feedforward);
- END_IF
-
- IF SSR_ON_PERCENT>PID_Output_Limit AND ENABLE
- THEN
- SSR_ON_PERCENT:=PID_Output_Limit;
- END_IF
- IF SSR_ON_PERCENT<0 OR NOT ENABLE
- THEN
- SSR_ON_PERCENT:=0;
- END_IF
- SCR_OUT:=SSR_ON_PERCENT;
-
- //*******PWM脉冲输出生成
-
- SSR_ON_TIME:=REAL_TO_TIME(SSR_ON_PERCENT*10); //输出脉冲ON宽度
- SSR_RESET_TIME:=REAL_TO_TIME((100-SSR_ON_PERCENT)*10); //输出脉冲总宽度
- SSR_ON_TON(IN:= SSR_ON_ENABLE, PT:= SSR_ON_TIME, Q=> , ET=> ); //输出脉冲计时
- IF SSR_ON_TON.Q //输出脉冲计时器使能在计时器下方ON,实现上升脉冲;同时复位计时器使能OFF
- THEN
- SSR_RESET_ENABLE:=TRUE;
- END_IF
- IF NOT (SSR_ON_ENABLE OR SSR_RESET_ENABLE) //首次cycle触发输出脉冲使能
- THEN
- SSR_ON_ENABLE:=TRUE;
- END_IF
- SSR_RESET_TON(IN:= SSR_RESET_ENABLE, PT:= SSR_RESET_TIME, Q=> , ET=> );
- IF SSR_RESET_TON.Q
- THEN
- SSR_ON_ENABLE:=FALSE;
- SSR_RESET_ENABLE:=FALSE;
- SSR_ON:=FALSE; //输出脉冲计时器使能OFF
- END_IF
- IF SSR_ON_PERCENT>0
- THEN
- SSR_ON:=NOT SSR_ON_TON.Q;
- END_IF
- ]]></ST>
- </Implementation>
- <LineIds Name="Temp_controller">
- <LineId Id="601" Count="0" />
- <LineId Id="607" Count="0" />
- <LineId Id="603" Count="1" />
- <LineId Id="608" Count="0" />
- <LineId Id="630" Count="0" />
- <LineId Id="632" Count="1" />
- <LineId Id="609" Count="0" />
- <LineId Id="617" Count="0" />
- <LineId Id="610" Count="0" />
- <LineId Id="618" Count="0" />
- <LineId Id="634" Count="1" />
- <LineId Id="629" Count="0" />
- <LineId Id="636" Count="2" />
- <LineId Id="605" Count="0" />
- <LineId Id="620" Count="0" />
- <LineId Id="619" Count="0" />
- <LineId Id="621" Count="1" />
- <LineId Id="624" Count="2" />
- <LineId Id="623" Count="0" />
- <LineId Id="628" Count="0" />
- <LineId Id="627" Count="0" />
- <LineId Id="602" Count="0" />
- <LineId Id="98" Count="0" />
- <LineId Id="285" Count="0" />
- <LineId Id="157" Count="0" />
- <LineId Id="30" Count="0" />
- <LineId Id="112" Count="0" />
- <LineId Id="93" Count="0" />
- <LineId Id="97" Count="0" />
- <LineId Id="31" Count="0" />
- <LineId Id="94" Count="0" />
- <LineId Id="29" Count="0" />
- <LineId Id="338" Count="0" />
- <LineId Id="103" Count="0" />
- <LineId Id="95" Count="0" />
- <LineId Id="101" Count="0" />
- <LineId Id="116" Count="0" />
- <LineId Id="137" Count="0" />
- <LineId Id="117" Count="0" />
- <LineId Id="115" Count="0" />
- <LineId Id="120" Count="4" />
- <LineId Id="119" Count="0" />
- <LineId Id="339" Count="0" />
- <LineId Id="158" Count="0" />
- <LineId Id="144" Count="1" />
- <LineId Id="148" Count="8" />
- <LineId Id="147" Count="0" />
- <LineId Id="146" Count="0" />
- <LineId Id="340" Count="0" />
- <LineId Id="139" Count="0" />
- <LineId Id="138" Count="0" />
- <LineId Id="141" Count="1" />
- <LineId Id="429" Count="0" />
- <LineId Id="410" Count="0" />
- <LineId Id="431" Count="0" />
- <LineId Id="430" Count="0" />
- <LineId Id="432" Count="0" />
- <LineId Id="434" Count="2" />
- <LineId Id="421" Count="1" />
- <LineId Id="424" Count="0" />
- <LineId Id="534" Count="0" />
- <LineId Id="425" Count="3" />
- <LineId Id="419" Count="0" />
- <LineId Id="162" Count="0" />
- <LineId Id="192" Count="0" />
- <LineId Id="189" Count="2" />
- <LineId Id="197" Count="2" />
- <LineId Id="194" Count="2" />
- <LineId Id="200" Count="1" />
- <LineId Id="259" Count="0" />
- <LineId Id="204" Count="0" />
- <LineId Id="165" Count="2" />
- <LineId Id="349" Count="1" />
- <LineId Id="168" Count="0" />
- <LineId Id="348" Count="0" />
- <LineId Id="172" Count="4" />
- <LineId Id="164" Count="0" />
- <LineId Id="531" Count="0" />
- <LineId Id="512" Count="0" />
- <LineId Id="528" Count="0" />
- <LineId Id="532" Count="0" />
- <LineId Id="526" Count="1" />
- <LineId Id="529" Count="1" />
- <LineId Id="178" Count="0" />
- <LineId Id="230" Count="0" />
- <LineId Id="232" Count="0" />
- <LineId Id="231" Count="0" />
- <LineId Id="233" Count="2" />
- <LineId Id="180" Count="0" />
- <LineId Id="706" Count="0" />
- <LineId Id="262" Count="0" />
- <LineId Id="707" Count="0" />
- <LineId Id="181" Count="0" />
- <LineId Id="282" Count="0" />
- <LineId Id="238" Count="0" />
- <LineId Id="258" Count="0" />
- <LineId Id="239" Count="0" />
- <LineId Id="271" Count="1" />
- <LineId Id="275" Count="0" />
- <LineId Id="270" Count="0" />
- <LineId Id="502" Count="2" />
- <LineId Id="501" Count="0" />
- <LineId Id="266" Count="0" />
- <LineId Id="240" Count="0" />
- <LineId Id="267" Count="0" />
- <LineId Id="499" Count="0" />
- <LineId Id="268" Count="0" />
- <LineId Id="510" Count="0" />
- <LineId Id="269" Count="0" />
- <LineId Id="505" Count="1" />
- <LineId Id="508" Count="0" />
- <LineId Id="507" Count="0" />
- <LineId Id="498" Count="0" />
- </LineIds>
- </POU>
- </TcPlcObject>
|