I. Разработка программы
MetaGen

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 введите:

st
fResult_1 := fRaw1 + Conf.Offset_1;

Вставьте только эту строку. Объявления из Data и оформление функционального блока MetaPlatform добавит при генерации.

4. Сгенерируйте и откройте в RT

  1. В меню «Проект» сохраните проект. Убедитесь, что выбрана MetaCore, и выполните «Сгенерировать».
  2. Дождитесь завершения генерации. Затем через «Проект → Скачать» сохраните MetaPlatformArtifacts.zip.
  3. Откройте MetaPlatform Runtime, нажмите «+ Импорт файлов» и выберите скачанный архив.
  4. В разделе MetaCore выберите импортированный артефакт MetaGen. Для этого упражнения библиотеки не нужны. Нажмите «Загрузить», затем «Запустить».
  5. Откройте MetaCore → Онлайн. Здесь доступны исходники и текущие значения программы.

Можно импортировать и отдельный MetaGenArtifact.zip. Архив исходного проекта, полученный через «Экспортировать проект», предназначен для MetaPlatform: сам по себе он в RT не выполняется.

При следующих изменениях повторяйте генерацию и импорт. В RT остановите предыдущую программу, выберите новый артефакт, загрузите и запустите его. Смена выбранного файла сама не обновляет уже работающую программу.

5. Посмотрите вызов и результат

В MetaCore → Онлайн выберите экземпляр Correction_Inst. Рядом с формулой будут показаны вход, поправка и результат. Для начальных значений ожидается:

Вход Поправка Результат
20.0 2.0 22.0

Теперь разберём, откуда взялись эти данные. Ниже приведены сгенерированные исходники; их не нужно вводить в MetaPlatform вручную.

Correction и Inst

Найдите файл FunctionBlocks/Correction.st. Его содержимое:

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 найдите этот фрагмент:

st
    Correction_Inst : Correction;

Добавлять основной экземпляр вручную в Instances не требуется.

Conf — поправка оператора

Conf объединяет настройки, которые задают оператор и наладчик. Для насоса это могут быть задержки пуска, для регулятора — уставка, для нашего измерения — поправка Offset_1.

Строка с режимом conf добавила Conf.Offset_1. Поле ввода поправки на панели должно изменять эту настройку; наш алгоритм читает её при каждом вычислении.

В CoDeSys это глобальные данные в GVL: структура Conf объявлена в MetaGen. В Siemens настройки находятся в блоке данных Conf. В MetaCore структура также глобальная, а её тип хранится отдельным файлом.

Найдите файл Types/_Conf.st. Его содержимое:

st
TYPE _Conf
STRUCT
    Offset_1 : REAL := 2.0; // Температура. Поправка
END_STRUCT
END_TYPE

Найдите файл GVL/MetaGen.st. Его содержимое:

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. Его содержимое:

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. Его содержимое:

st
FUNCTION makeView : BOOL
View.fRaw1 := fRaw1;
View.Correction_Inst_fResult_1 := Correction_Inst.fResult_1;
END_FUNCTION

Первое присваивание копирует измерение, второе — результат вычисления. Изменение такой копии View не меняет исходную переменную: следующий вызов makeView снова запишет в неё текущее рабочее значение.

Генератор добавляет в FunctionBlocks/_MetaGen_Main.st вызов нашего компонента:

st
    Correction_Inst();

После вызовов блоков, включая служебную обработку аварий, там выполняется:

st
    makeView();

Таким образом, View получает результат после выполнения алгоритма. Показанные две строки — фрагменты основного блока, а не всё его содержимое.

Программа Application вызывает экземпляр _MetaGen_Main_Inst, который выполняет вызовы проектных компонентов и обновляет View. Найдите файл Programs/Application.st:

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 дадут такое обновление:

st
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. Сценарий обращается к этому логическому имени. В основном упражнении ничего менять не нужно.

Далее: параметризация

← 1. Проект и глобальные данные3. Один шаблон — несколько каналов →