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