Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 14 из 14

Тема: Блок обработки ошибок

  1. #11
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    2,072

    По умолчанию

    Если вам нужно записать ошибки от разных блоков в одну переменную, то можно сделать так. В одну целочисленную переменную можно записать до 32 ошибок
    Безымянный.png

  2. #12

    По умолчанию

    Цитата Сообщение от PAVGroup Посмотреть сообщение
    К примеру у меня есть 5 моих ФБ. 4 рабочие ФБ процесса. У которых выходные данные ErrorNum. К примеру = 1 (обрыв цепи).
    Вот значение этой переменной ErrorNum, должно улететь в 5й ФБ который будет обрабатывать ошибки. На вход у него подается ErrorNum, он обрабатывает. На выходе Error = true - Авария (этот сигнал потом остановит оборудование), ErrorNumIPP - передает номер ошибки на панель. Оператор это видит.
    Если будет остановка по событию, то Вам нужно фиксировать какой ФБ вызвал остановку и по какой ошибке.
    Примерно так:
    Код:
    function_block FixError
        
        var_input
            ErrorFromFB1, ErrorFromFB2, ErrorFromFB3, ErrorFromFB4 : udint; // Состояние ФБ
        end_var
        
        var_output 
            ErrorFB, ErrorCode : udint; // Кто? Чего?
        end_var
        
        if ErrorFromFB1 > 0 then
            ErrorCode := ErrorFromFB1; ErrorFb := 1;
        elsif ErrorFromFB2 > 0 then
            ErrorCode := ErrorFromFB2; ErrorFb := 2;
        elsif ErrorFromFB3 > 0 then
            ErrorCode := ErrorFromFB3; ErrorFb := 3;
        elsif ErrorFromFB4 > 0 then
            ErrorCode := ErrorFromFB4; ErrorFb := 4;
        else
            ErrorCode := 0; ErrorFb := 0;
        end_if    
    end_function_block

  3. #13

    По умолчанию

    Цитата Сообщение от EFrol Посмотреть сообщение
    Если будет остановка по событию, то Вам нужно фиксировать какой ФБ вызвал остановку и по какой ошибке.
    Примерно так:
    Код:
    function_block FixError
        
        var_input
            ErrorFromFB1, ErrorFromFB2, ErrorFromFB3, ErrorFromFB4 : udint; // Состояние ФБ
        end_var
        
        var_output 
            ErrorFB, ErrorCode : udint; // Кто? Чего?
        end_var
        
        if ErrorFromFB1 > 0 then
            ErrorCode := ErrorFromFB1; ErrorFb := 1;
        elsif ErrorFromFB2 > 0 then
            ErrorCode := ErrorFromFB2; ErrorFb := 2;
        elsif ErrorFromFB3 > 0 then
            ErrorCode := ErrorFromFB3; ErrorFb := 3;
        elsif ErrorFromFB4 > 0 then
            ErrorCode := ErrorFromFB4; ErrorFb := 4;
        else
            ErrorCode := 0; ErrorFb := 0;
        end_if    
    end_function_block
    Завтра буду на работе, попробую. Заранее спасибо.

  4. #14
    Пользователь
    Регистрация
    31.01.2019
    Адрес
    РФ/РБ
    Сообщений
    929

    По умолчанию

    Цитата Сообщение от PAVGroup Посмотреть сообщение
    Доброе время суток.
    Подскажите как можно правильно реализовать данной мероприятие? Работаю в основном с ПР100.
    В проектах, у меня есть много своих ФБ, которые по различным условиям, могут выдавать ошибки. Т.е., выходные данные из блоков это число. Число передается в переменную. А эта переменная должна пойти в ФБ, где будет обрабатываться. Т.е., остановит оборудование и по номеру ошибки на дисплеи выведет номер ошибки. Проблема в том, что одну и туже переменную нельзя же перезаписать. Как тогда быть то?
    Подскажите. Заранее спасибо.
    У меня другой метод, который я использую в разных контроллерах.

    "Выходные данные из блоков - это число" - это принцип программиста "С", "Pascal".
    В FBD/ST - могут возникать несколько ошибок одновременно.
    Поэтому, я использую для каждой ошибки - свой бит. Если у макроса FDB/ST блока - 3-4 ошибки - для каждой использую свой Out. Если больше- упаковываю в Word - но все равно - один бит - одна ошибка.
    Если есть вложение макросов - переупаковываю слова ошибок от каждого вложенного макроса, формируя выходные переменные Errors1, Errors2...

    ЗЫ. В итоге, на панели оператора, при нажатии на кнопку, например пуска транспортера выводится цепочка ошибок:
    "Транспортер 12: Ошибка - Запрет пуска, принимающий транспортер не включился"
    "Транспортер 11: Ошибка - Нет вращения"
    "Транспортер 11: Ошибка - Нет сигнала с датчика вращения SQ122, модуль А2 DI 131"

    ЗЫЫ. Такое управление аварийными ситуациями удобно и в самой программе. Например
    Код:
    function_block   
      vEnable:= jEnable AND jPrevRun AND NOT( eOnTimeout OR eConcurrence);
      oOn:= vEnable AND ((jAuto AND jAutoON) OR (NOT jAuto AND btnManuOn));
      tonOnTimeout(IN: oOn AND NOT iOn, PT:= 500ms);
      eOnTimeout:= tonOnTimeout.Q OR (eOnTimeout AND NOT jResetErr);
    end_function_block
    i - Input, j- Job, e - Error, o - Output, ton - TON, v - local Variable. btn, sw - BuTtoN, SWitch - не всегда использую, но иногда полезно в большом проекте, сократить имена переменных (бывает и iOn и btnOn и swOn в одном макросе).
    Последний раз редактировалось keysansa; 09.04.2026 в 21:12.
    В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. Быстродействие обработки сигналов.
    от FlameAtomicFox в разделе ПЛК2хх
    Ответов: 1
    Последнее сообщение: 03.02.2025, 06:51
  2. ПЛК для быстрой обработки аналоговых входов.
    от Вячеслав@ в разделе Подбор Оборудования
    Ответов: 15
    Последнее сообщение: 25.06.2019, 08:37
  3. Ошибка обработки рекурсивной формулы
    от Kruschens в разделе Среда программирования OWEN Logic
    Ответов: 3
    Последнее сообщение: 08.01.2018, 09:24
  4. Ответов: 6
    Последнее сообщение: 07.03.2012, 18:35
  5. Передача данных для обработки
    от Михаил Геннадьевич в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 17.06.2009, 15:26

Ваши права

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