Здравствуйте! Необходимо раз в секунду вызывать функцию. Пытался в кофигураторе задач. Создал задачу->вызов циклически каждую секунду. Проблема в том что тогда PLC_PRG не вызывается.
Возможно ли в конфигураторе такое сделать или только через таймер?
Вид для печати
Здравствуйте! Необходимо раз в секунду вызывать функцию. Пытался в кофигураторе задач. Создал задачу->вызов циклически каждую секунду. Проблема в том что тогда PLC_PRG не вызывается.
Возможно ли в конфигураторе такое сделать или только через таймер?
Естественно, возможно.
Создайте еще одну задачу с вызовом PLC_PRG раз во сколькото мс.
А не получится сделать так, чтоб PLC_PRG вызывалась вновь , но только после завершения? Тогда надо Ставить интервал вызова не меньше чем цикл PLC_PRG?
Скажем так - как только Вы переходите на task manager - забыли про циклы PLC_PRG.
Такая вот простейшая приоритетная невытесняющая система реализована.
Создайте в программе генератор BLINK.
По фронту сигнала вызывайте свой FB.
Вот это вы меня озадачили:) Я даже уже не знаю что лучше?
Если я поставлю тип задачи "свободная" это значит что PLC_PRG будет выполнен по его завершению?
Непонятен вопрос.
Вам надо обеспечить принудительный вызов PLC_PRG по завершению секундной процедуры? Вызовите его последней операцией в секундной процедуре.
Нет, Я хочу в конфигураторе задач вызывать свою секундную операцию. Но тогда прийдется через конфигуратор вызывать и PLC_PRG так как он перестает вызыватся если использовать конфигуратор задач. Но надо чтоб PLC_PRG вызывалась циклически, но не по времени а по завершению самого PLC_PRG. Вот я и интнрнсовался. Если я в конфигураторе задач вызову PLC_PRG с типом вызова "свободная"?
Потому что неизвестно сколько PLC_PRG может занять времени. Чтоб не получилось так что пришло время вызова PLC_PRG а он еще выполняется.
Этого никогда не произойдет. Читайте основы работы ПЛК.
Где это прочитать?
Вызов PLC_PRG с типом свободная в конфигураторе задач практически тоже самое, что и работа PLC_PRG если конфигуратор задач не используется.
От чего же не известно? Добавьте в код программы PLC_PRG
1.В первой строке t1:=TIME();
2.Затем исходный код PLC_PRG
3. В последней строке t2:=TIME()-t1:
Загрузите в ПЛК, запустите на исполнение и смотрите значение t2. Это и есть время выполнения PLC_PRG.
Например получилось t2=10 мс.
Это значит 100 раз подряд выполнится PLC_PRG, затем один раз программа с циклическим временем вызова 1 сек, затем все повторится.
Я был не точен. Частота вызова программы с типом свободная определяется заданным временем цикла в конфигурации ПЛК.
следует читать такЦитата:
Например получилось t2=10 мс.
Это значит 100 раз подряд выполнится PLC_PRG, затем один раз программа с циклическим временем вызова 1 сек, затем все повторится.
Например получилось t2 не более 10 мс. И цикл ПЛК установлен 10 мс.
Это значит 100 раз подряд выполнится PLC_PRG, затем один раз программа с циклическим временем вызова 1 сек, затем все повторится.
Вложение 12225
Спасибо. Тоесть PLC_PRG можно ставить "свободная". А секундный ФБ "циклическая" с периодом 1сек. Так?
Зачем? Отмониторьте в tasck manager при выполнении программы.
Да.
К предыдущему примеру добавил измерение времени вызова "свободной" программы.
Вложение 12227
Спасибо, то что мне нужно!
Как то сложно все... а нельзя было из PLC_PRG раз в секунду Вашу подпрограмму вызывать???
Наверное можно. Если знать как. Я не знаю
var
Tmr_1s:ton;
end_var
Tmr_1s(In:=not(Tmr_1s.Q),Pt:=t#1s);
if Tmr_1s.Q then
Your_program;
end_if
Спасибо! И эта конструкция будет перезапускаться автоматом каждую секунду?
Нет. Эта конструкция будет перезапускаться автоматом не чаще чем раз в секунду+1 цикл
ОК. Спасибо.
Я вообще не юзаю все эти таймеры, для всего хватает только функции TIME(), если например нужно делать что-то периодически, просто в нужный момент загоняю в определённую переменную текущее значение TIME(), и потом проверяю разность TIME() - <Переменная>. При этом саму функцию TIME() можно не вызывать по сто раз за цикл, а в начале каждого цикла присваивать её значение какой-то переменной, и потом работать уже с этой переменной. ИМХО, без этих таймеров оптимальнее.
P. S. Кстати когда TIME() переходит через границу диапазона (раз в 49 суток вроде), то разность его с предыдущим значением (которое было запомнено до переполнения диапазона) не станет "космической", и всё равно будет верной. Опять же за счёт этого переполнения диапазона в результате вычитания. Проверено.