moin,
war mal kurz weg...
Auf so einen Code kommt man, wenn man weiß, dass es sich bei den binären Zahlen, deren Darstellungslängen beschränkt sind (z.B. Interer 16-bit), nicht um Zahlenstrahlen sondern um Zahlenkreise handelt.
So ergibt
keine 32768 (nicht mit 16 bit als Integer darstellbar), aber -32768 (kleinste Zahl, sogenannter Überlauf).
Das lässt sich auf eine andere Art und Weise jedoch nutzen. So ergibt
tatsächlich eins, also die Schrittweite, die die zwei Zahlen im Zahlenkreis auseinander liegen.
Um diesen Effekt mit dem 8192-schrittigen Drehgeber nutzen zu können, müssen seine 12 bit linksbündig geschoben werden. Der SLW 4 entspricht einer Multiplikation mit 16. Daher eine Umdrehung 8192x16 = 65536.
SCHEISSE! Dein Geber ist ja 13-Bit, merke ich grade...
...also ersetze SLW 4 durch SLW 3 (Multiplikation mit 8).
Dieser Code funktioniert, solange Zyklus für Zyklus nicht mehr als eine halbe Umdrehung des Drehgebers statt findet. Man kann jedoch den Code so erweitern, dass sogar größere Wegfortschritte noch gemessen werden können. V1.1 ist, sich die Bewegungsrichtung zu merken. Hat man z.B. eine positive Bewegung, aber plötzlich schlägt der Bewegungsfortschritt ins negative um, so ist mehr als eine halbe Umdrehung erfolgt. Also sind 65536 hinzuzuzählen (bzw. umgekehrt abzuziehen bei negativer Bewegung). Hab ich schon mal bis V1.2 getrieben (bis zu 1,5 Umdrehungen pro Zyklus).
Dass es bei Dir von Zeit zu Zeit den Wert verschiebt, kann ich jetzt nur vermuten, dass es ein Abtastproblem ist (SPS-Zyklus, ggf. Übertragungszyklus (DP), Wandlungszeit Drehgeber). Wir hatten eine Weile suchen müssen, bevor wir einen Geber fanden, der wirklich schnell und oft den aktualisierten Stellungswert über DP geben konnte. Zur Orientierung eine Hausnummer: bei mir ist wichtig, so alle 1-2ms die Geberstellung zu wissen.