, ET=> ); IF CACHE_TEMP_SV0) 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 ]]>