MetaLab Руководство пользователя

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

  1. Сохраните проект и выполните генерацию в MetaPlatform. Скачайте артефакты MetaGen и MetaLab.
  2. Откройте Runtime. В MetaCore импортируйте артефакт MetaGen. Библиотеки этому проекту не нужны.
  3. Задайте период 100 мс, нажмите «Загрузить», затем «Запустить».
  4. Откройте MetaLab, импортируйте артефакт MetaLab и нажмите «Загрузить».
  5. Нажмите «Из MetaCore», выберите FirstSteps и нажмите «Запустить».

Программа FirstSteps запущена в MetaCore

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

Сценарий FirstSteps выполнен в Runtime

В журнале видны результаты двух чтений. Сначала прочитано 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 или лишнюю точку. Для внешнего ПЛК также выполните предусмотренную вашей платформой привязку адресов из инженерного экспорта.

Выполните генерацию

  1. Импортируйте нужные шаблоны MetaLab.
  2. Заполните Params и экспорт.
  3. Сохраните проект и выполните генерацию MetaGen.
  4. Сформируйте артефакт MetaLab и загрузите его в Runtime.
  5. Проверьте наличие сценариев для нужного оборудования и запустите их.

Изменения вносите в исходный шаблон и экспорт. Готовые сценарии, созданные генератором, при следующей генерации будут заменены.

Доработка сценариев 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 или не найден обязательный тег, реальный прогон останавливается. Не продолжайте оценку результатов по старым значениям — сначала восстановите подключение и проверьте, что программа работает.