Разработчики! Сделайте пожалуйста сброс счетчика энкодера. А в идеале еще прерывание по достижению значения.
А как можно "попилить" или написать новый модуль вместо имеющегося? Я про модуль "encoder".
Я писал самостоятельно программу обработки энкодера и затолкал в прерывание 20мс.
Переменную Enc в основной программе не изменять.Код:VAR_GLOBAL; in:BYtE; (*текущее состояние входов DI1-DI4*) old_in:BYTE; (*предыдущее состояние входов*) Enc:WORD; (*счетчик энкодера*) END_VAR; 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 in.0=TRUE AND in.1=TRUE AND in.2=TRUE THEN Enc:=0; (*Сброс показаний энкодера*) END_IF;
Как-то неполно выглядит... и тем не менее, сколько по времени занимает обработка входов?
Неполно, да. Выдернул код из архива проекта не средствами КДС, т. к. в данный момент КДС нет в наличии. Предоставил только саму идею. Эта реализация без проблем работает уже год с энкодером 360 имп\об и скоростью вращения 30rpm max, но и на большей скорости пропусков не обнаружено. Конкретный замер не проводил.
Используется функция SysPortIn, которая читает "быстрые" входы ПЛК.
ЗЫ: В предыдущем моем посте ошибка - должно быть 20мкс вместо 20мс. Так что теоретически частота опроса 50кГц. Будет ли на практике такое работать - вопрос.
Последний раз редактировалось Sulfur; 19.01.2015 в 13:16.
Я так понимаю SysPortIn это обращение к регистру входа? А не подскажите, где по этой теме почитать можно справку?
Последний раз редактировалось ПетрПетр; 24.01.2015 в 01:17.