И я того же мнения
Вложение 32171
Вид для печати
И я того же мнения
Вложение 32171
Вроде и работает как надо, но периодически значение просидает или обнуляется. Сначала все в норме идет показывает значение с небольшой погрешностью, но иногда начинает выходить в 0 или показывать значение в несколько раз меньше чем было.
Вложение 32198
Вложение 32199
Вложение 32200
Скорей всего это из-за того, что числа REAL приблизительные, всего 7...8 точных знаков.
А Вы используете для счетчика числа DINT, при преобразовании DINT_TO_REAL будет большая погрешность для больших чисел
Попробуйте так
1. Вот ФБ задержки для чисел DINT. Я его из FT_TN64 сделал, оскатовская библиотека больше не нужна
Вложение 32208
2. Преобразовывать DINT_TO_REAL нужно после вычитания "старых" значений из "новых"Код: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;
Вложение 32209
Значения прыгают, но меньше. Думаю может это как то связано с периодом опроса. Теперь значения проседают в пределах 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 мс
В итоге попробовал разные значения и остановился все таки на
length : INT := 200;
X : ARRAY[0..199] OF DINT;
Но значения все равно в диапазоне изменяются. Решил просто это сгладить средним значением и поставил блок STATISTICS_REAL. Вывел наконец на блок PID. И он начал скакать, то выход минимум то максимум, хотя значение показывает +-2 или 3%.
Каждый цикл. Его лучше сделать через EN/ENO или я не правильно понимаю?
сделайте чтоб он выполнялся каждые 100мс, сравните результат