Исправлено поведение переменных VAR_OUTPUT и VAR_TEMP в соответствии с логикой, что это временные переменные, они не должны сохранять свои значения между вызовами.
Раньше, если модуль не записывает эти переменные, в них оставались старые значения, записанные этим модулем, или другим FBD_блоком этого же модуля,
или они могли использоваться произвольно и случайно, что вызывало нарекания.
Теперь, перед выполнением модуля при каждом вызове, в эти переменные записываются значения 0, чтобы явно стереть непредсказуемые значения, которые там могут быть.
Однако, некоторые программисты специально использовали указанное нестандартное поведение переменных, сохранявших свои значения, поэтому такие модули могут перестать работать, как ожидается.
Для исправления ситуации требуется:
- перенести переменные, которые должны сохранять свои значения между вызовами, из секции VAR_TEMP в секцию VAR.
- для каждой переменной из секции VAR_OUTPUT, которая так же должна сохранять значение между вызовами - создать двойника в секции VAR,
с каким-то другим именем, с которым выполнять все действия в модуле. Перед окончанием работы модуля - безусловно присвоить
переменной VAR_OUTPUT значение переменной VAR.
Например:
Модуль, ранее написанный:
PROGRAM My_RS;
VAR_INPUT
s: BOOL;
r: BOOL;
END_VAR
VAR_OUTPUT
q: BOOL;
END_VAR
IF s THEN q := TRUE;
END_IF
IF r THEN q := FALSE;
END_IF
// А если r = FALSE и s = FALSE - значение q не определено, но в большинстве случаев, оно сохранялось, если FBD-блок этого модуля единственный!
END_PROGRAM
Модуль, исправленный:
PROGRAM My_RS;
VAR_INPUT
s: BOOL;
r: BOOL;
END_VAR
VAR_OUTPUT
q: BOOL; // Имя переменной оставляем как было, иначе поменяется название выхода FBD-блока!
END_VAR
VAR
q_: BOOL := FALSE; // Явно указываем начальное значение (не обязательно, иначе будет 0)
END_VAR
IF s THEN q_ := TRUE; // Переменная из секции VAR!
END_IF
IF r THEN q_ := FALSE; // Переменная из секции VAR!
END_IF
// А если r = FALSE и s = FALSE - значение q теперь будет равно 0!
q := q_; // Безусловно записать выходное значение
END_PROGRAM
Добрый день. Вот такая ошибка возникает при добавлении макроса с ST
"Исключительная ситуация в файле ( дальше путь к файлу lang_i_ctm32.cpp строка 595 условие ..."