Как эффективно освоить среду разработки контроллеров
Современные тенденции в разработке логических контроллеров олицетворяют собой прогрессивные изменения в сфере автоматизации. Первые программируемые логические контроллеры (ПЛК) появились в конце 60-х годов прошлого века и заменили шкафы релейной автоматики. Основной задачей ПЛК было формирование необходимых состояний дискретных выходов в зависимости от состояния дискретных входов. Но сегодня ситуация значительно изменилась.
Современные контроллеры являются подвидом промышленных компьютеров и выполняют не только простейшую дискретную логику, но и более сложные операции, такие как обмен данными с другими устройствами, архивирование технологических параметров и запись значений в базы данных.
Одной из значительных тенденций в данной области является интеграция систем автоматизации технологических процессов с системами управления предприятием (MES, ERP). Это приводит к тому, что программирование контроллеров всё чаще выполняют не инженеры АСУ ТП, а “классические” программисты, привыкшие к использованию современных языков программирования, таких как C++, C#, Java и другие.
Как enterprise-разработчику быстро освоить среду разработки CODESYS V3.5?
Для этого необходимо понять основные аспекты этой среды и процесса программирования контроллеров. CODESYS V3.5 представляет собой интегрированную среду разработки (IDE) с редакторами языков программирования, редактором для создания графического интерфейса (GUI), компилятором, отладчиком и другими компонентами.
Проект, созданный пользователем, преобразуется перед загрузкой контроллера в набор файлов, загружаемых в директорию PlcLogic, расположенную в памяти ПЛК. Важным файлом является .app файл, содержащий машинный код для конкретного процессора, который создается с помощью генераторов кода для различных платформ (Intel, ARM, PowerPC и др.). Контроллеры ОВЕН используют архитектуру ARM и операционную систему OpenWrt, основанную на Linux.Чтобы использовать CODESYS IDE для программирования контроллера, контроллер должен включать в себя систему исполнения (runtime), которая зашивается в него на этапе изготовления. Среда разработки CODESYS бесплатна для конечных пользователей, но некоторые дополнительные компоненты могут потребовать лицензирования и приобретения отдельно. Лицензия на систему исполнения оплачивается производителем контроллера.
Таргет-файл
Для создания проекта в CODESYS необходимо указать контроллер, для которого он будет создан. Это связано с тем, что CODESYS должен знать характеристики контроллера и требуемый для него генератор кода. Эта информация содержится в таргет-файлах, которые обычно распространяются в виде пакетов (.package файлы). Таргет-файлы контроллеров ОВЕН также можно загрузить с официального сайта ОВЕН в разделе CODESYS V3/Сервисное ПО. Установка пакетов выполняется через утилиту CODESYS Installer, входящую в состав среды разработки.
Механизм выполнения приложения
Контроллеры ориентированы на циклическое выполнение задач. Приложение контроллера выполняется в автоматически создаваемом средой бесконечном цикле, называемом задачей. Проект может содержать несколько задач с разными периодами вызова и приоритетами, которые настраиваются в компоненте Конфигурация задач.
Для программистов, привыкших использовать планировщики задач или организовывать подобные циклы в своем коде, это может показаться непривычным, так как весь код будет вызываться циклически.
Большинство контроллеров с CODESYS V3.5, включая контроллеры ОВЕН, используют вытесняющую многозадачность.
Стандарт МЭК 61131-3 определяет 5 языков программирования для контроллеров:
- LD, FBD, SFC – графические языки программирования;
- IL – низкоуровневый текстовый язык, синтаксически похожий на язык ассемблера. Однако, IL не является “настоящим” языком ассемблера, его команды не соответствуют командам процессора, и в последней редакции стандарта он признан устаревшим;
- ST – единственный высокоуровневый текстовый язык, описанный в стандарте.
Исторически, наличие всех пяти языков объясняется тем, что в начале развития контроллеров каждый производитель создавал собственный язык, и перед разработчиками стандарта стояла задача как-то ограничить их количество, учитывая интересы крупных компаний, которые уже вложили много средств в разработку своего ПО.
Для enterprise-разработчика естественным выбором будет язык ST (Structured Text). Это высокоуровневый текстовый язык, который представляет собой промышленный диалект языка Pascal. Он обладает лаконичным и строгим синтаксисом, а также предоставляет типовой набор управляющих операторов, таких как IF, CASE, циклы FOR и WHILE.
Для сравнения, рассмотрим код для вычисления факториала, написанный на языках Java и ST:
class FactorialExample{
public static void main(String args[]){
int i,fact=1;
int number=5;// число, для которого вычисляется факториал
for(i=1;i<=number;i++){
fact=fact*i;
}
System.out.println(Factorial of +number+ is: +fact);
}
}
PROGRAM PLC_PRG
VAR
i, fact: INT := 1;
number: INT := 5; // число, для которого вычисляется факториал
str_fact: STRING;
DoCalculate: BOOL := TRUE;
END_VAR
IF DoCalculate THEN
fact := fact * i;
i := i + 1;
IF i > number THEN
DoCalculate := FALSE;
i := 1;
str_fact := CONCAT('Factorial of ', TO_STRING(number) );
str_fact := CONCAT(str_fact, ' is: ');
str_fact := CONCAT(str_fact, TO_STRING(fact) );
fact := 1;
END_IF
END_IF
Не вдаваясь в мелкие синтаксические нюансы, давайте рассмотрим те моменты, которые отличаются концептуально.
Во-первых, напомним, что весь код программы контроллера выполняется циклически. Это необходимо для вычисления факториала только тогда, когда это действительно необходимо, путем добавления команды логического типа с именем DoCalculate. Поскольку код задачи выполняется циклически, вы можете отказаться от цикла FOR, представив его как операцию приращения. Таким образом, этот код будет выполняться асинхронно, в течение нескольких циклов выполнения задачи. Если бы использовался цикл FOR, код выполнялся бы синхронно (подробнее о синхронном и асинхронном выполнении мы поговорим ниже).
Во-вторых, вывод журнала, традиционно используемый в других языках для отладки, редко используется при программировании контроллеров (журнал контроллера используется системой исполнения контроллера для вывода сообщений об исключениях и ошибках в его работе). Вместо этого удобно наблюдать за значениями переменных в IDE в режиме отладки – они отображаются во всех фрагментах кода, где используются эти переменные. В примере на ST выше мы просто сформировали текстовое сообщение (как в исходном примере Java) и записали его в текстовую переменную str_fact. Перегрузка оператора “+” для объединения строк в языке ST не поддерживается; вместо этого используется функция стандартной библиотеки CONCAT, которая позволяет объединить две строки (эта функция имеет фиксированное количество аргументов, поэтому объединить более двух строк не получится). Неявное преобразование типов также не поддерживается, поэтому мы преобразуем INT в STRING с помощью оператора TO_STRING.
Переменные объявляются на отдельной панели текстового редактора; переменные не могут быть объявлены в области кода.
ST (как и другие языки стандарта IEC 61131-3) – это компилируемый язык со статической типизацией и статическим распределением памяти (строго говоря, CODESYS предоставляет инструменты для динамического распределения памяти, но они используются крайне редко и в основном при разработке библиотек, а не пользовательских приложений).
Это связано с тем, что основными требованиями к использованию контроллера являются производительность и надежность. Вам приходится платить за них значительно меньшим уровнем гибкости по сравнению с тем, что предоставляют современные корпоративные языки.
Фактически, приложения для контроллеров разрабатываются в парадигме структурированного программирования. CODESYS – одна из немногих сред разработки, которая также предоставляет инструменты для использования объектно-ориентированного подхода (ООП). Реализация ООП аналогична языку Java и использует те же ключевые слова: INTERFACE, EXTENDS, IMPLEMENTS, SUPER, THIS и т.д. Но ООП не так широко используется в задачах программирования контроллеров. Существует очень мало примеров и документации по этой теме. ООП в основном используется самими разработчиками CODESYS (например, он активно используется в библиотеках GUI и протоколах exchange).
Программирование на ST по своему принципу близко к разработке на ANSI C для embedded-устройств – здесь тоже часто приходится работать с битами, заниматься сериализацией/десериализацией байтовых массивов и т. д.
В CODESYS присутствует стандартный набор типов данных (числа, строки, специальные типы для работы с датой и временем, массивы, структуры, перечисления) и операторов. Для работы с памятью «напрямую» поддерживаются указатели.