Вычисление скорость вращения по сигналам энкодера

Инженерное программное обеспечение
Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

Что-то не могу сообразить, как вычислить скорость вращения двигателя по сигналу энкодера.

Дано:
- разрешение энкодера 4096 имп./оборот,
- сигнал заведен в контроллер на скоростной вход и настроен на реверсивный квадратурный счет, который сбрасывается при получении сигнала нулевой метки,
- т.е. при вращении вперед счетчик считает от 0 до (4 * 4096) = 16 384 импульсов, делает полный оборот, наезжает на R-метку и опять сбрасывается в 0,
- при вращении в обратном направлении счетчик начинает вычитать сигналы и считает от 0 до -16384, наезжает на R-метку и опять сбрасывается в 0,
- причем, если двигатель вращался вперед и был в положении 4096, то после реверсирования будет изменять счет от 4096 до 0, наедет на R-метку и опять сбросится в 0,
- максимальная скорость вращения может достигать 1 об/сек (60 об/мин).

Найти:
- скорость вращения двигателя в об/сек.

Решение:
Вроде все очевидно: надо подсчитать разницу между двумя измерениями и зная период вычислить скорость. Для чего реализуем циклические прерывания с циклом 50 мс. В контроллере это выглядит так (Step7 v13, SCL):

Код: Выделить всё

ORGANIZATION_BLOCK "INT_N_PVO"
TITLE = INT_N_PVO - Прерывание для расчета скорости ПВО
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
//Расчет текущей скорости вращения ПВО
   VAR_TEMP 
      t_A_d : DInt;   // Количество импульсов ПВО за 50 мс
   END_VAR


