10.07.2022

Das Modell - SPS auf der DreamCatcherOne

Nun ist es endlich geschafft: Die Speicherprogrammierbare Steuerung (SPS) von Bachmann ist auf dem Modell der DreamCatcherOne installiert und programmiert.

Abbildung 1: SPS im Modell installiert

Abbildung 1 gibt einen Überblick über den Systemaufbau im eingebauten Zustand. Ganz oben links ist die Spannungsquelle für alle 24V Systeme zu sehen: Ein 6-Zelliger LiPo-Akku mit 8000mAh Kapazität (rund 177 Wh). Damit kann die Steuerung und alle 24V-Sensoren für einige Stunden versorgt werden, was in erster Linie für den Burn-in im eingebauten Zustand wichtig ist. Um auszuschließen, dass die Steuerung oder die Sensoren bei Spannungsschwankungen Probleme bereiten, habe ich einen Victron Energy Orion-Tr 24/24/17 DC-DC-Wandler nachgeschaltet, der die Spannung immer fix bei 24V hält, egal, ob der Akku 25,2V (voll) oder 22,2V (leer) bereitstellt. Es ist anzumerken, dass dieser Akku/DC-DC-Wandleraufbau nicht die Fahrmotoren und die Servos versorgt. Die hängen an eigenen 2 oder 3 Zellen LiPo-Akkus. Die Fahrtregler versorgen die Servos mit 5V. Dem Stomverlauf weiter folgend ist die 24V-Leitung mit 10A abgesichtert, falls es irgendwo einen Kurzschluss geben sollte. Der Ein-/Ausschalter fehlt in diesem Bild noch.

Der große schwarze Kasten in der Mitte ist die Bachmannsteuerung mit einigen I/O-Modulen, die ich meine Tests erworben habe. Unten links sieht man die Verbindungskabel für die CANOpen-Sensoren. In Anlehnung an NMEA2000 habe ich eine Device-Net-Verkabelung mit M12-Steckern und Buchsen verwendet. Das erscheint mir die komfortabelste Verkabelung zu sein, da in den fünf Polen auch die Spannungsversorgung mitgeführt wird. Unten in der Mitte befindet sich der 24V auf 5V Signalwandler für die Servo PWM-Signale. Was sich hochtechnisch anhört, ist lediglich ein simpler Spannungsteiler, da die Servoeingänge ausreichend hochohmig sind. Es gibt insgesamt sechs Anschlüsse: Podrotation, Drehzahl und Ruder jeweils an Backboard und Steuerboard. Ganz rechts unten schließlich ist der Empfänger der HBC Radiomatic Fernsteuerung, der über einen separaten CANOpen-Bus angeschlossen ist. Es ist nicht erforderlich, den Empfänger an einem separaten Bus zu betreiben. Dies war lediglich für Testzwecke einfacher und am Ende hatte ich keine Lust mehr, das CAN-Bus-Kabel des Empfängers auf einen M12-Stecker umzulöten. Der Empfänger wird über DIP-Switches auf die gewünschte Adresse/Baudrate eingestellt, was bei weitem die einfachste Methode darstellt. Ein wichtiger Punkt bei dem Empfänger ist, dass er zwingend ein Heart-Beat-Signal (1000ms) verlangt. Ansonsten geht der Empfänger in einen Fehlermodus, was ja auch irgendwo sinnvoll ist, wenn man damit ein ganzes Schiff steuert...

Die Programmierung der Bachmann-Steuerung ist problemlos und zuverlässig, wenn man sich mit SPS-Programmierung mit Structured Text (ST) auskennt und verstanden hat, wie Prozessabbilder und I/O-Konfigurationen funktionieren. Die Sprachimplementierung hält sich recht strikt an die ursprüngliche IEC 61331-Spezifikation, was bedeutet, dass sie keine Methoden und andere Spracherweiterungen kennt. Die Entwicklungsumgebung basiert auf Eclipse und ist sehr gut mit der Hardware der Steuerung integriert. Dadurch kann man den Code auf der Steuerung laufend direkt debuggen kann, womit man so ziemlich jeden Fehler finden kann. Auch direkte Änderungen von Variablen im laufenden Betrieb sind möglich, so dass man z.B. Reglerparameter händisch testen kann.

