Показано с 1 по 10 из 648

Тема: Создать функцию на ST

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь
    Регистрация
    19.01.2015
    Адрес
    Новосибирск
    Сообщений
    56

    По умолчанию

    Здравствуйте. Нужен фильтр скользящее средним окном Экспоненциальное (EMA). Входные данные 1 раз в секунду. ИИ выдал код, может нужно что-то поправить??
    Код:
    function_block EMAsek
        
    VAR_INPUT
        In  : REAL;    // Входной сигнал датчика
        Per : REAL;    // Период сглаживания в секундах (N >= 1)
        Res  : BOOL;    // Принудительный сброс/инициализация
    END_VAR
    
    VAR_OUTPUT
        Out : REAL;    // Сглаженный выходной сигнал
    END_VAR
    
    VAR
        fbTimer   : SYS.TON;    // Встроенный таймер для отсчета 1 секунды
        rAlpha    : REAL;    // Коэффициент альфа
        xInitDone : BOOL;    // Флаг первоначальной инициализации
    END_VAR
    
    // Ограничение периода сглаживания во избежание деления на 0
    IF Per < 1.0 THEN
        Per := 1.0;
    END_IF;
    
    // Расчет коэффициента альфа
    rAlpha := 2.0 / (Per + 1.0);
    
    // Первичная инициализация при старте ПЛК/прибора или по сбросу
    IF NOT xInitDone OR Res THEN
        Out := In;
        xInitDone := TRUE;
    END_IF;
    
    // Работа циклического таймера на 1 секунду
    fbTimer(I := NOT fbTimer.Q, T := T#1000ms);
    
    // Расчет фильтра строго в момент срабатывания таймера (раз в секунду)
    IF fbTimer.Q AND NOT Res THEN
        Out := (In * rAlpha) + (Out * (1.0 - rAlpha));
    END_IF;
    
    end_function_block

  2. #2
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,187

    По умолчанию

    Цитата Сообщение от zsm7 Посмотреть сообщение
    Здравствуйте. Нужен фильтр скользящее средним окном Экспоненциальное (EMA). Входные данные 1 раз в секунду. ИИ выдал код, может нужно что-то поправить??
    Не. Всё норм.


    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Не фильтрует он и среднее не считает, выдаёт каждую сек разные числа.
    С чего бы?

  3. #3

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    С чего бы?
    Проверил на живом ПЛК и модуле, он каждую секунду выдаёт разные значения, так как на входе значения прыгают, фильтр просто повторяет значения входа.
    Нет фильтрации и среднего.
    Последний раз редактировалось kondor3000; 29.05.2026 в 14:09.

  4. #4
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,187

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Проверил на живом ПЛК и модуле, он каждую секунду выдаёт разные значения, так как на входе значения прыгают, фильтр просто повторяет значения входа.
    Нет фильтрации и среднего.
    Нормальная там фильтрация. Что было понятно нужны наложенные графики входа/выхода
    А повторяет если Per = 1. Из формулы же видно. Ставьте например 5.
    У вас абсолютно такая же формула.

Похожие темы

  1. Ответов: 14
    Последнее сообщение: 01.07.2023, 21:30
  2. Ответов: 6
    Последнее сообщение: 22.12.2021, 10:50
  3. Ответов: 3
    Последнее сообщение: 13.09.2021, 13:31
  4. ПЛК160. Чем заменить функцию записи 0x05?
    от FallenDAY в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 26.08.2017, 13:19
  5. Как написать собственную функцию wait()
    от PavelKazakov в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 23.07.2009, 11:37

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

Ваши права

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