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

Тема: пр 103 суммировать время между событиями

  1. #1

    По умолчанию пр 103 суммировать время между событиями

    Помогите пожалуйста реализовать два похожих сценария:
    1. на вход AI1 приходит дискретный сигнал. Через некоторое время t1, выставляемое в программе, например 2 секунды происходит какое то событие, например активируется триггер1 для дальнейшей логики, или Q1. C этим все понятно, есть блок с задержкой. Через некоторое время t2, которое задается внешним реле времени, после AI1, приходит сигнал на AI2. Нужно активировать событие, например триггер2 или Q2 через время равное t1 + t2. Как посчитать разницу во времени между событиями и сделать такую задержку, фикс t1 + посчитанное t2?
    2. похожая ситуация. на вход AI1 приходит дискретный сигнал. Одновременно с этим (ну почти одновременно, может быть не в этом цикле, т.к. сигнал от другого реле, время срабатывания контактов может быть разным) приходит сигнал на AI2 длительностью t2 и пропадает потом. Нужно после первого сигнала с фиксированной задержкой t1 активировать триггер, а c задержкой t3 = t1 + t2 активировать другое событие, триггер2 например.


    разница в сценариях в том, что в первом случае длительность задержки определяется фикс + задержка от реле времени, а во втором фикс + длительность самого сигнала.
    Все сигналы дискретные, AI только потому что DI и FDI уже заняты другой логикой, уточнил тип входа на всякий случай если это важно.
    Последний раз редактировалось kapithan; 10.09.2025 в 10:45.

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

    По умолчанию

    Вот здесь измеряли время между двумя событиями
    https://owen.ru/forum/showthread.php?t=41573

  3. #3

    По умолчанию

    Так что-ли?
    Код:
    function_block Fun
        
        var_input
            ai1, ai2 : bool;
            t1 : udint;
        end_var
        
        var_output 
            Q1, Q2 : bool;
        end_var
        
        var 
            event1, event2 : bool;
            ts1, ts2 : udint;
            rt1, rt2 : SYS.RTRIG;
            tQ1, tQ2 : SYS.TON;
        end_var
        
        rt1(I:=ai1);   // Ловим фронт ai1
        if rt1.Q then
            event1 := true;                     // Фиксируем событие ..                        
            ts1 := time_to_udint(get_time());    // и время ai1
        end_if
        rt2(I:=ai2);    // Ловим фронт ai2
        if rt2.Q then
            event2 := true;                     // Фиксируем событие ..
            ts2 := time_to_udint(get_time());   // и время ai2
        end_if
    
        if tQ2.Q then   // После выдачи сигнала Q2 все сбрасываем и начинаем сначала
            event1 := false; event2 := false;
        end_if
    
        tQ1(I:=event1, T := udint_to_time(t1), Q=>Q1);
        tQ2(I:=event2, T := udint_to_time(t1 + ts2 - ts1), Q=>Q2);
        
    end_function_block
    Код:
    function_block Fun2
        
        var_input
            ai1, ai2 : bool;
            t1 : udint;
        end_var
        
        var_output 
            Q1, Q2 : bool;
        end_var
        
        var 
            event1, event2 : bool;
            ts1, ts2 : udint;
            rt1, rt2 : SYS.RTRIG;
            ft2 : SYS.FTRIG;
            tQ1, tQ2 : SYS.TON;
        end_var
        
        rt1(I:=ai1);   // Ловим фронт ai1
        if rt1.Q then
            event1 := true;                     // Фиксируем событие ..                        
        end_if
        rt2(I:=ai2); ft2(I:=ai2);   // Ловим фронт и спад ai2
        if rt2.Q then
            ts1 := time_to_udint(get_time());   // Фиксируем время прихода фронта ai2
        end_if
        if ft2.Q then
            event2 := true;                     // Фиксируем событие ..
            ts2 := time_to_udint(get_time());   // и время прихода спада ai2
        end_if
    
        if tQ2.Q then   // После выдачи сигнала Q2 все сбрасываем и начинаем сначала
            event1 := false; event2 := false;
        end_if
    
        tQ1(I:=event1, T := udint_to_time(t1), Q=>Q1);
        tQ2(I:=event2, T := udint_to_time(t1 + ts2 - ts1), Q=>Q2);
        
    end_function_block
    Последний раз редактировалось EFrol; 10.09.2025 в 13:13.

Похожие темы

  1. Ответов: 5
    Последнее сообщение: 23.11.2025, 22:56
  2. Время между импульсами
    от IgorT1 в разделе Помощь Разработчикам
    Ответов: 1
    Последнее сообщение: 19.05.2025, 10:00
  3. Работа с аварийными событиями
    от ASo в разделе Master SCADA 3
    Ответов: 10
    Последнее сообщение: 11.05.2012, 15:30
  4. проблема с системными событиями
    от ezl68 в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 18.11.2010, 00:21
  5. Ответов: 21
    Последнее сообщение: 03.03.2009, 16:27

Ваши права

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