PID_AutoTune.TcPOU 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
  3. <POU Name="PID_AutoTune" Id="{0b5b2a49-235c-4a08-81da-cef5b056859e}" SpecialFunc="None">
  4. <Declaration><![CDATA[FUNCTION_BLOCK PID_AutoTune
  5. VAR_INPUT
  6. PV : REAL; // 过程变量(Process Value),即当前温度
  7. AutoTuneActive : BOOL;
  8. StepResponseAmplitude : REAL := 20.0; // 阶跃响应的输出幅度
  9. END_VAR
  10. VAR_OUTPUT
  11. Output : REAL; // 控制器输出
  12. Kp : REAL; // 比例增益
  13. Ki : REAL; // 积分增益
  14. Kd : REAL; // 微分增益
  15. Done : BOOL;
  16. END_VAR
  17. VAR
  18. StepResponseStartTime : REAL := 0.0; // 阶跃响应开始时间(以秒为单位)
  19. StepResponsePVStart : REAL; // 阶跃响应开始时的PV值
  20. StepResponsePVEnd : REAL; // 阶跃响应结束时的PV值
  21. StepResponseTime : REAL; // 阶跃响应时间(以秒为单位)
  22. Ku : REAL; // 临界增益
  23. Tu : REAL; // 临界周期(以秒为单位)
  24. // 时间相关变量
  25. CurrentTime : REAL; // 当前时间(以秒为单位)
  26. NT_Time:TIME;
  27. D_Dec:TON;
  28. monitor:REAL;
  29. END_VAR
  30. ]]></Declaration>
  31. <Implementation>
  32. <ST><![CDATA[ D_Dec(IN:= AutoTuneActive, PT:= T#1600S, Q=> , ET=> NT_Time);
  33. CurrentTime := TIME_TO_REAL(NT_Time) / 1000.0; // 将毫秒转换为秒
  34. IF NOT AutoTuneActive
  35. THEN
  36. StepResponseStartTime := 0.0;
  37. IF Done
  38. THEN
  39. Done := FALSE;
  40. END_IF;
  41. END_IF;
  42. monitor:=StepResponsePVStart + StepResponseAmplitude * 0.63;
  43. IF AutoTuneActive THEN
  44. // 开始阶跃响应测试
  45. IF StepResponseStartTime = 0.0 THEN
  46. StepResponseStartTime := CurrentTime; // 记录开始时间
  47. StepResponsePVStart := PV; // 记录初始PV值
  48. Output := StepResponseAmplitude; // 设置阶跃输出
  49. END_IF
  50. // 等待系统响应
  51. IF PV >= StepResponsePVStart + StepResponseAmplitude * 0.63 THEN
  52. StepResponseTime := CurrentTime - StepResponseStartTime; // 计算响应时间
  53. StepResponsePVEnd := PV; // 记录结束PV值
  54. AutoTuneActive := FALSE; // 结束自整定
  55. Done:=TRUE;
  56. Ku := 4 * StepResponseAmplitude / (StepResponsePVEnd - StepResponsePVStart); // 临界增益
  57. Tu := StepResponseTime; // 临界周期
  58. Kp := 0.6 * Ku;
  59. Ki := 1.2 * Ku / Tu;
  60. Kd := 0.075 * Ku * Tu;
  61. END_IF
  62. END_IF
  63. ]]></ST>
  64. </Implementation>
  65. <LineIds Name="PID_AutoTune">
  66. <LineId Id="162" Count="0" />
  67. <LineId Id="160" Count="0" />
  68. <LineId Id="234" Count="0" />
  69. <LineId Id="237" Count="1" />
  70. <LineId Id="235" Count="0" />
  71. <LineId Id="239" Count="3" />
  72. <LineId Id="245" Count="0" />
  73. <LineId Id="89" Count="12" />
  74. <LineId Id="208" Count="0" />
  75. <LineId Id="102" Count="0" />
  76. <LineId Id="104" Count="1" />
  77. <LineId Id="108" Count="3" />
  78. <LineId Id="115" Count="1" />
  79. <LineId Id="9" Count="0" />
  80. </LineIds>
  81. </POU>
  82. </TcPlcObject>