Tag Archives: язык ST

Язык ST для C программиста (часть 2)

WHILE и REPEAT

Цикл WHILE совершенно аналогичен циклу while в C. REPEAT UNTIL соответствует do while. Тонкое, отличие состоит в том, что REPEAT выполнятся до тех пор, пока условие не примет значение TRUE.

FOR

Цикл FOR применяется для выполнения группы выражений заранее известное число раз. Цикл включает установку начального значения, конечное значение, опционально шаг (по умолчанию 1) и тело цикла. Пример:

FOR I := 1 TO 100 BY 10 DO x := x*y; END_FOR

На С этому соответствует:

for (I = 1; I <= 100; I += 10) x = x*y;

Бесконечный цикл в ST обычно записывается как WHILE TRUE DO.

Оператору break в циклах ST соответствует оператор EXIT. Оператор continue в CoDeSys V2.3 отсутствует.

main и PLC_PRG

Прекращение выполнения и возврат управления операционной системе был бы для контроллерной программы полным крахом. Поэтому любая контроллерная программа имеет цикл:

while(1)

{ReadInputs();

PLC_PRG();

WriteOutputs();

}

На самом деле в CoDeSys мы видим только PLC_PRG. Сам главный цикл спрятан в системе исполнения. Это наиболее тонкий момент, который нужно очень четко себе представлять. В многозадачных проектах система исполнения создает независимый главный цикл для каждой задачи. Любая ваша программа выполняется в цикле, если вы не предприняли специальных мер. Принимайте это как факт. Сложности в этом нет, устойчивые навыки приобретаются за несколько часов.

Многозадачность.

Многозадачность в CoDeSys доступна даже для ПЛК, выполненных на 8 разрядных микропроцессорах без ОС. В простейшем случае, вместо вызова единственной PLC_PRG, система попеременно подставляет вызовы разных пользовательских программ. Конечно, с учетом их приоритетов и времен циклов выполнения. Так реализуется не вытесняющая многозадачность. В многозадачных проектах необходимо сопоставить программы задачам с помощью менеджера задач в CoDeSys (См. рис. 2). Если этого не сделать, то проект будет однозадачным, с единственной главной функцией PLC_PRG.

Помимо циклических задач в CoDeSys можно создавать задачи, вызываемые по событиям. В контроллерах имеющих ОС, CoDeSys умеет обеспечивать вытесняющую многозадачность. Например, так работает CoDeSys SP RTE [3]. Минимальное время цикла задач и список активирующих событий необходимо уточнить в документации на контроллер.

Рис. 2. Настройка задачи, вызываемой по фронту входной переменной.

Функции

Для возврата значения функции в C используется return(). Часто для подготовки возвращаемого значения приходится объявлять вспомогательную переменную. В МЭК каждая функция имеет неявно объявленную переменную для возврата значения. Ее наименование совпадает с именем функции. То есть int GetX(int x) { … return(x); } на ST будет выглядеть так:

GetX := x; RETURN;

Как и в языке C передавать параметры, при вызове функции, можно перечисляя их в скобках через запятую: GetX(2). Либо путем присваивания значений: GetX(x := 2). Второй способ применяется и для функциональных блоков.

Память для переменных функции выделяется в стеке. Естественно, значения внутренних переменных не сохраняются между вызовами. Объявления локальных static переменных в функциях не предусмотрено. Для функций и функциональных блоков допускается передача параметров по ссылке (VAR_IN_OUT).

Функции МЭК могут иметь переменное число параметров. Типичный пример – это функция MUX, приведенная в таблице 1. Она может работать с переменным числом параметров, причем любого типа. В CoDeSys V2.3 это реализовано только для стандартных функций. Перегрузки стандартных операций нет. Впрочем, этого нет и в языке C.

Типа void в CoDeSys V2.3 нет. Любая функция должна иметь хотя бы один параметр и возвращать значение. Используйте тип BOOL, он обеспечивает минимальные издержки. Как и в С, вызовы функции можно включать в выражения.

Функциональные блоки.

Помимо функции, в МЭК существует понятие функционального блока. По сути, это структура, к которой добавлен управляющий код. При объявлении данных выделяются входные, выходные и внутренние переменные. На основе объявления функционального блока можно объявить один или несколько его экземпляров. Объявление экземпляра приводит к выделению памяти данных, совершенно аналогично созданию переменных типа структура.

