CODESYS V3.5 для enterprise-разработчика. Часть 2
OWEN.RU
Оборудование для автоматизации
Подписаться:

CODESYS V3.5 для enterprise-разработчика. Часть 2

CODESYS V3.5 для enterprise-разработчика. Часть 2

Важные моменты среды разработки

Программные объекты

«Программная» часть приложения CODESYS состоит из различных программных объектов (POU). Существует три типа таких объектов:

  • программы – высокоуровневые программные объекты, привязываемые к циклически вызываемым задачам контроллера. Самое близкое к ним понятие из enterprise-языков – это точки входа в пользовательский код (функция main() и т. п.). Программы являются верхним уровнем абстракции приложения – они соответствуют крупным фрагментам технологического процесса (например, «управление вентиляцией», «обработка тревог» и т. д.);
  • функции – аналогичны функциям в других языках программирования;
  • функциональные блоки – аналоги классов из современных языков программирования. Для использования функциональных блоков нужно объявить их экземпляры (инстансы); для каждого экземпляра выделяется своя область памяти. Ключевое отличие функциональных блоков от функций в том, что переменные блоков сохраняют свои значения между вызовами. Соответственно, функциональные блоки используются для создания счетчиков, таймеров и других объектов, которым требуется сохранение данных.

Библиотеки

Среда CODESYS включает богатый набор библиотек с дополнительными функциональными блоками и функциями – генераторами импульсов, регуляторами, блоками чтения/записи файлов и т. д.

Отдельно расскажем о библиотеке, которая будет важна для тех, кто привык программировать на языке C и использовать функции из string.h (memset, memcpy, memcmp и т. д.). Аналог этой библиотеки в CODESYS называется CAA Memory.

Пользователь может создавать собственные библиотеки.

Библиотеки, разработанные компанией ОВЕН, доступны на сайте ОВЕН в разделе CODESYS V3/Библиотеки и компоненты. Большинство этих библиотек поддерживается только контроллерами ОВЕН.

Синхронное и асинхронное выполнение

Мы уже упоминали, что приложение контроллера выполняется в циклически вызываемой задаче (одной или нескольких). Ключевые требования к приложению контроллера – быстродействие и надежность. То есть каждая итерация этого бесконечного цикла должна занимать как можно меньше времени, и это время должно быть детерминированным (то есть не меняться от итерации к итерации).

Раньше в программировании ПЛК был широко распространен подход, при котором практически весь код приложения выполнялся синхронно. Характерное исключение составляют таймеры стандартной библиотеки – они выполняются асинхронно, не блокируя работу кода, расположенного после их вызова.

PROGRAM PLC_PRG
VAR
xDi: BOOL; // Сигнал от дискретного входа ПЛК
xAlarm: BOOL; // Сигнал тревоги
fbDelay: TON; // Экземпляр таймера задержки включения
i: INT;
END_VAR
fbDelay
(
IN := xDi,
PT := T#5S,
Q => xAlarm
);
i := i + 1;
view rawgistfile1.txt hosted with ❤ by GitHub

В примере выше приведена реализация задержки формирования сигнала тревоги (переменная xAlarm) при замыкании дискретного входа ПЛК (переменная xDi) с помощью таймера задержки (экземпляр fbDelay блока TON).

Фактически – вызов таймера происходит в каждом цикле задачи, но его код начнет выполняться только в тот момент, когда вход IN примет значение TRUE. Выход Q примет значение TRUE спустя 5 секунд, и при этом в течение этого времени инкремент переменной i продолжит выполняться, а не будет остановлен.

