Цитата Сообщение от Smith2007 Посмотреть сообщение
Такой же вопрос был
С авариями я поступил следующим образом:
Создал глобальный массив из структур. Каждая запись описывает одно событие. В структуре имеются:
флаг состояния, текстовое описание, уровень критичности, период повторения формирования сообщения о событии (ФБ TON), и еще несколько служебных полей.

Каждая программа при обнаружении выхода параметра за пределы нормы - выставляет флаг соответствующего события.
Отдельная программа (запускается так же по таймеру) при каждом входе проверяет одну строку глобального массива событий. Если флаг взведен - генерирует различные сигналы (в том числе устанавливает требование отправки СМС)
Код:
TYPE Alarm :
    STRUCT
        Alert:            BOOL;        
        Level:            BYTE;    
        mode:            INT;        
                                     
        t_idle:            TIME;    
        Msg:            STRING[255] :='';
        Count:            INT;         
        fTON:            TON;
    END_STRUCT
END_TYPE
Код:
VAR_GLOBAL
Control : ARRAY[1..11] OF Alarm :=    (Alert := FALSE, Level := 16#01, mode :=0, t_idle := T#24h, Count :=0 ),     (* 01 *)
                                        (Alert := FALSE, Level := 16#00, mode :=0, t_idle := T#10m, Count :=0 ),    (* 02 *)
                                        (Alert := FALSE, Level := 16#00, mode :=0, t_idle := T#10m, Count :=0 ),    (* 03 *)
                                        (Alert := FALSE, Level := 16#00, mode :=0, t_idle := T#10m, Count :=0 ),    (* 04 *)
                                        (Alert := FALSE, Level := 16#00, mode :=0, t_idle := T#20m, Count :=0 ),    (* 05 *)
                                        (Alert := FALSE, Level := 16#01, mode :=0, t_idle := T#10m, Count :=0 ),    (* 06 *)
                                        (Alert := FALSE, Level := 16#00, mode :=0, t_idle := T#10m, Count :=0 ),    (* 07 *)
                                        (Alert := FALSE, Level := 16#01, mode :=0, t_idle := T#10m, Count :=0 ),     (* 08 *)
                                        (Alert := FALSE, Level := 16#01, mode :=0, t_idle := T#30m, Count :=0 ),     (* 09 *)
                                        (Alert := FALSE, Level := 16#01, mode :=0, t_idle := T#30m, Count :=0 ),     (* 10 *)
                                        (Alert := FALSE, Level := 16#01, mode :=0, t_idle := T#3m, Count :=0 );     (* 11 *)
Вот это интересное решение. А не расскажите поподробнее,как вы это реализовали?