Спасибо за подсказку
Получил чего хотел. Код маленький и понятный.
TYPE Alarm :
STRUCTAlert: BOOL;
mode: INT;
t_idle: TIME;
CurrentValue: INT;
CriticalMin: INT;
CriticalMax: INT;
MsgMin: STRING :='';
MsgMax: STRING :='';
fTON: TON;
END_STRUCT
END_TYPE
TYPE Control :ARRAY [1..4] OF Alarm;
END_TYPE
PROGRAM PLC_PRG
VAR
i1: INT := 49;
i2: INT := 1;
i3: INT := 24;
i4: INT := 0;
sText, sVar : STRING[255] := '';
b : BOOL;
count: INT := 0;
event: ARRAY [1..4] OF INT := 0,0,0,0;
T: Control := (Alert := FALSE, mode :=0, t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'min11111111', MsgMax := 'max111111'),(Alert := FALSE, mode :=0, t_idle := T#10s, CriticalMin := 0, CriticalMax := 20000, MsgMin := 'min2222222', MsgMax := 'max222222'),
(Alert := FALSE, mode :=0, t_idle := T#05s, CriticalMin := 5, CriticalMax := 25, MsgMin := 'min33333333', MsgMax := 'max3333333'),
(Alert := FALSE, mode :=0, t_idle := T#15s, CriticalMin := -20000, CriticalMax := 1, MsgMin := 'min444444444', MsgMax := 'max4444444');
i : INT;
END_VAR
T[1].CurrentValue := i1;
T[2].CurrentValue := i2;
T[3].CurrentValue := i3;
T[4].CurrentValue := i4;
FOR i := 1 TO 4 DO
(************* i **************)
IF (T[i].CurrentValue <= T[i].CriticalMin) OR (T[i].CurrentValue >= T[i].CriticalMax) THENT[i].Alert := TRUE;
ELSET[i].Alert := FALSE;
END_IF;
IF T[i].Alert THEN
CASE T[i].mode OF0: T[i].mode := 1;
IF (T[i].CurrentValue<= T[i].CriticalMin) THEN sText := CONCAT(sText, T[i].MsgMin ); END_IF;
IF T[i].CurrentValue >= T[i].CriticalMax THEN sText := CONCAT(sText, T[i].MsgMax ); END_IF;
T[i].fTON(IN := TRUE, PT := T[i].t_idle);
event[i] := event[i] + 1;
1: T[i].fTON(IN := TRUE, PT := T[i].t_idle);
IF T[i].fTON.Q THEN
T[i].fTON(IN := FALSE, PT := T[i].t_idle);
T[i].mode := 0;
END_IF;
END_CASE
ELSET[i].fTON(IN := FALSE, PT := T[i].t_idle);
T[i].mode := 0;
END_IF;
END_FOR;
IF LEN(sText) > 0 THEN; (* смс sText *)
count := count +1;
sVar := CONCAT( sVar, sText);
sText := '';
END_IF;
(*
T[1].Alert := T[1].Alert;
T[2].Alert := T[2].Alert;
T[3].Alert := T[3].Alert;
T[4].Alert := T[4].Alert;
event[1] := event[1];
event[2] := event[2];
event[3] := event[3];
event[4] := event[4];
*)
Теперь следующий вопрос:
В приведенном примере я анализирую только один тип данных, а именно INT. В процессе может потребоваться контролировать BOOL и REAL.
Есть ли не сложный способ обеспечить это все в одной программе или лучше ввести 3-три разные программы для контроля значений с разными типами?
При этом строку СМС (sText) можно инициализировать как глобальную переменную, составление строки возложить на программы контроля (по типам), а очистку переменной производить в ФБ ответственном за отправку СМС.
зы. или я куда-то не туда "поехал"?