Многие системные библиотеки имеют синхронные и асинхронные варианты реализации. Рассмотрим, например, производственную линию по маркировке бутылок. Бутылки движутся по конвейеру, и контроллер должен успевать организовать наклейку этикеток без пропусков. При этом код, напечатанный на каждой этикетке, нужно сохранять в файл. Запись в файл может занимать непредсказуемое время (это зависит от времени доступа для конкретной модели flash-памяти, размера файла и т. д.), и поэтому, если запись выполняется синхронно, блокируя остальные операции, то время этой итерации цикла может существенно увеличиться, и очередная бутылка будет пропущена. В этом случае разумнее производить запись в асинхронном режиме, тогда она займет несколько итераций цикла задачи, но время выполнения каждого из них будет сравнительно небольшим.

Синхронные библиотеки построены на использовании функций:

SysFile.SysFileWrite(hFile := hFile, ADR(sWriteData), SIZEOF(sWriteData),
ADR(dwResult) );
// этот код будет выполнен только после окончания записи в файл...
// ...потому что функция SysFileWrite выполняется синхронно
i := i + 1;
view rawgistfile1.txt hosted with ❤ by GitHub

Асинхронные библиотеки построены на использовании функциональных блоков:

fbFileWrite
(
xExecute := xWriteToFileCmd,
hFile := hFile,
pBuffer := ADR(sWriteData),
szSize := SIZEOF(sWriteData)
);
IF fbFileWrite.xDone THEN
// здесь разместите код, который будет однократно выполнен после завершения записи
ELSIF fbFileWrite.xError
// здесь разместите код обработки ошибок
END_IF
// этот код будет выполняться каждый цикл задачи
// в том числе, и во время записи в файл
// потому что экземпляр fbFileWrite выполняется асинхронно
i := i + 1;
view rawgistfile1.txt hosted with ❤ by GitHub

В примерах выше опущено объявление переменных, открытие файла и т. д. – продемонстрирована лишь сама разница в использовании синхронных и асинхронных операций.

Также в примерах можно увидеть использование пространств имен (namespaces), характерное и для enterprise-языков. В CODESYS пространства имен присутствуют у библиотек, функциональных блоков, структур, перечислений и некоторых других объектов.

Отладка

CODESYS предоставляет удобные средства для отладки проекта. К ним относятся:

  • отображение текущих значений переменных во время онлайн-подключения к контроллеру;
  • возможность задавать и «фиксировать» значения переменных;
  • точки останова, позволяющие прекратить выполнение приложения в момент достижения заданного фрагмента кода и оценить значения переменных в этот момент;
  • пошаговое исполнение приложения;
  • поиск значений в оперативной памяти по заданному паттерну;
  • и т. д.

Интерфейс IDE

CODESYS предоставляет разработчику средства, без которых сложно представить современную IDE:

  • подсветка синтаксиса (с возможностью настройки цветов);
  • автодополнение и автоформатирование кода;
  • темная тема для редактора ST;
  • переименование переменной, затрагивающее все фрагменты, в которых она используется;
  • перекрестные ссылки для вызываемых объектов (crossreferences);
  • и т. д.

Автоматизированные сборка и тестирование

Современный подход к разработке приложений неразрывно связан с методологией DevOps – непрерывной интеграцией и развертыванием (СI/CD), автоматизированным тестированием, хранением и управлением исходным кодом и т. д.

Программирование ПЛК пока что не пришло к этой методологии. Тем не менее CODESYS поддерживает ряд отдельных платных плагинов, позволяющих частично решить эти задачи:

  • CODESYS Test Manager – инструмент для автоматического тестирования;
  • CODESYS Git – плагин для подключения к системе управления версиями Git;
  • CODESYS Static Analysis – статический анализатор для проверки соответствия кода заданному набору правил;
  • CODESYS Profiler – профилировщик, позволяющий оценить время выполнения конкретного фрагмента кода для определения «узких мест» в приложении и его последующей оптимизации.

Кроме того, среда разработки позволяет создавать сценарии на языке Python для автоматизации рутинных операций (фактически вы получаете API для выполнения команд меню, операций в дереве проекта и т. д.). Эти сценарии могут быть добавлены на панель инструментов в виде дополнительных ярлыков.

Доступ к ОС контроллера

