@Mitya78
Инженер АСУТП

Входные и выходные параметры в теле функции — нормально?

Хоть сфера моя и программирование ПЛК, но вопрос "общечеловеческий".

На новом месте начал смотреть тексты программ и уже робко поднял вопрос, но мне сказали - а в чём дело, всё нормально.
Задам и вам.

Есть некие функции, которые вызываются в программе, у функций есть входные, выходные (возвращаемые, входновыходные), внутренние переменные... Ну вроде как и в обычном программировании.
Так вот, я всегда считал, что функция должна работать только с теми переменными, что она получила и выдавать значения в те, что прописаны вовне.
Тут же вижу, что раз в тексте функции идёт обращение сразу напрямую к глобальным переменным и во мне всё протестует.

Кто прав, вообще это где-то написано, что такой стиль плохой?
  • Вопрос задан
  • 211 просмотров
Пригласить эксперта
Ответы на вопрос 2
Maksclub
@Maksclub
maksfedorov.ru
идёт обращение сразу напрямую к глобальным переменным и во мне всё протестует.

Чистота функции
в функциональном программировании функции стремятся быть чистыми, чистые функции просты, надежны и легко тестируемы.
Ответ написан
@Mitya78 Автор вопроса
Инженер АСУТП
Повторю ещё раз, может в комментарии не все смотрят:

spoiler
Может плохо выразился, но вот есть функция, которая условно при наличии двух дискретных входах ПЛК включает выход контроллера. Так я бы считал, что этот выход ПЛК должен быть привязан к выходу функции, а не устанавливаться внутри её.

Вот пример набросал:

// Вызов функции
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
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы