II. Визуализация и наладка
MetaView, MetaLab и MetaCore

12. MetaLab — один шаблон для всех каналов

В предыдущей главе мы написали сценарий для одного входа. Теперь поручим MetaPlatform создавать имитаторы по строкам Params. Для двух каналов получим два синуса; при добавлении новых каналов тот же шаблон будет повторяться для каждого из них.

Продолжайте проект из предыдущей главы. Программу обработки и карточки MetaView оставим прежними. Изменим InputSine, заполним экспорт MetaLab в Correction и добавим короткий сценарий ожидания.

1. Превратите сценарий в шаблон

Откройте InputSine в разделе MetaLab и замените его таблицу:

Object Method Tag Value Comment
@init — — — —
factory create {id} sensor —
{id} set_tag {tag} — —
{id} set_min — 10 —
{id} set_max — 30 —
{id} set_period — {period} —
@scenario — — — —
{id} sin — — —

Тире означает пустую ячейку. Столбец Comment пока оставьте пустым.

Вместо конкретных имён и одного периода появились подстановки в фигурных скобках:

Подстановка Что передадим
{id} Уникальное имя имитатора: SimInput1, SimInput2
{tag} Вход программы: fRaw1, fRaw2
{period} Период синуса в секундах: 20, 40

Отдельно объявлять эти подстановки не нужно. Записываем их в нужные ячейки, а значения передаём из проектного компонента MetaGen через таблицу экспорта.

Строки @init и @scenario разделяют шаблон на две части:

Часть Назначение Куда попадут её строки
@init Создать имитатор, связать его с входом, задать диапазон и период MetaGen Init Objects
@scenario Запустить синус MetaGen Scenario

Сами строки-разделители команд не выполняют. При генерации MetaPlatform сначала соберёт подготовку всех имитаторов, затем — их запуск.

Уберите прежнюю строку h.confirm из InputSine. Ожидание добавим один раз после запуска всех каналов. Если оставить его в повторяемом шаблоне, сценарий остановится уже на первом канале, не дойдя до запуска второго.

2. Передайте значения из Correction

Откройте проектный компонент MetaGen Correction. В области экспорта MetaLab заполните три строки:

Export Value Comment
InputSine.id SimInput|Id| Имя имитатора
InputSine.tag |Input| Логический вход программы
InputSine.period %20 * int(Id)% Период синуса, с

В InputSine.tag передаём логическое имя исходного входа из ML OPC UA: fRaw1 или fRaw2. Не добавляйте здесь View. или префикс области. При заданной Area = Signals адрес исходного тега определяется через эту область, а в сценарии остаётся прежнее имя. Схема публикации global.

В Export перед точкой указано имя базового сценария, после точки — имя подстановки в нём. Например, InputSine.tag передаёт значение в {tag} сценария InputSine.

Столбец Comment в таблице экспорта содержит пояснения к привязкам. Эти пояснения не становятся командами ожидания в сценарии.

Используем уже имеющиеся строки Params; новых столбцов добавлять не требуется:

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

Для каждой строки MetaPlatform сначала раскрывает |Id|, |Input| и вычисляет выражение в %…%. Затем подставляет полученные значения в {id}, {tag} и {period} базового сценария.

Строка Params Имя имитатора Вход Период
Id = 1 SimInput1 fRaw1 20 с
Id = 2 SimInput2 fRaw2 40 с

Здесь int(Id) переводит строковое значение параметра в число. Выражение %20 * int(Id)% даёт первому синусу период 20 секунд, второму — 40. Разные периоды помогут увидеть, что каналы работают независимо. В этом примере Id должен быть числом.

Экспорт MetaView оставьте как есть. Из тех же строк Params он создаёт карточки, а экспорт MetaLab — имитаторы. Оба используют одни и те же идентификаторы каналов.

3. Добавьте общее ожидание

В разделе MetaLab создайте компонент Observe с одной строкой:

Object Method Tag Value Comment
h confirm — — Оба синуса работают. Перейдите в MetaView. Нажмите «Продолжить» после проверки.

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

В итоге мы подготовили:

Где Что задаём
InputSine Как создать и запустить один имитатор
Экспорт MetaLab в Correction Какие имена, входы и периоды передать для каждой строки Params
Observe Когда остановиться и дать пользователю поработать с экраном

4. Посмотрите результат генерации

