Какие еще есть варианты отключить выход на короткий промежуток времени при смене значения на входе? Возможно ли после каждого оператора If поставить условие отключения выхода, к примеру на 1 мс?
Моргнуть при изменении этапа, кратковременно выключить выход (сбросить Start).
Вообще, всё делается гораздо проще на шаговом автомате CASE, тут есть несколько примеров, везде где есть шаги или переключения режимов, только в вашем случае без таймера шагов https://owen.ru/forum/showthread.php...=9&p=429061#81
Последний раз редактировалось kondor3000; 12.08.2024 в 14:59.
При использовании кода:
f udiSel<> udiSel_ then
Start:=false;
udiSel_:=udiSel;
else Start:=True;
end_if
Происходит сброс выхода при каждом изменении переменной udiSel. Case и If у меня дают одинаковые результаты. Как сделать сброс после этапа выполнения? Переменная udiSel меняется от 2 до 7, при этом сброс выхода делать не нужно, так как происходит регулирование в заданном диапазоне.
//область кода
xOut1 := 0;
xOut2 := 0;
xOut3 := 0;
Start := false;
CASE udiSel OF
0..1:
xOut1 := IN0_0;
xOut2 := IN0_1max;
xOut3 := D0_1;
2..7:
xOut1 := IN0_1max;
xOut2 := IN2_7max;
xOut3 := D2_7;
8..14:
xOut1 := IN2_7max;
xOut2 := IN8_14max;
xOut3 := D8_14;
END_CASE
if udiSel <> udiSel_ then
Start := false;
udiSel_:= udiSel;
else Start := True;
end_if
END_FUNCTION_BLOCK
Screenshot 2024-08-12 153905.png
Последний раз редактировалось Александр_004; 12.08.2024 в 15:39.
Селектор работает, но выход не сбрасывается.
//область кода
xOut1 := 0;
xOut2 := 0;
xOut3 := 0;
//Start := false;
if (udiSel >= 0) and (udiSel <= 1) then
xOut1 := IN0_0;
xOut2 := IN0_1max;
xOut3 := D0_1;
end_if
if (udiSel<>udiSel_) and ((udiSel=0) or (udiSel=1)) then
Start := false;
udiSel_:= udiSel;
else Start := True;
udiSel_:= udiSel;
end_if
if (udiSel >= 2) and (udiSel <= 7) then
xOut1 := IN0_1max;
xOut2 := IN2_7max;
xOut3 := D2_7;
end_if
if (udiSel<>udiSel_) and ((udiSel=2) or (udiSel=7)) then
Start := false;
udiSel_:= udiSel;
else Start := True;
udiSel_:= udiSel;
end_if
if (udiSel >= 8) and (udiSel <= 14) then
xOut1 := IN2_7max;
xOut2 := IN8_14max ;
xOut3 := D2_7;
end_if
if (udiSel<>udiSel_) and ((udiSel=8) or (udiSel=14)) then
Start := false;
udiSel_:= udiSel;
else Start := True;
udiSel_:= udiSel;
end_if
end_function_block
[QUOTE=Александр_004;443640]Селектор работает, но выход не сбрасывается.
А если так
Код:var flag : udint; end_var xOut1 := 0; xOut2 := 0; xOut3 := 0; Start := false; case udiSel of 0, 1: xOut1 := IN0_0; xOut2 := IN0_1max; xOut3 := D0_1; Start := true; flag := 0; 2..7: if flag = 1 then xOut1 := IN0_1max; xOut2 := IN2_7max; xOut3 := D2_7; Start := true; else flag := 1; end_if 8..14: if flag = 2 then xOut1 := IN2_7max; xOut2 := IN8_14max; xOut3 := D8_14; Start := true; else flag := 2; end_if end_case end_function_block
Последний раз редактировалось kondor3000; 12.08.2024 в 19:19.
Спасибо за помощь! Оба варианта работают