Через файл это наихудший вариант, для меня, я бы вообще хотел от сторонних файлов уйти, но пока не могу победить WinCC.
Передавать как текст тоже не вариант, так как сообщений будет много и разных.
Нужно через текстовую переменную.
Вот эта сериализация как может выглядеть?
Многое что может работать, но не является правильным.
Например
"Out1_PLC" := TRUE;
"Out1_PLC" := FALSE;
будет работать, но Сименс явно пишет:
DA008 Rule: Write output parameters only once
The output variables and return values are written once per execution cycle. This
shall take place, when possible, collectively towards the end of the block.
It is not permitted to read the own output parameter or return value. Instead of that
a temporary or static variable must be used.
Justification: This makes sure, that all output values are consistent.
Если в вашей среде удобней использовать глобальные переменные, то почему бы и нет
Дело не в самих переменных, в них как раз ничего плохого нет.
Может плохо выразился, но вот есть функция, которая условно при наличии двух дискретных входах ПЛК включает выход контроллера. Так я бы считал, что этот выход ПЛК должен быть привязан к выходу функции, а не устанавливаться внутри её.
Вот пример набросал:
// Вызов функции
ORGANIZATION_BLOCK "Main_1"
TITLE = "Main Program Sweep (Cycle)"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
BEGIN
"FC_Set_Q"(In1 := "In1_PLC",
In2 := "In2_PLC",
Out => "Out2_PLC"); // Верное обращение к выходу ПЛК
END_ORGANIZATION_BLOCK
// Сама функция
FUNCTION "FC_Set_Q" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
In1 : Bool;
In2 : Bool;
END_VAR
VAR_OUTPUT
Out : Bool;
END_VAR
BEGIN
IF #In1 AND #In2 THEN
#Out := TRUE; // Устанавливается выход функции, нормально
"Out1_PLC" := TRUE; // Устанавливается глобальная переменная, плохо
END_IF;
END_FUNCTION
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
А мне надо "Example"