Сообщение от
ilys
Получается, если мы находимся на границе программного обнуления счетчика при 65000
Простите, но "бла-бла-бла-65000".
Вот вам пример:
Код:
VAR
prevEncoderValue, encoderValue : WORD;
diff_word : WORD;
diff_int : INT;
value : DINT;
newValue : DINT;
newValue2 : DINT;
END_VAR
value := 10; (* прошлое значение -- 10 *)
prevEncoderValue := 65530; (* было у границы *)
encoderValue := prevEncoderValue + 9; (* крутанули на 9 *)
newValue := value + encoderValue - prevEncoderValue; (* неправильно *)
diff_word := encoderValue - prevEncoderValue;
diff_int := WORD_TO_INT(diff_word);
newValue2 := value + diff_int; (* правильно *)
Вот в симуляции:
newValue2 правильно изменилось с 10 до 19 (увеличилось на 9)
Попробуем в обратную сторону. Т.е. пусть старое значение 5, а крутанули на -9:
Тоже всё верно. newValue2 изменилось с 10 до 1 (уменьшилось на 9)
Поэтому никакие "сбросы по 50000" не нужны. Они только вредят и запросто могут вызывать ошибку счёта.
Честное слово, я даже не хочу вчитываться, если есть нормальный и простой вариант в одну строку.