ПР103 ). А про ОЛ не подумал
Вид для печати
Это экструдер. Скорость можно считать постоянной. Сложно раскачать экструдер что бы скорость скакала +- 5-6 см за минуту.
10 - 15 это было на вскидку. 77 - посчитано на Ваших глазах.
Нет обратной связи. Только импульсы с квадратурного энкодера + таймер в ПР. Скоростью рулит частотник который даже незнает про энкодер, да и не нужно ему это.
Расстояние я отмеряю с точностью 1 мм. ( 0,5 мм на 6 метрах сложно померить рулеткой) А вот скорость измеряю с точностью +- 5-6 см ! Хотя в теории - должен до +- 0,5 мм.
Но я понял проблему подсчета количества импульсов за дробную единицу времени.
Думаю надо идти по пути измерения времени между соседними фронтами. Я уже пробовал но забуксовал в обработке переменных типа TIME. Кривой алгоритм получился.
Точность нужна до 1 см/мин. мм/мин я отбрасываю.
Мне кажется, быстрый вход(ы) лучше сконфигурировать в режим счётчика импульсов, а не АВ энкодера, в смысле, использовать для этой функции оставшиеся(неиспользованные) быстрые входы тогда будет в 4 раза меньше импульсов, счётчик энкодера считает по фронту и спаду каждого из двух каналов, тогда и период следования импульсов(что нам важно) будет в 4 раза больше, соответственно и точность возрастёт!
В первом варианте так и делал. Потом решил попробовать привязаться к началу фронта... нечего не поменялось. Но причина понятна. Я теряю "полуимпульсы" которые накапливаются при пересчете в минуты. Если считать за минуту - точность должна быть приемлемой. Но минута на ожидание реальной скорости - не приемлемо ))
Завтра попробую через период посчитать. Нашел ошибку в алгоритме.
Такой вопрос : если к примеру разделить 1 секунду на 625 мс получится 1 мс или 1.6 мс ?
Самый точный, но тоже скачущий спидометр у меня получился так:
Вложение 85201
Чтобы не скакало использовал фильтр + сглаживаниеКод:function_block Freq
var_input
in : real; // Вход с текущим значением счётчика
end_var
var_output
F : real; // Частота или скорость
end_var
var
inOLD : real; // старое значение счётчика
tsOLD, ts : udint; // Фиксация системного таймера
end_var
ts := time_to_udint(get_time()); // Текущее значение системного таймера в мс
if ts - tsOLD >= 1000 then // ПР может проскочить 1000 мс период
F := (in - inOLD) / udint_to_real(ts - tsOLD); // Текущая разница за реальный период
tsOLD := ts; inOLD := in; // Фиксируем как предыдущие значения
end_if
end_function_block