Страница 5 из 5 ПерваяПервая ... 345
Показано с 41 по 46 из 46

Тема: Обработка сигнала датчика продукта на дискретный вход ПР

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

    По умолчанию

    У меня как-то так получилось и даже, вроде, работает
    Код:
    function_block Impuls 
    
        var_input //объявление входных переменных
           U : bool; 
           Delay : udint; //Длительность задержки импульса, мс
           Imp : udint; //Длительность выходного импульса, мс
        end_var
    
        var_output //объявление выходных переменных
           Q : bool; 
        end_var
    
        var //объявление локальных переменных
           CurTime : udint; 
           RTrig : SYS.RTRIG;
           TOF : SYS.TOF;
           MasDel : array[0..9] of udint;
           MasImp : array[0..9] of bool; 
           nWrite, nRead : udint := 0;
           flag : bool;
        end_var
    
        TOF.T := udint_to_time(Imp);
        CurTime := time_to_udint(get_time());
        RTrig(I := U);
        if RTrig.Q then
            MasDel[nWrite] := CurTime + Delay;
            MasImp[nWrite] := true;
            nWrite := (nWrite + 1) mod 10;
        end_if
        flag := MasImp[nRead] and CurTime >= MasDel[nRead];
        if flag then
            MasImp[nRead] := false;
            nRead := (nRead + 1) mod 10;
        end_if
        TOF(I := flag, Q => Q);
    
    end_function_block

  2. #42

    По умолчанию

    Спасибо, всем сочуствующим, буду пробовать

  3. #43

    По умолчанию

    Цитата Сообщение от FPavel Посмотреть сообщение
    Код:
    A: array [0..999] of bool;  // буфер на 1000 * 10 мс = 10 с
    InIndx: udint;
    OutIndx: udint;
    
    if CLK then // если на тактовом входе true - выполнить пересчёт
      A[InIndx] := In;
      OutIndx := InIndx + 123;  // 123 * 10 ms = 1 s 23 ms - задержка при такте 10 ms
      if OutIndx > 999 then
        OutIndx := OutIndx - 1000; //минус длина массива
      end_if
      Out := A[OutIndx];  // значение выхода
      InIndx := InIndx + 1;
      if InIndx > 999 then
        InIndx := InIndx - 1000; //минус длина массива
      end_if
    end_if
    На вход CLK подать выход связки BLINK+RTrig с полным периодом 10 мс (5+5 мс).
    В этом примере длительность выходного импульса равна 5 мс. А можно ли ее задавать?
    Время не корректно выадерживает. МОжет связано с BLINKom
    Последний раз редактировалось Антон_Б; 17.01.2025 в 12:34.

  4. #44

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    У меня как-то так получилось и даже, вроде, работает
    Код:
    function_block Impuls 
    
        var_input //объявление входных переменных
           U : bool; 
           Delay : udint; //Длительность задержки импульса, мс
           Imp : udint; //Длительность выходного импульса, мс
        end_var
    
        var_output //объявление выходных переменных
           Q : bool; 
        end_var
    
        var //объявление локальных переменных
           CurTime : udint; 
           RTrig : SYS.RTRIG;
           TOF : SYS.TOF;
           MasDel : array[0..9] of udint;
           MasImp : array[0..9] of bool; 
           nWrite, nRead : udint := 0;
           flag : bool;
        end_var
    
        TOF.T := udint_to_time(Imp);
        CurTime := time_to_udint(get_time());
        RTrig(I := U);
        if RTrig.Q then
            MasDel[nWrite] := CurTime + Delay;
            MasImp[nWrite] := true;
            nWrite := (nWrite + 1) mod 10;
        end_if
        flag := MasImp[nRead] and CurTime >= MasDel[nRead];
        if flag then
            MasImp[nRead] := false;
            nRead := (nRead + 1) mod 10;
        end_if
        TOF(I := flag, Q => Q);
    
    end_function_block
    ГОДНЫЙ ВАРИАНТ, ТО ЧТО НУЖНО, СПАСИБО ЗА ПОМОЩЬ

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

    По умолчанию

    Цитата Сообщение от Антон_Б Посмотреть сообщение
    ГОДНЫЙ ВАРИАНТ, ТО ЧТО НУЖНО, СПАСИБО ЗА ПОМОЩЬ
    Упустил нюанс с переполнением. От греха подальше, лучше поправить две строчки
    Код:
    function_block Impuls 
    
        var_input //объявление входных переменных
           U : bool; 
           Delay : udint; //Длительность задержки импульса, мс
           Imp : udint; //Длительность выходного импульса, мс
        end_var
    
        var_output //объявление выходных переменных
           Q : bool; 
        end_var
    
        var //объявление локальных переменных
           CurTime : udint; 
           RTrig : SYS.RTRIG;
           TOF : SYS.TOF;
           MasDel : array[0..9] of udint;
           MasImp : array[0..9] of bool; 
           nWrite, nRead : udint := 0;
           flag : bool;
        end_var
    
        TOF.T := udint_to_time(Imp);
        CurTime := time_to_udint(get_time());
        RTrig(I := U);
        if RTrig.Q then
            MasDel[nWrite] := CurTime;
            MasImp[nWrite] := true;
            nWrite := (nWrite + 1) mod 10;
        end_if
        flag := MasImp[nRead] and CurTime - MasDel[nRead] >= Delay;
        if flag then
            MasImp[nRead] := false;
            nRead := (nRead + 1) mod 10;
        end_if
        TOF(I := flag, Q => Q);
    
    end_function_block

  6. #46

    По умолчанию

    Цитата Сообщение от Антон_Б Посмотреть сообщение
    В этом примере длительность выходного импульса равна 5 мс. А можно ли ее задавать?
    Время не корректно выадерживает. МОжет связано с BLINKom
    Странно, вроде бы, выдерживает

    Код:
    function_block Delay
    
        var_input
           In: bool;
           Clk: bool;
        end_var
    
        var_output
            Out: bool;
        end_var
    
        var
            A: array [0..999] of bool;  // буфер на 1000 * 10 мс = 10 с
            InIndx: udint;
            OutIndx: udint;
        end_var
    
    if CLK then // если на тактовом входе true - выполнить пересчёт
      A[InIndx] := In;
      OutIndx := InIndx + 123;  // 123 * 10 ms = 1 s 23 ms - задержка при такте 10 ms
      if OutIndx > 999 then
        OutIndx := OutIndx - 1000; //минус длина массива
      end_if
      Out := A[OutIndx];  // значение выхода
      InIndx := InIndx + 1;
      if InIndx > 999 then
        InIndx := InIndx - 1000; //минус длина массива
      end_if
    end_if
    end_function_block
    delay.PNG

    Ничего не менял в коде...

    По хорошему, BLINK и RTrig реализовать бы на ST, но хотел принцип реализации задержки показать.

Страница 5 из 5 ПерваяПервая ... 345

Похожие темы

  1. Ответов: 2
    Последнее сообщение: 22.09.2024, 12:38
  2. Дискретный вход ТРМ-10
    от Алексей Дмитриев в разделе Эксплуатация
    Ответов: 29
    Последнее сообщение: 14.04.2022, 14:36
  3. Ответов: 1
    Последнее сообщение: 30.01.2019, 14:47
  4. Ответов: 5
    Последнее сообщение: 11.04.2016, 14:55
  5. частота сигнала на дискретный вход
    от Gerkules в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 06.05.2009, 07:09

Ваши права

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