-
Для организации таймера в 1 сек пробывал сделать так:
Программа ST:
PROGRAM MAIN_PROGRAM
VAR_INPUT
in:bool;
front_out:bool;
END_VAR
VAR_OUTPUT
out:bool;
front_in:bool;
END_VAR
(*TODO: TYPE PROGRAM CODE HERE*)
if in = true then
if front_in = false and front_out = false then
front_in := true;
out := true;
elsif front_in = true and front_out = false then
front_in := false;
out := false;
end_if;
end_if;
END_PROGRAM
и ФБ Передний фронт.Связь Вход-front_in, передний фронт-front_out.
Схема в принципе работает, но не 1 сек, а примерно в 2.Это и понятно,потому что 1 такт программы 1сек. Пробывал уменьшить время опроса объектов. Не помогло. Что еще можно сделать?
-
Вот такой код попробуйте. Опрос у ФБ "Скрипт ST" поставьте периодический (опрос остальных объектов можно не менять)
PROGRAM MAIN_PROGRAM
VAR_INPUT
in:bool;
END_VAR
VAR_OUTPUT
out:bool;
END_VAR
var
m:bool:=false;
Trig1:R_Trig;
end_var
(*TODO: TYPE PROGRAM CODE HERE*)
Trig1(Clk:=in);
if out=true then
out:=false;
end_if;
if m=true then
out:=true;
m:=false;
end_if;
if Trig1.Q=true then
m:=true;
end_if;
END_PROGRAM
-
Это код я как понял будет так.Поменялось in с 0 на 1 через 1сек поменялся out. и все.Чтобы опять out стал равен 1, а потом 0 надо in снова поменять на 0, а потом на 1.Мне же надо сделать так.Если на in пришла 1,то out поочередно сам меняется с 0 на 1. и меняется до тех пор,пока in равен 1, как только in равен 0, out перестает менятся.
-
сделал так:
PROGRAM MAIN_PROGRAM
VAR_INPUT
in:bool;
END_VAR
VAR_OUTPUT
out:bool;
END_VAR
VAR
timer:TON;
timer1:TON;
END_VAR
(*TODO: TYPE PROGRAM CODE HERE*)
if in = true then
timer();
timer1();
if not timer.in then
timer1(in:=false);
timer(in:=true,PT :=T#1s);
out := true;
end_if;
if timer.Q then
out := false;
timer1(in:=true,PT:=T#1s);
end_if;
if timer1.Q then
timer(in:=false);
end_if;
end_if;
END_PROGRAM
Насколько можно(оптимально) уменьшить время цикла программы?
-
Можно вопрос.Я так думаю что Время цикла программы должно быть таким же как время цикла опроса ОРС сервера, иначе если время программы будет меньше время цикла ОРС, то могут пойти ошибки.А можно ли время для ОРС задать 20 мс?Не произойдут ли какие нибудь сбои из-за времени?
-
20 мс слишком мало. Сам ОРС за это время не успеет устройство опросить.
Мы не рекомендуем снижать цикл опроса ОРС и объектов ниже 500 мс. Тем более что ниже этого значения - это бессмысленно, все равно оператор не успеет среагировать с такой скоростью.
-
А тогда можно сделать так:время цикла программы одно допустим 50мс, а время опроса ОРС оставить 1000мс?Или все таки они должны быть одинаковы?
-
В принципе можно, но тогда объекты будут исполняться в разных потоках.
Может получится что слишком короткие импульсы которые вы будете передавать из "быстрого" объекта в "медленный" могут не пройти.
А зачем вам такой маленький цикл?
-
Просто надо было отобразить аварийное состояние клапана.Это состояние состоит из 2 изображений. И надо переключать эти изображения с переодичностью 1 сек. при аварии.Сделал Программу ST:
PROGRAM MAIN_PROGRAM
VAR_INPUT
in:bool;
END_VAR
VAR_OUTPUT
out:bool;
END_VAR
VAR
timer:TON;
timer1:TON;
END_VAR
(*TODO: TYPE PROGRAM CODE HERE*)
if in = true then
timer();
timer1();
if not timer.in then
timer1(in:=false);
timer(in:=true,PT :=T#1s);
out := true;
end_if;
if timer.Q then
out := false;
timer1(in:=true,PT:=T#1s);
end_if;
if timer1.Q then
timer(in:=false);
end_if;
end_if;
END_PROGRAM
этот код зависит от времени выполнения цикла.Если поставить 1000мс, то out меняется с периодичностью 2 сек.Вот для этого уменьшил.
-
Попробовал сделать отдельный объект Таймер и перенес Программу ST.Поставил Собственный цикл и выставил 20мс. Так в принципе можно сделать?Если объект Таймер входит в объект с периодом 1000мс.