Пытаюсь сделать управление нагревателем, 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