C:=C + ((оттуда - M) and 65535);

Первый вариант считает только в прямом направлении, в случае легкого отката энкодера назад - в переменой С уже каша.

Например возврат с 30-го импульса на 27-й:

С:=30+((27-30) and 65535);
C:=30+((-3) and 65535); где -3 будет рассматриваться как dword, то есть = FFFFFFFD и ее результат с and 65535 даст FFFD=65533;
C:=30+65533;
С:=65563; а не 27 как положено.



Второй вариант перемещения в минус засчитывает в плюс.
Тот же вариант возврат от 30-го импульса к 27-му:

C:=C + (abs(word_to_int(оттуда - M)) mod 16#10000);
С:=30+(abs(word_to_int(27-30)) mod 16#10000);
C:=30+(abs(-3) mod 16#10000); вот тут, из-за abs() мы потеряли направление движения
C:=30+(3 mod 65536); ; немного не понял зачем тут MOD, ведь разность значений регистра "оттуда" не может быть больше 65535 вообще никак.
C:=30+3;

Если MOD в конце операции подсчета стоит для приведения положения энкодера к его разрядности, то очевидно что данный вариант работать не будет. Так как операция MOD должна применяться к абсолютному положению энкодера подсчитанному в DWORD, это следует из того, что при переполнения регистра "оттуда" положение энкодера резко сбрасывается в ноль со значения [65535 MOD "разрядность энкодера"]. И при каждом переполнении эти значения будут складываться. То же самое и при обратном переходе через ноль. В регистре "отттуда" был ноль, стало резко [65535 MOD "разрядность энкодера"].

Если я в чем-то ошибаюсь или не понял вашу мысль, прошу не ругать. Потому как обе приведенные формулы проверил на ПЛК с подключенным энкодером и говорю только о том, что наблюдаю в отладчике.