I. Разработка программы
MetaGen

6. Встроенный интерпретатор выражений

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

Например, один экземпляр использует собственные настройки, а другой — общий набор. Выражение выбирает нужный ID, и тот же шаблон подходит обоим.

Когда и где вычисляются выражения

Перед формированием кода целевой платформы MetaGen обрабатывает шаблон для каждого набора параметров:

  1. Определяет значения параметров Params, включая ссылки на другие параметры.
  2. Заменяет подстановки |Имя| текстом параметра.
  3. Вычисляет выражения %...% и вставляет их результат.
  4. По полученным данным создаёт объявления, вызовы и остальные артефакты.

Это подготовка данных до генерации целевого кода, а не вычисление во время работы ПЛК. Чтобы изменить результат выражения, меняют исходные параметры и повторяют генерацию.

Где используется Что можно подготовить
Params Значение одного параметра из других
Data Режим строки, имя тега, начальное значение, комментарий
Instances Имя экземпляра, тип блока, комментарий
ST Template Имена и значения в коде
Экспорт MetaLab и MetaView Имена и значения привязок

Правила одинаковы во всех этих областях проектного компонента MetaGen. Отдельные ST-документы — функции, функциональные блоки и GVL — содержат обычный ST: в них подстановки не раскрываются.

Две записи: подстановка и выражение

Запись Назначение
|Id| Вставить текст параметра Id
%Id% Получить значение параметра внутри интерпретатора
%ConfId or Id% Выбрать ConfId, а если он пуст — Id

Вертикальные черты |...| обозначают текстовую подстановку. Знаки %...% — выражение для интерпретатора.

Внутри выражения параметр доступен и по имени, и через подстановку. Но это разные способы передачи значения. Рассмотрим их отдельно.

Текст, числа и преобразование типов

В таблицах параметры хранятся как текст. Подстановка |Имя| вставляет этот текст без преобразования. При обращении по имени внутри выражения текущий интерпретатор распознаёт числовые значения и true/false; обычные имена вроде TE1 остаются строками.

Поэтому нельзя считать, что параметр внутри выражения всегда строка или всегда число. Для вычислений удобно явно задать нужный тип.

Запись Что делает
int(Index) Преобразует значение Index в целое число
float(Offset) Преобразует Offset в вещественное число
str(Index) Преобразует значение в текст для составления имени

Например, при Index = 2 обе записи дадут 3:

text
%int(Index) + 1%
text
%int("|Index|") + 1%

В первой записи интерпретатор получает параметр по имени. Во второй сначала выполняется текстовая подстановка: выражение становится int("2") + 1. Кавычки оставляют вставленное значение строкой, а int превращает её в число.

Для текстовых ID это особенно наглядно. При Id = TE1:

text
%Id + "_Inst"%
text
%"|Id|" + "_Inst"%

Обе записи дадут TE1_Inst. А %|Id| + "_Inst"% после подстановки превратится в выражение с именем TE1, которого интерпретатор не знает. Поэтому текстовую подстановку внутри выражения заключают в кавычки. Если значение уже доступно как параметр, обычно проще обратиться к нему по имени.

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

Краткий справочник

Для следующих примеров достаточно арифметики, преобразования типов и выбора через and/or.

Элемент Назначение
+, -, *, / Арифметические действия над числами. + также соединяет строки.
( ... ) Задать порядок вычисления
int, float, str Преобразовать значение в целое, вещественное число или текст
"текст" Строковое значение
"" Пустая строка
A or B Вернуть A, если оно считается истинным; иначе вернуть B
A and B Вернуть B, если A считается истинным; иначе вернуть само A

Для условий пустая строка, числовой ноль и логическое false считаются ложными. Непустой текст, ненулевое число и true — истинными. and и or выбирают значения, а не обязательно возвращают логический результат. Именно поэтому ими удобно выбирать имя или режим строки.

Например, ConfId or Id вернёт один из двух идентификаторов, а ExtraId and "conf" — строку conf либо пустое значение ExtraId.

Запись A and B or C подходит для выбора между B и C, когда выбранное B не пусто и не равно нулю. Если B ложно, результатом станет C. Для имён и непустых режимов это удобно; при выборе числового значения, которое может быть нулём, это поведение нужно учитывать.

Параметр может зависеть от другого параметра

В знакомой таблице Params замените только значения Input. Порядок и состав столбцов сохраняются:

Id Label Input Offset
1 Температура подачи fRaw|Id| 2.0
2 Температура обратки fRaw|Id| -1.5

Сначала будут получены Input = fRaw1 и Input = fRaw2. Затем |Input| раскроется в таблицах и коде. Самих глобальных переменных эта запись не объявляет — они должны существовать в GVL.

Если в Params несколько групп

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

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

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

Предыдущий раздел: static · Далее: выбор настроек и строк

← 5.5. static7. Выбор настроек и строк →