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. Запустите все сценарии вместе
- Скачайте результаты генерации и импортируйте
MetaPlatformArtifacts.zipв RT. - Запустите программу в MetaCore и подключите к нему MetaView Runtime. Если они продолжают работать с прежним кодом и карточками, достаточно обновить артефакт MetaLab.
- В разделе MetaLab выберите новый артефакт и нажмите «Загрузить».
- Нажмите «Из MetaCore». Флажок «Автоматически» оставьте выключенным.
- Нажмите «Запустить все».
RT выполнит три сценария в одном запуске:
| Порядок | Сценарий | Результат |
|---|---|---|
| 1 | MetaGen Init Objects |
Созданы и настроены SimInput1 и SimInput2 |
| 2 | MetaGen Scenario |
Оба имитатора непрерывно записывают синус в свои входы |
| 3 | Observe |
Выполнение ждёт оператора, синусы продолжают работать |
Здесь используйте именно «Запустить все». Имитаторы должны создаваться и использоваться в одном запуске; отдельный запуск Observe их не создаёт, а отдельный запуск MetaGen Scenario не выполняет подготовку.

Когда появится сообщение «Оба синуса работают», перейдите в 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 завершены.
Перейдите к итогу второй части: там собраны результаты и доступен финальный проект для скачивания. Затем выберем целевой ПЛК и перенесём в него эту же программу.