Я бы реализовал всю логику c более объектно-ориентированным способом.
Сначала мы определим кнопку.
Часть объявления:
FUNCTION_BLOCK FB_Button
VAR
bSignal AT%I* : BOOL;
IButtonHandler : I_ButtonHandler;
fbPushTimer : TON;
fbTrig : R_TRIG;
sValue : STRING;
END_VAR
Часть реализации:
IF IButtonHandler = 0
THEN
RETURN;
END_IF
fbPushTimer(IN:= bSignal, PT:=T#50MS);
fbTrig(CLK:=fbPushTimer.Q);
IF fbTrig.Q
THEN
IButtonHandler.onPush(sValue);
END_IF
Кнопка имеет четыре свойства:
1-е свойство:
Часть объявления:
PROPERTY getValue : String
Часть реализации :
getValue := sValue;
2-е свойство:
Часть декларации:
PROPERTY isPushed : BOOL
Часть реализации:
isPushed := bSignal;
3-е Свойство:
Часть декларации:
PROPERTY setPushHandler : I_ButtonHandler
Часть реализации:
IButtonHandler := setPushHandler;
4 Свойство:
Часть декларации:
PROPERTY setValue : String
Часть реализации:
sValue := setValue;
Затем мы определяем интерфейс.
INTERFACE I_ButtonHandler
и добавляем метод интерфейса:
METHOD onPush
VAR_INPUT
sValue : STRING;
END_VAR
Наконец, мы определяем обработчик.
Часть объявления:
FUNCTION_BLOCK FB_ButtonHandler IMPLEMENTS I_ButtonHandler
VAR_OUTPUT
floorstorage : STRING;
END_VAR
Обработчик имеет два метода:
1-й метод:
Часть декларации:
METHOD onPush
VAR_INPUT
sValue : STRING;
END_VAR
Часть реализации :
floorstorage := concat(floorstorage,sValue);
2-й метод:
Декларация:
METHOD reset
Реализация:
floorstorage := '';
Сейчас нам нужно инициировать кнопки и вызывать их в основном.
Основная часть объявления:
PROGRAM MAIN
VAR
aButtons : ARRAY[1..10] OF FB_Button;
fbButtonHandler : FB_ButtonHandler;
i : UINT;
bInit : BOOL;
END_VAR
Часть реализации:
IF NOT bInit
THEN
FOR i := 1 TO 10 DO
aButtons[i].setPushHandler := fbButtonHandler;
aButtons[i].setValue := UINT_TO_STRING(i);
END_FOR
bInit := TRUE;
END_IF
FOR i := 1 TO 10 DO
aButtons[i]();
END_FOR
Вы можете выбрать собственное значение кнопки в зависимости от кнопки.
Для простоты я назначил индекс l oop в качестве значения кнопки.
При каждом нажатии кнопки вызывается метод onPu sh только один раз через 50 мс.
Если вы хотите получить доступ к значению floorstorage , вы просто вызываете fbButtonHandler.floorstorage , чтобы назначить его другой переменной.
Таким образом вы достигаете более сильной инкапсуляции и защиты данных для своей переменной, чем объявляете ее global .