MetaLab — руководство пользователя
MetaLab подаёт сигналы на входы программы, имитирует датчики и механизмы, читает значения из ПЛК. Сценарий вы составляете в MetaPlatform, а выполняете в Runtime.
Первый сценарий
Начнём с одного тега. Запишем TRUE, прочитаем его, затем запишем FALSE и прочитаем ещё раз. В примере нет двигателя, датчика или другого оборудования.
Скачать проект первого примера
Откройте проект
Импортируйте скачанный проект в MetaPlatform. В MetaGen находится компонент _01_Demo с одним изменяемым тегом Conf.Demo_bSignal. В MetaLab — сценарий FirstSteps.
Откройте таблицу сценария FirstSteps. В ней семь строк:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
h |
log |
Первый сценарий MetaLab | ||
opc |
write |
Conf.Demo_bSignal |
TRUE |
|
h |
wait |
1 |
||
opc |
read |
Conf.Demo_bSignal |
0 |
Учебный сигнал: True | $1 |
opc |
write |
Conf.Demo_bSignal |
FALSE |
|
h |
wait |
1 |
||
opc |
read |
Conf.Demo_bSignal |
0 |
Учебный сигнал: False | $1 |
Что делает каждая строка:
| Строка | Действие |
|---|---|
| 1 | Выводит сообщение «Первый сценарий MetaLab» |
| 2 | Записывает TRUE в учебный тег |
| 3 | Ждёт одну секунду |
| 4 | Читает тег и выводит «Учебный сигнал: True | True». Вместо $1 подставляется прочитанное значение |
| 5 | Записывает FALSE в тот же тег |
| 6 | Ждёт одну секунду |
| 7 | Читает тег и выводит «Учебный сигнал: False | False» |
В комментарии чтения первое значение написано автором, второе подставляется из ПЛК. Runner выводит их рядом, но не сравнивает автоматически.
Где объявлен учебный тег
Тег создаётся при генерации из строки Data компонента _01_Demo:
| Type | Mode | Tag | Value |
Publish |
|---|---|---|---|---|
Bool |
conf |
Demo_bSignal |
false |
1 |
В сгенерированном ST есть оба объявления:
| Где | Объявление |
|---|---|
Структура _Conf |
Demo_bSignal : Bool := false; |
| Глобальные переменные | Conf : _Conf; |
Поэтому в сценарии используется имя Conf.Demo_bSignal. Объявлять этот тег вручную в ST не нужно.
Запустите в Runtime
- Сохраните проект и выполните генерацию в MetaPlatform. Скачайте артефакты MetaGen и MetaLab.
- Откройте Runtime. В MetaCore импортируйте артефакт MetaGen. Библиотеки этому проекту не нужны.
- Задайте период 100 мс, нажмите «Загрузить», затем «Запустить».
- Откройте MetaLab, импортируйте артефакт MetaLab и нажмите «Загрузить».
- Нажмите «Из MetaCore», выберите
FirstStepsи нажмите «Запустить».

MetaCore выполняет программу с периодом 100 мс. Библиотеки и модели оборудования не подключены.

