Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 31

Тема: CFC last value

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

    По умолчанию

    И я того же мнения
    Захват-2.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #12

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    И я того же мнения
    Захват-2.png
    Вроде и работает как надо, но периодически значение просидает или обнуляется. Сначала все в норме идет показывает значение с небольшой погрешностью, но иногда начинает выходить в 0 или показывать значение в несколько раз меньше чем было.
    3.jpg
    2.jpg
    1.jpg
    Последний раз редактировалось MrR; 24.07.2017 в 09:32.

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

    По умолчанию

    Цитата Сообщение от MrR Посмотреть сообщение
    Вроде и работает как надо, но периодически значение просидает или обнуляется. Сначала все в норме идет показывает значение с небольшой погрешностью, но иногда начинает выходить в 0 или показывать значение в несколько раз меньше чем было.
    3.jpg
    2.jpg
    1.jpg
    Скорей всего это из-за того, что числа REAL приблизительные, всего 7...8 точных знаков.
    А Вы используете для счетчика числа DINT, при преобразовании DINT_TO_REAL будет большая погрешность для больших чисел
    Попробуйте так
    1. Вот ФБ задержки для чисел DINT. Я его из FT_TN64 сделал, оскатовская библиотека больше не нужна
    Захват-2.png
    Код:
    FUNCTION_BLOCK Zad_DINT
    VAR_INPUT
        in : DINT;
        T : TIME;
    END_VAR
    VAR_OUTPUT
        out : DINT;
        trig: BOOL;
    END_VAR
    VAR
        length : INT := 64;
        X : ARRAY[0..63] OF DINT;
        cnt : INT;
        last : TIME;
        tx: TIME;
        init: BOOL;
    END_VAR
    (* read system time *)
    tx := TIME();
    
    trig := FALSE;
    IF NOT init THEN
        x[cnt] := in;
        init := TRUE;
        last := tx;
    ELSIF tx - last >= T / length THEN
        IF cnt = length - 1 THEN cnt := 0; ELSE cnt := cnt + 1; END_IF;
        Out := X[cnt];
        x[cnt] := in;
        last := tx;
        trig := TRUE;
    END_IF;
    2. Преобразовывать DINT_TO_REAL нужно после вычитания "старых" значений из "новых"
    Захват-1.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #14
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    Скорей всего это из-за того, что числа REAL приблизительные, всего 7...8 точных знаков.
    А Вы используете для счетчика числа DINT, при преобразовании DINT_TO_REAL будет большая погрешность для больших чисел
    Попробуйте так
    1. Вот ФБ задержки для чисел DINT. Я его из FT_TN64 сделал, оскатовская библиотека больше не нужна
    Захват-2.png
    Код:
    FUNCTION_BLOCK Zad_DINT
    VAR_INPUT
        in : DINT;
        T : TIME;
    END_VAR
    VAR_OUTPUT
        out : DINT;
        trig: BOOL;
    END_VAR
    VAR
        length : INT := 64;
        X : ARRAY[0..63] OF DINT;
        cnt : INT;
        last : TIME;
        tx: TIME;
        init: BOOL;
    END_VAR
    (* read system time *)
    tx := TIME();
    
    trig := FALSE;
    IF NOT init THEN
        x[cnt] := in;
        init := TRUE;
        last := tx;
    ELSIF tx - last >= T / length THEN
        IF cnt = length - 1 THEN cnt := 0; ELSE cnt := cnt + 1; END_IF;
        Out := X[cnt];
        x[cnt] := in;
        last := tx;
        trig := TRUE;
    END_IF;
    2. Преобразовывать DINT_TO_REAL нужно после вычитания "старых" значений из "новых"
    Захват-1.png
    а еще можно сделать одно внедрение из оскат и добавить в окно объявления VAR CONSTANT length : INT := 64; END_VAR, в обычном VAR убрать length и массив объявить как X : ARRAY[0..length] OF DINT; и в коде вместо условия cnt пропускать через модуль

  5. #15

    По умолчанию

    Значения прыгают, но меньше. Думаю может это как то связано с периодом опроса. Теперь значения проседают в пределах 220-270
    Последний раз редактировалось MrR; 24.07.2017 в 14:08.

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

    По умолчанию

    Цитата Сообщение от MrR Посмотреть сообщение
    Значения прыгают, но меньше. Думаю может это как то связано с периодом опроса. Теперь значения проседают в пределах 220-270
    Для этих значений
    FUNCTION_BLOCK Zad_DINT
    VAR_INPUT
    in : DINT;
    T : TIME;
    END_VAR
    VAR_OUTPUT
    out : DINT;
    trig: BOOL;
    END_VAR
    VAR
    length : INT := 64;
    X : ARRAY[0..63] OF DINT;
    период опроса 2000/64 = 31,25 мс
    Можно попробовать уменьшить дискретность выходного сигнала, например сделать
    length : INT := 200;
    X : ARRAY[0..199] OF DINT;
    период опроса станет 2000/200 = 10 мс
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  7. #17

    По умолчанию

    В итоге попробовал разные значения и остановился все таки на
    length : INT := 200;
    X : ARRAY[0..199] OF DINT;
    Но значения все равно в диапазоне изменяются. Решил просто это сгладить средним значением и поставил блок STATISTICS_REAL. Вывел наконец на блок PID. И он начал скакать, то выход минимум то максимум, хотя значение показывает +-2 или 3%.

  8. #18
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от MrR Посмотреть сообщение
    В итоге попробовал разные значения и остановился все таки на
    length : INT := 200;
    X : ARRAY[0..199] OF DINT;
    Но значения все равно в диапазоне изменяются. Решил просто это сгладить средним значением и поставил блок STATISTICS_REAL. Вывел наконец на блок PID. И он начал скакать, то выход минимум то максимум, хотя значение показывает +-2 или 3%.
    регулятор гоняете в каждом циклк или в отдельной задаче с большим периодом?

  9. #19

    По умолчанию

    Каждый цикл. Его лучше сделать через EN/ENO или я не правильно понимаю?

  10. #20
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    сделайте чтоб он выполнялся каждые 100мс, сравните результат

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Ваши права

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