5.4. inout — параметры проектного компонента MetaGen
В предыдущем разделе ручное управление относилось к экземплярам COffset. Теперь сделаем его параметрами самого проектного компонента MetaGen Correction.
Это удобно, когда одна команда нужна нескольким частям алгоритма: компонент принимает её и передаёт нужным блокам. В нашем примере поведение не изменится — поменяется место, где описано ручное управление.
Начните с проекта раздела 5.3 — ref. Исходник COffset, GVL Signals, Params и Instances оставьте без изменений.
1. Замените ref на inout
В Data удалите две строки ref и добавьте следующие:
| Type | Mode | Area | Tag | Value | Comment | Publish |
|---|---|---|---|---|---|---|
BOOL |
inout |
— | inout_bManual_|Id| |
FALSE |
|Label|. Ручная подстановка |
1 |
REAL |
inout |
— | inout_fManualValue_|Id| |
0.0 |
|Label|. Ручное значение |
1 |
У inout поле Area пусто: параметр принадлежит проектному компоненту MetaGen Correction. Имя содержит |Id|, чтобы после раскрытия двух каналов получились разные параметры.
Для ref объявление VAR_IN_OUT уже было в ST-блоке COffset. Для inout MetaGen сам создаст объявление VAR_IN_OUT в блоке Correction по строкам Data.
Value задаёт начальное значение поля View, которое будет передано в компонент. В самом объявлении VAR_IN_OUT начальное значение не дублируется.
Остальные строки global, conf и val сохраните. Publish включён, чтобы параметры были доступны для подключения панели.
2. Передайте собственные параметры в COffset
В ST Template замените вызов:
Correct_|Id|_Inst(
in_fValue := |Input|,
in_fOffset := Conf.Offset_|Id|,
inout_bManual := inout_bManual_|Id|,
inout_fManualValue := inout_fManualValue_|Id|
);
Внутри Correction обращаемся к собственным параметрам inout_bManual_|Id| и inout_fManualValue_|Id|. Передача из View в сам компонент теперь будет добавлена генератором в основной вызов.
3. Посмотрите объявления в Correction
Повторите генерацию и загрузку в RT. Откройте Correction_Inst в MetaCore → Онлайн: у него появились собственные параметры ручного управления. Файл FunctionBlocks/Correction.st содержит:
FUNCTION_BLOCK Correction
VAR_IN_OUT
inout_bManual_1 : BOOL; // Температура подачи. Ручная подстановка
inout_fManualValue_1 : REAL; // Температура подачи. Ручное значение
inout_bManual_2 : BOOL; // Температура обратки. Ручная подстановка
inout_fManualValue_2 : REAL; // Температура обратки. Ручное значение
END_VAR
Correct_1_Inst(
in_fValue := fRaw1,
in_fOffset := Conf.Offset_1,
inout_bManual := inout_bManual_1,
inout_fManualValue := inout_fManualValue_1
);
Correct_2_Inst(
in_fValue := fRaw2,
in_fOffset := Conf.Offset_2,
inout_bManual := inout_bManual_2,
inout_fManualValue := inout_fManualValue_2
);
END_FUNCTION_BLOCK
Две строки inout вместе с двумя строками Params дали четыре параметра в одном экземпляре Correction_Inst: по два на канал. Он передаёт их дальше в Correct_1_Inst и Correct_2_Inst.
Для третьего канала тот же шаблон создаст ещё два параметра и их подключения. Основной экземпляр Correction_Inst останется один; число каналов внутри него определяется Params.
Состав Inst остаётся прежним:
В файле GVL/Inst.st найдите этот фрагмент:
Correct_1_Inst : COffset;
Correct_2_Inst : COffset;
Correction_Inst : Correction;
4. Найдите подключение к View
В файле FunctionBlocks/_MetaGen_Main.st найдите этот фрагмент:
Correction_Inst(
inout_bManual_1 := View.Correction_Inst_inout_bManual_1,
inout_fManualValue_1 := View.Correction_Inst_inout_fManualValue_1,
inout_bManual_2 := View.Correction_Inst_inout_bManual_2,
inout_fManualValue_2 := View.Correction_Inst_inout_fManualValue_2
);
Этот вызов создаётся автоматически по строкам inout. Вручную добавлять его в ST Template не нужно.
Проследим первое ручное значение:
| Участок | Что происходит |
|---|---|
Панель → View.Correction_Inst_inout_fManualValue_1 |
Оператор вводит значение |
Основной вызов → Correction_Inst.inout_fManualValue_1 |
В сгенерированном вызове поле View передаётся по ссылке |
Код Correction → Correct_1_Inst.inout_fManualValue |
Наш шаблон передаёт тот же параметр в блок обработки |
Выход Correct_1_Inst.out_fValue → View.Correct_1_Inst_out_fValue |
makeView обновляет результат для индикатора |
5. Учтите новые имена полей
Найдите файл Types/_View.st. Его содержимое:
TYPE _View
STRUCT
fRaw1 : REAL; // Температура подачи. Измерение
Correct_1_Inst_out_fValue : REAL; // Температура подачи. Результат
Correction_Inst_inout_bManual_1 : BOOL := FALSE; // Температура подачи. Ручная подстановка
Correction_Inst_inout_fManualValue_1 : REAL := 0.0; // Температура подачи. Ручное значение
fRaw2 : REAL; // Температура обратки. Измерение
Correct_2_Inst_out_fValue : REAL; // Температура обратки. Результат
Correction_Inst_inout_bManual_2 : BOOL := FALSE; // Температура обратки. Ручная подстановка
Correction_Inst_inout_fManualValue_2 : REAL := 0.0; // Температура обратки. Ручное значение
Alarms_Inst_inout_bReset : Bool; // Сброс аварий/предупреждений
END_STRUCT
END_TYPE
В имени поля теперь используется Correction_Inst, потому что ручное управление описано на уровне этого компонента. При переходе с примера раздела ref переключатель и поле ручного задания нужно связать с новыми именами.
Имя поля результата осталось прежним: значение всё ещё вычисляет COffset.
Найдите файл Functions/makeView.st. Его содержимое:
FUNCTION makeView : BOOL
View.fRaw1 := fRaw1;
View.Correct_1_Inst_out_fValue := Correct_1_Inst.out_fValue;
View.fRaw2 := fRaw2;
View.Correct_2_Inst_out_fValue := Correct_2_Inst.out_fValue;
END_FUNCTION
Поля inout не копируются из экземпляра через makeView. Их рабочие значения находятся в View и передаются в вызов компонента.
Когда выбирать ref, а когда inout
| Что описываем | Mode | Area | Кто задаёт объявление и вызов |
|---|---|---|---|
| Параметр экземпляра функционального блока | ref |
Экземпляр блока | VAR_IN_OUT объявлен в исходнике блока; передачу из View пишем в его вызове |
| Параметр проектного компонента MetaGen | inout |
Пусто | MetaGen создаёт VAR_IN_OUT и подключает его к View в основном вызове |
В обоих случаях оператор работает с полями View. Выбор определяется тем, к какому блоку относится параметр.
Все режимы Mode · Далее: static — внутреннее состояние проектного компонента MetaGen