PROGRAM MAIN_PROGRAM
VAR_INPUT
Start_Stop_Timer:bool;
Temp_current:real:=20;(*Начальная температура*)
Temp_end:real:=35;(*Конечная температура*)
time_Hold_hours:real:=5;(*Время удержания температуры*)
heat_speed_deg_per_min:real:=0.05;(*Скорость нагрева град\мин*)
reset_timer:bool; (*Сброс температуры и температурного приращения к начальной температуре*)
END_VAR
VAR_OUTPUT
ustavka:real;(*Значение температуры на запись в термостат*)
END_VAR
var
proba:real;
shag:real:=0.01; (*Минимальный шаг уставки температуры термостата*)
z:real; (*Время измнения температуры на 0.01 град в мин *)
delta:real; (*Приращение температуры*)
in1:bool;(*Запуск таймера удержания*)
in2:bool;(*Запуск таймера нагрева*)
Timer1:TON; (*Таймер для удержания температуры*)
Timer2:TON; (*Таймер для нагрева*)
T1:time:=T#1h;(*Время первого таймера для удержания в часах*)
T2:time:=T#1m;(*Время второго таймера таймера в минутах*)
out1,out2:bool;(*логика выхода таймера*)
end_var
(*TODO: TYPE PROGRAM CODE HERE*)
in1:=Start_Stop_Timer;
Timer1(In:=in1,PT:=MUL(T1,time_Hold_hours));
out1:=Timer1.Q;
z:=shag/heat_speed_deg_per_min-0.0167;(*минус период опроса программы ST в настройках = 1 секунда в минутах *)
Timer2(In:=in2,PT:=MUL(T2,z));
out2:=Timer2.Q;
if Start_Stop_Timer=true and out2=false and out1=true and (Temp_current+delta+shag)<Temp_end then in2:=true;
else in2:=false; end_if;
if out2=true and (Temp_current+delta+shag)<Temp_end then delta:=delta+shag; end_if;
ustavka:=Temp_current+delta;
if Start_Stop_Timer=false and reset_timer=true then ustavka:=Temp_current; delta:=0; end_if;
END_PROGRAM