Страница 511 из 1044 ПерваяПервая ... 114114615015095105115125135215616111011 ... ПоследняяПоследняя
Показано с 5,101 по 5,110 из 10436

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #5101

    По умолчанию

    Может стоит с временем фильтрации поиграться.

  2. #5102

    По умолчанию

    Спасибо за совет, уменьшение времени существенно помогло, но не до конца, раз-два в минуту считает один лишний импульс.

  3. #5103
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от ОксанаН Посмотреть сообщение
    Добрый день! Мой первый проект в CodeSys, помогите пожалуйста решить проблему.
    Необходимо считать скорость вращения колеса. Один оборот - один импульс.
    ПЛК 150 U-M, прошивка 2.10.8, таргет 2.10, все настройки по умолчанию.
    Пробую два алгоритма: считать время между импульсами и количество импульсов за промежуток времени.
    До 10Гц количество импульсов считает стабильно, после 12 начинает пропускать.


    TRIG1 (CLK:= D_IN1); (*ловим передний фронт сигнала*)

    IF TRIG1.Q THEN Y:=Y+1;
    END_IF

    TON1(IN:=NOT TON1.Q,PT:=T#2s);
    IF TON1.Q THEN
    KOL_OB:=Y;
    Y:=0;
    END_IF
    Почему время у таймера 2s? Ведь по условию "Один оборот - один импульс".

    Вариант
    Код:
    VAR
    	TRIG1: R_TRIG;
    	D_IN1: BOOL;
    	INT1: INT;
    	old: TIME;
    	new: TIME;
    	Period: TIME;
    	Kol_v_Sec: REAL;
    END_VAR
    
    TRIG1 (CLK:= D_IN1); (*ловим передний фронт сигнала*)
    CASE INT1 OF
    0:	IF TRIG1.Q THEN
    	old:=TIME();
    	INT1:=1;
    	END_IF;
    1:	IF TRIG1.Q THEN
    	new:=TIME();
    	Period:= new - old;
    	Kol_v_Sec:=1000/TIME_TO_REAL(Period);
    	INT1:=0;
    	END_IF;
    END_CASE
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #5104

    По умолчанию

    Спасибо за ответ. Да такой вариант был бы лучше, но у меня не получается получить стабильный период, уже при 10 Гц время между импульсами скачет от 84ms до 114. Попробовала ваш вариант, такая же картина. При подсчёте импульсов за период, картина более стабильная, но пока тоже недостаточно.

  5. #5105
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от ОксанаН Посмотреть сообщение
    Спасибо за ответ. Да такой вариант был бы лучше, но у меня не получается получить стабильный период, уже при 10 Гц время между импульсами скачет от 84ms до 114. Попробовала ваш вариант, такая же картина. При подсчёте импульсов за период, картина более стабильная, но пока тоже недостаточно.
    Можно попробовать ФБ FREQ_MEASURE
    Вложение 25532
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #5106

    По умолчанию

    Цитата Сообщение от ОксанаН Посмотреть сообщение
    Спасибо за ответ. Да такой вариант был бы лучше, но у меня не получается получить стабильный период, уже при 10 Гц время между импульсами скачет от 84ms до 114. Попробовала ваш вариант, такая же картина. При подсчёте импульсов за период, картина более стабильная, но пока тоже недостаточно.
    А каков "период стабильности нужен"? Иначе говоря: "если скорость вращения изменилась, то через какое время усреднённое значение должно совпасть с новой скоростью"?

    Попробуйте экспоненциальное сглаживание

    В простейшем слуаче -- просто скопируйте как в том проекте-примере.
    В основном цикле просто подсчёт импульсов, а во вспомогательной программе -- усреднение.

    Как часто запускать программу и какой "усредняющий" интервал ставить -- зависит от конкретной задачи.

  7. #5107

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Можно попробовать ФБ FREQ_MEASURE
    Вложение 25532
    Да, freq_measure тоже обсуждали и при его использовании нужно справку хорошенько смотреть. Например при "periods=1 этот блок вырождается в простое 1/время_между_импульсами". Или то, что максимальное значение periods равно 10, т.е. больше чем по 10 импульсам усреднять уже невозможно и т.п.

  8. #5108

    По умолчанию

    Спасибо, сейчас попробую разобраться. "Период стабильности" должен быть не более 2-х секунд, в идеале 1.

  9. #5109

    По умолчанию

    Добрый день. Подскажите, как (на CFC) реализовать принудительный сброс булевой переменной в false раз в минуту.

  10. #5110

    По умолчанию

    Цитата Сообщение от ОксанаН Посмотреть сообщение
    Спасибо, сейчас попробую разобраться. "Период стабильности" должен быть не более 2-х секунд, в идеале 1.
    Если так часто, то можно попробовать сглаживать каждый интервал.

    Т.е.
    Код:
    Period := new-old; (* т.е. время, прошедшее с прошлого раза, в миллисекундах *)
    a := 1.0 - EXP(-Period / 200.0);  (* тут 200.0 мс это как раз период усреднения -- его можно менять *)
    avg_period := a*Period + (1.0-a)*avg_period; (* тут накапливается усреднение *)
    
    rate := 1000/avg_period; (* что выводить в случае "деления на ноль" предлагаю рассмотреть отдельно *)
    Вот пример, как оно может выглядеть: https://docs.google.com/spreadsheets...it?usp=sharing
    Видно, что при увеличении константы результат сглаживания меняется более плавно, но медленнее.

    Если характерная частота -- 5-20Гц, то, судя по графику, значение 200 должно неплохо работать. За секунду-полторы оно "выходит на режим", и потом несильно колбасится.

Страница 511 из 1044 ПерваяПервая ... 114114615015095105115125135215616111011 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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