Ich verwende für das Modell nur das GIO212-Input-Output-Modul, das eine wahrhaft eierlegende Wollmilchsau ist: Es kann simples digitales oder analoges I/O (immer an denselben Pins!), aber das ist noch lange nicht das Ende: Es kann PWM-Signale generieren (man beachte die verschiedenen zeitlichen Auflösungsgenauigkeiten je nach dem welche Periodendauer eingestellt ist) und stellt auch eine Periodendauermessung mit 96MHz Basisfrequenz zur Verfügung und vieles mehr. Zu jedem Primärkanal kann man auch einen Sekundärkanal definieren, auf dem man z.B. eine Versorgungskleinspannung (bis 10V) für einen Sensor bereitstellen kann. Ich habe mich entschieden, die Periodendauer für die Modellbauservos auf 8 ms einzustellen, wodurch das PWM-Signal dann in Schritten von 125ns variiert werden kann. Dadurch kann der Nullpunkt des Servos sauber fixiert werden. Alle, die Ahnung von den Innereien von Modellbauservos haben, werden nun die Hände über dem Kopf zusammenschlagen, weil diese Servos laut Spezifikation normalerweise mit einer Periodendauer von 20ms (50Hz) betrieben werden. Hier kommt die Entwarnung: Alle modernen Modellbauservos vertragen die 8ms (125Hz) ohne Mucken. Stellt sich die Frage, warum ich das gemacht habe? Wie bereits früher beschrieben, habe ich die Servos für die Drehung der POD-Antriebe gehackt, so dass sie einen Endlosbetrieb (360°-Betrieb) erlauben. Das ist recht einfach, wenn man Servos hat, die ein Poti zur Positionsregelung haben (siehe Eintrag vom 30.08.2021). Allerdings sind selbst 1% Widerstände nicht genau genug, damit das Servo in der Standard-Nullstellung (1500$\mu$s Pulsbreite) steht. Auf einer modernen Modellbaufernsteuerung (ich hatte mir eine FySky Taranis Q X7 für die ersten Harwaretests und Testfahrten zugelegt) kann man die Null-Position mikrosekundengenau einstellen. Durch die Wahl der 8ms Periodendauer ist das auf der Bachmann SPS ebenfalls möglich. Ab 8192$\mu$s (8,192ms) Periodendauer sinkt die Auflösung des GIO212 um den Faktor 16, so dass die minimale Schrittweite dann nur noch 2$\mu$s beträgt, eine mikrosekundengenaue Einstellung also nicht mehr möglich ist. Vermutlich würden 2$\mu$s Schritte auch ausreichen, aber ich habe es nicht ausprobiert.

Abbildung 2: Drehzahlmessung HW-Test

Die Motoren werden per Drehzahlregelung mit einem PI-Regler geregelt. Das ist zwingend erforderlich, weil ein und derselbe Ausgabewert für den Modellbaufahrtregler bei zwei Motoren zu grob unterschiedlichen Drehzahlen führt. Damit wäre mit einem Joystick nicht einmal eine Geradeausfahrt möglich. Die Drehzahlregelung hat auch noch einen anderen positiven Nebeneffekt: Normalerweise bestimmt sich die Maximaldrehzahl bei bürstenlosen Modellbaumotoren und Modellbaufahrtreglern durch die angelegte Spannung, also ob, zwei oder drei LiPo-Zellen-Akkus angeschlossen werden. Durch die Regelung spielt das keine Rolle mehr, da ich die Maximaldrehzahl auf 7000 U/min fixiere und so egal welche Spannung anliegt, die Maximaldrehzahl des Podantriebs von 8000 U/min nie erreicht wird. Meine primitive Lochscheiben-/Lichtschranken-basierte Drehzahlmessung, die lediglich die Rechteckimpulse der Lichtschranke per Periodendauermessung auswertet (Abbildung 2), hat natürlich einen entscheidenden Fehler: Sie macht keine Drehrichtungserkennung. Zum Glück ist das für meine Vektorsteuerung kein Problem, da die Propeller hier immer nur vorwärts laufen. Für den normalen Jostick-basierten vorwärt-rückwärtsbetrieb musste ich ein wenig tricksen, indem ich geeignete Annahmen mache, in welche Richtung der Propeller dreht. Für die echte DreamCatcherOne wäre das ein no go, aber für das Modell funktioniert es leidlich.

