3. Один шаблон — несколько каналов
Теперь измерений два: температура подачи и обратки. Оставим одну формулу, а различия перенесём в таблицу параметров. MetaPlatform создаст обработку обоих каналов.
В Params вынесем различающиеся значения: идентификатор и название канала, входной тег и начальную поправку. Генератор подставит их в общие строки Data и общий код.
1. Добавьте второй вход
В ST-документе Signals запишите:
fRaw1 : REAL := 20.0;
fRaw2 : REAL := 25.0;
При генерации он по-прежнему создаёт одну GVL с именем Signals.
Найдите файл GVL/Signals.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:
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. Его содержимое:
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 по-прежнему объявлен один основной экземпляр:
Correction_Inst : Correction;
В нём находятся оба результата: Correction_Inst.fResult_1 и Correction_Inst.fResult_2. Это может быть обработка температуры подачи и обратки одного контура. Две строки Params в этом примере дают два вычисления внутри одного проектного компонента MetaGen. В следующей главе вынесем обработку в блок COffset и создадим по его экземпляру для каждого канала.
Настройки каждого канала
Найдите файл Types/_Conf.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. Его содержимое:
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. Его содержимое:
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 ещё одно объявление:
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 к двум прежним вычислениям добавится:
fResult_3 := fRaw3 + Conf.Offset_3;
То же происходит для четвёртой, пятой и каждой следующей строки. Число повторений задаётся таблицей параметров. Имена, получаемые после подстановок, должны оставаться уникальными.
Прилагаемый проект содержит два канала — третий можно добавить самостоятельно по этому упражнению.