PDA

Просмотр полной версии : Нашел небольшой баг в ST



AllXXX
29.10.2025, 13:19
В функциях ST не инициализируются значения по умолчанию во входных переменных, в функциональных блоках все нормально

kondor3000
29.10.2025, 13:34
В функциях ST не инициализируются значения по умолчанию во входных переменных, в функциональных блоках все нормально

Функции не имеют памяти, это азы программирования. На входы, каждый цикл, надо подавать значения, для её работы.
Инициализировать входы внутри невозможно, они перезапишутся значениями на входе.
Вы не баг нашли, а расписались в незнании теории.

У вас ещё много открытий впереди, в вашем примере на выходе функции всегда будет 0, даже если на вход подать True.

Cs-Cs
29.10.2025, 15:35
AllXXX Держи тебе подробное (моё) чтиво: https://cs-cs.net/funkciya-fun-i-funkcionalniy-blok-fb-codesys-owenlogic
Если потратишь чуток времени - дофига вопросов отпадёт про функции и FB

kondor3000 правильно пишет всё!

AllXXX
30.10.2025, 10:53
Спасибо обязательно почитаю на досуге

Cs-Cs
30.10.2025, 14:34
Нет. Желательно первым делом почитать, чтобы закрыть 90% всех вопросов

AllXXX
01.11.2025, 05:46
Нет. Желательно первым делом почитать, чтобы закрыть 90% всех вопросов

Да прочел хорошая статья!

Cs-Cs
01.11.2025, 16:44
Ура! Я писал сам, когда разбирался!

Ещё добавлю комментарий вот какой: В ДРУГИХ средах разработки параметры по умолчанию для функций могут работать!
То есть, это в OwenLogic не реализовано (или сделано криво).

Например, в CodeSys последних версий (SP17) можно объявить функцию как

FUNCTION MyFun
VAR_INPUT
wParam1 : WORD;
wParam2 : WORD := 10;
END_VAR

И вызывать так:

MyFun(10, 30);
MyFun(200);

melky
02.11.2025, 08:58
Типа это в ST только-только добавили, в то время как в других языках это давно было?
Или это было, но никто не придавал значению?

Развитие ST тогда радует :)

kondor3000
02.11.2025, 12:25
Например, в CodeSys последних версий (SP17) можно объявить функцию как

FUNCTION MyFun
VAR_INPUT
wParam1 : WORD;
wParam2 : WORD := 10;
END_VAR

И вызывать так:

MyFun(10, 30);
MyFun(200);
Эта фича прикольная, но бестолковая. Потому что в первом случае, инициализация на входе функции,
а во втором, нет смысла в инициализации внутри, можно поставить просто константу. Всё равно снаружи уже не изменишь.

Cs-Cs
02.11.2025, 21:43
kondor3000 Не понял! Ни разу она не бестолковая! Это опциональные аргументы. Как во всех других языках.
Ты чего? Ни разу этим не пользовался вообще нигде? Я удивлён: ты же прям гуру и спец форума.
Опциональные аргументы используют тогда, когда не надо их менять на свои, и когда стандартные значения устраивают

Например, у меня есть функция, которая делает из WORD тип TIME, и имеет такие аргументы:
wValue : WORD;
bTimeInMunitues : BOOL := FALSE;

Соответственно если я вызываю её так:
CSWordToTime(132) - то знаю, что второй аргумент подставится как FALSE
А если
CSWordToTime(132, TRUE) - то явно подставляю аргумент как мне надо

Это даже в WinAPI так было ещё с WIn 3.11