BEGIN
	// Прерывание выполняется каждые 50 мс. Подсчитываем количество импульсов энкодера от энкодера HSC_BR1 (ID1016)
	// М1. Вращение оправки. Абсолютный счет.Датчик ЛИР-158Б-1-Н-004096-30-ПИ-5
	// Вычисляем разницу между текущим и прошлым значением положения в импульсах
	#t_A_d := ABS("BR1_d") - "C_PVO-1_d";
	// если разница отрицательная, значит начался новый оборот,
	//  к значению надо добавить количество импульсов за оборот (разрешение * 4)
	IF #t_A_d < 0 THEN
	    #t_A_d := #t_A_d + 16384;
	END_IF;
	
	// Вычисляем скорость вращения ПВО, об/сек
	// А - количество импульсов за период измерения
	// 50 мс - период измерения,
	// 16384 - количество импульсов энкодера за 1 оборот,
	//      A * 1000       A
	// N = ------------ = -----
	//      16384 * 50     810
	 
	"PVO_N_r" := DINT_TO_REAL(#t_A_d) / 810.0;
	
	// Cохраняем текщее значение счетчика в памяти
	"C_PVO-1_d" := ABS("BR1_d");
END_ORGANIZATION_BLOCK
Алгоритм считает хорошо, но только в установившемся режиме. При реверсе появляется на некоторое время скорость около 20 об/сек - т.е. неправильно организован счет при переходе через 0 и выскакивает цифра около (16384 / 810).

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение ward »

контроллер 1200?
Там же есть HSC

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение ward »

Заведи нулевую метку на частоту у скоростного счетчика и все, сам так буду делать, только у меня простой индуктивный датчик (100Гц)

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

ward писал(а):контроллер 1200?
да
ward писал(а):Там же есть HSC
Автоматизатор писал(а):- сигнал заведен в контроллер на скоростной вход и настроен на реверсивный квадратурный счет, который сбрасывается при получении сигнала нулевой метки,
Да
ward писал(а):Заведи нулевую метку на частоту у скоростного счетчика и все, сам так буду делать, только у меня простой индуктивный датчик (100Гц)
Энкодер уже заведен на 2 скоростных счетчика. Один отслеживает абсолютное положение вала (сбрасывается по нулевой метке), другой считает относительное перемещение (счетчик имеет программный сброс). Оба используются в программе. Нужно дополнительно получить скорость. Думаю, что можно алгоритм такой сделать.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

Попробую порассуждать:

Максимальная скорость вращения 60 об/мин., или 1 об/сек, или 16 384 имп./сек. Если период измерений 50 мс, то максимальное количество импульсов за период будет: Смакс = 16384 * 50 / 1000 = 819,2

Есть 3 варианта расчета:
1. Вращение в положительном направлении, сигнал на счетчике меняется от С1 = 400 до С2 = 800 импульсов, тогда приращение за 50 мс (0,05 сек) равно:
D = C2 - C1 = 800 - 400 = 400 имп.
тогда за 1 сек будет
D1 = D / t = 400 / 0,05 = 8 000 имп.
N = D1 / 16384 = 8 000 имп. / 16384 = 0,488 об/мин
2. Вращение в положительном направлении, сигнал на счетчике меняется от С1 = 16184 до С2 = 200 импульсов - при переходе через 0 счетчик сбрасывается, тогда приращение за 50 мс (0,05 сек) равно:
D = C2 - C1 = 200 - 16184 = -15984 имп. - отрицательная величина,
Для корректного счета надо добавить еще оборот (или 16 384 имп.)
D = D + 16384 = -15984 + 16384 = 400 имп.
тогда за 1 сек будет
D1 = D / t = 400 / 0,05 = 8 000 имп.
N = D1 / 16384 = 8 000 имп. / 16384 = 0,488 об/мин
3. Вращение в положительном направлении, сигнал на счетчике меняется от С1 = -200 до С2 = 200 импульсов - при переходе через 0 счетчик сбрасывается, переход появляется при реверсе, тогда приращение за 50 мс (0,05 сек) равно:
D = C2 - C1 = 200 - (-200) = 400 имп.
тогда за 1 сек будет
D1 = D / t = 400 / 0,05 = 8 000 имп.
N = D1 / 16384 = 8 000 имп. / 16384 = 0,488 об/мин

А может быть еще обратное вращение.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Михайло »

Надо просто фиксировать тот момент, когда счетчик ловит нулевую метку и сбрасывается. В этот момент надо восстанавливать то значение, которое было до сброса, то есть прибавлять 16384 или отнимать 16384. Естественно надо счет вести в отдельной ячейке памяти типа DINT. Если так сделать, то получим DINT-значение, которое не зависит от нулевой метки и тогда по этому DINT скорость рассчитать удобно. Я верно рассуждаю?

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение ward »

можно проще - сделай перемычку с нулевого провода на другой свободный счетчик

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

ward писал(а):можно проще - сделай перемычку с нулевого провода на другой свободный счетчик
Так не интересно.

В преобразователе частоты Yaskawa A1000, который управляет двигателем, есть параметр, который показывает счет от энкодера от 0 до 16384 (не скажу, что происходит при реверсе :( ). Т.е. инвертор как то считает всякое! А мы что, хуже?!

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение ward »

Не вижу смысла выносить себе мозг. Проще сделать как я написал- перемычка с провода нулевого положения. После тебя придут люди и увидя сие они тебя будут вспоминать нехорошими словами)

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

ward писал(а):Не вижу смысла выносить себе мозг.
Нам надо контролировать абсолютное положение вала двигателя - подключили счетчик (А-В) со сбросом по нулевой метке.
Нам надо контролировать относительное положение - подключили счетчик (/А-/В) с программным сбросом - на тот же энкодер (трудно было считать несколько оборотов подряд).
ward писал(а):Проще сделать как я написал- перемычка с провода нулевого положения.
Это уже будет третий счетчик на один энкодер :)
ward писал(а):осле тебя придут люди и увидя сие они тебя будут вспоминать нехорошими словами)
Это точно! :)

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

Уточненный алгоритм разработан. Завтра обкатаю и проверю. Покажу результат.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Михайло »

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

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

ward писал(а):Не вижу смысла выносить себе мозг. Проще сделать
Выносить не стоит, а тренировать надо. В учебно-познавательных целях получил следующий код:

Код: Выделить всё

// Прерывание выполняется каждые 50 мс. Подсчитываем количество импульсов энкодера от энкодера HSC_BR1 (ID1016)
// М1. Вращение оправки. Абсолютный счет.Датчик ЛИР-158Б-1-Н-004096-30-ПИ-5
 
