Кажется нашел решение своей проблемы. При объявлении скоростных входов как "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" и нигде ни слова о том, что данный параметр актуален только для старого ПЛК. В результате вместо спокойной работы с документацией начинаются недоумения "а куда пропал параметр? А не кривой-ли у меня таргет? А может на моем ПЛК прошивка старая?" и изучение постов форума. Деталь, мелочь, но думаю многие заходят на форум с вопросами как раз из-за таких деталей.