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


Ответить с цитированием