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 замените тело блока:
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 запишите:
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:
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. Его содержимое:
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. Его содержимое:
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