Die Drehwinkel der Podantriebe wird durch einen simplen P-Regler eingeregelt, da die Strecke bereits einen Integrator (Drehgeschwindigkeit zu Drehwinkel) umfasst. Einen PI-Regler habe ich auch ausprobiert. Der erreicht zwar eine bessere Endgenauigkeit, hat aber ein seltsames Kriechverhalten gezeigt, das ich nicht beseitigen konnte. Irgendwelche Vorschläge?

Ich habe zwei Betriebsmodi implementiert, die meine HBC Radiomatic Fernsteuerung vorsieht:

Die Betriebsart Moor (wie mooring oder anlegen) steht für die Vektorsteuerung. Zur Erinnerung: Das bedeutet, dass das Schiff der Auslenkungsrichtung des Joysticks folgt, also, wenn ich z.B. den Joystick nach links drücke, fährt das Schiff seitwärts. Dreht man an dem Knopf für die z-Achse, dreht sich das Schiff auf der Stelle. Drehung und Richtung können gemeinsam benutzt werden und werden rechnerisch zu einer Gesamtbewegung überlagert. Die Ruder werden in diesem Modus nicht verwendet. Um die Podantriebe nicht zu zerstören, wird die Drehzahl erst zugeschaltet, wenn die Poddrehung weniger als 5°-10° von der Sollposition entfernt ist. Bei Winkelabweichungen, die größer als dieser Wert sind, werden beide Antriebe kurzfristig abgeschaltet. Jeder, der schon einmal ein Fahrradvorderrad in der Hand hatte und versucht hat, die Drehebene des Rades zuverändern während sich dieses dreht, versteht intuitiv, was das Problem ist: Die auftretenden Kräfte sind sehr groß.

Die Betriebsart Sail steht für eine simple Joysticksteuerung der Antriebe. Das bedeutet, dass man nach vorne und nach hinten die Drehzahl der der Motoren regelt. Im Gegensatz zu echten Katamaranen, die bei gleicher Gashebelstellung nie geradeaus fahren, ist dies in meinem Fall durch die Drehzahlregelung der Antriebsmotoren weitestgehend gewährleistet. Mit dem z-Achsen-Drehknopf auf dem Joystick kann das Schiff gedreht werden. Im Unterschied zur Vektorsteuerung, bei der ein Motor um 180° gedreht wird, aber beide Motoren vorwärts laufen, läuft hier ein Motor rückwärts und es gibt keine Poddrehung. Die rechts/links-Bewegung des Joysticks steuert die Ruder an. Da der Sail Modus auch bei längeren Strecken komfortabel sein soll, kann man die Drehzahlen auf Knopfdruck (Set) fixieren, ähnlich wie in einem Auto mit einer Geschwindigkeitsregelung, nur dass hier nichts geregelt wird. Mit den Tasten + und - an der Fernsteuerung kann die Geschwindigkeit nachgestellt werden. Das Ganze funktioniert aber nur in Vorwärtsfahrt, damit man nicht aus Versehen rückwärts in eine Kaimauer donnert. Drückt man den Set-Knopf in Neutralstellung des Joysticks wird die Drehzahlfixierung aufgehoben. Dasselbe passiert, wenn man den Joystick nach hinten zieht. So sollte die Bedienung so intuitiv sein, dass man auch in einer Stresssituation nichts verkehrt machen kann.