Естественно код при этом не увеличивается. В отличие от функции, значения переменных экземпляра функционального блока сохраняются между его вызовами. Это означает, что к переменным экземпляра можно обращаться в любое время, вне зависимости от его вызова.

В объявлении экземпляра можно выполнять дополнительную инициализацию переменных. При трансляции с ST в C, для каждого функционального блока приходится писать функцию инициализации.

Дополнительно CoDeSys V2.3 позволяет добавлять действия в функциональные блоки. Это аналогично методам класса в ООП.

Библиотеки.

CoDeSys поддерживает 2 вида библиотек. Первый вид это внутренние библиотеки. Любой проект можно сохранить как библиотеку. Внутренние библиотеки пишутся и хранятся на языках МЭК. Они компилируются вместе с проектом. Вы можете запретить редактирование и просмотр текстов внутренних библиотек пользователем. Специальный менеджер библиотек позволяет защитить вашу библиотеку лицензией и сделать ее платной. Именно так реализованы библиотеки CANopen и SoftMotion в CoDeSys (язык ST).

Второй тип – это внешние библиотеки. Их код откомпилирован внешними средствами и включен в систему исполнения (например, системные библиотеки) или размещен в obj файлы. Внешние библиотеки могут иметь еще и ‘внутреннюю’ реализацию (на языках МЭК). Это позволяет написать заглушки системных функций, работающие в режиме эмуляции контроллера в среде программирования CoDeSys.

Системные библиотеки.

Указателей на функции в CoDeSys нет. Есть оператор INDEXOF(name), возвращающий внутренний индекс программного компонента (POU). Он используется там, где нужно программно указать POU. Например, это используется в системных библиотеках, выполняющих установку обработчиков аппаратных прерываний, управление задачами и некоторых других.

В CoDeSys можно создать множество задач и программно управлять (разрешать и останавливать) их работой (по событиям или ‘в лоб’ с помощью специальной системной библиотеки). Это является аналогом идеи массива указателей на функции.

Динамическое распределение памяти в МЭК не предусмотрено. В CoDeSys это делается с помощью функций специализированной библиотеки. Аналогично поддерживается работа с файлами, потоками, сокетами TCP/IP, точная синхронизация задач, управление работой контроллера и многое другое. Всего в CoDeSys V2.3 существует 24 системные библиотеки.

На самом деле, в CoDeSys видны лишь интерфейсы системных библиотек. Их код реализован в системе исполнения изготовителем. Он решает, что можно отдавать пользователю и что лучше запретить. В итоге, состав системных библиотек может быть разным для разных типов ПЛК. Общий обзор дан в документе SysLyb_Overview_RU в дистрибутиве CoDeSys. Безусловно, использовать системные библиотеки можно порекомендовать только опытным пользователям.

Обработка ошибок.

CoDeSys имеет специальный набор функции с фиксированными именами, позволяющими организовать обработку критических ошибок (деление на ноль, выход за границы массива, диапазоны значений, ошибочные указатели и др.) в пользовательской программе. Например:

Checkbounds, CheckPointer, CheckRangeSigned, CheckRangeUnsigned, CheckDivByte, CheckDivWord, CheckDivDWord и CheckDivReal и др. Если соответствующая функция отсутствует в проекте, то используется обработчик по умолчанию, имеющийся в системе исполнения.

Средства управления проектом.

Все что входит в рабочий проект, CoDeSys сохраняет в единственном файле. Это достаточно удобно для архивации. В случае аварии питания компьютера, CoDeSys полностью восстанавливает проект. В контроллеры, имеющие достаточный объем памяти, можно загрузить файл проекта вместе с исполняемым кодом.

