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

5.3. ref — передать ручное задание в блок

Добавим возможность подставить результат вручную. Например, задать температуру 50.0, чтобы проверить реакцию следующего участка программы.

Для этого нужны два значения: включена ли подстановка и какое число подставить. Создадим их в View и передадим в COffset через VAR_IN_OUT.

Продолжайте проект раздела 5.2 — val, то есть результат четвёртой главы. GVL Signals, два канала в Params, настройки Conf.Offset_1 и Conf.Offset_2, таблицу Instances оставьте прежними.

1. Добавьте ручной режим в COffset

В ST-документе COffset замените тело блока:

st
VAR_INPUT
    in_fValue : REAL;
    in_fOffset : REAL;
END_VAR

VAR_IN_OUT
    inout_bManual : BOOL;
    inout_fManualValue : REAL;
END_VAR

VAR_OUTPUT
    out_fValue : REAL;
END_VAR

IF inout_bManual THEN
    out_fValue := inout_fManualValue;
ELSE
    out_fValue := in_fValue + in_fOffset;
END_IF;

При inout_bManual = FALSE блок выполняет прежнее вычисление. При TRUE он выдаёт inout_fManualValue; поправка в этом режиме не применяется.

Ручная подстановка относится к выходу блока. Исходные fRaw1 и fRaw2 продолжают хранить измерения.

2. Опишите ручное управление в Data

В компоненте Correction сохраните прежние строки global, conf и val. Добавьте две строки в Data:

Type Mode Area Tag Value Comment Publish
BOOL ref Correct_|Id|_Inst inout_bManual FALSE |Label|. Ручная подстановка 1
REAL ref Correct_|Id|_Inst inout_fManualValue 0.0 |Label|. Ручное значение 1

Режим ref создаёт в View поле для передачи в существующий параметр VAR_IN_OUT функционального блока. Area указывает на экземпляр из Inst, Tag — на его параметр VAR_IN_OUT. Value задаёт начальное значение создаваемого поля View.

Две строки-шаблона ref описывают пару «ручной режим + ручное значение». При двух строках Params MetaGen создаст две такие пары — для Correct_1_Inst и Correct_2_Inst. При трёх строках появятся три пары. Дописывать их в Data вручную не требуется.

3. Подключите поля View к блоку

В ST Template запишите:

st
Correct_|Id|_Inst(
    in_fValue := |Input|,
    in_fOffset := Conf.Offset_|Id|,
    inout_bManual := View.Correct_|Id|_Inst_inout_bManual,
    inout_fManualValue := View.Correct_|Id|_Inst_inout_fManualValue
);

По строкам ref MetaGen создаёт поля View. Чтобы блок использовал их, передаём эти поля в его вызов в ST Template. Сам режим ref не добавляет аргументы в написанный нами вызов.

По проектному компоненту MetaGen Correction будет создан следующий функциональный блок:

Повторите генерацию и загрузку в RT. В MetaCore → Онлайн откройте Correction_Inst и посмотрите, какие поля View передаются в каждый вызов. Для просмотра исходника используйте FunctionBlocks/Correction.st:

st
FUNCTION_BLOCK Correction
Correct_1_Inst(
    in_fValue := fRaw1,
    in_fOffset := Conf.Offset_1,
    inout_bManual := View.Correct_1_Inst_inout_bManual,
    inout_fManualValue := View.Correct_1_Inst_inout_fManualValue
);

Correct_2_Inst(
    in_fValue := fRaw2,
    in_fOffset := Conf.Offset_2,
    inout_bManual := View.Correct_2_Inst_inout_bManual,
    inout_fManualValue := View.Correct_2_Inst_inout_fManualValue
);
END_FUNCTION_BLOCK

Экземпляры Correct_1_Inst и Correct_2_Inst по-прежнему объявлены в Inst. Для первого канала ручной режим передаётся из View.Correct_1_Inst_inout_bManual, ручное значение — из View.Correct_1_Inst_inout_fManualValue.

4. Найдите данные ручного управления

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

st
TYPE _View
STRUCT
    fRaw1 : REAL; // Температура подачи. Измерение
    Correct_1_Inst_out_fValue : REAL; // Температура подачи. Результат
    Correct_1_Inst_inout_bManual : BOOL := FALSE; // Температура подачи. Ручная подстановка
    Correct_1_Inst_inout_fManualValue : REAL := 0.0; // Температура подачи. Ручное значение
    fRaw2 : REAL; // Температура обратки. Измерение
    Correct_2_Inst_out_fValue : REAL; // Температура обратки. Результат
    Correct_2_Inst_inout_bManual : BOOL := FALSE; // Температура обратки. Ручная подстановка
    Correct_2_Inst_inout_fManualValue : REAL := 0.0; // Температура обратки. Ручное значение
    Alarms_Inst_inout_bReset : Bool; // Сброс аварий/предупреждений
END_STRUCT
END_TYPE
Элемент панели для первого канала Переменная
Поправка измерения Conf.Offset_1
Переключатель ручной подстановки View.Correct_1_Inst_inout_bManual
Поле ручного значения View.Correct_1_Inst_inout_fManualValue
Индикатор результата View.Correct_1_Inst_out_fValue

Поправка остаётся настройкой Conf. Ручной режим и задание относятся к оперативному управлению, поэтому находятся в View.

Почему ручное задание сохраняется

Найдите файл 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_bManual и inout_fManualValue нет: они уже являются рабочими данными и передаются в блок по ссылке.

Когда оператор изменяет ручное значение в View, блок получает его при следующем вызове. Если бы код блока изменял свой параметр VAR_IN_OUT, изменилось бы то же поле View. В нашем примере блок только читает оба параметра.

Режим Data Для чего используем Роль View
val Показываем выход экземпляра функционального блока Копия обновляется через makeView
ref Передаём изменяемый параметр экземпляра функционального блока Само значение хранится в View и передаётся в вызов

Так можно подключать выбор режима, ручные команды и задания к собственным блокам. В следующем разделе сделаем эти параметры собственными параметрами проектного компонента MetaGen Correction.

Все режимы Mode · Далее: inout проектного компонента MetaGen

← 5.2. val5.4. inout →