Просмотр полной версии : Порядок выполнения кода LADDER
DolomanN
23.09.2024, 17:11
Добрый день. Сами строки в ladder выполняются циклично и параллельно, насколько я понял.
Но при написании программы столкнулся с тем, что строчки в блоке "execute" тоже выполняются параллельно, да и флаг выполнения блока "ENO" вывешивается до выполнения кода внутри.
Прописал два таймера в блоке execute, и они начинают работу сразу параллельно друг другу.
Вопрос, как организовать последовательное выполнение строчек кода?
78808
DolomanN
23.09.2024, 18:42
Проблема возникла конкретно в том, что мне нужно выполнять дальнейшую программу только после получения результата от execute блока, но это не получается реализовать из-за того что "ENO" срабатывает до выполнения кода внутри, так же, если прописать в конце кода что-то вроде result=TRUE, то она примет это значение сразу, как только программа зайдет в этот блок.
Получается, что надо писать так:
IF NOT TON12.IN THEN
// Выполнение кода
END_IF
// Пауза 2 раза по 10s
TON12(IN:=in1, PT:=T#10s);
IF TON12.Q THEN
TON13(IN:=in2, PT:=T#10s);
IF TON13.Q THEN
ok := TRUE;
TON12(IN:=FALSE); TON13(IN:=FALSE);
END_IF
END_IF
Строки то выполняются последовательно, только они не ждут, когда таймеры отработают.
Проверить состояние таймеров можно только на следующем цикле.
DolomanN
24.09.2024, 10:49
А если не брать в расчет работу с таймерами, у которых есть результат выполнения. А, например, если мы перебираем массив, и работаем со строками. то в конце каждого действия ставить дополнительные переменные, которые будут позволять переходить к следующей строчке только после завершения предыдущей?
и вопрос, это особенность всех языков стандарта IEC61131-3?
В принципе можно организовать цикл, но сразу же сработает сторожевой таймер.
Дело в том, что в настройках конфигурации жестко задается время программного цикла.
ОС ПЛК кроме цикла программы еще занимается и обменом по всем портам и т.д.
Сдается мне, что многозадачность то - кооперативная. Не любит он длинные циклы в программе пользователя (а вдруг бесконечный цикл - "зависание")!
И да - все языки этого стандарта такие.
чтобы цикл не приводил к зависанию и сработке сторожевых таймеров то система должна быть многозадачной и позволять создавать потоки.
То есть вы бесконечный цикл запускаете в отдельном потоке и в рамках основного потока к нему обращаетесь.
Не уверен, что ST это позволяет в принципе
DolomanN
24.09.2024, 13:52
понял, в общем, получается что ограничение именно в цикличности исполнения программы. ПЛК не может выходить за свой цикл ожидая исполнения.
может кто-нибудь знает, можно ли прикрутить модуль входов-выходов ОВЕН к питону?
понял, в общем, получается что ограничение именно в цикличности исполнения программы. ПЛК не может выходить за свой цикл ожидая исполнения.
всегда найдется место куда можно вставить return и программа дальше не пойдет пока не выполнится какое то условие в первом ПОУ
может кто-нибудь знает, можно ли прикрутить модуль входов-выходов ОВЕН к питону
яндекс, гугл гитхаб, все знают
https://github.com/ljean/modbus-tk/blob/master/examples/rtumaster_example.py
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot