Я писал самостоятельно программу обработки энкодера и затолкал в прерывание 20мс.
Код:
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;
Переменную Enc в основной программе не изменять.