Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.
Перед Новым годом (с неделю назад) столкнулся с багом Owen Logic.
Весь проект, к сожалению, на форуме выложить не могу, но при дублировании претензии в техподдержку обязательно прикреплю.
Проект автоматизации содержит несколько насосов, нагревателей, задвижек. Управление всем оборудованием возможно как в автоматическом режиме, так и в ручном режиме с панели оператора Weintek.
Задвижки не имеют концевиков, поэтому управляются "на доверии" - т.е. в программе используется модель задвижки, которая по длительности сигналов "открыть" и "закрыть" вычисляет позицию и срабатывание концевиков (вопросы по решениям и подбору оборудования - к проектировщику, я лишь получаю ТЗ и реализую его).
Эти задвижки открываются только перед пуском насосов для заполнения их водой. Поэтому повторяющийся код с моделью и условиями открытия-закрытия одной задвижки оформлен в макрос. По количеству задвижек программа содержит два макроса.
Каюсь - до этой поры игнорировал предупреждения о циклических связях, поэтому программа содержала 11 таких сообщений. Но при этом, внутри использованных макросов циклических связей не было.
Ошибка проявлялась следующим образом:
Поведение наблюдал как по состояниям на панели, так и на ПР по значениям переменных в режиме онлайн-отладки.
Во время ПНР и проверки исполнительных механизмов с панели оператора перевожу в ручной режим обе задвижки.
Подаю сигнал открыть или закрыть на первую задвижку - через время полного хода (45 секунд) срабатывает "концевик" модели и соответствующее реле выключается и управляющее напряжение с привода снимается.
А вот для второй задвижки срабатывание "концевика" выполняется почти сразу без выдержки времени полного хода в обоих направлениях (и открыть и закрыть).
Ситуация странная, т.к. для каждой задвижки использовал экземпляры одного и того же макроса.
Проблему решил устранением циклических связей - заменой соединительных линий на линии обратной связи.
Ошибка воспроизводилась на ПР205-230.1211.22 и двух разных OwenLogic 2.10.367 и 2.11.370 (с заменой прошивки в ПР).
Думаю, что это всё же ошибка OwenLogic, т.к. несмотря на мою небрежность к циклическим связям, макросы для двух задвижек должны были отрабатывать одинаково - т.е. при формировании состояний "задвижка открыта" или "задвижка закрыта" должно было выдерживаться время полного хода. Тем более, что для одной задвижки это работало, а для другой - нет.
После устранения всех циклических связей - ошибка ушла, т.е. макрос корректный.
Приведу внешний вид макросов в программе, чтобы показать, что все переменные подключены, не перепутаны. Назначение макросов - при поступлении запроса включения насоса перекачки воды - проверить его заполненность водой и при необходимости выполнить заполнение (открыть задвижку и включить погружной насос заполнения). Задвижки индивидуальные, а насос заполнения общий, поэтому сигнал его включения объединяется по OR.
Повторюсь, проекты для ПР и Weintek отправлю в техподдержку, т.к. не могу их опубликовать.
Но для себя сделал вывод, что предупреждения о циклических связях не столь безобидны.
На языке ST это примерно если бы вы поменяли местами 2 строки, на LD это поменять местами 2 ветви. Это очень критично. Код совершенно по разному будет работать. Но иногда, если в программе нет замороченных связей, это случайным образом проканывает. Тут у вас не прошёл этот финт, где то эта последовательность выполнения и присвоения переменной портит вам всю логику, но это не баг OL, это реальность...
Писанины много, а толку как обычно 0.
Если это макрос на FBD, то при копировании, связи в макросе могут просто разорваться. Надо проверять.
А по выходным линиям задержки видно, что выхода присваиваются в разной последовательности.
Возможно дело не только в линиях задержки, но и в присвоении выходов (например по разному присваиваются энергонезависимые и нет
или с настройкой присвоение в конце цикла -Да или Нет)
Последний раз редактировалось kondor3000; Вчера в 12:38.
А я всегда согласно логики линию задержки ставлю. А если что-то не уследил и Лоджик подсветил желтым, то разбираюсь что на что влияет и ставлю линию задержки (и не всегда там где ее Лоджик подсветил).
Не могу публиковать весь проект.
Повторю - есть макрос на FBD - Prepare_Pump_ - он содержит БЕЗ циклических связей формирование условий открытия и закрытия задвижки, включение насоса заполнения водой через эту задвижку, контроль заполнения трубопровода через дискретный датчик, формирование сигнала разрешения включения основного насоса.
В системе два рабочих насоса, поэтому через две задвижки они заполняются единственным насосом заполнения. Поэтому есть смысл повторяющийся код оформить макросом.
Этот макрос не секретный и приведу его здесь в тестовой программе - он НЕ содержит внутри себя циклических связей.
Ошибка работы ППО на OL состоит в том, что когда поступает сигнал открыть задвижку №1, то после этого сигнала через 45 секунд (время полного хода) сигнал выключается. А вот для задвижки №2 время не выдерживается и выключение происходит почти сразу.
А макросы - одинаковые, и по скрину видно, что снаружи они подключены без обрывов связей.
Т.е. пауза на TON внутри макроса должна отрабатывать и для задвижки №1 и для задвижки №2.
А должна, потому, что подаю с панели команду открыть-закрыть - и вижу эту команду на входе в макрос.
К сожалению, не записал видео, как одна задвижка открывается 45 секунд, а другая - почти мгновенно.
При ПНР первым делом проверил подключение переменной времени полного хода к макросу. Проверил прохождение команд РУЧН-АВТО и ОТКР-ЗАКР от панели - проходят. Значит таймер внутри макроса должен выдержать 45 секунд. НО, не выдерживал для задвижки №2, а выдерживал для №1.
Прикладываю скрины макросов и тестовую программу с ними - это не та, с которой ошибка.
Ещё раз выделю ошибку:
- в ручном режиме все циклические связи уже недействительны - они не проходят через маски из элементов AND
- в ручном режиме остаются только сигналы переключения РУЧН-АВТО и ОТКР-ЗАКР, приходящие от панели оператора
- макрос и вложенный в него - НЕ содержит циклических связей
- при подаче в РУЧН команды ОТКР (или ЗАКР) внутренний таймер TON не выдерживает 45 секунд, а сразу формирует сигнал окончания отсчёта
А таймер в макросе неожиданно стал одним и тем же, и вышло у него время...
Хотя вроде таймеры тут все программные и не должно быть такого, но вдруг как-то с этим связано?