Еще раз хочу уточнить.
У вас первый этап занимает два шага, второй этап - 6 шагов. Вы хотите моргнуть при изменении шага (udiSel) или изменении этапа (выходы)? И как моргнуть - кратковременно сбросить переменную Start или кратковременно взвести ее?
Вид для печати
Какие еще есть варианты отключить выход на короткий промежуток времени при смене значения на входе? Возможно ли после каждого оператора If поставить условие отключения выхода, к примеру на 1 мс?
Моргнуть при изменении этапа, кратковременно выключить выход (сбросить Start).
Вообще, всё делается гораздо проще на шаговом автомате CASE, тут есть несколько примеров, везде где есть шаги или переключения режимов, только в вашем случае без таймера шагов https://owen.ru/forum/showthread.php...=9&p=429061#81
При использовании кода:
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
Вложение 77972
Селектор работает, но выход не сбрасывается.
//область кода
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
Спасибо за помощь! Оба варианта работают