2. Первый компонент: Conf и View
Прибавим к температуре поправку. При входе 20.0 и поправке 2.0 ожидаемый результат — 22.0. Поправка станет настройкой оператора, а результат подготовим для отображения.
Продолжайте проект первой главы. Создайте в меню MetaGen → Добавить компонент проектный компонент Correction.
1. Осмотритесь в редакторе
| Область | Что здесь задаём |
|---|---|
Параметры / Params |
Список каналов и значения для подстановки |
Данные / Data |
Настройки, параметры и публикацию данных |
Экземпляры / Instances |
Какие функциональные блоки нужны алгоритму |
ST Template |
Сам алгоритм |
| Экспорт MetaLab | Связи со сценариями наладки |
| Экспорт MetaView | Связи с шаблонами экранов |
Щелчок по заголовку области разворачивает её, повторный — возвращает прежнюю раскладку.
Сейчас заполним только Data и код. Остальные таблицы оставьте пустыми.
2. Заполните Data
| Type | Mode | Area | Tag | Value | Comment | Publish |
|---|---|---|---|---|---|---|
REAL |
global |
— | fRaw1 |
— | Температура. Измерение | 1 |
REAL |
conf |
— | Offset_1 |
2.0 |
Температура. Поправка | 1 |
REAL |
out |
— | fResult_1 |
0.0 |
Температура. Результат | 1 |
Оставьте Flt, Wrn, Alm и Trend пустыми.
| Режим | Результат этой строки |
|---|---|
global |
Публикуется уже объявленная fRaw1; для её значения создаётся копия в View |
conf |
В общих настройках Conf создаётся поле Offset_1 |
out |
В функциональном блоке Correction создаётся выход fResult_1 |
Для global начальное значение задаётся в GVL, поэтому Value здесь пусто.
3. Напишите алгоритм
В ST Template введите:
fResult_1 := fRaw1 + Conf.Offset_1;
Вставьте только эту строку. Объявления из Data и оформление функционального блока MetaPlatform добавит при генерации.
4. Сгенерируйте и откройте в RT
- В меню «Проект» сохраните проект. Убедитесь, что выбрана MetaCore, и выполните «Сгенерировать».
- Дождитесь завершения генерации. Затем через «Проект → Скачать» сохраните
MetaPlatformArtifacts.zip. - Откройте MetaPlatform Runtime, нажмите «+ Импорт файлов» и выберите скачанный архив.
- В разделе MetaCore выберите импортированный артефакт MetaGen. Для этого упражнения библиотеки не нужны. Нажмите «Загрузить», затем «Запустить».
- Откройте MetaCore → Онлайн. Здесь доступны исходники и текущие значения программы.
Можно импортировать и отдельный MetaGenArtifact.zip. Архив исходного проекта, полученный через «Экспортировать проект», предназначен для MetaPlatform: сам по себе он в RT не выполняется.
При следующих изменениях повторяйте генерацию и импорт. В RT остановите предыдущую программу, выберите новый артефакт, загрузите и запустите его. Смена выбранного файла сама не обновляет уже работающую программу.
5. Посмотрите вызов и результат
В MetaCore → Онлайн выберите экземпляр Correction_Inst. Рядом с формулой будут показаны вход, поправка и результат. Для начальных значений ожидается:
| Вход | Поправка | Результат |
|---|---|---|
20.0 |
2.0 |
22.0 |
Теперь разберём, откуда взялись эти данные. Ниже приведены сгенерированные исходники; их не нужно вводить в MetaPlatform вручную.
Correction и Inst
Найдите файл FunctionBlocks/Correction.st. Его содержимое:
FUNCTION_BLOCK Correction
VAR_OUTPUT
fResult_1 : REAL := 0.0; // Температура. Результат
END_VAR
fResult_1 := fRaw1 + Conf.Offset_1;
END_FUNCTION_BLOCK
MetaPlatform создала блок Correction и объявила его экземпляр Correction_Inst в глобальной таблице Inst.
В Correction_Inst.fResult_1 хранится результат нашего вычисления. Основной экземпляр создаётся автоматически по имени проектного компонента.
В файле GVL/Inst.st найдите этот фрагмент:
Correction_Inst : Correction;
Добавлять основной экземпляр вручную в Instances не требуется.
Conf — поправка оператора
Conf объединяет настройки, которые задают оператор и наладчик. Для насоса это могут быть задержки пуска, для регулятора — уставка, для нашего измерения — поправка Offset_1.
Строка с режимом conf добавила Conf.Offset_1. Поле ввода поправки на панели должно изменять эту настройку; наш алгоритм читает её при каждом вычислении.
В CoDeSys это глобальные данные в GVL: структура Conf объявлена в MetaGen. В Siemens настройки находятся в блоке данных Conf. В MetaCore структура также глобальная, а её тип хранится отдельным файлом.
Найдите файл Types/_Conf.st. Его содержимое:
TYPE _Conf
STRUCT
Offset_1 : REAL := 2.0; // Температура. Поправка
END_STRUCT
END_TYPE
Найдите файл GVL/MetaGen.st. Его содержимое:
VAR_GLOBAL
Conf : _Conf;
View : _View;
END_VAR
_Conf и _View — имена типов. Conf и View — глобальные переменные этих типов. Если позже добавим настройки других компонентов, они также попадут в общую Conf.
Value = 2.0 определяет начальное значение поля. Во время работы программа использует текущее значение Conf.Offset_1.
View — измерение и результат для экрана
View содержит данные, с которыми работает панель оператора: измерения, состояния и параметры оперативного управления. Для показанных режимов global и out это копии исходной температуры и результата коррекции. Индикатор температуры читает такое поле View, а настройку поправки оператор задаёт в Conf.
В CoDeSys View объявлена как глобальная структура в GVL MetaGen. В Siemens это блок данных View. В MetaCore её объявление находится рядом с Conf в GVL/MetaGen.st.
Найдите файл Types/_View.st. Его содержимое:
TYPE _View
STRUCT
fRaw1 : REAL; // Температура. Измерение
Correction_Inst_fResult_1 : REAL; // Температура. Результат
Alarms_Inst_inout_bReset : Bool; // Сброс аварий/предупреждений
END_STRUCT
END_TYPE
Имя Correction_Inst_fResult_1 показывает источник значения: выход fResult_1 экземпляра Correction_Inst. Строка Alarms_Inst_inout_bReset относится к служебному сбросу аварий, который добавляет генератор; в нашей таблице Data её нет.
Настройка Offset_1 остаётся в Conf: отдельная копия в View для неё не создаётся.
makeView — обновление результата
Найдите файл Functions/makeView.st. Его содержимое:
FUNCTION makeView : BOOL
View.fRaw1 := fRaw1;
View.Correction_Inst_fResult_1 := Correction_Inst.fResult_1;
END_FUNCTION
Первое присваивание копирует измерение, второе — результат вычисления. Изменение такой копии View не меняет исходную переменную: следующий вызов makeView снова запишет в неё текущее рабочее значение.
Генератор добавляет в FunctionBlocks/_MetaGen_Main.st вызов нашего компонента:
Correction_Inst();
После вызовов блоков, включая служебную обработку аварий, там выполняется:
makeView();
Таким образом, View получает результат после выполнения алгоритма. Показанные две строки — фрагменты основного блока, а не всё его содержимое.
Программа Application вызывает экземпляр _MetaGen_Main_Inst, который выполняет вызовы проектных компонентов и обновляет View. Найдите файл Programs/Application.st:
PROGRAM Application
_MetaGen_Main_Inst();
END_PROGRAM
6. Разберитесь с Publish
При включённом Publish MetaPlatform включает данные в формируемые таблицы тегов. По этим именам затем связывают поля ввода и индикаторы панели с переменными программы.
| Данные примера | Имя для обращения | Для чего используются |
|---|---|---|
| Исходное глобальное измерение | fRaw1 в таблице ML OPC UA |
MetaLab записывает имитируемый вход прямо в рабочую переменную |
Копия измерения в View |
View.fRaw1 |
MetaView показывает исходное измерение |
| Настройка | Conf.Offset_1 |
Оператор меняет поправку |
| Результат | View.Correction_Inst_fResult_1 |
MetaView показывает результат обработки |
Исходный вход и его копия — разные переменные. Для виртуальной наладки публикуйте в OPC UA исходные глобальные теги, а также Conf и View. Если доступны только копии из View, MetaLab не сможет подать сигнал в исходные входы. Как связаны имя сценария, Area и адрес OPC UA, показано в разделе global.
Для global и out в этом примере публикация также приводит к созданию показанных полей View и присваиваний в makeView. Объявления настройки conf и выхода out создаются и при выключенном Publish.
Если у строки global выключить Publish и оставить Flt, Wrn, Alm пустыми, она ничего не добавит в генерируемый код. Её можно удалить из Data: переменная fRaw1 останется в GVL и продолжит использоваться в алгоритме. Если же заполнен Flt, Wrn или Alm, генератор создаст сигнализацию по этой переменной даже без публикации.
Мы задали три строки данных и одну формулу. MetaPlatform создала настройку, рабочий выход, экземпляр блока и данные для отображения. В следующей главе этот же алгоритм будет работать для двух каналов.
Когда заполнять Area у global
Area указывает, откуда брать значение. В нашем упражнении переменная доступна по короткому имени, поэтому оставьте эту ячейку пустой.
| Area | Tag | Откуда читается значение | Копия при Publish |
|---|---|---|---|
| — | fRaw1 |
fRaw1 |
View.fRaw1 |
Signals |
fRaw1 |
Signals.fRaw1 |
View.Signals_fRaw1 |
Заполняйте Area, когда нужно обратиться к переменной через имя GVL или блока данных. Например, Area = SomeDB, Tag = SomeTag дадут такое обновление:
View.SomeDB_SomeTag := SomeDB.SomeTag;
Исходную SomeTag при этом объявляют в ST-документе SomeDB. Строка global повторно её не создаёт. В HMI Tags опубликованная копия будет называться View_SomeDB_SomeTag, а её PLC-тег — View.SomeDB_SomeTag.
Изменение Area меняет и источник, и имя поля View. Поэтому элементы уже созданного экрана потребуется связать с новым именем. В таблице ML OPC UA логическое имя исходного входа остаётся fRaw1: область помогает сопоставить его с реальным адресом в GVL или DB. Сценарий обращается к этому логическому имени. В основном упражнении ничего менять не нужно.