что такое pou в codesys
Язык непрерывных функциональных схем CFC. Часть 1
Пять основных языков программирования (ST, SFC, FBD, LD, IL), установленных стандартом МЭК 61131-3, используются при написании программ для логических контроллеров. В дополнение к ним CODESYS предлагает язык непрерывных функциональных схем (CFC). Редактор языка и сама его структура интуитивно понятна. Для написания программ не требуется специальных знаний. Именно поэтому CFC является языком выбора для начинающих программистов.
Начиная с 1993 года стандартом IEC 61131-3 (МЭК 61131-3) определено пять основных языков (ST, SFC, FBD, LD, IL) для программирования логических контроллеров. Из них наиболее простым в изучении и удобным в работе является графический язык FBD.
Некоторые компании для облегчения программирования внедряют в свои программные продукты языки, не входящие в стандарт МЭК. Например, CODESYS использует язык непрерывных функциональных схем (CFC), как вариант языка FBD. Язык удобен для прикладных специалистов, не имеющих специальной подготовки в области информатики.
Принципиальное отличие CFC от FBD заключается в том, что в редакторе CFC размещать компоненты программы (функциональные и логические блоки) и задавать порядок их выполнения можно произвольным образом. Такие возможности позволяют легко реализовывать обратные связи, что удобно при разработке схем регулирования. При создании программ на CFC необходимо вручную выстраивать связи между элементами, в то время как на FBD соединения выполняются автоматически.
Свойства редактора CFC
Существуют две разновидности редактора CFC: стандартный (рис. 1) и страничный (рис. 2). Выбрать тип редактора можно при создании нового проекта или при добавлении POU (компонент организации программы) в уже существующий проект
Рис. 1
Рис. 2
Страничный тип редактора CFC удобен при создании проектов, содержащих большое количество последовательно выполняющихся частей программы. Постраничное размещение программы позволяет быстро переключаться между ее разделами, акцентировать внимание только на необходимых элементах, снижает риск построения ошибочных связей и делает проект интуитивно понятным. При работе программы страницы выполняются последовательно, а передача информации с одной страницы на другую осуществляется с помощью меток соединения.
Стандартный тип редактора CFC более популярен среди пользователей, так как обладает рядом преимуществ: наглядность представления кода (все блоки и связи между ними расположены на единой рабочей области), не требуется переключения между страницами, что позволяет избежать лишних действий при написании кода.
Важно помнить, что стандартный и страничный типы редактора не конвертируются один в другой.
Общие свойства блоков
Программа на языке CFC начинается с добавления блоков на рабочую область редактора. Нужный блок добавляется мышкой с панели инструментов.
Блоки имеют фиксированное значение входных и выходных контактов. Можно добавить дополнительные контакты с панели инструментов Входной и Выходной контакт или из пункта: Контакты, контекстного меню, вызываемого нажатием ПКМ на рабочей области редактора.
При работе с большим числом ФБ могут остаться не задействованными входные/выходные контакты. Для компактности программы их можно удалить. При необходимости удаленные контакты всегда можно восстановить функцией сброс контактов. Операции удаления и сброса контактов выполняются аналогично добавлению входных и выходных контактов, а также при помощи соответствующих кнопок на панели инструментов. Чтобы поменять порядок входных/выходных контактов, необходимо их удалить, а потом заново добавить в нужном порядке.
После создания блока начинается этап создания входов и выходов путем перемещения их с панели инструментов. Если блок имеет два-три входных/выходных контакта, то операция занимает мало времени. Если у блока большое число контактов, то потребуется оптимизировать процесс. Необходимо выделить входной или выходной контакт блока и начать вводить имя переменной или константу. Таким образом выход будет добавляться автоматически столько раз, сколько потребуется (рис. 3).
Существует еще один способ добавления входа/выхода блока сразу с переменной. Для этого переменные задаются в разделе программы VAR: выделяется имя переменной и перемещается к нужному входному или выходному контакту блока.
При формировании логики программы блоки добавляются, как правило, в произвольном порядке и так же строятся связи между ними. Это приводит к тому, что нумерация блоков отличается от последовательности их расположения (порядка выполнения) (рис. 4). Чтобы соблюсти очередность выполнения (рис. 5), нужно перед запуском программы нажать ПКМ на рабочем поле редактора CFC и в меню Порядок выполнения, выбрать пункт Упорядочить в соответствии с потоком данных.
Рис. 4
Рис. 5
В версии CODESYS V3.5 SP15 появилась новая опция – автоматическая нумерация блоков в соответствии с потоком данных. Теперь элементы можно добавлять на рабочую область редактора в любом порядке и как угодно перемещать. Автоматическая нумерация элементов программы установлена по умолчанию. Вместе с тем сохранена нумерация элементов в режиме заданного порядка выполнения. Переключаться между режимами можно из свойств POU на вкладке: Порядок выполнения CFC. Посмотреть номера элементов при автоматической нумерации (рис. 6) можно из пункта контекстного меню Порядок выполнения с помощью кнопки Показать порядок выполнения или с помощью этой же кнопки, расположенной на панели инструментов.
Функциональные блоки и структуры
При работе с ФБ, имеющими большое количество входов/выходов, или структурами, содержащими большое количество переменных, удобно использовать компоновщик и селектор (рис. 7), которые находятся на панели инструментов.
Компоновщик упаковывает входы ФБ или структуры, а селектор распаковывает в отдельные выходы, таким образом заменяется большое количество близко расположенных линий связи на одну. Такой подход позволяет избежать ошибок и ускорить процесс компоновки и перемещения блоков, а также экономит место на рабочей области редактора и делает код программы нагляднее.
Линии связи
Для построения линии связи между двумя элементами нужно соединить контакты двух блоков. В редакторе CFC реализован ряд полезных функций по построению линий свиязи. Функция автосоединения линий связи по умолчанию активна, ее можно включить или отключить в меню Инструменты, пункт Опции. Для автосоединения необходимо вплотную приблизить контакты элементов. Существует поддержка параллельной связи от одного элемента к многим другим (рис. 3).
Если линия связи целиком не умещается на экране монитора, нужно выделить один из контактов линии связи (зажать клавишу + нажать стрелку ), тогда рабочая область сама сдвинется к входным или выходным контактам.
Для того чтобы избежать проблем из-за наличия большого количества линий связи, в стандартном редакторе CFC используют соединительные метки (рис. 8). Единственная задача меток – заменить длинные нечитаемые линии связи. Соединительные метки можно установить с панели инструментов. Сначала добавляется метка выхода (ей автоматически присваивается идентификационный номер), затем добавляется метка входа, и ей присваивается соответствующий номер. Заменить линию связи метками можно в пункте Метка соединения контекстного меню, вызываемого нажатием ПКМ на самой линии или на соответствующем входе/выходе. Аналогичным образом можно восстановить линию из меток.
В страничном редакторе CFC нельзя добавить соединительную метку на рабочую область (заменить ими линии связи), так как они выполняют другую задачу. Соединительные метки служат входами и выходами на страницах проекта – осуществляют передачу данных с одной страницы на другую (рис. 9). Метки добавляются не на рабочей области, что улучшает наглядность проекта и экономит место непосредственно на рабочей области редактора.
Оформление и компоновка программ
В редакторе CFC существует возможность печати проекта с двумя типами подгонки – Постер и Страница, выбрать один из них можно в меню Инструменты, в пункте Опции. По умолчанию стоит печать постером. Перед печатью проекта можно выполнить его предварительный просмотр в пункте Файл.
Во второй части статьи речь пойдет о реализации условий на языке CFC; особенностях работы с элементами, охваченными обратной связью; свойствах раздела VAR_INPUT CONSTANT в ФБ; кастомизации проектов и других важных особенностях работы с CFC.
© Автоматизация и Производство, 2021. Все права защищены. Любое использование материалов допускается только с согласия редакции. За достоверность сведений, представленных в журнале, ответственность несут авторы статей.
Издание зарегистрировано Федеральной службой по надзору в сфере связи, информационных технологий и массовых коммуникаций. Свидетельство о регистрации средств массовой информации ПИ № ФС77-68720.
Тема: CODESYS V3.5. Вопросы и ответы
Опции темы
Отображение
Здравствуйте! Очень нужен ваш совет-помощь.
1) Как можно в CODESYS V3.5 SP5 язык программирования LD сохранить вводимое значение чтоб оно сохранялось при выключении питания,
ну и соответственно когда включишь панельку прошлое вводимое значение уже было и не изменённым ну и не сброшенным.
2) И также для вводимого значения с кнопки для таймера
3) И как можно это подключить, желательно визуальный пример.
Ответ есть в инструкции. Объявить соответствующую переменную RETAIN.
Я ведь тока учусь и много чего не знаю.
Вас не затруднить показать пример?
Да верно и чтобы тоже сохранялось указанное время
На входа функциональных блоков Вы всегда подаете переменные. Тип переменой для каждого ФБ есть в описании.
То есть на вход РТ нам надо подать переменую типа TIME. Это переменная в виде константы и имеет запись вида «T#. s». Задать просто числом мы не можем, так как число это переменная типа WORD или INT. Компилятор будет ругаться. Так что ни что не мешает нам подать на вход ретайн-переменую допустим VREMYA типа TIME. И дальше работать с ней.
Почему то не получается.
Я сделал А2 переменную тип TIME и к нему подключил кнопку
1 при вводе в окне получается T#0ms
2 не вводится значения
3 и почему получились мили секунды
Скриншот.png
What Is A CoDeSys POU?
A POU is an object of a specified type and language, it houses code that is called by a Task or another POU.
You can create a POU by right clicking on the “Application” object from the Device Navigation Pane and selecting Add Object >> POU
The “Add POU” window will open, from here you can create a new POU to add to your application. (Pictured above)
Name: The name of your POU
Type: The type of POU (this is covered on the next page)
Implementation Language: The language of the POU object. There are 6 options available that cover 5 different languages. The different languages have pro’s and con’s depending on what you are trying to achieve.
We will cover more on Implementation Languages later in this lesson pack.
Read More From Owlcation
S. Omar Barker’s «A Cowboy’s Christmas Prayer»
Buck Ramsey’s «Christmas Waltz»
Analysis of Poem ‘Landscape with the Fall of Icarus’ by William Carlos Williams
Clicking Add will add the new POU to your Application object.
CoDeSys POU Types
There are 3 types of POU:
CoDeSys 3.5 Languages
POUs can be written in 5 different languages, each have different strengths and weaknesses depending on the application that is being designed.
Что такое pou в codesys
1. Ставяться автоматически.
2. Есть на диске с контроллером.
3. Есть на сайте. http://www.owen.ru/catalog/67395347
Как это обойти. Удалить можно только целиком библиотеку.
А еще в КДС есть экспорт нужных ПОУ и импорт в собственный проект
ошибка вылетает сразу, превышен лимит в 256 POU, хотя ни одного не ставишь еще в проект.
Объясните, как экспортировать один FB из библиотеки, я такой возможности не нахожу пока, только бибиотеку целиком.
В общем через Ж. можно вытягивать FB из бибиотеки, оно там в текстовом виде, можно создать FUNCTION_BLOCK на ST и все куда положено скопировать.
Проверил на FF_DRE (D-Trigger), работает.
Экспорт-импорт не проще? Полагаю, вы просто не разобрались как это делать.
ошибка вылетает сразу, превышен лимит в 256 POU, хотя ни одного не ставишь еще в проект.
Объясните, как экспортировать один FB из библиотеки, я такой возможности не нахожу пока, только бибиотеку целиком.
Как сказала одна девушка на телевидении: «В УМЕЛЫХ руках и х.. напильник»
ЗЫ библиотека и среда разработки написана немцами, к овен отношения не имеет
В общем через Ж. можно вытягивать FB из бибиотеки, оно там в текстовом виде, можно создать FUNCTION_BLOCK на ST и все куда положено скопировать.
Проверил на FF_DRE (D-Trigger), работает.
А так же поймете разницу между внутренними и внешними библиотеками.
Что такое экспорт и импорт проекта или части проекта (ФБ или функции).
Вся информация доступна, описана.
Форумчане обязательно помогут.
И я с удовольствием готов подсказывать, если Вы начнете изучать вопрос не через Ж.
З.Ы.: В дальнейшем прошу Вас быть более умеренным в выборе выражений. Правила форума позволяют мне заблокировать на время Ваше присутствие на форуме. Чего лично мне бы не хотелось
petera способ с исключениями я пробовал, но он гораздо менее удобен, чем экспорт отдельно взятых элементов библиотеки, если они работают без зависимостей от других FB.
Надеюсь авторы CodeSys когда-нибудь поймут, что компилировать необходимо только использующие FB или FUN и их зависимости, вставленные в окно проекта, а не все подряд.
1. Ставяться автоматически.
2. Есть на диске с контроллером.
3. Есть на сайте. http://www.owen.ru/catalog/67395347
Что такое pou в codesys
Начинаю программировать ПЛК WAGO 750-841, до этого опыта программирования ПЛК нет. В процессе возникают различные простые вопросы, но победить их самостоятельно не получается. Решил обратиться за помощью к колегам.
Начал писать первый пробный проект на ST (PLC_PRG), просто попробовать запрограммировать ПЛК пощёлкать клапанами, побаловаться с термопарами. вроде всё работает. Но столкнулся с тем, что с таймерами оказалось удобнее работать на FBD. Стал осваивать FBD, но как там организовать цикл или использовать условие, как IF на ST?! В общем, понял, что придётся как-то совмещать различные языки программирования в одном проекте, потому как что-то быстрее и проще сделать на ST, что-то на FBD.
Попробовал добавить к POU, рядом с PLC_PRG, который на FBD еще программ, допустим A1 и A2 на ST. А к PLC_PRG добавил действие RD_TMP. Но получить доступ из PLC_PRG к данным в A1, A2, RD_TMP и наоборот, не получилось. Т.е. как я понял, эти все части одного POU работают полностью параллельно и не могут использовать одни и те же переменные? Возможно ли как-то получить доступ к переменным из разных подпрограмм или действий одного POU.
По умолчанию контроллер вызывает одну программу PLC_PRG. Все эти A1 и пр. надо явно вызывать из PLC_PRG. Это обычные подпрограммы не более того. Если они видны в дереве проекта, то это означает то, что они доступны для вызова из других мест, но не более того. Автоматом они не вызываются.
Переменные могут быть либо глобальные – доступные всем. Либо локальные доступные только в одном POU…
В одном проекте больше 2х языков не желательно применять – некрасиво.
Igor Petrov писал(а): |
Переменные могут быть либо глобальные – доступные всем. Либо локальные доступные только в одном POU… |
И всё же локалные переменные на чтение могут быть доступны из любых подпрограмм одного проекта, а вот как в них вести запись я пока не понял. Получается, что обмен данными между подпрограммами возможен только через глобальные переменные?! Тогда как свести к минимуму использование глобальных переменных? Писать весь проект в PLC_PRG, а подпрограммы используются только как самостоятельные блоки без обмена данными с другими подпрограммами? Если использовать подпрограммы как самостоятельные блоки, во многих случаях можно отказаться от подпрограмм. для меня же они, в настоящее время, инструмент, с помощью которого можно сделать то, что на каком-то другом языке или сложно или не возможно. Но при этом результат работы подпрограммы нужно передавать в основную программу.
В классическом программировании ПЛК есть 1 единственная программа (PLC_PRG). Она строится на вызовах функций и экземпляров функциональных блоков. В многозадачных проектах (делается с помощью Менеджера задач) есть много программ. Они почти независимы и в идеале занимаются разными вещами и не имеют общих данных. Без опыта и большой нужды лучше не делать многозадачные проекты. Они сложны в отладке.
С функциями все просто. Параметры на вход дал – результат получил. Внутри никакой памяти нет и быть не должно. Классика y = sin(x). См. стандартные функции в CoDeSys, они все сделаны красиво. Использовать внутри функции глобальные переменные совсем нехорошо. Это выглядит как автомобиль, где глушитель привязан проволокой и рессора усилена доской. Можно использовать в функции некие глобальные константы и параметры, но не переменные. Функция должна получать все, что ей надо через параметры. Если внутри функции вылезает нужда запоминать некие промежуточные результаты, то ее пора переделать в функциональный блок.
В функциональном блоке есть входные и выходные переменные. Через них и нужно общаться с экземпляром блока. Глобальные переменные тоже нехорошо. Экземпляры теряют независимость, становятся сложными в понимании, способными вызывать ошибки со сложной симптоматикой и тяжелой диагностикой (глюки). На ST в экземпляр блока значения входов можно передавать как параметры функции в скобках. Тут же, при вызове можно забирать значения с выходов с помощью =>). Либо и к входам и к выходам обращаться через точку (описано в мануале, не нужно опытов). При этом не обязательно сам экземпляр вызывать. Можно постепенно по одному в программе присвоить значения входам через точку, затем вызвать сам экземпляр вообще без параметров. Нормальная практика. Например, таймер. Один раз его с параметрами вызвал (на ST), настроил параметры и запустил. Дальше вызываю регулярно без параметров и наблюдаю выход, когда сработает.
Т.е. есть программа, в ней свой набор переменных. Она вызывает кучу разных POU. Они в свою очередь вызывают другие POU и др. Но данные всегда передаются им на вход и с выходов забираются. Это интерфейс POU, предназначенный для общения с внешним миром. Никаких глобальных переменных. Обращение же извне к локальным переменным нужно только для отладчика и подобных дел, но не для нормальной работы.
ps. для корректной работы нужна java-платформа, но это уточните у производителя
Спасибо за пошаговую инструкцию, всё проделал. В окне визуализации CoDeSys состояние переменной меняется, но при входе на web-сервер контроллера по ссылке WebVisu она не отображается. Судя по всему что-то происходит некорректно. Действительно, для работы потребовалась виртуальная Java машина, при первом входе на страничку WebVisu было предложено её загрузить и установить, что я и сделал. Перезагрузил компьютер на всякий случай. При первичной загрузке программы в контроллер (при первом подключении) вылетает следующая ошибка «Последний онлайн сервис был завершен некорректно. «, показанная на рисунке в прикреплённом файле.
Нажимаю «Ок», подключение происходит нормально, программа в контроллере стартует. Но web-визуализация не работает.
Что это может быть? И сам файл webvisu.htm редактировать вручную не надо?
Галочку «Web визуализация» в свойствах целевой платформы я поставил.
по визуализации:
проверьте правильность настроек в c:\Program Files\3S Software\CoDeSys V2.3\Visu\
в файле webvisu.htm нужно указать имя визуализации
Код: |
в файле webserver_conf.xml указать IP контроллера
Код: |
PLC |
интереса ради: попробуйте увеличить объем информации, отображаемой в визуализации:
1) объявить несколько массивов по 100-200 целых переменных, например DWORD
2) в программе изменять значения элементов массива
3) на визуализацию добавить элемент Table и привязать его к массивам
4) оценить быстродействие контроллера
FOR i:=1 TO 15 DO
FOR j:=1 TO 15 DO
Mass1[i,j]:=i+j;
END_FOR
END_FOR
Вставил графический элемент «таблица» привязал к массиву, но вместо таблицы получается только 1 строка с парой чисел 16/16, как на рисунке. Почему-то в свойствах элемента можно настроить только столбцы, а стрОки нет. Хотелось бы увидеть табличку в столбцах/строках которой были бы i/j, а в ячейчках значения.