Язык ST

Автор Artem, 22 мая 2025, 21:14:35

« назад - далее »

Artem

Исправлено поведение переменных 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

Evdoc

#1
Добрый день. Вот такая ошибка возникает при добавлении макроса с ST

"Исключительная ситуация в файле ( дальше путь к файлу lang_i_ctm32.cpp строка 595 условие ..."

Artem

Высылайте проект, в котором такая ошибка появляется, будем разбираться.

JIeKaPb

Здравствуйте, после обновления
(Версия 2.3.263-b1 :Qt 5.15.2 (MSVC 1929 64 bit):Сборка: a73780dc Дата сборки: May  7 2025 at 09:27:03) перестал работать поразрядный сдвиг влево и вправо в ST.

Artem

Ошибку нашли, в ближайшем обновление выйдет исправление.