Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 29

Тема: Обработка нештатных ситуаций

  1. #11
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,246

    По умолчанию

    Я то как раз понял, что Вы хотели сказать про внешний таймер, подобный метод далек от заданного вопроса, он (вопрос) может быть сделан в комп.языках пока невыполниться весь цикл дальше не идем,в плк такой подход не пройдет
    У меня тоже было желание ответить на все вопросы,кроме последнего, утвердительно, но надо сдерживать себя

  2. #12
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,290

    По умолчанию

    Цитата Сообщение от Sergey666 Посмотреть сообщение
    Валенок! Тут хлопцы не знают как проект загрузочный делать , а туда же "структуры" , "указатели" , вы уверены что товарищи само понятие "ФБ" трактуют адекватно?
    Летчиков сначала на кукурузнике летать учат , а вы сразу на истребитель 5 поколения подсадить хотите.
    Ну мне показалось-таки что этот чел - как раз летчик. Только летал на другом самолете, причем сложном, и не знает что в этой модели нужно перед взлетом еще некую кнопу нажать. Снимем шляпы, вспомним ярославский Локомотив (Одна из версий. Извините, если кого задело)
    Последний раз редактировалось Валенок; 23.09.2013 в 11:20.

  3. #13
    Пользователь
    Регистрация
    09.08.2013
    Адрес
    Башкортостан
    Сообщений
    234

    По умолчанию

    Вот примерно такое, но упаковать все в массив и не делать 100 линейных записей, а пройтись в цикле.
    Все параметризовано, а значит можно пустить в цикле.
    Не разобрал в примерах как создать массив структур и как к нему обращаться.


    TYPE Alarm :
    STRUCT
    Alert: BOOL := FALSE;
    mode: INT :=0;

    t_idle: TIME;
    CurrentValue: INT;
    CriticalMin: INT;
    CriticalMax: INT;
    MsgMin: STRING :='';
    MsgMax: STRING :='';
    fTON: TON;
    END_STRUCT
    END_TYPE

    ==================


    VAR
    i1,i2,i3,i4: INT := 0;
    T1: Alarm := (t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Minimum!!', MsgMax := 'Maxi!');
    T2: Alarm := (t_idle := T#10s, CriticalMin := 0, CriticalMax := 20000, MsgMin := 'miiiin!', MsgMax := 'maaaaax!');
    T3: Alarm := (t_idle := T#30s, CriticalMin := 5, CriticalMax := 25, MsgMin := 'Minimum!', MsgMax := 'Maximum!');
    T4: Alarm := (t_idle := T#25s, CriticalMin := -20000, CriticalMax := 1, MsgMin := '!', MsgMax := '!!!!!');
    sText : STRING := '';
    b : BOOL;
    END_VAR

    (* Для снижения нагрузки вместо прямого присваивания сделать указатели на контролируемые переменные*)
    T1.CurrentValue := i1;
    T2.CurrentValue := i2;
    T3.CurrentValue := i3;
    T4.CurrentValue := i4;

    (************* 1- **************)
    IF (T1.CurrentValue <= T1.CriticalMin) OR (T1.CurrentValue >= T1.CriticalMax) THEN
    T1.Alert := TRUE;
    ELSE
    T1.Alert := FALSE;
    END_IF;

    IF T1.Alert THEN
    CASE T1.mode OF
    0: T1.mode := 1;
    IF (T1.CurrentValue<= T1.CriticalMin) THEN sText := CONCAT(sText, T1.MsgMin ); END_IF;
    IF T1.CurrentValue >= T1.CriticalMax THEN sText := CONCAT(sText, T1.MsgMax ); END_IF;
    T1.fTON(IN := TRUE, PT := T1.t_idle);
    1: T1.fTON(IN := TRUE, PT := T1.t_idle);
    IF T1.fTON.Q THEN
    T1.fTON(IN := FALSE, PT := T1.t_idle);
    T1.mode := 0;
    END_IF;
    END_CASE
    ELSE
    T1.fTON(IN := FALSE, PT := T1.t_idle);
    T1.mode := 0;
    END_IF;

    (************* 2 **************)
    IF (T2.CurrentValue <= T2.CriticalMin) OR (T2.CurrentValue >= T2.CriticalMax) THEN
    T2.Alert := TRUE;
    ELSE
    T2.Alert := FALSE;
    END_IF;

    IF T2.Alert THEN
    CASE T2.mode OF
    0: T2.mode := 1;
    IF T2.CurrentValue <= T2.CriticalMin THEN sText := CONCAT(sText, T2.MsgMin ); END_IF;
    IF T2.CurrentValue >= T2.CriticalMax THEN sText := CONCAT(sText, T2.MsgMax ); END_IF;
    T2.fTON(IN := TRUE, PT := T2.t_idle);
    1: T2.fTON(IN := TRUE, PT := T2.t_idle);
    IF T2.fTON.Q THEN
    T2.fTON(IN := FALSE, PT := T2.t_idle);
    T2.mode := 0;
    END_IF;
    END_CASE
    ELSE
    T2.fTON(IN := FALSE, PT := T2.t_idle);
    T2.mode := 0;
    END_IF;

    (************* 3 **************)

    (************* 4 **************)

    IF LEN(sText) > 0 THEN
    ; (* вызов блока отправки смс с текстом sText *)
    sText := '';
    END_IF;


    2 Sergey666:
    В Вашем примере не перейдем к контролю Alm2 до тех пор пока не отработает Alm1 и т.д. Если я укажу время таймера пару часов, то все остальные параметры не будут контролироваться данным блоком.
    Вложения Вложения
    • Тип файла: pro Alert!.pro (33.6 Кб, Просмотров: 13)
    Последний раз редактировалось Smith2007; 24.09.2013 в 06:01. Причина: исправил ошибки

  4. #14
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,674

    По умолчанию

    (*
    2 Sergey666:
    В Вашем примере не перейдем к контролю Alm2 до тех пор пока не отработает Alm1 и т.д. Если я укажу время таймера пару часов, то все остальные параметры не будут контролироваться данным блоком.
    *)

    Данный пример разработан для поочередной индикации всех активных аварий . Какие еще пара часов!?

    "Выхватывание" или фиксация факта аварии необходимо не только для отображения , но и для отработки в процессе АСУ-ТП. Так-вот отображение в данном случае вторично , корректная отработка - первична .

  5. #15
    Пользователь
    Регистрация
    09.08.2013
    Адрес
    Башкортостан
    Сообщений
    234

    По умолчанию

    Не могу найти примера. Подскажите как правильно инициализировать массив из структур в секции объявления переменных. Пробую разные способы - ошибка.

  6. #16
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,674

    По умолчанию

    Сначала сделать структуру (вкладка Типы данных) и обозвать ее,напр My_struct.
    Потом массив объявляете Array_tipa_struct : Array[0..100]of My_struct;

  7. #17
    Пользователь
    Регистрация
    09.08.2013
    Адрес
    Башкортостан
    Сообщений
    234

    По умолчанию

    Структуру создал. Массив элементов типа структуры создал. Банально не получается инициализировать массив значениями в секции объявления переменных в программе alert

    TYPE Alarm :
    STRUCT
    Alert: BOOL := FALSE; (* FALSE - параметр в норме, TRUE - критическое значение параметра *)
    mode: INT :=0; (* 0 - инициализация таймера задежки, сборка текста СМС сообщения,
    1 - ожидание повторной отправки **** сброс mode = 0*)
    t_idle: TIME; (* период ожидания *)
    CurrentValue: INT; (* Текущее значение *)
    CriticalMin: INT; (* Предельное минимальное значение *)
    CriticalMax: INT; (* Предельное максимальное значение *)
    MsgMin: STRING :=''; (* Строка СМС *)
    MsgMax: STRING :=''; (* Строка СМС *)
    fTON: TON;
    END_STRUCT
    END_TYPE

    TYPE Control :
    STRUCT
    aControl: ARRAY [1..4] OF Alarm;
    END_STRUCT
    END_TYPE

    PROGRAM PLC_PRG
    VAR
    i1,i2,i3,i4: INT := 0;
    Param : Control := ((t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Недостижимо', MsgMax := 'Критическое значение!'));
    (*
    T1: Alarm := (t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Недостижимо', MsgMax := 'Критическое значение!'); (* Контролируем только максимум. Минимум заведомо недостижим *)
    T2: Alarm := (t_idle := T#10s, CriticalMin := 0, CriticalMax := 20000, MsgMin := 'Критически низкая температура!', MsgMax := 'Критически высокая температура!');
    T3: Alarm := (t_idle := T#30s, CriticalMin := 5, CriticalMax := 25, MsgMin := 'Minimum!', MsgMax := 'Maximum!');
    T4: Alarm := (t_idle := T#25s, CriticalMin := -20000, CriticalMax := 1, MsgMin := '!', MsgMax := 'Опасно!'); (* Возможно использовать с типами BOOL преобразованным к INT *)
    *)
    sText : STRING := '';
    sVar : STRING[255] := '';
    b : BOOL;
    count, event1, event2: INT := 0;
    END_VAR


    Выделил красным попытку инициализировать переменные структуры
    Последний раз редактировалось Smith2007; 24.09.2013 в 15:18.

  8. #18
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,290

    По умолчанию

    Param : Control := (aControl := (t_idle := T#20s, CriticalMin := -20000, CriticalMax := 50, MsgMin := 'Недостижимо', MsgMax := 'Критическое значение!'));

    Можно
    TYPE Control :
    STRUCT
    aControl: ARRAY [1..4] OF Alarm;
    END_STRUCT
    END_TYPE

    упростить до
    TYPE Control :
    ARRAY [1..4] OF Alarm;
    END_TYPE
    Тогда - красным, без лишней пары скоб
    Последний раз редактировалось Валенок; 24.09.2013 в 16:18.

  9. #19
    Пользователь
    Регистрация
    09.08.2013
    Адрес
    Башкортостан
    Сообщений
    234

    По умолчанию

    Спасибо за подсказку

    Получил чего хотел. Код маленький и понятный.

    TYPE Alarm :
    STRUCT
    Alert: 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) THEN
    T[i].Alert := TRUE;
    ELSE
    T[i].Alert := FALSE;
    END_IF;

    IF T[i].Alert THEN
    CASE T[i].mode OF
    0: 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
    ELSE
    T[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) можно инициализировать как глобальную переменную, составление строки возложить на программы контроля (по типам), а очистку переменной производить в ФБ ответственном за отправку СМС.


    зы. или я куда-то не туда "поехал"?
    Вложения Вложения
    Последний раз редактировалось Smith2007; 24.09.2013 в 18:10.

  10. #20
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,246

    По умолчанию

    http://www.owen.ru/forum/showthread....l=1#post119388
    Здесь посмотрите, как раз про разные типы

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Обработка исключений
    от const3 в разделе ПЛК1хх
    Ответов: 11
    Последнее сообщение: 26.06.2012, 06:43
  2. Ответов: 1
    Последнее сообщение: 19.05.2012, 11:21
  3. плк110+мв110 обработка данных
    от woffka в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 19.02.2010, 16:45

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •