Дано:
- разрешение энкодера 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