Просмотр полной версии : Про параллельные ветки в SFC вопрос
Что-то я до конца не понял из описаний МЭК и Кодесиса.
Как оно реально исполняется? В течении одного цикла ПЛК слева направо, или там взаправду какая-то одновременнность?
В эмуляторе получается, что про конкурентной записи в переменную в нескольких ветках на входе в следующий цикл там то значение, которое писалось самым правым блоком.
Так и есть? Правильно ли сказать, что все блоки, у которых есть маркер, в течении одного цикла ПЛК обходятся на самом деле последовательно слева направо? Или поведение системы при конкурентном доступе к ресурсу не определено вообще (что было бы правильно, пожалуй)?
Что-то я до конца не понял из описаний МЭК и Кодесиса.
Как оно реально исполняется? В течении одного цикла ПЛК слева направо, или там взаправду какая-то одновременнность?
В эмуляторе получается, что про конкурентной записи в переменную в нескольких ветках на входе в следующий цикл там то значение, которое писалось самым правым блоком.
Так и есть? Правильно ли сказать, что все блоки, у которых есть маркер, в течении одного цикла ПЛК обходятся на самом деле последовательно слева направо? Или поведение системы при конкурентном доступе к ресурсу не определено вообще (что было бы правильно, пожалуй)?
О какой конкуренции для параллельных ветвей может идти речь вообще? На то они и параллельные. И "там взаправду одновременнность".
21156
Когда встречается параллельные ветви, то маркер активного шага уже будет не один, SFC исполнитель их размножит на количество параллельных ветвей. В вашем случае их уже будет три, по одному на каждую ветвь. Соответственно в Вашем случае активных шагов будет три. А Вы взяли и одной и той же переменной присваиваете в каждом активном шаге разные значения и удивляетесь почему "там то значение, которое писалось самым правым блоком".
А какое значение из трех там должно быть? Там будет то значение, которое встретилось в программе последним, т.е. "которое писалось самым правым блоком".
Если речь зашла о конкурентном доступе, то возможно Вы перепутали параллельные ветви с альтернативными?
21157
Вот тут да, маркер активного шага один и только один.:rolleyes:
Или поведение системы при конкурентном доступе к ресурсу не определено вообще (что было бы правильно, пожалуй)?Порядок выполнения произвольный. Наверняка всегда выполняется слева направо, но полагаться на это я бы не стал.
одной и той же переменной присваиваете в каждом активном шаге разные значения и удивляетесь почему "там то значение, которое писалось самым правым блоком
Да не, я не удивляюсь. Просто обычно, если есть многонитевость, то и средства синхронизации тоже есть. но можно руками изобразить, не вопрос.
Это ж нормально, что в параллельных "ветвях" хочется обмениваться информацией между ветками, ничего постыдного.
но полагаться на это я бы не стал.
Угу.
Вообще нравится мне SFC. Выразительная штука.
Крайне неудобный он в CDS в отладке, в изменении кода.
Правда весомый плюс, если Вы умеете проектировать в подобном или таком стиле (http://lapshinvr.ru/algoritm.html). Сначала на бумаге.
Для реализации того же самого удобнее ST
У меня вместо ТЗ -- блоксхема, метра полтора)) Так что самое оно.
А про реализацию -- я так понял, это язык абстракций, реально байтами шевелить надо все равно в ST, LD или FBD
Неудобный.. да весь CoDeSys, прямо скажем, ужасен. На фоне современной IDE для какой-нибудь жавы.. ух.
Жава - насмешил. Правда нравится?
Это только для визуальных эффектов или чего-то не особо связанного с управлением.
Я джавист по жизни, автоматизация -- между хобби и халтурой. Начинал со схемотехники когда-то, так и не завязал до конца.
Установки у меня все исследовательско-экспериментальные.
ПЛК в эту конкретную взял потому, что сроки сжатые, а условия промышленные. Разработать помехоустойчивое железо не успевали.
Кстати, жаба в задачи управления ползет потихоньку. Очень заметные выгоды в технологии программирования потому что. но ооочень медленно ползет.
Владимир Ситников
24.12.2015, 22:42
Жава - насмешил. Правда нравится?
Читаем внимательнее: "На фоне современной IDE для какой-нибудь жавы.".
Вот пример IDE для Java: https://www.jetbrains.com/idea/
И речь не о языках Java vs ST, а о том, что в CoDeSys нет толкового автодополнения, подсказок параметров, подкрашивания красным "нерабочего кода" до нажатия build (например, пропущенная скобка или end_if), перехода к определению процедуры, "поиска использований процедуры", и много чего ещё.
какое то не дружелюбное отношение к Яве, я вот знаю что на молочных заводах по всей стране моя контора ставила оборудование под управлением на Яве с начала века, так же некоторые тэц испроьзуют теже наработки
Если у кого то не срослось, не значит что это не работает
если знакомы что такое groovy, тогда мне кажется, станет понятным как удобно отлаживать код уже на самом объекте, да и заказчику не стоит бояться, что у него на руках компиленый код без возможности его прочесть. Создать циклическое выполнение одного и того же кода, как в плк не проблема, функций для этого достаточно, плюсом может идти по настоящему параллельная работа разных блоков программа, из минусов такой код сопоставим с панелями, потому что в компе нет внутренних физических входов/выходов, обязательно нужна перефирия
а используем мы IEI Technology
как сделать RESET из любого шага? помогите плииииззз...
22717
как сделать RESET из любого шага? помогите плииииззз...
22717
Не понял в чем подвох?
Например так
22720
Или так
22721
Не понял в чем подвох?
Например так
спасибо! я думал можно как то проще...
спасибо! я думал можно как то проще...
Можно проще, но только если эта SFC программа будет не PLC_PRG, а будет просто программой, вызываемой из PLC_PRG.
Можно проще, но только если эта SFC программа будет не PLC_PRG, а будет просто программой, вызываемой из PLC_PRG.
это будет не PLC_PRG.... подскажите пожалуйста
это будет не PLC_PRG.... подскажите пожалуйста
Нужно использовать флаг "SFCReset", который нужно устанавливать в вызывающей программе и сбрасывать в шаге Init.
22725
Нужно использовать флаг "SFCReset", который нужно устанавливать в вызывающей программе и сбрасывать в шаге Init.
а примером не поделитесь? :confused: я еще чайник.... :cool:
а примером не поделитесь? :confused: я еще чайник.... :cool:
22726
https://www.youtube.com/watch?v=0Ae2uFCg0Ug
Поменяйте ветви RESET и START местами
22727
Поменяйте ветви RESET и START местами
понял...)) спасибо огромное!
Менять местами - хорошо. Но, имхо, лучше изначально исходить из неопределённости порядка выполнения в || ветках. Поможет в дальнейшем.
Предлагаю вбить "START AND NOT RESET" заместо "START". Исхожу их приоритета RESET'а
Менять местами - хорошо. Но, имхо, лучше изначально исходить из неопределённости порядка выполнения в || ветках. Поможет в дальнейшем.
Предлагаю вбить "START AND NOT RESET" заместо "START". Исхожу их приоритета RESET'а
Можно и так, указать явный приоритет, неявный приоритет - слева на право теже работает.
А вообще всегда нужно для параллельных веток в условиях прописывать все комбинации условий во избежание неопределенных состояний
а если вот так....??
22733
22734
а если вот так....??
22733
22734
Для МЭК шагов прокатит
Внимание: начиная с версии компилятора 2.3.7.0, флаг SFCReset сбрасывает также логические действия, ассоциированные с МЭК шагами, чего не было ранее
А для упрощенного SFC нет.
Кроме того у Вас частный случай, когда просто нужно OUT_xx:=FALSE. А если нужно еще какие-либо действия при сбросе сделать?
а если вот так....??
А никак. Выкиньте свое управление SFCReset раз он завязан на Di. Де факто Вы работаете с копией Di, де юро - входы не доступны для записи
Кстати - а на фига сравнение с временем если в шагах уже есть таймеры ?
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot