12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- <?xml version="1.0" encoding="utf-8"?>
- <TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
- <POU Name="PID_AutoTune" Id="{0b5b2a49-235c-4a08-81da-cef5b056859e}" SpecialFunc="None">
- <Declaration><![CDATA[FUNCTION_BLOCK PID_AutoTune
- VAR_INPUT
- PV : REAL; // 过程变量(Process Value),即当前温度
- AutoTuneActive : BOOL;
- StepResponseAmplitude : REAL := 20.0; // 阶跃响应的输出幅度
- END_VAR
- VAR_OUTPUT
- Output : REAL; // 控制器输出
- Kp : REAL; // 比例增益
- Ki : REAL; // 积分增益
- Kd : REAL; // 微分增益
- Done : BOOL;
- END_VAR
- VAR
- StepResponseStartTime : REAL := 0.0; // 阶跃响应开始时间(以秒为单位)
- StepResponsePVStart : REAL; // 阶跃响应开始时的PV值
- StepResponsePVEnd : REAL; // 阶跃响应结束时的PV值
- StepResponseTime : REAL; // 阶跃响应时间(以秒为单位)
- Ku : REAL; // 临界增益
- Tu : REAL; // 临界周期(以秒为单位)
- // 时间相关变量
- CurrentTime : REAL; // 当前时间(以秒为单位)
- NT_Time:TIME;
- D_Dec:TON;
- monitor:REAL;
- END_VAR
- ]]></Declaration>
- <Implementation>
- <ST><![CDATA[ D_Dec(IN:= AutoTuneActive, PT:= T#1600S, Q=> , ET=> NT_Time);
- CurrentTime := TIME_TO_REAL(NT_Time) / 1000.0; // 将毫秒转换为秒
- IF NOT AutoTuneActive
- THEN
- StepResponseStartTime := 0.0;
- IF Done
- THEN
- Done := FALSE;
- END_IF;
- END_IF;
- monitor:=StepResponsePVStart + StepResponseAmplitude * 0.63;
- IF AutoTuneActive THEN
- // 开始阶跃响应测试
- IF StepResponseStartTime = 0.0 THEN
- StepResponseStartTime := CurrentTime; // 记录开始时间
- StepResponsePVStart := PV; // 记录初始PV值
- Output := StepResponseAmplitude; // 设置阶跃输出
- END_IF
-
- // 等待系统响应
- IF PV >= StepResponsePVStart + StepResponseAmplitude * 0.63 THEN
- StepResponseTime := CurrentTime - StepResponseStartTime; // 计算响应时间
- StepResponsePVEnd := PV; // 记录结束PV值
- AutoTuneActive := FALSE; // 结束自整定
- Done:=TRUE;
-
- Ku := 4 * StepResponseAmplitude / (StepResponsePVEnd - StepResponsePVStart); // 临界增益
- Tu := StepResponseTime; // 临界周期
- Kp := 0.6 * Ku;
- Ki := 1.2 * Ku / Tu;
- Kd := 0.075 * Ku * Tu;
- END_IF
- END_IF
- ]]></ST>
- </Implementation>
- <LineIds Name="PID_AutoTune">
- <LineId Id="162" Count="0" />
- <LineId Id="160" Count="0" />
- <LineId Id="234" Count="0" />
- <LineId Id="237" Count="1" />
- <LineId Id="235" Count="0" />
- <LineId Id="239" Count="3" />
- <LineId Id="245" Count="0" />
- <LineId Id="89" Count="12" />
- <LineId Id="208" Count="0" />
- <LineId Id="102" Count="0" />
- <LineId Id="104" Count="1" />
- <LineId Id="108" Count="3" />
- <LineId Id="115" Count="1" />
- <LineId Id="9" Count="0" />
- </LineIds>
- </POU>
- </TcPlcObject>
|