
Сообщение от
Viktor D
Спасибо. Работает.
Т.Е. надо просто в отсутствии strt устантвить state 0 (первая ступень цикла) и присвоить t : SYS.TON; логический 0.
А что в таком случае будет происходить при переполнении get_time()? Или при использовании SYS.TON это не важно?
Если Вы используете SYS.TON, то get_time() - не нужен и наоборот.
Попробуйте понять как работает этот вариант, где нет ни того ни другого:
Код:
function_block DRV
var_input
Start : bool;
Stop : bool;
tStart : udint;
tStop : udint;
end_var
var_output
FW : bool;
RW : bool;
end_var
var
btn : SYS.RS;
bl : SYS.BLINK;
st : SYS.CTN;
end_var
btn(S := Start, R := Stop);
bl(I := btn.Q, Th := udint_to_time(tStart), Tl := udint_to_time(tStop));
st(U := bl.Q, R := st.Q = 2);
FW := (st.Q = 0) and bl.Q;
RW := (st.Q = 1) and bl.Q;
end_function_block
capzap предложил Вам добавить в код:
Код:
if strt then OnOff := true; end_if // Фиксируем состояние входа "Старт"
if stop then OnOff := false; end_if // Но "Стоп" является приоритетом, но тогда...
if OnOff then // вместо if strt then
Некоторые пишут так:
Код:
OnOff := (OnOff or strt) and not stop;
Можно входные переменные вставлять в параметры других блоков, например:
Код:
t(I:=true, T:=udint_to_time(ust_p)); // где ust_p задается в миллисекундах!!!