В журнале видны результаты двух чтений. Сначала прочитано True, затем False.
Одна сессия для нескольких сценариев
Нажатие «Загрузить» в MetaLab открывает сессию и подключение к OPC UA. Инициализация сама не запускается.
| Порядок | Что запустить |
|---|---|
| 1 | MetaGen Init Objects — создание и настройка моделей |
| 2 | Пользовательскую инициализацию, если проекту нужны нормальные начальные значения входов |
| 3 | Нужные сценарии автономной или комплексной наладки |
Выбирайте следующий сценарий в той же сессии. Созданные модели сохраняются и продолжают работать между запусками. Не загружайте артефакт заново перед каждым сценарием.
«Отменить сценарий» прекращает текущий сценарий, но сохраняет модели и уже выполненные воздействия. «Завершить сессию» останавливает моделирование и удаляет объекты сессии; значения ПЛК автоматически не сбрасываются. После открытия новой сессии снова выполните инициализацию.
Объекты MetaLab
В столбце object укажите объект, к которому обращается строка сценария. В method — его метод. Остальные столбцы содержат параметры этого метода.
Есть три встроенных объекта. Их имена зарезервированы, создавать их не нужно:
object |
Для чего нужен |
|---|---|
h |
Сообщения оператору, паузы и подтверждения |
opc |
Запись и чтение тегов ПЛК через OPC UA |
factory |
Создание моделей, которыми будет управлять сценарий |
Модели пользователь создаёт через factory:
| Тип | Назначение |
|---|---|
sensor |
Аналоговый датчик: выдаёт значение на вход программы |
engine |
Двигатель: читает команду пуска и выдаёт обратную связь |
valve |
Клапан: читает команды и выдаёт концевики |
delay |
Дискретный сигнал с задержкой |
Имена моделей задавайте сами: например PT01, P01, XV01. Обращайтесь к модели по этому имени. Не используйте для неё имена h, opc или factory.
Если у действия указан comment, сценарий после выполнения этого действия ждёт подтверждения пользователя. Исключения: у сообщений h текст выводится как сообщение, у opc.read comment задаёт подпись результата. Ниже это показано для каждого объекта.
Сначала создайте объект, затем настройте его и вызывайте методы. Если объект ещё не создан, сценарий не сможет к нему обратиться.
factory
Создаёт модель. Укажите имя в tag, тип — в value.
method |
tag |
value |
|---|---|---|
create |
Имя нового объекта | sensor, engine, valve или delay |
Создадим модель датчика PT01:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
factory |
create |
PT01 |
sensor |
После этой строки PT01 становится объектом сценария. Например, строка PT01 / const задаёт значение именно этой модели. Повторное создание объекта с тем же именем возвращает уже созданный объект.
h
Выводит сообщения, делает паузы и запрашивает подтверждение оператора.
method |
Параметры | Действие |
|---|---|---|
log |
Текст в comment |
Обычное сообщение |
action |
Текст в comment |
Заголовок действия |
success |
Текст в comment |
Положительное сообщение |
warning |
Текст в comment |
Предупреждение |
error |
Текст в comment |
Сообщение об ошибке; само по себе не останавливает сценарий |
wait |
Секунды в value |
Пауза |
confirm |
Текст в comment |
Ожидание подтверждения |
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
h |
log |
Начало проверки | ||
h |
wait |
2 |
||
h |
confirm |
Проверьте индикацию на экране |
На строке confirm сценарий остановится и будет ждать «Продолжить». Режим «Автоматически» пропускает подтверждения.
opc
Работает с тегами ПЛК через OPC UA.
write
Записывает значение. В tag укажите имя тега, в value — значение.
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
opc |
write |
DI_P01_VfdFault |
TRUE |
Проверьте аварийную индикацию |
Если к действию указан комментарий, сценарий после выполнения действия ждёт подтверждения пользователя для перехода к следующему шагу. В этом примере он запишет TRUE, покажет комментарий и будет ждать «Продолжить». Без комментария перейдёт дальше сразу.
У сообщений h.log текст просто выводится. У чтения opc.read комментарий задаёт формат результата, а не запрос подтверждения.
Для инверсного входа перед именем можно написать NOT:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
opc |
write |
NOT DI_P01_Healthy |
TRUE |
Строка запишет FALSE в DI_P01_Healthy. Сравнение или составное выражение как адрес записи не подходит.
В какой тег записывать
Сценарий должен писать в тег, который программа не перезаписывает при обновлении View. У входного сигнала может быть отдельное зеркало для отображения:
| Тег | Для чего используется |
|---|---|
DI_P01_Running |
Исходный дискретный вход. Сюда модель или сценарий подаёт обратную связь |
View.IO_DI_P01_Running |
Пример зеркала этого входа в области IO. Программа копирует сюда значение для отображения |
Пишите в DI_P01_Running, а не в его зеркало. Имя зеркала зависит от проекта: точное имя смотрите в таблице тегов. То же относится к вычисляемым выходам блока — запись в них не заменяет воздействие на вход.
В проекте FirstSteps используется Conf.Demo_bSignal. Программа его циклически не пересчитывает, поэтому он подходит для знакомства с записью и чтением.
read
Читает тег или список тегов. В value укажите 0 для одного чтения. В comment задайте подпись; $1 — первое значение, $2 — второе.
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
opc |
read |
Conf.Demo_bSignal |
0 |
Учебный сигнал: $1 |
opc |
read |
DO_P01_Start, DI_P01_Running |
0 |
Пуск: $1; работа: $2 |
Положительное value задаёт период наблюдения в интерактивном режиме. При автоматическом запуске выполняется одно чтение.
Читайте имена тегов, а не выражения. Для NOT Tag или сравнения используйте отдельный опубликованный результат, если он нужен в проверке.
Неиспользуемые входы
Запись в пустую цель, TRUE, FALSE, NULL или NONE пропускается. Чтение пустой цели, FALSE или NONE возвращает False без ПЛК и помечается в журнале как необъявленный канал. Так базовый сценарий может работать с разными наборами входов.
В списке нескольких тегов пустые элементы и константы недопустимы. Чтение константы не считается проверкой оборудования.
Sensor
Sensor имитирует аналоговый датчик: пишет значение на аналоговый вход программы. Назовём модель PT01, а вход — AI_PT01_Raw.
Подайте постоянное значение
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
factory |
create |
PT01 |
sensor |
|
PT01 |
set_tag |
AI_PT01_Raw |
||
PT01 |
const |
13824 |
Первая строка создаёт модель. Вторая связывает её с входом. Третья задаёт постоянное значение Raw.
PT01 — имя модели MetaLab. AI_PT01_Raw — тег, который получает значение в программе ПЛК.
Задайте линейное изменение или синусоиду
Перейдём от текущего значения к 20000 за десять секунд:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
PT01 |
set_period |
10 |
||
PT01 |
ramp |
20000 |
||
h |
wait |
11 |
Теперь включим синусоиду между 6000 и 20000:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
PT01 |
set_min |
6000 |
||
PT01 |
set_max |
20000 |
||
PT01 |
set_period |
10 |
||
PT01 |
sin |
Для возврата к постоянному значению вызовите const.
Подайте давление в барах
Чтобы не пересчитывать давление в Raw вручную, задайте шкалы модели. В примере вход модуля — 0–20 мА = Raw 0–27648, датчик — 4–20 мА = 0–10 бар.
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
PT01 |
set_enable_scale |
TRUE |
||
PT01 |
set_raw_min |
0 |
||
PT01 |
set_raw_max |
27648 |
||
PT01 |
set_ev_min |
0 |
||
PT01 |
set_ev_max |
20 |
||
PT01 |
set_fvx_min |
4 |
||
PT01 |
set_fvx_max |
20 |
||
PT01 |
set_fv_min |
0 |
||
PT01 |
set_fv_max |
10 |
||
PT01 |
set_k |
1 |
||
PT01 |
set_add |
0 |
||
PT01 |
const_fv |
5 |
На входе получится Raw 16588.8: это 12 мА, или 5 бар. Настройки должны соответствовать обработке датчика в ПЛК — модель не забирает их из Conf автоматически.
Если нужно подать именно ток, используйте const_ev, например 4 мА. const, ramp и sin всегда работают в Raw. Отдельных команд синусоиды в барах или мА нет.
Методы модели датчика
method |
tag |
value |
Пояснение |
|---|---|---|---|
set_tag |
Имя входного тега | Куда модель пишет Raw |
|
set_value |
Число | Сразу задать значение | |
const |
Значение Raw |
Удерживать постоянное значение | |
set_target |
Значение Raw |
Задать цель изменения | |
ramp |
Значение Raw |
Перейти к цели за настроенный период | |
set_min, set_max |
Значение Raw |
Границы синусоиды | |
set_period |
Секунды | Период изменения | |
sin |
Включить синусоиду | ||
set_enable_scale |
TRUE/FALSE |
Включить преобразование шкал | |
set_raw_min, set_raw_max |
Число | Границы Raw |
|
set_ev_min, set_ev_max |
Число | Электрические величины на границах Raw |
|
set_fvx_min, set_fvx_max |
Число | Электрические точки шкалы датчика | |
set_fv_min, set_fv_max |
Число | Диапазон физической величины | |
set_k, set_add |
Число | Коэффициент и смещение | |
const_ev |
Электрическая величина | Подать её через пересчёт в Raw |
|
const_fv |
Физическая величина | Подать её через пересчёт в Raw |
При отключённом масштабировании const_ev и const_fv используют только коррекцию: Raw = (значение − Add) / K. При включённом масштабировании const_fv сначала убирает коррекцию, затем переводит физическую величину в электрическую и в Raw.
Значения за границами шкалы не ограничиваются. Если нужные настройки пропущены или некорректны, например K=0, модель выдаст Raw=0 без отдельного предупреждения. Проверьте шкалы до испытания.
Если входом уже управляет модель, меняйте значение её методами. Одиночную запись opc.write в тот же вход модель может перезаписать.
Engine
Engine имитирует двигатель. Создадим модель P01: она будет читать выход пуска и через секунду выдавать обратную связь «Работа».
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
factory |
create |
P01 |
engine |
|
P01 |
set_start_tag |
DO_P01_Start |
||
P01 |
set_state_tag |
DI_P01_Running |
||
P01 |
set_local_control_tag |
DI_P01_LocalControl |
||
P01 |
set_remote_control_tag |
DI_P01_RemoteControl |
||
P01 |
set_runup_time |
1 |
||
P01 |
set_cooldown_time |
1 |
||
P01 |
mode_remote |
|||
P01 |
start_normal |
Теперь подайте пуск штатным способом управления вашим компонентом. Если программа выдаст DO_P01_Start, модель включит DI_P01_Running.
Проверьте незапуск
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
P01 |
start_fail |
|||
h |
log |
Подайте пуск и проверьте аварию незапуска | ||
h |
confirm |
Авария появилась? | ||
P01 |
start_normal |
Перед этой проверкой остановите двигатель. Контроль состояния в ПЛК должен быть включён. Его нормальная задержка должна учитывать время разгона модели. После проверки верните start_normal.
Методы модели двигателя
method |
tag |
value |
Пояснение |
|---|---|---|---|
set_start_tag |
Тег или выражение | Команда пуска, которую читает модель | |
set_state_tag |
Имя входного тега | Обратная связь «Работа», которую пишет модель | |
set_local_control_tag, set_remote_control_tag |
Имя входного тега | Признаки аппаратного режима | |
set_runup_time, set_cooldown_time |
Секунды | Задержки пуска и останова | |
mode_local, mode_remote, mode_off |
Выбрать аппаратный режим | ||
start_normal |
Нормальный ответ на пуск | ||
start_fail |
Имитация незапуска |
Local/remote — положение аппаратного переключателя. Ручной/автоматический режим алгоритма через HMI выбирается отдельно.
Valve
Valve имитирует клапан. Создадим модель XV01 с двумя командами и двумя концевиками. Полный ход займёт три секунды.
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
factory |
create |
XV01 |
valve |
|
XV01 |
set_open_tag |
DO_XV01_Open |
||
XV01 |
set_close_tag |
DO_XV01_Close |
||
XV01 |
set_opened_tag |
DI_XV01_Opened |
||
XV01 |
set_closed_tag |
DI_XV01_Closed |
||
XV01 |
set_local_control_tag |
DI_XV01_LocalControl |
||
XV01 |
set_remote_control_tag |
DI_XV01_RemoteControl |
||
XV01 |
set_full_time |
3 |
||
XV01 |
set_position |
0 |
||
XV01 |
mode_remote |
|||
XV01 |
normal |
Положение 0 — клапан закрыт, 100 — открыт. Подайте команды через PLC-компонент и проверьте концевики.
Если есть только команда открытия
Вместо отдельной команды закрытия передайте её отрицание:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
XV01 |
set_close_tag |
!DO_XV01_Open |
Когда команда открытия исчезнет, модель начнёт закрытие. Сам PLC-компонент также должен быть настроен под однокомандный привод — по руководству компонента.
Методы модели клапана
method |
tag |
value |
Пояснение |
|---|---|---|---|
set_open_tag, set_close_tag |
Тег или выражение | Команды, которые читает модель | |
set_opened_tag, set_closed_tag |
Имя входного тега | Концевики, которые пишет модель | |
set_local_control_tag, set_remote_control_tag |
Имя входного тега | Признаки аппаратного режима | |
set_full_time |
Секунды | Время полного хода | |
mode_local, mode_remote, mode_off |
Выбрать аппаратный режим | ||
normal |
Нормальное движение | ||
fail |
Остановить движение, снять оба концевика | ||
get_position |
Получить положение 0–100 | ||
set_position |
Число 0–100 | Принудительно задать положение |
Для проверки неисправности вызовите fail, подайте команду и дождитесь времени контроля хода ПЛК. После проверки верните normal.
Delay и выражения
Delay
Delay создаёт задержанный дискретный сигнал. Например, признак наличия потока должен появиться через две секунды после пуска насоса:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
factory |
create |
FlowFeedback |
delay |
|
FlowFeedback |
set_start_tag |
DO_P01_Start |
||
FlowFeedback |
set_state_tag |
DI_FlowPresent |
||
FlowFeedback |
set_delay |
2 |
||
FlowFeedback |
delay_on |
method |
tag |
value |
Пояснение |
|---|---|---|---|
set_start_tag |
Тег или выражение | Входной сигнал | |
set_state_tag |
Имя выходного тега | Куда писать результат | |
set_delay |
Секунды | Время задержки | |
delay_on |
Задерживать включение | ||
delay_off |
Задерживать отключение | ||
off |
Отключить выход |
Объедините несколько команд
В командных входах моделей двигателя, клапана и задержки можно использовать выражения:
| Обозначение | Значение |
|---|---|
& |
И |
| |
ИЛИ |
! |
НЕ |
( и ) |
Группировка |
Например, включать модель от любой из двух команд, но только при наличии питания:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
P01 |
set_start_tag |
(DO_P01_Start | DO_P02_Start) & DI_Cabinet_PowerHealthy |
Модель читает выражение. В opc.write такое выражение передавать нельзя: у записи нужен один тег или NOT перед одним тегом.
Выражение передаётся прямо в параметр команды модели: set_start_tag, set_open_tag или set_close_tag. Модель сама вычисляет его по значениям тегов. Создавать отдельный объект для выражения не нужно.
Экспорт и генерация
Если в проекте десять одинаковых насосов, не нужно вручную переписывать сценарий десять раз. Сделайте один шаблон и передайте ему теги каждого насоса через таблицу «Экспорт MetaLab» компонента MetaGen.
Подготовьте шаблон
Создайте компонент MetaLab с именем PumpCheck. Заполните его таблицу сценария:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
// {comment} |
||||
@scenario |
||||
@Проверка насосов |
||||
opc |
write |
{fault_tag} |
{fault_value} |
|
h |
wait |
1 |
||
opc |
read |
{fault_output} |
0 |
Авария: True | $1 |
Фигурные скобки — места для подстановки. Конкретные теги появятся при генерации.
// {comment} — подпись экземпляра. Остальные строки с @ разбивают шаблон на секции.
Секции сценария
Маркер в object |
Что разместить после него | Что получится |
|---|---|---|
@init |
Только создание моделей и их начальную настройку | Общий сценарий MetaGen Init Objects |
@scenario |
Проверочные действия: команды, ожидания, чтение результатов | Основной сценарий MetaGen Scenario, если не заданы именованные секции |
@Valves, @Pumps и другие имена |
Действия, которые нужно собрать в отдельную группу | Отдельный сценарий для каждой группы |
Сначала выполняйте MetaGen Init Objects. Он создаёт и настраивает модели, к которым обращаются проверки. При запуске всех сценариев генератор ставит его первым. Если запускаете проверки по отдельности, сначала сами выполните инициализацию.
Пуски, остановы и проверки аварий размещайте после @scenario, а не в @init.
Как объединяются проверки
При генерации через «Экспорт MetaLab» блоки всех экземпляров сначала собираются в общий документ MetaGen Scenario. При подготовке артефакта MetaLab одинаковые именованные секции этого документа объединяются.
Например, две проверки клапанов используют одну метку:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
@scenario |
||||
@Valves |
||||
h |
log |
Проверка клапана XV01 |
||
@Valves |
||||
h |
log |
Проверка клапана XV02 |
В Runtime появится один сценарий [MetaGen] Valves. В нём сначала будут действия XV01, затем XV02. Так можно объединить проверки всех клапанов проекта, сохранив отдельную группу для насосов.
| Что задано в проверочной части | Сценарии в Runtime |
|---|---|
Только @scenario, без именованных секций |
MetaGen Scenario |
@scenario, затем @Valves |
[MetaGen] Valves |
Повторяющаяся @Valves у нескольких экземпляров |
Один [MetaGen] Valves со всеми этими блоками |
@Valves и @Pumps |
Отдельные [MetaGen] Valves и [MetaGen] Pumps |
Для объединения имена секций должны совпадать в точности.
Сценарий MetaGen Init Objects остаётся отдельным. Строки с маркерами сами не исполняются как команды.
Это объединение относится к блокам, собранным через экспорт MetaGen. Одинаковые названия секций в разных самостоятельных сценариях MetaLab не объединяют эти сценарии между собой.
Заполните экспорт
Откройте таблицу «Экспорт MetaLab» в проектном компоненте MetaGen. Для примера в его Params уже есть Id и FaultInput.
Export |
Value |
Comment |
|---|---|---|
PumpCheck.comment |
Насос |Id| |
Подпись экземпляра |
PumpCheck.fault_tag |
|FaultInput| |
Входной сигнал — авария |
PumpCheck.fault_value |
TRUE |
Сценарий — аварийное значение |
PumpCheck.fault_output |
View.|Id|_Engine_Inst_out_bFault |
Параметр — общая авария |
В Export до точки указывается имя компонента MetaLab — PumpCheck. После точки — имя подстановки из фигурных скобок. В Value — то, что нужно передать в сценарий.
Заполните две строки в Params:
| Id | FaultInput |
|---|---|
P01 |
DI_P01_VfdFault |
P02 |
DI_P02_VfdFault |
Генератор создаст два блока проверки:
| Насос | Куда сценарий подаст аварию | Откуда прочитает результат |
|---|---|---|
P01 |
DI_P01_VfdFault |
View.P01_Engine_Inst_out_bFault |
P02 |
DI_P02_VfdFault |
View.P02_Engine_Inst_out_bFault |
Для каждой используемой подстановки нужна одна привязка. Если забыть импортировать шаблон PumpCheck, оставить обязательное значение пустым или создать дубликат привязки, генерация сообщит об ошибке.
Три вида подстановок
| Запись | Когда и что подставляется |
|---|---|
|Id| |
MetaGen подставляет параметр, например P01 |
{fault_tag} |
При генерации сценария подставляется значение из экспорта |
$1 |
При чтении в Runtime подставляется фактическое значение |
Параметр может ссылаться на другой параметр. Например:
| Параметр | Значение |
|---|---|
SensId |
PT01 |
FltIn8 |
|SensId|_Sensor_Inst.out_bError |
Программа получит ссылку PT01_Sensor_Inst.out_bError. Это связь алгоритма с датчиком, а не доступный для записи тестовый вход.
Есть и системный параметр |this| — имя проектного компонента MetaGen. Для компонента _03_Pumps он подставит _03_Pumps. Добавлять this в Params нельзя: имя зарезервировано.
Подготовьте теги
В Data у тегов, необходимых сценарию, должно быть Publish=1. После генерации они появятся в таблице OPC UA.
| Где объявлен тег | Пример имени в MetaLab |
|---|---|
| Глобальный IO | DI_P01_Running |
Настройка Conf |
Conf.CabinetController_diPowerControlFilter |
| Опубликованный параметр блока | View.P01_Engine_Inst_out_bFault |
Берите имя из таблицы OPC UA. Не добавляйте к физическому IO имя GVL или лишнюю точку. Для внешнего ПЛК также выполните предусмотренную вашей платформой привязку адресов из инженерного экспорта.
Выполните генерацию
- Импортируйте нужные шаблоны MetaLab.
- Заполните
Paramsи экспорт. - Сохраните проект и выполните генерацию MetaGen.
- Сформируйте артефакт MetaLab и загрузите его в Runtime.
- Проверьте наличие сценариев для нужного оборудования и запустите их.
Изменения вносите в исходный шаблон и экспорт. Готовые сценарии, созданные генератором, при следующей генерации будут заменены.
Доработка сценариев MetaKit
MetaKit содержит базовые сценарии. Перед запуском их нужно проверить и при необходимости изменить под конкретный объект. Они помогают проверить стандартный блок, но не знают всю технологию вашей установки.
Работайте с копиями компонентов и сценариев, импортированными в свой проект. Начните с простого:
| Что проверить | Что подстроить |
|---|---|
| Входы и выходы | Указать настоящие теги |
| Исходное состояние | Подготовить питание, режимы и разрешения |
| Времена | Учесть разгон, ход, фильтрацию и цикл ПЛК |
| Аварии | Выбрать воздействие, которое действительно вызовет нужную аварию |
| Ожидания | Указать правильный результат для выбранного режима |
| Завершение | Снять воздействия и вернуть модели в нормальную работу |
Нормальное и аварийное значение
Каждому проверяемому каналу передаются два значения:
- Нормальное — чтобы подготовить исходное состояние.
- Аварийное — чтобы вызвать срабатывание.
Названия привязок зависят от компонента:
| Компоненты | Нормальное значение | Аварийное значение |
|---|---|---|
| Units | faultN_reset_value |
faultN_value |
SignalsFilter, FltsWrns, General |
signalN_reset_value |
signalN_value |
N заменяется номером канала. Например, для канала 1 компонента EngineUnit:
Export для примера EngineUnit |
Value |
Назначение |
|---|---|---|
EngineUnit.fault1_reset_value |
FALSE |
Нормальное состояние входа |
EngineUnit.fault1_value |
TRUE |
Аварийное состояние входа |
При необходимости можно передать числа. Но тег для записи тоже должен соответствовать проверке. Значение 12 не означает 12 бар, если записать его прямо в Raw.
Если авария вычисляется по давлению
Допустим, авария возникает, когда измеренное давление превышает предел. В само сравнение нельзя записать TRUE.
Выберите один способ:
- Передать в экспорт
Raw-тег датчика и заранее рассчитанные значения Raw. - Настроить модель датчика и изменить действие сценария на const_fv.
- Проверить эту защиту отдельным технологическим сценарием в автоматическом режиме.
Если модель PT01 настроена как в разделе о датчике, можно подать давление так:
object |
method |
tag |
value |
comment |
|---|---|---|---|---|
PT01 |
const_fv |
12 |
||
h |
wait |
2 |
||
opc |
read |
View.P01_Engine_Inst_out_bFault |
0 |
Авария давления: True | $1 |
PT01 |
const_fv |
5 |
Здесь нужно, чтобы предел был ниже 12 бар и канал защиты был разрешён. Две секунды — пример: задайте ожидание с учётом фильтра и задержки аварии. После возврата к нормальному давлению выполните сброс, если он предусмотрен.
Одной замены числа в экспорте недостаточно, чтобы opc.write стал const_fv: при смене способа воздействия изменяется и строка сценария.
Пример: сухой ход по уровню — от параметров до шагов
В учебной насосной станции канал 2 аварий насоса подключён к условию LT01_SensFilter_Inst.out_fY < Conf.Pumps_DryRunLevel. Уставка сухого хода — 10 %. Канал разрешён при исправном датчике. Записать TRUE в это сравнение нельзя: изменим уровень через модель датчика.
Изменения вносите в импортированные в свой проект компонент MetaGen и шаблон MetaLab. Библиотечные оригиналы менять не требуется. Для насосов станции используется VfdGroupEngineUnit, а имя его базового шаблона MetaLab — PidEngineUnit.
1. Добавьте параметры в таблицу Params насосов.
LM_Fault2_SensId |
LM_Fault2_NormalValue |
LM_Fault2_FaultValue |
|---|---|---|
LT01 |
50.0 |
5.0 |
| Параметр | Что передаём |
|---|---|
LM_Fault2_SensId |
Идентификатор датчика уровня |
LM_Fault2_NormalValue |
Нормальный уровень, % |
LM_Fault2_FaultValue |
Уровень ниже уставки сухого хода, % |
Это параметры проверки. Существующее условие защиты и её уставку в программе ПЛК сохраняем.
2. Измените три строки в таблице «Экспорт MetaLab».
Строку PidEngineUnit.fault2_input замените на PidEngineUnit.fault2_sensor. Две строки значений уже существуют — замените их значения ссылками на новые параметры.
Export |
Value |
Comment |
|---|---|---|
PidEngineUnit.fault2_sensor |
|LM_Fault2_SensId|_Sensor |
Сценарий - Модель датчика для проверки канала 2 |
PidEngineUnit.fault2_reset_value |
|LM_Fault2_NormalValue| |
Сценарий - Нормальное значение воздействия на канал 2 |
PidEngineUnit.fault2_value |
|LM_Fault2_FaultValue| |
Сценарий - Аварийное значение воздействия на канал 2 |
После подстановки параметров сценарий получит имя модели LT01_Sensor и числа 50.0 и 5.0. Привязки шунта, задержки, выхода аварии и сброса остаются стандартными.
3. Замените действия, подающие сигнал на канал 2.
В проектном шаблоне PidEngineUnit найдите все записи opc.write с tag={fault2_input}. Замените их на вызовы модели. Сохраните назначение каждого значения:
| Где находится строка | object |
method |
tag |
value |
comment |
|---|---|---|---|---|---|
| Подготовка нормального состояния | {fault2_sensor} |
const_fv |
{fault2_reset_value} |
||
| Подача аварии канала 2 | {fault2_sensor} |
const_fv |
{fault2_value} |
||
| Восстановление уровня | {fault2_sensor} |
const_fv |
{fault2_reset_value} |
У const_fv оставьте tag пустым, а число передайте через value. Метод задаёт значение в инженерных единицах; модель сама рассчитывает сигнал Raw по своей шкале и записывает его в исходный аналоговый вход. В выходы View сценарий не пишет.
Сохраните остальные шаги: ожидание, чтение аварии, проверку блокировки двигателя и сброс. Выдержка должна покрывать фильтрацию датчика, задержку защиты и цикл ПЛК. После восстановления уровня сбросьте защёлкнутую аварию штатной командой.
4. Сгенерируйте и выполните проверку.
| Порядок | Действие |
|---|---|
| 1 | Выполнить генерацию MetaGen и MetaLab после изменения Params, экспорта и шаблона |
| 2 | Загрузить актуальные артефакты в Runtime, запустить MetaCore |
| 3 | В одной сессии MetaLab выполнить MetaGen Init Objects: стандартный сценарий датчика создаст LT01_Sensor |
| 4 | Выполнить пользовательскую инициализацию нормальных входов, если она есть в проекте |
| 5 | Запустить автономную проверку насосов и проверить чтения: при 5 % возникает сухой ход и двигатель блокируется |
| 6 | Вернуть 50 %, выполнить сброс и проверить восстановление |
Этот пример проверяет защиту, действующую и в ручном режиме. Ошибку датчика регулирования, действующую только в AUTO, проверяйте в пользовательском сценарии комплексной наладки. В стандартных регулирующих Units она уже исключена из автономного воздействия.
Если канал не проверяется автономно
Не удаляйте проверку канала из общего шаблона только ради одного объекта: этот шаблон может использоваться другими компонентами. В своей проектной копии можно изменить сценарий либо отключить конкретную проверку через экспорт.
При отключении через экспорт согласуйте все привязки канала: вход, шунт, задержку и выход передайте как FALSE, ожидаемое срабатывание — False, объект сообщения — //. Ожидание общего выхода фильтра тоже должно учитывать только проверяемые каналы.
У регулирующих Units MetaKit канал 8 с ошибкой датчика уже исключён из автономного воздействия. Защита в ПЛК продолжает действовать. У Units без регулятора обычный канал 8 проверяется как остальные.
Автономная и комплексная наладка
При автономной наладке проверяют отдельный механизм: ручной пуск и останов, обратную связь, местное/дистанционное управление, аварии и сброс.
При комплексной наладке проверяют установку в автоматическом режиме: общий пуск и останов, переключение на резервный насос, работу от датчиков и восстановление после нарушений. Для этого составляют свой сценарий с технологическими условиями и ожидаемыми результатами.
На страницах компонентов MetaKit доступны демо-проекты с примерами их применения. Скачайте проект из документации нужного компонента, чтобы посмотреть его параметры, связи и сценарии.
Проверка и ошибки
Для пробного выполнения без ПЛК есть Memory Mode. Он проверяет, что сценарий читается, объекты создаются и команды выполняются. Программы ПЛК в этом режиме нет — правильность аварий и управления он не доказывает.
Реакцию программы проверяйте с работающим MetaCore или внешним ПЛК. После прогона убедитесь, что сценарии завершились, ожидаемые значения совпали с прочитанными и оборудование осталось в нужном состоянии.
| Что случилось | Что проверить |
|---|---|
| Неизвестный объект | Выполняли ли создание модели; совпадает ли имя |
| Неизвестный тег или BadNodeIdUnknown | Publish, имя в таблице OPC UA, адреса и запущенную версию программы |
| Насос не запускается | Питание, разрешения, режим ПЛК и модели, обратную связь и контроль состояния |
| Клапан в модели не закрывается | Команду закрытия, время хода и normal/fail |
| Датчик выдаёт ноль | Шкалы, границы и коэффициент K |
| Подтверждение требуется после каждой строки | Непустые comment у действий; пояснения лучше вынести в h.log |
| SUCCESS, но ожидание не совпало | Просмотрите прочитанные значения: Runner не сравнивает текст автоматически |
| Изменения исчезли после генерации | Редактируйте исходный шаблон и экспорт, а не созданный генератором сценарий |
| Не удаётся записать выражение | Выберите настоящий входной тег или другой способ воздействия |
Если пропало соединение с OPC UA или не найден обязательный тег, реальный прогон останавливается. Не продолжайте оценку результатов по старым значениям — сначала восстановите подключение и проверьте, что программа работает.