Вход

Просмотр полной версии : Время жизни переменных метода ФБ. Абстрактный вопрос по организации ST кода



Нидвораич
10.05.2025, 18:28
Добрый день. Есть ФБ, у которого есть несколько методов. В каждом методе есть переменные, необходимые для работы метода.
С точки зрения порядка в коде было бы очень неплохо локальные переменные методов объявлять в самих методах, дабы не захламлять список переменных ФБ.
Но я столкнулся с проблемой. Переменные, объявленные в методе, обнуляются при каждом вызове.
Пытался решить проблему через VAR STAT, но в этом случае переменные метода расшариваются на все экземпляры ФБ.

Есть ли какой-то способ не пихать все переменные в шапку ФБ? Очень снижает читаемость кода и удовольствие от работы.
Хотелось бы:
1) чтобы переменные, необходимые чисто для работы метода, объявлялись в нём, а не на уровне ФБ
2) чтобы эти переменные сохраняли свои значения всё время жизни ФБ
3) чтобы была возможность скрыть эти переменные из списка переменных ФБ в ассистенте ввода, чтоб они не мозолили глаза лишний раз (может, через какую-то прагму?)
4) чтобы лето не кончалось, чтоб оно за мною мчалось

Спасибо :)

Евгений Кислов
10.05.2025, 18:39
Добрый день.
VAR_INST решит хотелки 1) и 2)
https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_vartypes_var_inst.html

Для 3) - используйте на уровне ФБ прагму hide_all_locals
https://content.helpme-codesys.com/en/CODESYS%20Development%20System/_cds_pragma_attribute_hide_all_locals.html

Нидвораич
11.05.2025, 10:45
Добрый день.
VAR_INST решит хотелки 1) и 2)

спасибо :) но столкнулся с ещё одной непоняткой. Помимо обычных переменных у меня есть константа, определяющая размер массива.
И вот при объявлении массива в рамках VAR_INST, а константы в VAR CONSTANT - получаю ошибку
[ERROR] varsInMet: FB [Device: Plc Logic: Application](Строка 7 (Объявл.)): C0161: Граница 'cv' массива не является постоянным значением

ошибка воспроизводится и в совершенно пустом проекте. CDS 3.5 sp5.

FUNCTION_BLOCK FB
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR


METHOD METH
VAR_INPUT
END_VAR

VAR CONSTANT
cv: USINT:=55;
END_VAR

VAR_INST
arrr: ARRAY [0..cv] OF INT;
END_VAR

Евгений Кислов
11.05.2025, 10:59
Это особенность реализации, которая не планируется к исправлению.

83707

Нидвораич
11.05.2025, 11:30
печально, спасибо. Вынес константу из метода в ФБ. Остальное вроде работает