Один из характерных вопросов, который возникает у enterprise-разработчиков при переходе к программированию ПЛК, – как переиспользовать существующий код. Многие из современных ПЛК используют операционную систему Linux – поэтому возникает естественное желание установить какие-то пакеты, перекомпилировать и использовать свои C/C++ библиотеки, найти toolchain и т. д.

Большинство контроллеров не являются «открытыми» – то есть пользователь ограничен средствами, которые предоставляет IDE и не может напрямую взаимодействовать с операционной системой ПЛК. Это справедливо и для контроллеров ОВЕН.

Но для наших пользователей мы предоставляем два инструмента для решения специфических задач:

  • вызов утилит операционной системы контроллера с помощью библиотеки CmpSysExec. В состав прошивки входят хорошо известные разработчикам утилиты curl, jq, клиенты для СУБД MySQL/MSSQL/PostgreSQL, ImageMagick и др. Мы готовы добавлять в прошивку новые утилиты по запросам пользователей;
  • написание скриптов на языке Python. Для этого языка существует множество библиотек, которые могут упростить выполнение нехарактерных для ПЛК задач (например, интеграцию с web-сервисами через REST API, работу с XML и т. д.). В состав прошивки контроллеров ОВЕН входит менеджер пакетов pip3. Вызов скриптов осуществляется через библиотеку CmpSysExec. Скрипты являются лишь дополнением к приложению CODESYS, но не могут служить его заменой.

Документация и гайдлайны

Основными источниками по информации о CODESYS является онлайн-справка и документация ОВЕН.

Для enterprise-языков программирования характерно наличия гайдлайнов, best practices и т. д. Для программирования контроллеров, к сожалению, подобных гайдлайнов довольно мало. Самый известный пример – это гайдлайны от консорциума производителей ПЛК PLCopen. С их русскоязычными переводами можно ознакомиться на этом ресурсе.

А теперь передаем слово вам

Если вы enterprise-разработчик, столкнувшийся с ПЛК, пожалуйста, расскажите нам о своем опыте и трудностях, которые возникли при переходе от «обычного» программирования к программированию контроллеров: internet@owen.ru.

Смотри также
Опрос датчика вакуума с нестандартным протоколом обмена в CODESYS V3.5
Программируемые устройства Программное обеспечение, устройства связи CODESYS
Опрос датчика вакуума с нестандартным протоколом обмена в CODESYS V3.5
Средства обеспечения информационной безопасности в контроллерах ОВЕН. Часть 1
Программируемые устройства CODESYS ПЛК210
Средства обеспечения информационной безопасности в контроллерах ОВЕН. Часть 1
CODESYS V3.5 для enterprise-разработчика. Часть 1
Программируемые устройства CODESYS ПЛК210
CODESYS V3.5 для enterprise-разработчика. Часть 1
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 3
Программируемые устройства Программное обеспечение, устройства связи ПЛК210
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 3
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 2
Программируемый контроллер CODESYS ПЛК210
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 2
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 1
Программируемый контроллер Программное обеспечение, устройства связи CODESYS
Обновления возможностей ОВЕН ПЛК в 2022 году. Часть 1
CODESYS V3.5 для enterprise-разработчика
Программируемый контроллер CODESYS ПЛК210
CODESYS V3.5 для enterprise-разработчика
Протокол OPC UA в приборах ОВЕН
Программное обеспечение, устройства связи ПЛК210 СПК1хх
Протокол OPC UA в приборах ОВЕН
Использование API облачного сервиса OwenCloud (часть 2)
OwenCloud ПЛК210 СПК1хх
Использование API облачного сервиса OwenCloud (часть 2)
Создание АСУ запорной арматурой на магистральном газопроводе и системы мониторинга работ повышенной опасности. Опыт инженеров из Сургута.
Программируемые устройства Нефтегаз СПК1хх
Создание АСУ запорной арматурой на магистральном газопроводе и системы мониторинга работ повышенной опасности. Опыт инженеров из Сургута.