// если нет перехода между 1 и четвертым квадрантом при реверсе
 IF (("C_PVO-1_d" >= 0) AND ("BR1_d" >= 0)) OR (("C_PVO-1_d" < 0) AND ("BR1_d" < 0)) THEN
     // если нет перехода через 0     
     IF ABS("BR1_d" - "C_PVO-1_d") <= 900 THEN // 900 - максимальная разница между положениями
         #t_A_d := ABS("BR1_d" - "C_PVO-1_d");
     ELSE
         #t_A_d := 16384 + ABS("BR1_d") - ABS("C_PVO-1_d");
     END_IF;
 ELSE
     #t_A_d := ABS("BR1_d" - "C_PVO-1_d");
 END_IF;

// Вычисляем скорость вращения ПВО, об/сек
// А - количество импульсов за период измерения
// 50 мс - период измерения,
// 16384 - количество импульсов энкодера за 1 оборот,
//      A * 1000        A
// N = ------------ = -------
//      16384 * 50     819.2
 
"PVO_N_r" := DINT_TO_REAL(#t_A_d) / 819.2;

// Cохраняем текщее значение счетчика в памяти
"C_PVO-1_d" := "BR1_d";
На практике решили брать скорость с преобразователя частоты по Profibus.

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение ward »

одно дело тренировка, друго - внедрение в реальный объект. Пожалей человека который будет потом разбиратся в этом

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

ward писал(а):Пожалей человека который будет потом разбиратся в этом
Стараюсь для него писать подробные комментарии, см. код выше, описание, формулы, иногда даже картинки.

Вы такое делаете, или просто код сплошняком?

ward
Специалист
Сообщения: 415
Зарегистрирован: 12 ноя 2012, 08:44

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение ward »

я столько не пишу, но делаю минимальные пояснения по которым можно разобраться

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

ward писал(а):делаю минимальные пояснения
Сейчас у нас процесс поставлен так:
- программист пишет программу,
- я проверяю,
- потом отдаем программу наладчику, наладчик изучает код, налаживает под нашем руководством работу механизмов в ручном режиме,
- потом совместно программист с наладчиком запускают все в автомате,
- потом передаем вместе с оборудованием программу заказчику.

В идеале все участники процесса должны понимать как что работает. Если комментарии скудные, нет толком картинок, и пр., то объяснять трудно и долго.

В последнее время склоняюсь к написанию самодокументирующихся программ. Т.е. я не спешу сразу писать код. А вначале пишу описание:
- ясное название функции,
- назначение функции,
- описание входных - выходных параметров,
- коды ошибок, которые могут возникать.
Имея такие спецификации, я могу отложить реализацию самой функции на время. И заняться другими кусками кода., которые тоже имеют описание интерфейсов и понятным образом выстраиваются все взаимодействия.

Для проверки математики использую Excel. Если все ячейки прокомментировать (а потом вставить в код в виде примечаний), то таблицей можно пользоваться не только при разработке, но и на более поздних этапах: отладки, ПНР и пр. В любой момент проверить расчеты. И все будет понятно. Если просто накидать циферки на экране, то через месяц уже и не помнишь, что считал.

Конечно, вроде времени в первый момент уходит больше. Но зато существенный выигрыш по итогам!

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Михайло »

У меня все практически наоборот. Вон, сегодня ходил на ПНР, стенд уже практически отлажен, а программа еще с кучей костылей. :D

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Автоматизатор »

Михайло писал(а):У меня все практически наоборот. Вон, сегодня ходил на ПНР, стенд уже практически отлажен, а программа еще с кучей костылей.
В чем "наоборот"? Так обычно и происходит. Задумки отличаются от реальности. В автоматическом режиме начинают вылазить всякие нюансы. Вот тут то и важно иметь правильное представление о работе отдельных функций без анализа деталей реализации. Если программа большая, с момента написания прошло много времени, то детали забываются. Поэтому важно знать принципы работы, которые можно описать в комментариях.

Например, работа преобразователя частоты может быть описана с помощью нескольких битовых сигналов (слово управления и слово состояния) и нескольких цифирек (текущая скорость, ток, код аварии). Аналогично можно описать интерфейс и работу функций. Тогда в процессе ПНР, в случае необходимости, будет легко вносить изменения в программу.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Вычисление скорость вращения по сигналам энкодера

Сообщение Михайло »

Автоматизатор писал(а):В чем "наоборот"?
В том, что в процессе проектирования все нюансы продумываются, потом забываются, так как ничего не записывается. Проходит время, приближается ПНР - пишется программа...

Ответить