Программирование ПЛК в Codesys. Pragma.

Pragma - это специальный оператор в исходном коде приложения, который влияет на свойства переменных при предварительной компиляции или компиляции (генерации кода).

Здравствуйте, коллеги. Я считаю, что для хорошей работы требуется хорошо знать свой инструмент. И если создания функций, функциональных блоков и блоков данных плюс минус одинаковое, то в некоторых моментах, в различных средах программирования ПЛК разный инструментарий. Так что сегодня у нас Codesys и очень нужный инструмент Pragma.

Pragma в Codesys

Pragma — это специальный оператор в исходном коде приложения, который влияет на свойства переменных при предварительной компиляции или компиляции (генерации кода).

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

Синтаксис и применение

Оператор прагмы указывается в фигурных скобках. Атрибуты и тексты, используемые в операторе, заключаются в одинарные прямые кавычки. Открывающая скобка может следовать сразу после имени переменной. Открывающая и закрывающая фигурные скобки должны располагаться на одной линии.
ПРИМЕРЫ:
Pragma-выражение, которое позволяет использовать динамическое выделение памяти
Pragma-выражение, которое позволяет обращаться к глобальным переменным только через имя списка
В зависимости от типа и содержания прагмы это может влиять на следующее:
  • на последующие операторы
  • только на следующий оператор
  • на все последующие операторы, пока они не будут отменены соответствующей прагмой
  • на все последующие операторы, пока та же прагма не будет выполнена с другими параметрами или не будет достигнут конец кода.

Прагмы Codesys делятся на следующие категории:

  • Прагма атрибутов (влияют на компиляцию и предварительную компиляцию)
  • Прагмы сообщений (выводить определенные пользователем сообщения при компиляции)
  • Условные прагмы (влияние на генерацию кода)
  • Пользовательские прагмы

Категории

Теперь нам предстоит рассмотреть все категории, хотя бы с точки зрения теории.

Прагма атрибутов

Данные выражения влияют на компиляцию и пре-компиляцию.

Codesys поддерживает ряд предопределенных прагм атрибутов. Кроме того, вы можете использовать определяемые пользователем прагмы, которые вы можете запрашивать с помощью условных прагм перед компиляцией проекта.
Атрибуты определяются в части объявления. Исключение: для объектов Action и Transition, которые не имеют собственной части объявления, вы можете определить атрибуты в начале части реализации.

Наверно самый известный из этой серии выражений — ‘qualified_only’

Эффект этой прагмы состоит в том, что к переменным из списка глобальных переменных обращаются только путем указания имени глобальной переменной, например gvl.g_var. Это также относится к переменным типа Enumeration и может помочь избежать ошибки доступа в случае если локальная переменная имеет такое же имя.
Указывается над VAR_GLOBAL в GVL
{attribute 'qualified_only'}
VAR_GLOBAL
 iVar:INT;
END_VAR

Условные прагмы

Назначение условных прагм - повлиять на генерацию кода в процессе пре-компиляции или в процессе компиляции. Язык реализации ST поддерживает эти прагмы.
В эту группу мы относим {define}, {undefine}, {IF/ELSE/ELSIF/END_IF} и различные операторы.

И вот тут надо помнить:

Прагмы в CODESYS не являются однозначной реализацией директив препроцессора C. Вы должны позиционировать прагму как обычное утверждение. Его нельзя использовать в выражении.

Использование условных прагм

И вот тут небольшой практический пример не повредит. Очень часто бывает, что нам приходится менять различные значения для тестирования системы, а потом для наладки, что-то другое. Возможно у нас есть типовая установка с модификаторами. Тут нам и помогает минимальная генерация.

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

VAR
     iPragmaI:STRING;
END_VAR
------------------------------------
{IF defined(TEST)} //если определен тестовый режим
    iPragmaI:="TEST MODE";
{ELSIF defined(PROD)} //если определен режим производственный
    iPragmaI:="PROD MODE";
{END_IF}

Запускаем и смотри, что получается

Результат выполнения

Как можно заметить без каких-либо изменений, а дальше у нас начинается магия.

Сперва заходим в свойства приложения.

Далее нам потребуется раздел Компиляция

Раздел «Компиляция» в свойствах приложения

И теперь в директивах компилятора мы пропишем нужный нам режим. Например TEST. Загружаем — запускаем.

Да, String пишется в одинарных кавычках, но работает. Пишем PROD и будет у нас другой режим, если требуется много, то через запятую.

Прагмы сообщений

Ну тут вообще все легко. Благодаря данным выражениям мы получим необходимые сообщения.

Позиция вставки: отдельная или уже существующая строка в текстовом редакторе POU.

{text <‘textstring’>}Выводит в окне сообщений ‘textstring’
{info <‘textstring’>}Выводит в окне сообщений Info и наше сообщение
{warning  <‘textstring’>}Выводит в окне сообщений предупреждение
{error <‘textstring’>}Ошибка
список прагма-выражений для сообщений

Ну и для примера.

От Себя

Прагма-выражения — очень хороший инструмент для конфигурации проекта под разные задачи. Начиная от важных сообщений при компиляции. а иногда очень важно видеть TODO и заканчивая гибкой генерацией кода. Так что я пожалуй углублюсь в эту тему на досуге. Всем спасибо.

Ответить