Средств условной трансляции (#ifdef) в CoDeSys V2.3 нет. Однако есть возможность в менеджере проекта выделить определенные POU и запретить их включение в процесс компиляции. В CoDeSys можно установить дополнительный продукт 3S, так называемый инжиниринговый сервер (ENI). С его помощью реализуется полноценная возможность сетевой многопользовательской работы с проектом и управление версиями программных компонентов пользователей.

Заключение.

По числу типов данных ST превосходит C. Применение стандартных и специализированных операций не вызывает у C программистов ни каких сложностей. Редактор ST в CoDeSys поддерживает синтаксическое цветовое выделение и имеет средства быстрого ввода. Как правило, трансляция C программ в ST проще, чем обратная операция. Может вызвать сложность цикличность вызова главной программы, но это дело привычки. Вы наверняка заметили, что в определенных местах, где речь шла об ограничениях ST в сравнении с C, было написано ‘CoDeSys V2.3’. Все эти моменты доработаны в новой версии CoDeSys V3.0. Безусловно, это радикальный шаг 3S по расширению МЭК. Он сделан под давлением пользователей, являющихся профессиональными программистами. Пожалуй, самое интересное в 3.0 – это оснащение МЭК языков полноценными средствами ООП.

Мой блог находят по следующим фразам

Язык ST для C программиста (часть 1)

Принято считать, что языки программирования ПЛК стандарта МЭК 61131-3 (далее для краткости МЭК) предназначены для применения неспециалистами в области информатики. Но возможности ПЛК растут, соответственно растут и требования, предъявляемые к прикладному программному обеспечению (ПО). Все чаше мы встречаем системы на ПЛК, включающие сложнейший математический аппарат. В ПЛК используют web-технологии, нечеткие регуляторы, многомерные интерполяторы систем управления движением (SoftMotion) и т.д.

Такие технологии требуют специальных знаний. Несмотря на все прогнозы и рассуждения, на сегодняшний день более половины ПО для ПЛК создается профессиональными программистами, имеющими высшее образование. С каждым годом их доля возрастает. Не смотря на это, подавляющее большинство изготовителей МЭК систем упорно продолжают создать простые инструменты «для чайников». Чаще всего это некий редактор FBD и интерпретирующая система исполнения, опирающаяся на вызов заранее откомпилированных модулей. Для расширения состава блоков их пишут на языке C внешними средствами. Если профессиональный программист сталкивается с такой средой, то часто результатом становится МЭК программа, состоящая из одного большого функционального блока, полностью написанного на C.

Стандарт МЭК включает высокоуровневый язык ST, по выразительной мощности не уступающий языкам C и Паскаль. К сожалению, в большинстве систем МЭК программирования он не реализован вовсе либо имеет массу ограничений. Как правило, это ограничение числа поддерживаемых типов данных, упрощенный интерпретирующий транслятор или промежуточный код, ограничения на доступ к аппаратным ресурсам, невозможность обрабатывать прерывания, выполнять динамическое распределение памяти, управлять процессами и др. На самом деле, это не ограничения языка ST. Это именно ограничения среды программирования.

Некоторым особняком в ряду комплексов МЭК стоит CoDeSys производства 3S-Smart Software Solution GmbH. Его уникальность состоит в том, что он изначально задумывался как инструмент для профессионалов. Исходя из собственных соображений, при адаптации CoDeSys для конкретного ПЛК, изготовитель может наложить ряд ограничений на возможности пользователя. Но изначально их нет.

Безусловно, в CoDeSys можно использовать внешние библиотеки, реализованные на C, но необходимость в этом возникает крайне редко. Практически все, что можно написать на C, в CoDeSys можно написать на ST, без изменения методологии проектирования. CoDeSys имеет встроенный компилятор и генераторы машинного кода для всех популярных семейств микропроцессоров. Внешний C компилятор не даст выигрыша по быстродействию, но значительно усложнит разработку.

Очень существенная тонкость стандарта МЭК состоит в том, что он включает только требование однозначности выполнения описанных в нем конструкций. Многие воспринимают это как возможность называть МЭК системой программирования среду, поддерживающую только часть стандарта. Однако справедлив и обратный подход: МЭК система может включать все, что описано в стандарте, плюс дополнительные возможности.

Практика показывает что, профессиональные программисты, работая с CoDeSys, чаше всего выбирают язык ST. Практически все они в совершенстве владеют языком C. Данная статья имеет целью быстро очертить C программистам границы возможностей языка ST в CoDeSys и подсказать типовые методы преодоления затруднений.

Типы данных.

В CoDeSys реализованы все стандартные типы данных МЭК 61131-3. Все типы данных доступны во всех 6 поддерживаемых языках. Специальных расширений для ST нет. Целочисленные типы таковы: SINT (char), USINT (unsigned char), INT (short int), UINT (unsigned int), DINT (long), UDINT (unsigned long), LINT (64 бит целое), ULINT (64 бит целое без знака).

Действительные типы: REAL (float), LREAL (double).

Специальные типы BYTE, WORD, DWORD, LWORD представляют собой битовые строки длиной 8, 16, 32 и 64 бит соответственно. Битовых полей в ST нет. К битовым строкам можно непосредственно обращаться побитно. Например: a.3 := 1; (* Установить бит 3 переменной a *). В C в подобных целях используются целые без знака и битовые логические операции. В CoDeSys к битовым стокам можно применять операции, доступные для целых без знака. Логический тип BOOL. Может иметь значение TRUE или FALSE. Физически переменная типа BOOL может соответствовать одному биту. Обычно так и есть, если речь идет о дискретном входе либо выходе ПЛК или прямоадресуемой переменной (см. ниже). В иных случаях CoDeSys выделяет один байт. Это вызвано тем, что большинство микропроцессоров не умеют непосредственно адресоваться к отдельным битам памяти.

Строки STRING. Являются именно строкой, а не массивом. Поэтому (в версии V2.3) нет возможности обращаться к отдельным символам. Зато можно сравнивать и копировать строки стандартными операторами. Например так: strA := strB. В МЭК есть стандартный набор функций для работы со строками. Внутренний формат строк не стандартизован. CoDeSys использует нуль-терминированные строки.

Специальные типы в стандарте МЭК определены для длительности (TIME), времени суток (TOD), календарной даты (DATE) и временного штампа (DT). Работа со временем и интервалами встречается в ПЛК программах повсеместно.

Применение структур (STRUCT) не отличается от C. Описание структуры должно предшествовать объявлению переменной данного типа. Допускаются вложенные структуры и массивы.

Массивы (ARRAY) строятся из элементов любых типов, включая структуры и массивы. Из особенностей нужно отметить возможность задания повтора значений при инициализации. Например: bX ARRAY[0..20] OF BOOL := TRUE, 10(FALSE), 9(TRUE); Значение FALSE повторено здесь 10 раз и значение TRUE, соответственно 9 раз. Массивы (и структуры) можно копировать с помощью обычной операции присваивания: bY := bX; Перечисления аналогичны перечислениям C. Пример: TYPE TEMPO: (Adagio := 1, Andante := 2); END_TYPE.

На базе целых можно построить типы, имеющие ограниченный диапазон значений.

Например: TYPE DAC10: INT (0..16#3FF); END_TYPE.

Для любого типа можно создать псевдоним (typedef в C). Например: TYPE DEGR : UINT

END_TYPE.

Константы.

В МЭК используются типизированные константы. Например: 2#10001000 (целое, байт в двоичном формате), INT#40, t#10h14m5s (время дня), D#2006-01-31 (дата). Формат констант описан в документации и не вызывает сложностей.

Символьные константы можно объявлять локально или глобально в специальной секции раздела объявлений: VAR CONSTANT.

Идентификаторы.

Идентификаторы имен переменных могут иметь любую длину. Ограничения числа значимых символов нет. Идентификаторы не чувствительны к регистру (XZ и Xz одно и тоже). Идентификаторы не должны начинаться с цифры (12x). Двойные подчеркивания запрещены(__X).

Инициализация переменных.

По умолчанию, все переменные инициализируются нулем. Иное значение переменной можно указать явно при ее объявлении. Например: str1: STRING := ‘Hello world’. Переменные можно объявить как RETAIN или PERSISTENT. Это означает требование их размещения в энергонезависимой памяти контроллера (если она есть). Их инициализация производится только при первом запуске программы или по специальной команде.

Прямая адресация.

Помимо общей памяти данных в контроллере предусмотрены 3 специальные области памяти. Это область входов, выходов и прямо-адресуемая область. Эти области служат для связи системы исполнения контроллера и пользовательской программы. В простейших ПЛК распределение памяти в области входов/выходов фиксировано изготовителем. Мы можем непосредственно обращаться к нужному адресу из программы (например, %QB5 дает 5-й байт в области выходов) или объявить переменную, расположенную в соответствующем месте. Как правило, изготовители ПЛК снабжают CoDeSys конфигурационными файлами. Встроенный графический конфигуратор позволяет настроить и автоматически объявить переменные для всех входов/выходов и диагностических переменных без программирования, включая распределенные модульные системы (См. рис. 1).

Рис. 1. Конфигурирование переменных входов/выходов в CoDeSys

Преобразование типов.

Неявное преобразование типов запрещено. Любое преобразование нужно делать явно с помощью специальных операторов. Запомнить их легко. Пишем исходный тип, далее _TO_ и нужный тип. Например: iX := REAL_TO_INT(rX); .

Операторы и функции.

Наиболее часто используемые операторы и функции ST приведены в таблице 1. В МЭК определен целый ряд общепринятых и специализированных (для ПЛК программ) функций и функциональных блоков. В их числе таймеры, триггеры, счетчики, регуляторы и многое другое.

Написать ++x; или x += 1; в ST, конечно, нельзя. Единственный вариант – это x := x + 1;. Полное описание стандартных операций, функций и функциональных блоков вы найдете в руководстве программиста CoDeSys.

Sizeof В CoDeSys имеется оператор SIZEOF(in). Смысл его должен быть очевиден для C

программистов.

Sprintf Такого оператора в ST нет. Преобразовать любой переменную любого типа в строку можно с помощью …_TO_STRING.

Указатели.

В МЭК указателей нет, в CoDeSys они есть. Адрес переменной можно получить с помощью оператора ADR, разыменовывание дает ‘^’. Например:

pt : POINTER TO INT;

var_int1:INT;

var_int2:INT;

pt := ADR(var_int1);

var_int2 := pt^;

Объединений в CoDeSys V2.3 нет. При необходимости это удается обойти, разместив несколько переменных разного типа по одному адресу в прямо адресуемой памяти либо посредством указателей. Аналогично можно получить доступ к элементам строки ‘совместив’ ее с массивом.

Точка с запятой.

Не смотря на явное родство ST с языком Паскаль, точка с запятой используется в нем также как в языке C. То есть она служит не разделителем, а признаком конца оператора. Естественно, в одной строке может быть любое число операторов. Кроме того, точка с запятой служит пустым оператором. Текст любого программного компонента (POU) на ST должен включать хотя бы один оператор.

Программные скобки.

В ST нет привычных программных скобок ({} в C или begin и end в Паскале). Вместо этого каждая программная конструкция имеет собственную закрывающую программную скобку. Например: END_FUNCTION или END_IF. Каждому кто имел ‘счастье’ видеть многоэтажные лесенки завершающих скобок в C, такое решение должно быть понятно. Некоторая многословность текста компенсируется средствами быстрого ввода CoDeSys.

IF ELSE

Оператор выбора IF почти эквивалентен соответствующему оператору в C. Условием может служить переменная или выражение только логического типа. В ином случае, необходимо выполнить явное приведение к логическому типу.

Дополнительно в IF можно вложить последовательную цепочку условий ELSIF. Это достаточно удобно при анализе сложных разветвляющихся условий.

CASE

Аналогичен switch в C. Альтернативные ветки не имеют закрывающей программной скобки и не могут выполняться одна за другой. Соответственно оператор break не имеет смысла и отсутствует. При указании значений констант альтернативы можно перечислить их через запятую или указать диапазон. Например:

CASE (x + 2)/3 OF

0:

y := 1;

1,2:

y := 4;

z := 5;

3..50:

y := 7

ELSE

y := 0;

END_CASE

 

Мой блог находят по следующим фразам

График с заданием точек элементами массива

Пример: график уставки по пяти точкам. Каждая из координат задается массивом из 5 элементов, которые сначала сортируются по возрастанию, а затем по ним определяется уставка регулирования.

При выходе за пределы линейной зависимости выходная переменная принимает значение  крайних точек зависимости.

Листинг

FUNCTION_BLOCK obr_gr (*сортировка элементов массивов по возрастанию*)

VAR_INPUT

x,y:ARRAY[1..5] OF REAL;

END_VAR

VAR_OUTPUT

x1,y1:ARRAY[1..5] OF REAL;

END_VAR

VAR i: INT;

xp,yp: REAL;

END_VAR

FOR i:=1 TO 4 DO

IF x[i+1]<x[i] THEN

xp:=x[i];

x[i]:=x[i+1];

x[i+1]:=xp;
yp:=y[i];

y[i]:=y[i+1];

y[i+1]:=yp;
END_IF;

END_FOR;
FOR i:=1 TO 5 DO

x1[i]:=x[i];

y1[i]:=y[i];

END_FOR;

FUNCTION_BLOCK opr_ust

VAR_INPUT

x,y:ARRAY[1..5] OF REAL; (*массивы входных значений*)

vh_znach:REAL; (*сигнал с датчика*)

END_VAR

VAR_OUTPUT

ust:REAL; (*требуемая уставка регулирования*)

END_VAR

VAR

i: INT;

k: REAL;

END_VAR

FOR i:=1 TO 4 DO;

IF (x[i+1]>vh_znach) AND (x[i]<vh_znach) THEN

k:=(y[i+1]-y[i])/(x[i+1]-x[i]);

ust:=y[i]+k*(vh_znach-x[i]);

END_IF;

END_FOR;

Работа с таймерами на языке ST

Пример работы с дискретными входами и выходами ПЛК, а также с таймерами ton и tof. Пример на языке ST.

При замыкании первого входа замыкается первый выход.

При замыкании первого и второго входа замыкается второй выход.

Через 5 секунд после замыкания третьего входа замыкается третий выход.

Через 10 секунд после размыкания четвертого входа размыкается четвертый выход.

Листинг:

PROGRAM PLC_PRG

VAR

tim1:TON;

tim2:TOF;

END_VAR

(*plc100-24.K-L core 2-03 target 2-02-4*)

out1:=in1;

Out2:=in1 AND in2;

(*задержка включения*)

tim1(IN := in3, PT := T#5s);

out3:=tim1.Q;

(*задержка выключения*)

tim2(IN := in4, PT := T#10s);

out4:=tim2.Q;

Cоздание проекта в CoDeSys 3.

Запуск программной среды CoDeSys 3 может быть произведен из меню Пуск по следующему пути: Программы  > 3S CoDeSys > CoDeSys  > CoDeSys V3.x либо двойным щелчком по иконке на рабочем столе. Результатом запуска будет окно, представленное на рис.1.

Рисунок 1 Окно CoDeSys3 при запуске

Окно включает в себя следующие основные части проекта:

  • переключающиеся вкладки Devices (дерево устройств) и POU (функции, функциональные блоки и программы проекта) в левой части окна экрана;
  • рабочую область (на рис.1 неактивна, окрашена серым цветом, расположена в правой верхней части экрана);
  • Messages (строку сообщений), показывающую число и статус служебных сообщений и расположенную в правой центральной части экрана;
  • Description, включающая описание этапов работы CoDeSys и расшифровку служебных сообщений и расположенная в правой нижней части экрана.

Для создания нового проекта можно выбрать пункт New project вкладки File, щелкнуть левой кнопкой мыши по иконке на панели быстрого вызова или воспользоваться сочетанием клавиш <Ctrl>+<N>. Результатом этих действий должно стать появление окна New Project, вид которого представлен на рис.2.

Рисунок 2 Создание нового проекта и определение адреса его сохранения

В этом окне нужно выбрать пункт Standard project категории General. В разделе Name можно дать имя проекту, а в разделе Location – путь его сохранения на ПК. После сохранения проекта появляется окно выбора исполнительного устройства и языка основной программы. Его вид представлен на рис.3.

Рисунок 3 Выбор устройства и текста основной программы

В качестве исполнительного устройства в этом примере будет использован внутренний виртуальный ПЛК среды CoDeSys 3. Это устройство реализует полнофункциональный ПЛК на ПК, позволяя работать в том числе и с внешними устройствами, подключенными к Com-портам компьютера. Для его использования  в пункте Device выберем CoDeSys SP Win V3. В качестве языка проекта PLC_PRG выберем язык структурированного текста ST. После задания этих параметров дерево проекта примет вид, показанный на рис.4.

Рисунок 4 Дерево проекта

В дереве проекта появилось его название (pr_start), вид устройства (CoDeSys Control Win V3) и доступные приложения (Application), включая менеджер задач и библиотек, а также основную программу PLC_PRG. Вид менеджера библиотек в конфигурации по умолчанию представлен на рис.5. Он содержит библиотеку Standard, включающую счетчики, таймеры, переключатели и другие основные функциональные блоки.

Рисунок 5 Стандартная библиотека CoDeSys 3 (добавляется по умолчанию)

Создадим простейший проект с 2 переменными x и y как показано на рис.6. В этом проекте переменная х увеличивается на 1 каждый цикл работы ПЛК, а переменная y аналогичным образом уменьшается. Задание типов и начальных значений переменных может быть осуществлено в разделе переменных PLC_PRG (между служебными словами VAR и END_VAR) или с помощью окна автообъявления, вид которого представлен на рис.7.

Рисунок 6 Вид программы инкремента/декремента

На этом создание проекта завершено.

 

    Терморегулятор с ПИД-управлением в CoDeSys

    Задача: моделирование работы ПИД – регулятора температуры. По первому выходу осуществляется непосредственно ПИД-регулирование, по второму – сигнализация режима работы по гистерезисной, П или U – логике.

    Чему можно научиться: работа со стандартным ПИД-регулятором, разработка гистерезисных  алгоритмов на языках ST и CFC

    Основная программа разработана на языке CFC. Такой выбор объясняется наибольшей наглядностью работы с функциональными блоками по сравнению с другими языками программирования ПЛК.

    Итак, ПИД – регулятор.

    ПИД-регулирование является наиболее точным и эффективным методом поддержания контролируемой величины на заданном уровне. На рис. 1 приведена функциональная схема ПИД-регулятора. Основное назначение регулятора – формирование управляющего сигнала Y, задающего выходную мощность исполнительного механизма (ИМ) и направленного на уменьшение рассогласования Е или отклонения текущего значения регулируемой величины Т от величины уставки Туст.

    пропорционально-интегрально-дифференциальное регулирование

    рис1 Схема ПИД-регулятора

    ПИД-регулятор состоит из трех основных частей: пропорциональной Кп, интегральной 1/р×Ти и дифференциальной р×Тд. На практике, для формирования цифровых регуляторов используются разностные формулы, позволяющие работать не с непрерывным во времени сигналом, а с квантованным по времени. Таким образом, для расчета управляющего сигнала на выходе цифрового ПИД-регулятора  используется формула:

    Xp полоса пропорциональности;
    Ei рассогласование или разность между уставкой Туст и текущим значением измеренной величины Тi;
    tд дифференциальная постоянная;
    DEi разность между двумя соседними рассогласованиями Ei и Ei–1;
    Dtизм время между двумя соседними измерениями Ti и Ti–1;
    tи интегральная постоянная;
    накопленная в i-й момент времени сумма рассогласований (интегральная сумма).

    Пропорциональная составляющая зависит от рассогласования Ei и отвечает за реакцию на мгновенную ошибку регулирования.

    Интегральная составляющая содержит в себе накопленную ошибку регулирования и позволяет добиться максимальной скорости достижения уставки.

    Дифференциальная составляющая зависит от скорости изменения рассогласования и позволяет улучшить качество переходного процесса.

    В CoDeSys в библиотеке UTIL.lib реализован стандартный блок ПИД-регулятора, который показан на рис.2

    рис2 ПИД-регулятор в CoDeSys

    Функциональный блок реализует ПИД закон регулирования:

    где Y_OFFSET – стационарное значение, KP – коэффициент передачи, TN – постоянная интегрирования (ms), TV – постоянная дифференцирования (ms), e(t) — сигнал ошибки (SET_POINT-ACTUAL).

    Входы ACTUAL, SET_POINT, KP, Y_OFFSET, Y_MIN Y_MAX типа REAL. Входы TN и TV типа

    DWORD, RESET и MANUAL типа BOOL.

    Выходы Y – REAL, LIMITS_ACTVE и OVERFLOW типа BOOL.

    Значение выхода Y ограничено Y_MIN и Y_MAX. При достижении Y границ ограничения, выход

    LIMITS_ACTVE, (BOOL) принимает значение TRUE. Если ограничение выхода не требуется, Y_MIN

    и Y_MAX должны быть равны 0.

    Неправильная настройка регулятора может вызвать неограниченный рост интегральной составляющей. Для обнаружения такой ситуации предназначен выход OVERFLOW. При переполнении он принимает значение TRUE, одновременно останавливается работа регулятора. Для его включения необходимо использовать рестарт.

    Теперь собственно о программе.

    Для начала, как обычно – список переменных. По традиции – это самая длинная часть программы. Список переменных  включает в себя параметры 2 регуляторов (ПИД и 2-х позиционного) и входы / выходы системы управления.

    рис 3 Переменные проекта

    рис 3 Переменные проекта

    Далее собственно программа управления.

    рис4 Проект ПИД-регулятора в CoDeSys

    рис4 Проект ПИД-регулятора в CoDeSys

    В алгоритме ПИД-регулятора реализовано ограничение по мощности регулирования (0-100%). Двухпозиционный регулятор реализован в виде подпрограммы, которая выглядит, например, так:

    рис5 Переменные подпрограммы 2-х позиционного регулятора

    рис5 Переменные подпрограммы 2-х позиционного регулятора

    Программа на ST

    рис8 Подпрограмма работы 2-х позиционного регулятора на языке ST

    рис8 Подпрограмма работы 2-х позиционного регулятора на языке ST

    Ну и то же самое на языке CFC

    рис9 2-хпозиционный регулятор на языке CFC

    рис9 2-хпозиционный регулятор на языке CFC

    рис10 Подпрограмма на CFC (продолжение)

    рис10 Подпрограмма на CFC (продолжение)

     

    Мой блог находят по следующим фразам

    Терморегулятор в CoDeSys (язык ST)

    В представленном ниже примере рассмотрена возможность реализации в CoDeSys стандартных алгоритмов работы терморегулятора.

    Цель работы: реализация  алгоритма терморегулятора, работающего по гистерезисному закону (нагреватель / охладитель), а также логике поддержания температуры в заданных границах (U/П — логика).

    Чему можно научиться: простая и наглядная реализация алгоритмов с гистерезисом, работа с IF и CASE на языке ST.

    Программа написана на наиболее популярном и удобном языке программирования ПЛК ST (структурированный текст). Реализуется алгоритм терморегулятора, работающего в одном из 5 режимов:

    • тип логики 0. регулятор отключен.
    • тип логики 1 (прямой гистерезис) применяется в случае использования прибора для управления работой нагревателя (например, ТЭНа) или сигнализации о том, что значение текущего измерения Ттек меньше уставки Т. При этом выходное устройство, подключенное к ЛУ, первоначально включается при значениях Ттек < (Т – Δ), выключается при Ттек > (T + Δ) и вновь включается при Ттек < (Т – Δ), осуществляя тем самым двухпозиционное регулирование по уставке Т с гистерезисом ± Δ;
    • тип логики 2 (обратный гистерезис) применяется в случае использования прибора для управления работой охладителя (например, вентилятора) или сигнализации о превышении значения уставки. При этом выходное устройство первоначально включается при значениях Ттек > (T + Δ), выключается при Ттек < (Т – Δ);
    • тип логики 3 (П-образная) применяется при использовании прибора для сигнализации о входе контролируемой величины в заданные границы. При этом выходное устройство включается при (Т – Δ) < Ттек < (T + Δ);
    • тип логики 4 (U-образная) применяется при использовании прибора для сигнализации о выходе контролируемой величины за заданные границы. При этом выходное устройство включается при Ттек < (Т – Δ) и Ттек > (T + Δ).

    Задание уставки (Т) и гистерезиса (Δ) проводится при программировании параметров регулирования прибора.

    Наглядно работа прибора может быть пояснена с помощью диаграммы на рис.1.

    Схема режимов работы терморегулятора

    Рисунок 1. Диаграмма работы логического устройства в различных режимах

    В соответствие с заданием определим переменные проекта, например, так как на рис.2.

    переменные проекта

    Рисунок 2 Определение переменных проекта

    Далее собственно программа. Для выбора режима использован оператор CASE, логика работы устройства разработана с использованием IF. Дополнительно к вышеописанным алгоритмам разработаны и аналоговые П-регуляторы, как нагреватель, так и холодильник.

    программа

    Рисунок 3. Первая часть программы. Обработка дискретных алгоритмов

    Первая часть программы. Обработка дискретных алгоритмов

    аналоговый выход

    Рисунок 4. Часть программы обрабатывающая алгоритмы для аналогового выхода

    Не забывайте закрывать соответствующие условные операторы словом END_ххх. Надеюсь пример получился не только простым, но и полезным.

     

    Мой блог находят по следующим фразам

    Пример программы ПЛК на языке ST «Работа с температурным графиком»

    Постановка задачи: программа определяет необходимую уставку температуры в помещении по известной температуре наружного воздуха. Зависимость температур задается графиком, в котором каждая точка содержит данные о температуре наружного воздуха и допустимой уставке комнатной температуры.

    Чему можно научиться:  создание и использование функций и функциональных блоков; семантика циклов и условных переходов на языке структурированного текста; работа с массивами данных.
    Оборудование: для программы управления вентиляцией, частью которой является описанный проект, предпочтительно использовать ПЛК со встроенными аналоговыми входами (проект примера работает в режиме эмуляции)

    Оборудование: для программы управления вентиляцией, частью которой является описанный проект, предпочтительно использовать ПЛК со встроенными аналоговыми входами (проект примера работает в режиме эмуляции)

    Функциональный блок «Обработка графика»

    Функциональный блок «Обработка графика»

    Общая программа

    Визуализация работы проекта

    Визуализация работы проекта

     

    Мой блог находят по следующим фразам