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

3. Один шаблон — несколько каналов

Теперь измерений два: температура подачи и обратки. Оставим одну формулу, а различия перенесём в таблицу параметров. MetaPlatform создаст обработку обоих каналов.

В Params вынесем различающиеся значения: идентификатор и название канала, входной тег и начальную поправку. Генератор подставит их в общие строки Data и общий код.

1. Добавьте второй вход

В ST-документе Signals запишите:

st
fRaw1 : REAL := 20.0;
fRaw2 : REAL := 25.0;

При генерации он по-прежнему создаёт одну GVL с именем Signals.

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

st
VAR_GLOBAL
fRaw1 : REAL := 20.0;
fRaw2 : REAL := 25.0;
END_VAR

2. Заполните Params

В компоненте Correction задайте заголовки и две строки значений:

Id Label Input Offset
1 Температура подачи fRaw1 2.0
2 Температура обратки fRaw2 -1.5

Каждая строка задаёт один набор подстановок. Id используется в именах, Label — в комментариях, Input выбирает глобальный тег, Offset задаёт начальную поправку.

Params заполняют до генерации: по этой таблице MetaGen определяет имена, количество каналов и начальные значения. Conf используется при работе ПЛК: оператор меняет в ней поправки без изменения шаблона. Редактирование Params само по себе не меняет значения в уже работающем ПЛК.

3. Замените конкретные имена подстановками

Замените строки Data:

Type Mode Area Tag Value Comment Publish
REAL global — |Input| — |Label|. Измерение 1
REAL conf — Offset_|Id| |Offset| |Label|. Поправка 1
REAL out — fResult_|Id| 0.0 |Label|. Результат 1

В ST Template остаётся одна формула. Не копируйте её для второго канала — это сделает MetaGen:

st
fResult_|Id| := |Input| + Conf.Offset_|Id|;

Подстановка |Имя| берёт значение из одноимённого столбца Params. Один и тот же набор подстановок применяется к данным, комментариям и коду.

4. Сгенерируйте и сравните каналы

Повторите генерацию и загрузку в RT, как в главе 2. В MetaCore → Онлайн откройте Correction_Inst. Ожидаемые значения:

Канал Вход Поправка Результат
Подача 20.0 2.0 22.0
Обратка 25.0 -1.5 23.5

Посмотрите на код: вы написали одну формулу с подстановками, а получили два вычисления.

Код обоих каналов

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

st
FUNCTION_BLOCK Correction
VAR_OUTPUT
    fResult_1 : REAL := 0.0; // Температура подачи. Результат
    fResult_2 : REAL := 0.0; // Температура обратки. Результат
END_VAR
fResult_1 := fRaw1 + Conf.Offset_1;

fResult_2 := fRaw2 + Conf.Offset_2;
END_FUNCTION_BLOCK

Один компонент Correction создал один функциональный блок с двумя выходами и двумя вычислениями. В Inst по-прежнему объявлен один основной экземпляр:

st
Correction_Inst : Correction;

В нём находятся оба результата: Correction_Inst.fResult_1 и Correction_Inst.fResult_2. Это может быть обработка температуры подачи и обратки одного контура. Две строки Params в этом примере дают два вычисления внутри одного проектного компонента MetaGen. В следующей главе вынесем обработку в блок COffset и создадим по его экземпляру для каждого канала.

Настройки каждого канала

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

st
TYPE _Conf
STRUCT
    Offset_1 : REAL := 2.0; // Температура подачи. Поправка
    Offset_2 : REAL := -1.5; // Температура обратки. Поправка
END_STRUCT
END_TYPE

Offset_1 и Offset_2 — независимые поля в общих настройках Conf. К ним можно привязать два поля ввода на панели: поправку температуры подачи и поправку температуры обратки. Изменение одной поправки не меняет вторую.

Результаты для отображения

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

st
TYPE _View
STRUCT
    fRaw1 : REAL; // Температура подачи. Измерение
    Correction_Inst_fResult_1 : REAL; // Температура подачи. Результат
    fRaw2 : REAL; // Температура обратки. Измерение
    Correction_Inst_fResult_2 : REAL; // Температура обратки. Результат
    Alarms_Inst_inout_bReset : Bool; // Сброс аварий/предупреждений
END_STRUCT
END_TYPE

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

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

Для каждого канала созданы свои имена и присваивания. При этом экземпляр компонента общий — Correction_Inst.

Строка Params Вход алгоритма Настройка Опубликованный результат
Id = 1 fRaw1 Conf.Offset_1 View.Correction_Inst_fResult_1
Id = 2 fRaw2 Conf.Offset_2 View.Correction_Inst_fResult_2

5. Добавьте третий канал — по желанию

Для дополнительного упражнения добавьте в ST-документ Signals ещё одно объявление:

st
fRaw3 : REAL := 30.0;

В Params допишите одну строку под существующими двумя:

Id Label Input Offset
3 Температура бака fRaw3 0.5

Data и ST Template не меняйте. После генерации появятся:

Часть программы Что добавит третья строка
Correction Выход fResult_3 и ещё одно вычисление
Conf Настройка Offset_3 с начальным значением 0.5
View Поля fRaw3 и Correction_Inst_fResult_3
makeView Копирование третьего измерения и результата

В коде Correction к двум прежним вычислениям добавится:

st
fResult_3 := fRaw3 + Conf.Offset_3;

То же происходит для четвёртой, пятой и каждой следующей строки. Число повторений задаётся таблицей параметров. Имена, получаемые после подстановок, должны оставаться уникальными.

Прилагаемый проект содержит два канала — третий можно добавить самостоятельно по этому упражнению.

Далее: собственный функциональный блок

← 2. Первый компонент4. Свой функциональный блок →