Цитата Сообщение от 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