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

Тема: CFC last value

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

    По умолчанию

    И я того же мнения
    Захват-2.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП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
    Адрес
    Минск
    Сообщений
    3,841

    По умолчанию

    Цитата Сообщение от 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/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  4. #14
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,246

    По умолчанию

    Цитата Сообщение от 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 пропускать через модуль
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #15

    По умолчанию

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

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

    По умолчанию

    Цитата Сообщение от 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/ПетрАртюков
    Библиотека ГМ для СП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
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,246

    По умолчанию

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

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  9. #19

    По умолчанию

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

  10. #20
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,246

    По умолчанию

    сделайте чтоб он выполнялся каждые 100мс, сравните результат
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

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

Ваши права

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