Показано с 1 по 9 из 9

Тема: ФБ для диагностики и настройки

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию ФБ для диагностики и настройки

    Коллеги, добрый день!

    Прошу Вас подключиться к теме диагностики и инструментам настройки оборудования. Предлагаю ФБ для вычисления и индикации времени между двумя событиями в миллисекундах. Писал целевым образом для пневмоцилиндра, но, вероятно этот метод можно применить и для круговых осей - изготовить некое подобие энкодера.
    Для тестирования рекомендую записать программу в прибор и подключить к входам два датчика PNP или герконы.
    Уважаемых программистов попрошу оптимизировать код, если потребуется.
    Ожидаю продолжения темы, ведь диагностика упрощает жизнь и заказчику и исполнителю

    Миллисекундомер для пневмоцилиндра.owleСпасибо!

  2. #2

    По умолчанию

    Понеслась:
    Owen.jpg

  3. #3

    По умолчанию

    Цитата Сообщение от EFrol Посмотреть сообщение
    Понеслась:
    Owen.jpg
    Я в комментарии писал, что не обязательно, но применимо к пневмоцилиндру : если магнитное кольцо проскакивает датчик - при неточной настройке - для этого и огород и фильтр тут не помощник. На Ваше усмотрение.

  4. #4

    По умолчанию

    Вариант:
    Owen1.jpg
    Код:
    function_block tmrEvent
        
        var_input
            i1, i2 : bool;
        end_var
        
        var_output 
            tUp : real;
            tDown : real;
        end_var
        
        var 
            tsUp : udint;
            tsDown : udint;
            rt1 : SYS.RTRIG;
            ft1 : SYS.FTRIG;
            rt2 : SYS.RTRIG;
            ft2 : SYS.FTRIG;
        end_var
    
        rt1(I:=i1); ft1(I:=i1); rt2(I:=i2); ft2(I:=i2);
        if ft1.Q then tsUp := time_to_udint(get_time()); end_if                                 // Начало подъема
        if ft2.Q then tsDown := time_to_udint(get_time()); end_if                               // Начало спуска
        if rt2.Q then tUp := udint_to_real(time_to_udint(get_time()) - tsUp) / 1000; end_if     // Конец подъема
        if rt1.Q then tDown := udint_to_real(time_to_udint(get_time()) - tsDown) / 1000; end_if // Конец спуска
    
    end_function_block

  5. #5

    По умолчанию

    Ваш код красивый, и работает только с правильно настроенным датчиком. Мой же не допускает счёт при повторном срабатывании одного и того же датчика. Благодарю за отзыв!

  6. #6

    По умолчанию

    Тогда в чём суть диагностики? Фиксировать повторное срабатывание или не допускать счёт?

  7. #7

    По умолчанию

    Повторное срабатывание в моём случае НЕ допускает счёт. Цель диагностики настроить пневмопривод и при несоответствии времени хода эталону выдать сообщение или аварию. В Вашем случае можно будет зафиксировать проскок датчика, в моём нет, согласен. Только сравнивать надо целые числа, конечно.
    Ваш код намного короче, поэтому я и просил упростить задачку в первом сообщении.
    Последний раз редактировалось Рогов Алексей; 04.07.2025 в 12:15.

  8. #8

    По умолчанию

    Если я настрою фильтрацию дребезга, так что проскок будет не замечен, то счёт будет продолжаться бесконечно.
    Правильнее запускать таймер на определенное время и останавливать его когда цель достигнута.
    Ну а если таймер всё таки остановился по окончанию времени, а событие не произошло = это и есть авария.
    Однако это может быть случайная флуктуация (например, давление в пневмосистеме вдруг снизилось при переходе на другой компрессор),
    само событие я фиксирую в электронном журнале, но если датчик сработал позже процесс продолжаю без аварийной остановки.

    В зависимости от требуемой цели можно фиксировать таймаут:
    Owen2.jpg
    Последний раз редактировалось EFrol; 04.07.2025 в 13:12.

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

    По умолчанию

    Если сделать вот так, то контакты сколько угодно могут дребезжать

    Код:
    function_block tim_p // Контроль времени хода механизма
        
        var_input
            T1 : bool; // Датчик начального положения
            T2 : bool; // Датчик конечного положения
        end_var
        
        var_output 
            Q : udint; // Время хода в микросекундах
        end_var
        
        var 
            Tm : udint; // Время с подачи питания на реле
            fl : bool;   
            ft1 : SYS.FTRIG;
        end_var
        
        ft1(I := T1);
        
        if ft1.Q and not fl then
            Tm := time_to_udint(get_time());
            fl := true;
        end_if
        
        if T2 and fl then
            Q := time_to_udint(get_time()) - Tm;
            fl := false;
        end_if
        
        end_function_block
    А, еще, мне кажется, что корректнее было бы считать время между подачей сигнала и срабатыванием датчика, а не между срабатываниями обоих датчиков
    Последний раз редактировалось Dimensy; 04.07.2025 в 13:43.

Похожие темы

  1. Настройки СИ8
    от greatserg в разделе Эксплуатация
    Ответов: 0
    Последнее сообщение: 14.10.2021, 10:51
  2. Настройки ПЧВ
    от Эдуард_Н в разделе Приводная техника ОВЕН
    Ответов: 15
    Последнее сообщение: 08.07.2020, 14:17
  3. Совместимость ОВЕН ЕКОН134 и с системой диагностики AMS Suite
    от Vasily777 в разделе Подбор Оборудования
    Ответов: 1
    Последнее сообщение: 20.04.2016, 10:14
  4. ПЛК-150 не применяются настройки
    от Телепузики в разделе ПЛК1хх
    Ответов: 19
    Последнее сообщение: 21.11.2014, 11:42

Ваши права

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