Добрый вечер!
Подскажите, где есть по ООП на codesys почитать? И про архитектуру среды исполнения. В документации, которая на сайте мало про это, можно сказать ничего. По крайней мере я не смог найти...
желательно на русском языке
Добрый вечер!
Подскажите, где есть по ООП на codesys почитать? И про архитектуру среды исполнения. В документации, которая на сайте мало про это, можно сказать ничего. По крайней мере я не смог найти...
желательно на русском языке
А зачем тебе ООП-то тут? Не надо его сюда, там же всё отлично через FB делается.
Хочешь я тебе вот проект скину на посмотреть? ))
На русском по этим темам фактически ничего нет.
1. Лучшая (и, собственно, единственная мне известная) книга про реализацию ООП в контексте МЭК 61131-3 - это Michael Braun, Wolfgang Horn.
Object-Oriented Programming with SIMOTION. Fundamentals, Program Examples and Software Concepts According to IEC 61131-3
Она, конечно, не про CODESYS - но так как и SIMOTION, и CODESYS базируются на МЭК 61131-3 - то отличий не очень много.
2. Эта документация предоставляется только производителям оборудования и обычно не выкладывается в свободный доступ. Но если погуглить "codesys control win v3 manual" - то кое-что найти можно.
СODESYS V3.5: Repository Archive V3.5 SP4 (необходим для старых СПК) / Раздел CDS V3.5 на сайте
Форум: Вопросы и ответы / Визуализация / Настройка обмена с другими устройствами
Web-панель ВП110 / Modbus-индикатор СМИ2-М
Telegram: @JuneSmellsLikeBlood | e-mail: e.kislov@owen.ru | oscat.ru | Как обратиться в техподдержку?
Как отлаживать ошибки | Отладка проектов в CODESYS V3.5 | XY problem | Как правильно задавать вопросы | AnyDesk
Скидывай, посмотрю.
А вообще мне надо ООП, т.к. хочу, чтоб в моем арсенале были все инструменты. Тем более используя ООП можно более красиво и гибко решить некоторые задачи, обычно это так. Но и не только это, он мне ближе в плане понимания, видимо сказывается предыдущий опыт
Вот, например, есть у меня въездные ворота на участок. Как сущность они имеют следующие управляющие входы:
- Enabled (вкл/выкл - выход ПЛК),
- ButtonEnabled (уличная кнопка для управления - вкл/выкл - выход ПЛК),
- Open (команда открыть - выход ПЛК),
- Close (команда закрыть - выход ПЛК);
и следующие выходы:
- isOpen (ворота открыты - вход ПЛК),
- isClosed (ворота закрыты - вход ПЛК),
- Opening (оба входа ПЛК false, был true isClosed),
- Closing (оба входа ПЛК false, был true isOpen).
На ООП я бы создал класс со следующими полями: Enabled, ButtonEnabled, isOpen (readonly), isClosed (readonly), методами: Open и Close и событиями: OnOpening, OnClosing, OnOpen, OnClose, а в вызове конструктора передал бы адреса портов ПЛК. И все, "черный ящик" готов.
Ну, думаю, я и ФБ так создам, накидал выходы: Enabled, ButtonEnabled, Open, Close и выходы: isOpen, isClosed, Opening, Closing и тут понял, что порты ПЛК я никак не завязываю внутри блока и черный ящик не получается. Посмотрел, вроде действительно внутри блока обратиться к портам нельзя (я не нашел как). Можно добавить в ФБ еще 4 входа, для портов ПЛК, тогда более менее что-то получается, но все равно не выходит черного ящика, да и не красиво это....
Может быть я просто еще не научился думать в парадигме ФБ и что-то делаю не так?
Последний раз редактировалось turkish945; 27.04.2020 в 18:44.
Или исключить из арсенала ПЛК1хх 😁
На самом деле ООП на больших проектах выручает. У меня прямо сейчас создается система где 3 частотника пчв, 3 instart и 3 упп. Много чего еще, но на примере этих - по сути это 3 насосные станции, они управляются все по modbus, команды и т.д. у всех разные. Но глобально логика общая работы. ООП в данном ключе отлично подходит.
Весь код я пока не готов написать, потому что некоторые идеи еще не продуманы до конца, я пока представляю скелет в терминах ООП, который наполняется функционалом по мере реализации идей. Да и мне не требуется, чтобы кто-то полностью за меня решил задачу. Я лишь хочу понять некоторые вещи.
Могу попробовать описать задачу еще раз, другими словами.
Есть автоматические ворота, у них есть несколько входов для управления: вкл/выкл, открыть, закрыть. Так же у них есть два выхода, сигнализирующих о достижении воротами конечных положений открыто и закрыто соответственно. Все это подключено к 5 портам ПЛК.
Соответственно нужно иметь возможность этими воротами управлять: включать/отключать, открывать, закрывать, обрабатывать сигналы о достижении конечных положений.
Цель не просто написать программу, которая будет связывать одно с другим по определенному алгоритму, а сделать это в виде самостоятельной сущности, черного ящика, отдельного блока. Чтобы при программировании сценариев управления воротами абстрагироваться от "внутренностей" и железа и предоставить "пользователю", готовый и полностью функциональный инструмент.
Как я понимаю в этом плане ФБ в первом приближении мне подходит.
На текущий момент не понятно следующее:
1. Есть ли у него что-то типа конструктора? Хочу инициализировать параметры. Можно ли как-то передавать при инициализации номера портов, с которыми он будет уже сам работать. Если такого нет, как это обычно делается? Могу ли я как-то обращаться к портам (или другому оборудованию) из ФБ?
2. ФБ потом вставляется в программу, которая "крутится" в рамках задачи с определенным временем цикла исполнения. И тут вот что не понятно. Есть, например, элемент F_TRIG, он действительно будет срабатывать по заднему фронту сигнала? Или это будет приурочено к следующему циклу программы? Или, например, таймер, установлен на 50 мс, а цикл задачи, в которой крутится программа с этим блоком, равен 200 мс, как это будет работать? В момент срабатывания таймера будет осуществляться переход к программе или это будет приурочено к следующему циклу программы?
3. Вопрос алгоритмического характера. На входе есть два параметра: isOpen и isClosed (сигналы конечных положений ворот), на выходе нужно получить два сигнала: Opening и Closing, которые true только во время открывания/закрывания ворот, в остальное время false. Как это сделать в виде FB? Мне удалось сделать схему, которая для каждого выхода использует по одному F_TRIG и R_TRIG, один AND и один SR, но мне кажется это слишком громоздко для такой простой вещи. По крайней мере с использованием ООП это делается гораздо проще.
пока все
Заранее спасибо.
Последний раз редактировалось turkish945; 28.04.2020 в 21:31.
Объясните, почему 200 мс не крутится? Если для задачи не требуется чаще, зачем крутиться чаще?
Так работать не будет, я забыл упомянуть, что управляющий сигнал на открытие/закрытие это короткий импульс, а не импульс на все время открывания/закрывания. И еще второе, сигнал на открытие может быть подан не через ПЛК, а, например, с пульта напрямую на блок управления воротами и мы об этом сможем узнать только косвенно по тому, что изменилось состояние концевика, соответственно управляющий сигнал на открытие в этих целям мы использовать не можем.
Ничего я не путаю. Как я говорил, я попытался это реализовать с помощью ФБ на CFC, получилось громоздко и я решил оформить отдельным ФБ, у которого это как раз входы, а выходы Opening и Closing.
В ООП можно сделать, чтобы свойство класса менялось через вызов функции set, в которой можно было бы установить Opening в нужное значение, а заодно еще кое что сделать. Например так: property isOpen: boolean read isOpen write Set_isOpen;
Извините, если мои вопросы кажутся глупыми, но ведь я только в самом начале. И не только спрашиваю тут, но и читаю материалы.