Сохраните проект и выполните полную генерацию для MetaCore. В разделе MetaLab откройте MetaGen Init Objects. Там будут команды подготовки обоих каналов:

Object Method Tag Value Comment
factory create SimInput1 sensor —
SimInput1 set_tag fRaw1 — —
SimInput1 set_min — 10 —
SimInput1 set_max — 30 —
SimInput1 set_period — 20 —
factory create SimInput2 sensor —
SimInput2 set_tag fRaw2 — —
SimInput2 set_min — 10 —
SimInput2 set_max — 30 —
SimInput2 set_period — 40 —

Между каналами генератор также оставляет пустую строку для удобства чтения.

А в MetaGen Scenario — запуск двух синусов:

Object Method Tag Value Comment
SimInput1 sin — — —
SimInput2 sin — — —

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

InputSine остаётся в проекте как шаблон. В RT отдельного исполняемого сценария InputSine уже не будет: туда попадут готовые команды с конкретными именами.

5. Запустите все сценарии вместе

  1. Скачайте результаты генерации и импортируйте MetaPlatformArtifacts.zip в RT.
  2. Запустите программу в MetaCore и подключите к нему MetaView Runtime. Если они продолжают работать с прежним кодом и карточками, достаточно обновить артефакт MetaLab.
  3. В разделе MetaLab выберите новый артефакт и нажмите «Загрузить».
  4. Нажмите «Из MetaCore». Флажок «Автоматически» оставьте выключенным.
  5. Нажмите «Запустить все».

RT выполнит три сценария в одном запуске:

Порядок Сценарий Результат
1 MetaGen Init Objects Созданы и настроены SimInput1 и SimInput2
2 MetaGen Scenario Оба имитатора непрерывно записывают синус в свои входы
3 Observe Выполнение ждёт оператора, синусы продолжают работать

Здесь используйте именно «Запустить все». Имитаторы должны создаваться и использоваться в одном запуске; отдельный запуск Observe их не создаёт, а отдельный запуск MetaGen Scenario не выполняет подготовку.

RT выполнил подготовку и запуск обоих имитаторов, Observe ждёт оператора

Когда появится сообщение «Оба синуса работают», перейдите в MetaView. «Продолжить» пока не нажимайте.

6. Проверьте оба канала на экране

Откройте сцену «Измерения». На обеих карточках выключите ручную подстановку. Для сравнения задайте поправки 2 и -1.5, подтвердив ввод по Enter.

Карточка Вход Результат в автоматическом режиме
Температура подачи Синус от 10 до 30, период 20 с Вход плюс 2: от 12 до 32
Температура обратки Синус от 10 до 30, период 40 с Вход минус 1.5: от 8.5 до 28.5

Теперь меняется и второй канал. За одно полное колебание температуры обратки температура подачи успевает пройти два.

Два автоматически созданных имитатора работают с разными периодами

На первой карточке нажмите «Задать 50 °C» и включите «Ручную подстановку». Первый результат удерживается на 50, а его вход и второй канал продолжают меняться. Верните первую карточку в автоматический режим.

Ручная подстановка первого канала не мешает имитации второго

После проверки вернитесь в MetaLab и нажмите «Продолжить». Завершится весь запуск, оба имитатора остановятся. Во входах останутся последние записанные значения; программа ПЛК продолжит работу.

Что изменится при добавлении каналов

Мы описали поведение имитатора один раз. Для следующего канала понадобится объявить его логический вход и добавить строку в Params компонента Correction.

По этой строке MetaPlatform создаст настройки, экземпляр COffset, его вызов и данные для отображения. Те же параметры дадут новую карточку MetaView и новый имитатор MetaLab. Если сцене нужен дополнительный элемент, включите новую карточку в её состав, как в главе о MetaView.

Копировать команды имитации для каждого канала не требуется. Например, для Id = 3 и Input = fRaw3 существующий экспорт передаст имя SimInput3, тег fRaw3 и период 60 секунд.

В этой главе мы оставили два канала и проверили их совместную работу. Разработка и наладка учебного проекта в MetaPlatform завершены.

Перейдите к итогу второй части: там собраны результаты и доступен финальный проект для скачивания. Затем выберем целевой ПЛК и перенесём в него эту же программу.

← 11. MetaLab: изменяющийся сигналИтог и финальный проект →