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

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 замените вызов:

st
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 содержит:

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

st
    Correct_1_Inst : COffset;
    Correct_2_Inst : COffset;
    Correction_Inst : Correction;

4. Найдите подключение к View

В файле FunctionBlocks/_MetaGen_Main.st найдите этот фрагмент:

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

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

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

← 5.3. ref5.5. static →