Temp_controller.TcPOU 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <TcPlcObject Version="1.1.0.1" ProductVersion="3.1.4024.12">
  3. <POU Name="Temp_controller" Id="{4c2be164-6e65-4759-af6b-8990e1c679db}" SpecialFunc="None">
  4. <Declaration><![CDATA[FUNCTION_BLOCK Temp_controller
  5. VAR_INPUT
  6. ENABLE:BOOL;
  7. AUTO_TUNE:BOOL;
  8. AUTO_TUNE_OUTPUT:REAL;
  9. //FILTER_ENABLE:BOOL;
  10. TEMP_SV:REAL;
  11. TEMP_ACTUAL:REAL;
  12. TEMP_RATE:REAL;
  13. PID_P:REAL;
  14. PID_I:REAL;
  15. PID_D:REAL;
  16. PID_Dp:REAL;
  17. PID_Feedforward:REAL;
  18. PID_Output_Limit:REAL;
  19. END_VAR
  20. VAR_OUTPUT
  21. PID_AUTO_TUNE_P,
  22. PID_AUTO_TUNE_I,
  23. PID_AUTO_TUNE_D:REAL;
  24. PID_AUTO_TUNE_DONE:BOOL;
  25. SCR_OUT: REAL;
  26. SSR_ON:BOOL;
  27. END_VAR
  28. VAR
  29. SAMPLING_TIME:TIME:=T#1S; //采样时间
  30. PID_NM : FB_CTRL_PID;
  31. PID_PARAMS:ST_CTRL_PID_PARAMS;
  32. PID_MODE:E_CTRL_MODE;
  33. PID_OUTPUT:LREAL;
  34. PID_FUC_STATE:E_CTRL_STATE;
  35. PID_ERRID:E_CTRL_ERRORCODES;
  36. PID_ERR:BOOL;
  37. PID_TASKTIME:TIME:=T#800MS;
  38. PID_CYCLETIME:TIME:=T#800MS;
  39. SSR_ON_PERCENT:REAL;
  40. TEMP_DATA_ARR : ARRAY[1..10] OF REAL; //FIFO
  41. FIRST_RUN:R_TRIG;
  42. SAMPLING_TON1:TON;
  43. SAMPLING_TON2:TON;
  44. SAMPLING_TON1_EN:BOOL;
  45. SAMPLING_TON2_EN:BOOL;
  46. TEMP_AVERAGE:REAL;
  47. i: INT;
  48. SSR_ON_TIME:TIME;
  49. SSR_RESET_TIME:TIME;
  50. SSR_ON_TON:TON;
  51. SSR_RESET_TON:TON;
  52. SSR_ON_ENABLE:BOOL;
  53. SSR_RESET_ENABLE:BOOL;
  54. PID_AUTO_TUNE:PID_AutoTune;
  55. TON_FOR_RATE:TON;
  56. CACHE_TEMP_SV:REAL;
  57. TEMP_SV_TO_PID:REAL;
  58. EACH_STEP_TEMP:REAL;
  59. END_VAR
  60. ]]></Declaration>
  61. <Implementation>
  62. <ST><![CDATA[//TEMP_RATE
  63. EACH_STEP_TEMP:=TEMP_RATE/10;
  64. IF TEMP_RATE=0 THEN
  65. TEMP_SV_TO_PID:=TEMP_SV;
  66. ELSE
  67. IF ENABLE AND TON_FOR_RATE.IN=FALSE AND CACHE_TEMP_SV<TEMP_SV THEN
  68. TON_FOR_RATE.IN:=TRUE;
  69. END_IF
  70. IF TON_FOR_RATE.Q THEN
  71. CACHE_TEMP_SV:=CACHE_TEMP_SV+EACH_STEP_TEMP;
  72. TON_FOR_RATE.IN:=FALSE;
  73. END_IF
  74. TON_FOR_RATE(IN:=, PT:= T#6S, Q=> , ET=> );
  75. IF CACHE_TEMP_SV<TEMP_SV THEN
  76. TEMP_SV_TO_PID:=CACHE_TEMP_SV;
  77. ELSE
  78. TEMP_SV_TO_PID:=TEMP_SV;
  79. END_IF
  80. END_IF
  81. IF TEMP_RATE=0 OR NOT ENABLE THEN
  82. CACHE_TEMP_SV:=0;
  83. END_IF
  84. IF (TEMP_RATE<>0) AND ENABLE AND (CACHE_TEMP_SV=0 OR CACHE_TEMP_SV>TEMP_SV) THEN
  85. CACHE_TEMP_SV:=TEMP_AVERAGE+EACH_STEP_TEMP;
  86. END_IF
  87. //数组数据初始化
  88. FIRST_RUN(CLK:=ENABLE,Q=> );
  89. IF FIRST_RUN.Q
  90. THEN
  91. SAMPLING_TON1_EN:=TRUE;
  92. FOR i:=1 TO 10 BY 1
  93. DO
  94. TEMP_DATA_ARR[i] := TEMP_ACTUAL;
  95. END_FOR;
  96. END_IF;
  97. //产生采样脉冲
  98. SAMPLING_TON1(IN:=SAMPLING_TON1_EN , PT:=SAMPLING_TIME , Q=> , ET=> );
  99. IF SAMPLING_TON1.Q
  100. THEN
  101. SAMPLING_TON1_EN:=0;
  102. SAMPLING_TON2_EN:=1;
  103. END_IF;
  104. SAMPLING_TON2(IN:=SAMPLING_TON2_EN , PT:=SAMPLING_TIME , Q=> , ET=> );
  105. IF SAMPLING_TON2.Q
  106. THEN
  107. SAMPLING_TON1_EN:=1;
  108. SAMPLING_TON2_EN:=0;
  109. END_IF;
  110. //数组右移一位
  111. IF SAMPLING_TON1.Q OR SAMPLING_TON2.Q
  112. THEN
  113. TEMP_DATA_ARR[10] := TEMP_DATA_ARR[9];
  114. TEMP_DATA_ARR[9] := TEMP_DATA_ARR[8];
  115. TEMP_DATA_ARR[8] := TEMP_DATA_ARR[7];
  116. TEMP_DATA_ARR[7] := TEMP_DATA_ARR[6];
  117. TEMP_DATA_ARR[6] := TEMP_DATA_ARR[5];
  118. TEMP_DATA_ARR[5] := TEMP_DATA_ARR[4];
  119. TEMP_DATA_ARR[4] := TEMP_DATA_ARR[3];
  120. TEMP_DATA_ARR[3] := TEMP_DATA_ARR[2];
  121. TEMP_DATA_ARR[2] := TEMP_DATA_ARR[1];
  122. TEMP_DATA_ARR[1] := TEMP_ACTUAL;
  123. END_IF
  124. //取平均数,前两个数据权重为0.5,中间4位权重为0.3,最后4位权重为0.2。原则上,时间越久,权重越小
  125. TEMP_AVERAGE:=0.5*(TEMP_DATA_ARR[1]+TEMP_DATA_ARR[2])/2
  126. +0.3*(TEMP_DATA_ARR[3]+TEMP_DATA_ARR[4]+TEMP_DATA_ARR[5]+TEMP_DATA_ARR[6])/4
  127. +0.2*(TEMP_DATA_ARR[7]+TEMP_DATA_ARR[8]+TEMP_DATA_ARR[9]+TEMP_DATA_ARR[10])/4;
  128. IF AUTO_TUNE
  129. THEN
  130. PID_MODE:=0;
  131. ELSE
  132. PID_MODE:=2;
  133. END_IF;
  134. PID_AUTO_TUNE(
  135. PV:= TEMP_ACTUAL,
  136. AutoTuneActive:= AUTO_TUNE,
  137. StepResponseAmplitude:=AUTO_TUNE_OUTPUT,
  138. Output=> ,
  139. Kp=> PID_AUTO_TUNE_P,
  140. Ki=> PID_AUTO_TUNE_I,
  141. Kd=> PID_AUTO_TUNE_D,
  142. Done=> PID_AUTO_TUNE_DONE);
  143. //*******PID的背景数据块 G(S)=Kp[1+1/Tn+Tv/(1+Td)]
  144. PID_PARAMS.tTaskCycleTime :=T#10MS; //任务周期
  145. PID_PARAMS.tCtrlCycleTime :=T#500MS; //控制循环时间
  146. PID_PARAMS.fKp :=PID_P; //P
  147. PID_PARAMS.tTn :=REAL_TO_TIME(PID_I); //I
  148. PID_PARAMS.tTv :=REAL_TO_TIME(PID_D); //D
  149. PID_PARAMS.tTd :=REAL_TO_TIME(PID_Dp); //DAMP阻尼时间
  150. PID_PARAMS.fOutMaxLimit :=100; //输出上限
  151. PID_PARAMS.fOutMinLimit :=0; //输出下限
  152. PID_PARAMS.bPInTheFeedbackPath :=FALSE; //P有效
  153. PID_PARAMS.bDInTheFeedbackPath :=FALSE; //D有效
  154. PID_PARAMS.bARWOnIPartOnly :=FALSE; //I有效
  155. //PID函数
  156. PID_NM(
  157. fSetpointValue:= TEMP_SV_TO_PID, //设定值
  158. fActualValue:= TEMP_AVERAGE, //实际值
  159. fManSyncValue:= , //操作值
  160. bSync:= , //上升沿时,操作值有效
  161. eMode:= PID_MODE, //函数的运行模式,0:空闲,1:PASSIVE,2:ACTIVE,3:RESET,4:MANUAL,5:AUTO,6:SELF-TUNING,7:SYNC同步模式
  162. bHold:= , //TRUE时,保持当前的内部状态
  163. fOut=> PID_OUTPUT, //输出值
  164. bARWactive=> , //TRUE时,表示PID输出值被限制
  165. eState=> PID_FUC_STATE, //函数状态
  166. eErrorId=> PID_ERRID, //ERR代码
  167. bError=> PID_ERR, //PID发生错误
  168. stParams:=PID_PARAMS );
  169. IF AUTO_TUNE
  170. THEN
  171. SSR_ON_PERCENT:=PID_AUTO_TUNE.Output+PID_Feedforward;
  172. ELSE
  173. SSR_ON_PERCENT:=LREAL_TO_REAL(PID_OUTPUT+PID_Feedforward);
  174. END_IF
  175. IF SSR_ON_PERCENT>PID_Output_Limit AND ENABLE
  176. THEN
  177. SSR_ON_PERCENT:=PID_Output_Limit;
  178. END_IF
  179. IF SSR_ON_PERCENT<0 OR NOT ENABLE
  180. THEN
  181. SSR_ON_PERCENT:=0;
  182. END_IF
  183. SCR_OUT:=SSR_ON_PERCENT;
  184. //*******PWM脉冲输出生成
  185. SSR_ON_TIME:=REAL_TO_TIME(SSR_ON_PERCENT*10); //输出脉冲ON宽度
  186. SSR_RESET_TIME:=REAL_TO_TIME((100-SSR_ON_PERCENT)*10); //输出脉冲总宽度
  187. SSR_ON_TON(IN:= SSR_ON_ENABLE, PT:= SSR_ON_TIME, Q=> , ET=> ); //输出脉冲计时
  188. IF SSR_ON_TON.Q //输出脉冲计时器使能在计时器下方ON,实现上升脉冲;同时复位计时器使能OFF
  189. THEN
  190. SSR_RESET_ENABLE:=TRUE;
  191. END_IF
  192. IF NOT (SSR_ON_ENABLE OR SSR_RESET_ENABLE) //首次cycle触发输出脉冲使能
  193. THEN
  194. SSR_ON_ENABLE:=TRUE;
  195. END_IF
  196. SSR_RESET_TON(IN:= SSR_RESET_ENABLE, PT:= SSR_RESET_TIME, Q=> , ET=> );
  197. IF SSR_RESET_TON.Q
  198. THEN
  199. SSR_ON_ENABLE:=FALSE;
  200. SSR_RESET_ENABLE:=FALSE;
  201. SSR_ON:=FALSE; //输出脉冲计时器使能OFF
  202. END_IF
  203. IF SSR_ON_PERCENT>0
  204. THEN
  205. SSR_ON:=NOT SSR_ON_TON.Q;
  206. END_IF
  207. ]]></ST>
  208. </Implementation>
  209. <LineIds Name="Temp_controller">
  210. <LineId Id="601" Count="0" />
  211. <LineId Id="607" Count="0" />
  212. <LineId Id="603" Count="1" />
  213. <LineId Id="608" Count="0" />
  214. <LineId Id="630" Count="0" />
  215. <LineId Id="632" Count="1" />
  216. <LineId Id="609" Count="0" />
  217. <LineId Id="617" Count="0" />
  218. <LineId Id="610" Count="0" />
  219. <LineId Id="618" Count="0" />
  220. <LineId Id="634" Count="1" />
  221. <LineId Id="629" Count="0" />
  222. <LineId Id="636" Count="2" />
  223. <LineId Id="605" Count="0" />
  224. <LineId Id="620" Count="0" />
  225. <LineId Id="619" Count="0" />
  226. <LineId Id="621" Count="1" />
  227. <LineId Id="624" Count="2" />
  228. <LineId Id="623" Count="0" />
  229. <LineId Id="628" Count="0" />
  230. <LineId Id="627" Count="0" />
  231. <LineId Id="602" Count="0" />
  232. <LineId Id="98" Count="0" />
  233. <LineId Id="285" Count="0" />
  234. <LineId Id="157" Count="0" />
  235. <LineId Id="30" Count="0" />
  236. <LineId Id="112" Count="0" />
  237. <LineId Id="93" Count="0" />
  238. <LineId Id="97" Count="0" />
  239. <LineId Id="31" Count="0" />
  240. <LineId Id="94" Count="0" />
  241. <LineId Id="29" Count="0" />
  242. <LineId Id="338" Count="0" />
  243. <LineId Id="103" Count="0" />
  244. <LineId Id="95" Count="0" />
  245. <LineId Id="101" Count="0" />
  246. <LineId Id="116" Count="0" />
  247. <LineId Id="137" Count="0" />
  248. <LineId Id="117" Count="0" />
  249. <LineId Id="115" Count="0" />
  250. <LineId Id="120" Count="4" />
  251. <LineId Id="119" Count="0" />
  252. <LineId Id="339" Count="0" />
  253. <LineId Id="158" Count="0" />
  254. <LineId Id="144" Count="1" />
  255. <LineId Id="148" Count="8" />
  256. <LineId Id="147" Count="0" />
  257. <LineId Id="146" Count="0" />
  258. <LineId Id="340" Count="0" />
  259. <LineId Id="139" Count="0" />
  260. <LineId Id="138" Count="0" />
  261. <LineId Id="141" Count="1" />
  262. <LineId Id="429" Count="0" />
  263. <LineId Id="410" Count="0" />
  264. <LineId Id="431" Count="0" />
  265. <LineId Id="430" Count="0" />
  266. <LineId Id="432" Count="0" />
  267. <LineId Id="434" Count="2" />
  268. <LineId Id="421" Count="1" />
  269. <LineId Id="424" Count="0" />
  270. <LineId Id="534" Count="0" />
  271. <LineId Id="425" Count="3" />
  272. <LineId Id="419" Count="0" />
  273. <LineId Id="162" Count="0" />
  274. <LineId Id="192" Count="0" />
  275. <LineId Id="189" Count="2" />
  276. <LineId Id="197" Count="2" />
  277. <LineId Id="194" Count="2" />
  278. <LineId Id="200" Count="1" />
  279. <LineId Id="259" Count="0" />
  280. <LineId Id="204" Count="0" />
  281. <LineId Id="165" Count="2" />
  282. <LineId Id="349" Count="1" />
  283. <LineId Id="168" Count="0" />
  284. <LineId Id="348" Count="0" />
  285. <LineId Id="172" Count="4" />
  286. <LineId Id="164" Count="0" />
  287. <LineId Id="531" Count="0" />
  288. <LineId Id="512" Count="0" />
  289. <LineId Id="528" Count="0" />
  290. <LineId Id="532" Count="0" />
  291. <LineId Id="526" Count="1" />
  292. <LineId Id="529" Count="1" />
  293. <LineId Id="178" Count="0" />
  294. <LineId Id="230" Count="0" />
  295. <LineId Id="232" Count="0" />
  296. <LineId Id="231" Count="0" />
  297. <LineId Id="233" Count="2" />
  298. <LineId Id="180" Count="0" />
  299. <LineId Id="706" Count="0" />
  300. <LineId Id="262" Count="0" />
  301. <LineId Id="707" Count="0" />
  302. <LineId Id="181" Count="0" />
  303. <LineId Id="282" Count="0" />
  304. <LineId Id="238" Count="0" />
  305. <LineId Id="258" Count="0" />
  306. <LineId Id="239" Count="0" />
  307. <LineId Id="271" Count="1" />
  308. <LineId Id="275" Count="0" />
  309. <LineId Id="270" Count="0" />
  310. <LineId Id="502" Count="2" />
  311. <LineId Id="501" Count="0" />
  312. <LineId Id="266" Count="0" />
  313. <LineId Id="240" Count="0" />
  314. <LineId Id="267" Count="0" />
  315. <LineId Id="499" Count="0" />
  316. <LineId Id="268" Count="0" />
  317. <LineId Id="510" Count="0" />
  318. <LineId Id="269" Count="0" />
  319. <LineId Id="505" Count="1" />
  320. <LineId Id="508" Count="0" />
  321. <LineId Id="507" Count="0" />
  322. <LineId Id="498" Count="0" />
  323. </LineIds>
  324. </POU>
  325. </TcPlcObject>