-
Не работает код, таймер
Пытаюсь сделать управление нагревателем, 2 режима. Первый: Нагрев, второй: Поддержание температуры на заданном уровне. Я попробовал описать функциональный блок, но он не работает. Подскажите, как будет правильно реализовать? Может, тут надо таймеры в отдельный функциональный блок как-то вынести?
Код:
FUNCTION_BLOCK Heater
VAR_INPUT
Temper_k :WORD; (*Температура с термопары*)
Time_grow :TIME; (*Время изменения мощности, скорость нагрева*)
Temper_oper: UINT; (*Температура, которую задает оператор*)
Time_work_elect_heat :TIME; (*Время поддержания температуры*)
END_VAR
VAR_OUTPUT
Out_elect_heat :WORD; (*Мощность нагревателя*)
END_VAR
VAR
Timer_grow : TON;
Operation_time: TON;
Time_step :TIME; (*Время приращения мощности ТЭНа*)
capacity_ADC :UINT := 4096; (*Разрядность АЦП*)
step_grow :UINT := 128; (*Приращение АЦП*)
heating_mode :UINT; (*Режим нагревателя, 0 - нагрев, 1 - поддержание температуры*)
END_VAR
Код:
Time_step := Time_grow / capacity_ADC; (*Это время идет на таймер, который вызывает сигнал Timer*)
Timer_grow(IN := 1, PT := Time_step);
Operation_time(IN := 1, PT := Time_work_elect_heat);
CASE heating_mode OF
0:
IF Timer_grow.Q AND (Temper_k < Temper_oper) AND Out_elect_heat < capacity_ADC THEN
Out_elect_heat := Out_elect_heat + step_grow; (*32 шага при 12-битном АЦП*)
ELSIF Timer_grow.Q AND (Temper_k > Temper_oper) AND Out_elect_heat > 0 THEN
heating_mode :=1;
END_IF
1:
IF Operation_time.Q AND (Temper_k < Temper_oper) AND Out_elect_heat < capacity_ADC THEN
Out_elect_heat := Out_elect_heat + step_grow; (*32 шага при 12-битном АЦП*)
ELSIF Operation_time.Q AND (Temper_k > Temper_oper) AND Out_elect_heat > 0 THEN
Out_elect_heat := Out_elect_heat - step_grow; (*32 шага при 12-битном АЦП*)
ELSE
Out_elect_heat := 0;
END_IF
END_CASE
-
чего за понты, ПИД-регулятором не хотели бы воспользоваться для своей задачи
и точно речь об овеновском плк, так то температуры у нас в REAL-ах, а в словах это у семена
-
Я не понимаю, где я ошибся, конкретный ПЛК/разрядность и т.д. это второстепенные вопросы. Меня больше интересует, как решить данную проблему.
-
-
Спасибо вам! Попробую разобраться что к чему.
-
да тут разбираться нечего, Ваш код не будет работать, потому что ))) надо смотреть эпюры
таймер прокрутится один раз и всё, я не нашел в коде где он перезапускается
-
Да я это уже понял) Не все мы рождаемся со всеми знаниями, некоторые приобретаем)
-
Я поправил код, но по какой-то причине не идет время в ET таймера operation_time, в эмуляции устанавливается IN в TRUE, PT тоже время присваивается, но отсчет не начинается. Подскажите, из-за чего так?
Код:
Time_step := Time_grow / capacity_ADC; (*Ýòî âðåìÿ èäåò íà òàéìåð, êîòîðûé âûçûâàåò ñèãíàë Timer*)
Timer_grow(IN := TRUE, PT := Time_step);
CASE heating_mode OF
0:
IF Timer_grow.Q AND (Temper_k < Temper_oper) AND Out_elect_heat < capacity_ADC THEN
Timer_grow(IN := FALSE);
Operation_time(IN := FALSE);
Out_elect_heat := Out_elect_heat + step_grow; (*32 øàãà ïðè 12-áèòíîì ÀÖÏ*)
ELSIF Timer_grow.Q AND (Temper_k >= Temper_oper) AND Out_elect_heat > 0 THEN
Timer_grow(IN := FALSE);
Operation_time(IN := TRUE, PT := Time_work_elect_heat);
heating_mode := 1;
END_IF
1:
IF Operation_time.Q AND Timer_grow.Q AND (Temper_k < Temper_oper) AND Out_elect_heat < capacity_ADC THEN
Timer_grow(IN := FALSE);
Out_elect_heat := Out_elect_heat + step_grow; (*32 øàãà ïðè 12-áèòíîì ÀÖÏ*)
ELSIF Operation_time.Q AND Timer_grow.Q AND (Temper_k >= Temper_oper) AND Out_elect_heat > 0 THEN
Timer_grow(IN := FALSE);
Out_elect_heat := Out_elect_heat - step_grow; (*32 øàãà ïðè 12-áèòíîì ÀÖÏ*)
ELSIF NOT Operation_time.Q THEN
Operation_time(IN := FALSE);
Out_elect_heat := 0;
END_IF
END_CASE
-
Чтобы работало надо чтобы после отработки таймера перед следующим запуском вход IN сбрасывался в FALSE.
У вас таймер с задержкой включения. Выход ET изменяется после поступления сигнала на вход IN до тех пор, пока таймер не выдаст сигнал на выходе Q. Следующий раз он будет изменяться только когда очередной раз сбросите и снова включите вход IN.
-
Подскажите, почему при эмуляции Timer1 досчитывает до конца и дальше эмуляция не идет? Я так подозреваю, потому что нет последующего изменения IN на TRUE, после FALSE. Хотя, может в чем-нибудь другом причина?
Код:
PROGRAM PLC_PRG
VAR
Timer1 : TON;
Timer2 :TP;
T1: BOOL := TRUE;
T2: BOOL;
END_VAR
Код:
Timer1(IN:=T1, PT:=T#5s);
Timer2(IN:=T2, PT:=T#10s);
IF Timer1.Q THEN
T1 := FALSE;
T2 := TRUE;
END_IF
IF NOT Timer2.Q THEN
T1 := TRUE;
T2 := FALSE;
END_IF