Страница 1 из 7 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 67

Тема: Расчет подключаемого энкодера

  1. #1

    По умолчанию Расчет подключаемого энкодера

    Всем добрый день.

    Знаю, что тема энкодеров и продукции Овен поднималась ни раз, и перед тем как задать вопрос, пару дней перечитывал форум.

    Задача состоит в измерении позиции объекта, посредством подсчета импульсов с энкодера.
    Для работы на станке выбран ПЛК110-60[М02]. К нему подключен инкрементный энкодер 2000 им/об. Ожидается, что данная связка обеспечит корректный подсчет перемещения объекта при вращении энкодера со скоростью до 5 об/сек. Расчет велся сходя из следующих соображений.

    5 об/сек*2000 им/об=10 000 им/сек. То есть получается всего 10 кГц, с чем ПЛК110[M02] должен легко справляться.
    Длительность одного периода сигнала получается 100 мкс.

    В онлайн курсе по работе с новым ПЛК110 (http://www.owen.ru/uploads/chast_10.html) предлагается анализировать состояние быстрых входов по внутреннему таймеру 20мкс, таким образом на каждый период сигнала энкодера должно приходиться 5 измерений состояния входов. Чего как я понимаю более чем достаточно, чтобы не терять количество импульсы.
    Нажмите на изображение для увеличения. 

Название:	Подсчет сигналов энкодера.jpg 
Просмотров:	876 
Размер:	106.4 Кб 
ID:	23231

    На практике не всё так красиво, как на бумаге.
    Сделан тестовый проект для проверки корректности счета (в приложении).

    Смысл его в следующем. На энкодере ставится метка между корпусом и валом. Они сводятся вместе. Данная позиция принимается нулевой. На визуализации проекта значения энкодера обнуляются.
    Далее вращаем энкодер n-ое количество раз. На станке пробег объекта от одной конечной точки до другой будет в несколько десятков оборота энкодера. Далее мы снова сводим метки вала и корпуса. В индикаторе "Позиция" должно отобразиться "0", в индикаторе "Кол-во оборотов" соответственно сколько раз мы крутанули энкодер в прямом направлении. Если в "Позиции" значения отличаются от нулевого (с учетом погрешности, конечно, так как при таком разрешении энкодера точно свести две метки тяжело) значит ПЛК потерял часть импульсов.

    Так вот. Энкодер на станок пока не устанавливал, кручу его руками. И если честно, сомневаюсь что делаю это быстрее чем 5 об/сек. Но после двадцати оборотов, при сведении меток получаю значение около 1500, то есть расхождение на четверть оборота энкодера.

    Отсюда вопрос к бывалым и опытным товарищам.
    Может при выборе энкодера допущена ошибка? Или в проекте есть какой-то подводный камень, который я упускаю?

    Поделитесь своим мнением пожалуйста.
    Вложения Вложения

  2. #2
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    У Васв цикле обрабатывается значение энкодера.
    Программа не правильная.
    примерно так
    Вложения Вложения

  3. #3

    По умолчанию

    не обрабатывается, а формируется.
    В вашем примере реализован счетчик, в моем энкодер, так как объект может двигаться как вперед, так и назад. К тому же я не увидел принципиального отличия наших обработчиков. Как и у вас, у меня используется чтение быстрых входов через функцию SysPortIn(0). Только вы анализируете весь получаемый байт, а я отдельно два первых бита, чтобы понять, в плюс идет текущий импульс или в минус. Или всё дело в количестве операций в прерывании?

  4. #4

    По умолчанию

    Когда вы пальцами крутите вал энкодера, то, возможно, вращение в основном направлении сопровождаются не большими откатами в обратном направлении. Возможно программа не корректно отрабатывает смену направления вращения вала, что и приводит к появлению ошибки.

  5. #5
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    когда дали инженерный образец ПЛК 110, то
    крутил сервопривод, с обратной связью,
    для проверки работы счетчика
    все работало правильно.
    Вот такие не хитрые програмки писал
    Вложения Вложения

  6. #6

    По умолчанию

    Цитата Сообщение от Вольд Посмотреть сообщение
    Когда вы пальцами крутите вал энкодера, то, возможно, вращение в основном направлении сопровождаются не большими откатами в обратном направлении. Возможно программа не корректно отрабатывает смену направления вращения вала, что и приводит к появлению ошибки.
    Обратите внимание на обработчик прерывания.

    Обработчик прерывания 20 мкс:

    Код:
    in:=SysPortIn(0);
    IF in.0<>Old_in THEN
    	IF in.0=TRUE THEN
    		IF in.1=TRUE THEN
    			Enc:=Enc+1;
    		ELSE
    			Enc:=Enc-1;
    		END_IF;
    	END_IF;
    END_IF;
    
    Old_in:=in.0;
    
    IF (Enc=Razr_Enc) THEN
    	Enc:=0; (*Переход через ноль в прямом направлении*)
    	Oborot:=Oborot+1;
    END_IF;
    
    IF Enc=INT_TO_DWORD(-1) THEN
    	Enc:=Razr_Enc-1; (*Переход через ноль в обратном направлении*)
    	Oborot:=Oborot-1;
    END_IF;
    
    IF Sbros THEN
    	Enc:=0;
    	Oborot:=0;
    END_IF;


    Счет импульсов реализован как в прямом, так и в обратном направлении. То есть небольшие откаты должны учитываться при подсчете.
    Последний раз редактировалось AlekseyK; 19.03.2016 в 15:29.

  7. #7

    По умолчанию

    Кажется нашел решение своей проблемы. При объявлении скоростных входов как "Fast encoder" позиция энкодера не теряется.

    С моим разрешением энкодера (2000 имп/об) можно делать до 32 оборотов в одном направлении, не переполняя регистр энкодера. Если в одну сторону крутить его максимально быстро, а в обратную медленно, то в первом случае (при объявлении быстрых входов как "direct control") появлялась ошибка, так как в прямом направлении происходила потеря импульсов. И при сведении метки на валу подсчитанное положение отличалось от нуля.

    Если же мы берем объявление как "Fast encoder", то импульсы не теряются. Но появляются две другие проблемы. На 33-м обороте будет переполнение регистра энкодера и как следствие потеря позиции объекта. То есть необходимо увеличить разрядность регистра энкодера до 32бит.

    Для этого выполняем следующий код:
    Код:
    IF ((Old_enc-Enc) > 25000) OR ((Enc-Old_Enc) > 25000) THEN (*Резкое изменение значение регистра означает переполнение в плюс или минус*)
    	IF (Enc < Old_Enc) THEN                                                 (*Enc - значение регистра "Fast Encoder"*)
    		Kol_Oborotov:=Kol_Oborotov+1;
    	ELSE
    		Kol_Oborotov:=Kol_Oborotov-1;
    	END_IF;
    END_IF;
    
    Enc32:=Kol_Oborotov*65535+Enc;                                     (*Enc32 - положение энкодера в DWORD*)
    Old_Enc:=Enc;
    Вторая проблема в том, что нельзя задать разрешение подключенного энкодера (в старом ПЛК110 это опция присутствовала), в новом счет идет жестко от 0 до 65535. Но она опять же решается, если по переменной Enc32 сделать операцию MOD 2000 - получим угловую позицию энкодера 2000 имп/об без ограничения на 32 оборота.

    Код можно размещать в основном цикле программы, так как сравниваются значения регистра энкодера на предыдущем цикле и на текущем. Все промежуточные значения всё равно не могут быть обработаны из-за длины цикла программы. Если хотим чтобы ПЛК максимально часто "присматривался" к позиции энкодера, то размещаем код в прерывание 20 мкс. Анализировать позицию (и реагировать на нее) быстрее чем там, всё равно не получится.

    Думаю что добавлю к этому коду еще инициализацию на нулевую точку и оформлю всё в виде функционального блока, чтобы обработка была целостной.
    Если кому интересно - результат выложу в данной теме.

    Остается только одно непонятно. Зачем ОВЕН в своем онлайн-курсе предлагает реализовывать обработку энкодера через "direct control"? Ведь даже видео-пример про это сняли. Или есть какие-то нюансы, которые я упускаю?

    Ну и вопрос к документации. Вот открываем Руководство пользователя, которое хоть на веб-страничке нового ПЛК110, хоть на диске, который вместе с ним приходит, и видим на странице 71 описание модуля Fast Encoder. А в нем описание параметра "Range of encoder 1" и нигде ни слова о том, что данный параметр актуален только для старого ПЛК. В результате вместо спокойной работы с документацией начинаются недоумения "а куда пропал параметр? А не кривой-ли у меня таргет? А может на моем ПЛК прошивка старая?" и изучение постов форума. Деталь, мелочь, но думаю многие заходят на форум с вопросами как раз из-за таких деталей.

  8. #8
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    можно проще, если считать в DWORD
    Суммирование значения счетчика из регистра счета:
    C:dword;
    оттуда, M:word;

    C:=C + ((оттуда - M) and 65535);
    M:=оттуда;
    C:=C + (abs(word_to_int(оттуда - M)) mod 16#10000); - для энкодера

  9. #9

    По умолчанию

    Цитата Сообщение от AlekseyK Посмотреть сообщение
    Кажется нашел решение своей проблемы. При объявлении скоростных входов как "Fast encoder" позиция энкодера не теряется.

    С моим разрешением энкодера (2000 имп/об) можно делать до 32 оборотов в одном направлении, не переполняя регистр энкодера. Если в одну сторону крутить его максимально быстро, а в обратную медленно, то в первом случае (при объявлении быстрых входов как "direct control") появлялась ошибка, так как в прямом направлении происходила потеря импульсов. И при сведении метки на валу подсчитанное положение отличалось от нуля.

    Если же мы берем объявление как "Fast encoder", то импульсы не теряются. Но появляются две другие проблемы. На 33-м обороте будет переполнение регистра энкодера и как следствие потеря позиции объекта. То есть необходимо увеличить разрядность регистра энкодера до 32бит.

    Для этого выполняем следующий код:
    Код:
    IF ((Old_enc-Enc) > 25000) OR ((Enc-Old_Enc) > 25000) THEN (*Резкое изменение значение регистра означает переполнение в плюс или минус*)
    	IF (Enc < Old_Enc) THEN                                                 (*Enc - значение регистра "Fast Encoder"*)
    		Kol_Oborotov:=Kol_Oborotov+1;
    	ELSE
    		Kol_Oborotov:=Kol_Oborotov-1;
    	END_IF;
    END_IF;
    
    Enc32:=Kol_Oborotov*65535+Enc;                                     (*Enc32 - положение энкодера в DWORD*)
    Old_Enc:=Enc;
    Вторая проблема в том, что нельзя задать разрешение подключенного энкодера (в старом ПЛК110 это опция присутствовала), в новом счет идет жестко от 0 до 65535. Но она опять же решается, если по переменной Enc32 сделать операцию MOD 2000 - получим угловую позицию энкодера 2000 имп/об без ограничения на 32 оборота.

    Код можно размещать в основном цикле программы, так как сравниваются значения регистра энкодера на предыдущем цикле и на текущем. Все промежуточные значения всё равно не могут быть обработаны из-за длины цикла программы. Если хотим чтобы ПЛК максимально часто "присматривался" к позиции энкодера, то размещаем код в прерывание 20 мкс. Анализировать позицию (и реагировать на нее) быстрее чем там, всё равно не получится.

    Думаю что добавлю к этому коду еще инициализацию на нулевую точку и оформлю всё в виде функционального блока, чтобы обработка была целостной.
    Если кому интересно - результат выложу в данной теме.

    Остается только одно непонятно. Зачем ОВЕН в своем онлайн-курсе предлагает реализовывать обработку энкодера через "direct control"? Ведь даже видео-пример про это сняли. Или есть какие-то нюансы, которые я упускаю?

    Ну и вопрос к документации. Вот открываем Руководство пользователя, которое хоть на веб-страничке нового ПЛК110, хоть на диске, который вместе с ним приходит, и видим на странице 71 описание модуля Fast Encoder. А в нем описание параметра "Range of encoder 1" и нигде ни слова о том, что данный параметр актуален только для старого ПЛК. В результате вместо спокойной работы с документацией начинаются недоумения "а куда пропал параметр? А не кривой-ли у меня таргет? А может на моем ПЛК прошивка старая?" и изучение постов форума. Деталь, мелочь, но думаю многие заходят на форум с вопросами как раз из-за таких деталей.
    А вы пост #55 из этой темы читали: http://www.owen.ru/forum/showthread.php?t=23600&page=6

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

    При частоте следования импульсов 10 кГц получается 10 импульсов за 1 мс. Это не много. При длительности цикла основной программы ПЛК 2 мс абсолютная погрешность будет не больше 20 импульсов на интервал измерения длины.
    Последний раз редактировалось Newcomer; 20.03.2016 в 12:38.

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    Цитата Сообщение от Newcomer Посмотреть сообщение
    А вы пост #55 из этой темы читали: http://www.owen.ru/forum/showthread.php?t=23600&page=6

    Читать состояние регистра энкодера из прерывания по таймеру 20 мкс бесполезно.
    не задумывались, что здесь люди конфигурируют входа и сами в таймере20мкс создают собственный енкодер, а не то что Вы думаете
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 1 из 7 123 ... ПоследняяПоследняя

Похожие темы

  1. Расчет в отчете.
    от VVS_123 в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 12.10.2015, 16:24
  2. Расчет радиатора и нагревателя
    от rovki в разделе Трёп (Курилка)
    Ответов: 48
    Последнее сообщение: 11.11.2014, 10:10
  3. Расчет охладителя для ТТР Кипприбор
    от Iroha Uta в разделе Твердотельное реле
    Ответов: 12
    Последнее сообщение: 24.01.2014, 19:58
  4. ФБ расчет и long
    от LordN в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 07.03.2012, 08:07
  5. Master SCADA расчет
    от kanava в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 27.08.2008, 12:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •