Moin allerseits,
um ein Hochregallager in fischertechnik zu bauen und zu programmieren sind keine Fremdkomponenten notwendig.
Dass es funktioniert, zeigt das Hochregallager aus dem "Automation Robots" Baukasten - mit RoboPro ist es natürlich etwas einfacher, aber in C gehts notfalls auch

Der Ansatzpunkt ist falsch. Bei den Encoder - Motoren sollte man sich sowieso nicht ausschließlich auf die Daten der Transfer-Area verlassen (die wird "nur" alle 10ms aktualisiert, die Impulse des Encoder-Motors kommen schneller) sondern die eingebauten "Fahre Motor x Schritte" - Funktionen verwenden. Steuert man die Motoren "manuell" sind Positionierungsfehler vorprogrammiert, weil der "Motor Stop"-Befehl einfach zu spät kommt.
Für die aktuelle tatsächliche Position lässt man eine Variable als Zähler mitlaufen, dann muss man für die neue Position nur die Differenz berechnen, je nach Vorzeichen der Differenz links- oder rechtsrum fahren und fertig ist die Laube. Sehr aufschlussreich sind auch die zum Automation Robots gehörenden RoboPro Programme, da kann man sich einige interessante Kniffs abschauen.
Eine Positionierung läuft in etwa so:
- die aktuelle Position ist in einer Variablen gespeichert. Der Counter des Motors ist 0(!)
- Soll eine neue Position angefahren werden, wird die Differenz Soll - Ist gebildet
- je nach Vorzeichen wird die Drehrichtung festgelegt
- Der "Fahre Motor X Schritte" Befehl wird ausgeführt. -->
StartMotorExCmd()
- Man liest den Counter aus (und damit die TATSÄCHLICH gefahrenen Schritte) -->
GetInCounterValue()
- der Wert des Counters wird (je nach oben festgestellter Drehrichtung) von der aktuellen Position abgezogen oder addiert.
- Der Counter wird wieder auf 0 gesetzt, damit die nächste Position angefahren werden kann. -->
StartCounterReset()
Durch die Korrektur der aktuelle Position mit dem tatsächlichen Zählerstand werden zuverlässig kumulative Positionierungsfehler ausgeschlossen, auch wenn der Motor mal einen Step zu früh oder zu spät stehengeblieben ist.
Der StartMotorExCmd() Befehl ist recht komplex, man kann damit sogar zwei Motoren synchronisieren. Wichtig ist auch, sich in das Thema Callback einzuarbeiten, z.B. für den Motor-Befehl benötigt man den Callback
SetCBMotorExReached() um das Erreichen der Zielposition zu überwachen.