Здравствуйте!
Столкнулся с проблемой при работе пользовательских функциональных блоков ST.
Контроллер: ПР225-24.1210.02.2.0
Owen Logic: 3.2.376.0
Проблема наблюдается на реальном ПР225, в режиме эмуляции не воспроизводится.
Удалось получить минимальный воспроизводимый пример.
1. Вложенный FB:
Код:
function_block PumpControllerTest
var_input
a01 : bool;
a02 : bool;
a03 : bool;
a04 : udint;
a05 : udint;
a06 : bool;
a07 : bool;
a08 : bool;
a09 : bool;
a10 : real;
a11 : real;
a12 : udint;
a13 : real;
a14 : real;
a15 : real;
a16 : real;
a17 : real;
a18 : real;
end_var
var_output
b01 : bool;
b02 : real;
b03 : udint;
b04 : bool;
b05 : bool;
end_var
var
c03 : bool;
c04 : bool;
c05 : bool;
c06 : bool;
c07 : bool;
c08 : bool;
c09 : bool;
c10 : bool;
c11 : real;
c12 : real;
c13 : udint;
c14 : udint;
c15 : real;
c16 : bool;
end_var
b03 := 2;
end_function_block
В данном FB выход `b03` всегда явно устанавливается в значение `2`:
2. Родительский FB:
Код:
function_block MainTest
var_input
a01 : bool;
a02 : bool;
a03 : real;
a04 : bool;
a05 : bool;
a06 : bool;
a07 : udint;
a08 : udint;
a09 : bool;
a10 : real;
a11 : real;
a12 : real;
a13 : real;
a14 : real;
a15 : real;
a16 : udint;
a17 : bool;
a18 : udint;
a19 : bool;
a20 : real;
a21 : real;
a22 : real;
a23 : real;
a24 : real;
a25 : real;
a26 : real;
a27 : real;
a28 : udint;
a29 : udint;
a30 : udint;
end_var
var_output
b01 : bool;
b02 : real;
b03 : udint;
b04 : bool;
b05 : bool;
end_var
var
c01 : PumpControllerTest;
c02 : bool;
c03 : bool;
c04 : bool;
//c05 : bool;
end_var
c01(
a01 := a01,
a02 := a02,
a03 := a04,
a04 := a07,
a05 := a08,
a06 := a05,
a07 := a06,
a08 := a09,
a09 := a17,
a10 := a03,
a11 := a10,
a12 := a16,
a13 := a11,
a14 := a12,
a15 := a13,
a16 := a14,
a17 := a15,
a18 := a20
);
b01 := c01.b01;
b02 := c01.b02;
b03 := c01.b03;
b04 := c01.b04;
b05 := c01.b05;
end_function_block
Результат на реальном ПР225:
закомментирована:
Если раскомментировать только эту переменную:
которая нигде не используется, результат становится:
При этом в обоих случаях в `PumpControllerTest` выполняется:
В режиме эмуляции Owen Logic в обоих вариантах:
То есть поведение зависит от наличия одной неиспользуемой переменной BOOL в родительском FB.
Появляется подозрение на проблему, связанную с размещением/адресацией переменных или экземпляров ST-FB при компиляции. Точно утверждать, что это именно смещение памяти, не могу.
При этом обычная логика FB в данном тесте отсутствует - фактически проверяется только передача выходного значения вложенного пользовательского функционального блока.
Вопрос:
Известна ли такая проблема в Owen Logic 3.2.376.0 на ПР225?
В частности, может ли наличие/отсутствие неиспользуемой переменной в родительском ST-FB влиять на адресацию или передачу выходов вложенного ST-FB?
Во вложении прилагаю минимальный проект Owen Logic, на котором проблема воспроизводится на реальном ПР225.