Die Software zum Aufzug

Den Aufzug kennt ihr bereits aus →dem Mechanik- und →dem Elektronikbeitrag. Das komplette Softwareprojekt findet ihr unter:

https://github.com/DoktorRail/DoktorRailProjects/tree/master/ModelRailway/Aufzug

Zum Auswerten von DCC-Telegrammen bindet das Projekt auch das →DCC-Framework ein.

Dateien im Projekt

  • Aufzug.c: Enthält die main() und wichtige Hauptfunktionen wie den Regler “ControllerLoop()”
  • AufzugExt.c: Enthält die Initialisierung und Nebenfunktionen
  • defines.h: Enthält die üblichen Werte- und Interfacedefinitionen, aber auch die Fehlercodes (ErrorcodeType)
  • uart.c und uart.h: Das ist →die bekannte Peter-Fleury-Uart-Library. Hiermit werden Statusausgaben in Klartext über Uart ermöglich. Als Gegenstück ist auf dem PC dazu das Tool →putty sinnvoll.

Programmstruktur

Initialisierung

Die Funktion “initia()” übernimmt alle Initialisierungen. Insbesondere werden die Feedbacks (Rückmelderelais) zunächst ausgeschaltet (Zustand des Aufzugs direkt nach dem Einschalten: unbekannt), ebenfalls die Statemachine: “stateCurr = UNDEFINED;”. Auch der Regler ist aus “controllerOn = false;”. Am Ende der Initialisierung wird ein Systemtest durchgeführt “SwitchOnTest();”. Falls der Schlitten in einer der Endpositionen steht (was nach dem Einschalten in der Regel der Fall ist), so wird dieser Zustand in der State-Machine gesetzt und der Aufzug ist betriebsbereit. Jeder andere Fall führt zu einem Fehlerzustand.

Mainloop

Die Hauptschleife ruft den Regler auf “ControllerLoop();” sowie die DCC-Abfrage “loop_dcc();”. Tastendrücke zum manuellen Setzen der Position werden als DCC-Eingaben gewertet, z.B. “dccTarg=UP”. Neben der Ausgabe von Statuswerten wird bei erforderlicher Schlittenbewegung die Funktion “Movement()” aufgerufen. Der komplette Verfahrvorgang wird innerhalb dieser Funktion erledigt.

State-Machine

Die Regelung ist eingebettet in eine State-Machine, welche z.B. die Regelung abhängig von den Inputs ein- oder ausschaltet. Der Zustand des Aufzugs wird hierbei über “StatePosition” bzw. “stateCurr” abgebildet. Der aktuelle Sollwert steht im gleichen Sinne in “dccTarg”. “Movement()” sorgt hier ebenfalls für die Einhaltung der Geschwindigkeitsrampe: Beim Annähern an die Endpositionen verfährt der Schlitten langsamer. Dies ist sehr gut →im Video zu sehen.

Ebenfalls als State anzusehen ist errorCode. Steht dieser auf NO_ERROR, liegt offensichtlich kein Fehler an und normaler Betrieb ist möglich. In jedem anderen Fall wird der Aufzug in den Nothalt gehen und nicht mehr auf DCC-Befehle reagieren. Die Feedbacks sind dann beide aus (es wird nach außen gemeldet: Schlittenposition unbekannt). Der Fehlerstate ist auf dem höchsten Prioritätslevel und “überschreibt” damit den Status in stateCurr.

Sensordaten & Regelung

In “ControllerLoop()” wird via “readPot()” die Schlittenposition ausgelesen. Über eine Mittelwertbildung wird mögliches Rauschen auf der Analogleitung herausgerechnet. Damit steht ein aktueller Positions- und Geschwindigkeitswert als Basis für die Regelung zur Verfügung.

Sensordaten und Regler

ControllerLoop() enthält den Regelalgorithmus. Hier kommt ein einfacher Geschwindigkeitsregler (Dreipunktregler) zum Einsatz. Aus der Differenz zwischen Ist- und Sollgeschwindigkeit bzw. der Ist- und Sollgeschwindigkeit werden die Motorstellwerte berechnet.

Funktionen

DCC-Input

In einem früheren Beitrag ist die Routine →zum Einlesen von DCC-Telegrammen veröffentlich worden. Diese wird hier per Include “#include “..\Dcc_Framework\dcc.c”” eingebunden. Die erforderliche Adresse des Aufzugs wurde vorher in defines.h über “#define ADDRESS_DCC_ACCESSORY    3” erledigt. So kann der DCC-Sollwert sehr bequem über “Function3_Addr1_On()” bzw. “Function3_Addr1_Off()” vorgegeben werden.

Fehler und Fehler quittieren

Alle Fehlercodes sind im enum “ErrorcodeType” festgehalten. Die Nummer bzw. die Position des Fehlers sind hierbei der Schlüssel. Tritt z.B. der Fehler ERROR_SpeedLimit auf, so steht dieser an Position 5 (da NO_ERROR = 0 ist). Sollte einer der Fehler auftreten, so geht der Aufzug sofort in den Nothalt. Die rote Status-LED blinkt dann genau so oft, wie es dem Fehlercode entspricht. So kann auch ohne Uart-Verbindung vergleichsweise schnell festgestellt werden, welcher Fehler anliegt.

Gleichzeitig kann der Schlitten über die Up/Down-Taster verfahren werden. Achtung! In diesem Modus gibt es keine Abschaltung an den Endpositionen! Dafür bekommt der Motor nur Strom, solange der Taster gedrückt ist. Diese Option ist dafür gedacht, den Schlitten z.B. ungeachtet der Taster aus einer Klemmung herauszubewegen.

Liegt ein Fehler an, kann er über langes Drücken der Nothalt-Taste quittiert werden. Der Aufzug bootet dann neu. Wurde der Fehler behoben, kann jetzt wieder normaler Aufzugsbetrieb gemacht werden.

Betrieb

Für den regulären Betrieb innerhalb einer MoBa-Automatik fungiert das DCC_framework als Signaleingang und die Feedbackrelais melden den Status an die MoBa-Steuerung zurück.

Der Aufzug in der MoBa-Automatik

Der Schlitten verfährt vollautomatisch mit hoher Geschwindigkeit, wobei er sich bei Annäherung an die Endtaster verlangsamt. Da es hier auch nur zwei Positionen zurückzumelden gibt (“UP” und “DOWN”), kann der Aufzug logisch als Weiche eingebunden werden. Gäbe es mehrere Schlittenpositionen (wie bei den vielen →Aufzügen in der Datenbank zu sehen) würde sich eine logische Anbindung z.B. Schiebebühne anbieten. Ggf. gibt es dann den doppeltem Gleisanschluss vorne und hinten oder eben auch nicht.

Weitere Details sind auch dem Beitrag →Aufzugs-Elektronik zu entnehmen.



Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.