
Сообщение от
Валенок
Дык шаг 0 после стопа будет 1 цикл или 1.5 месяца же - как звезды сложатся
Вы хотите сказать, что get_time() - T#0s будет < T#1s в течении 1.5 месяцев?
Я думал, Вас беспокоит, что при быстром сбросе OnOff при State := 3; произойдет смена вращения без паузы.
А вообще, я бы с Вами согласился, если бы арифметика была бы со знаком!!!
Давайте предупредим новичков, что get_time() каждые 1.5 месяца обнуляется.
И да, при get_time() = Tmax, какое-то состояние будет выдержано не полностью.
Предлагаю безопасный вариант с предварительной паузой:
Код:
function_block FPRP
var_input
OnOff : bool; // Управление блоком
end_var
var_output
FW, RW : bool; // Сигналы вперед и назад
end_var
var
State : udint; // Текущее состояние
t : SYS.TON; // Таймер
end_var
if OnOff then
case State of
0: // Пауза 1 сек перед пуском вперед
t(I:=true, T:=T#1s);
if t.Q then
State := 1; FW := true; t(I:=false); // Пуск вперед
end_if
1: // Вращение вперед 2 сек перед паузой
t(I:=true, T:=T#2s);
if t.Q then
State := 2; FW := false; t(I:=false); // Пауза
end_if
2: // Пауза 1 сек перед пуском назад
t(I:=true, T:=T#1s);
if t.Q then
State := 3; RW := true; t(I:=false); // Пуск назад
end_if
3: // Вращение назад 2 сек перед паузой
t(I:=true, T:=T#2s);
if t.Q then
State := 0; RW := false; t(I:=false); // Пауза
end_if
end_case
else
FW := false; RW := false; State := 0; t(I:=false);
end_if
end_function_block