OpenDCC AniMat - Sequenzer - Software
- Neben der direkten Ausgabe der jeweiligen Funktion kann der AniMat auch in einen sog. Sequenzer-Mode geschaltet
werden. Dabei können komplexere Abläufe zu einem Befehl zusammengefasst werden. Dieser Befehl kann entweder per DCC, per
Schalteingang oder mit der Fernsteuerschnittstelle erteilt werden.
Funktionsweise
- Der Sequenzer funktioniert wie ein Reiterschaltwerk, also so wie eine
mechanische Spieluhr, wo man
zu den gewünschten Zeitpunkten Reiter bzw. Schaltnocken in eine Scheibe zum Markieren der Einschaltpunkte bzw. Ausschaltpunkte
einsteckt.
Die 'Reiter', welche hier verwendet werden, haben jedoch nicht nur die Eigenschaft EIN oder AUS, sondern bestehen aus einem Datenwort. Dieses enthält das Zielobjekt (also was der Reiter bewirken soll) und einem Parameter (der die Wirkgröße angibt). Zielobjekte können die Port, Servos, Motoren oder Sound sein.
Der zeitliche Abstand zum vorherigen Reiter wird mit einer Zeitvariablen eingestellt. Ein Reiter besteht somit immer aus zwei Datenworten: Zeit und Zielaktion.
In AniMat sind parallel mehrere (8) solcher Reiterschaltwerke enthalten, die jeweils mit einem DCC-Befehl, per Eingang oder per USB gestartet werden können. Es können mehrere Schaltwerke gleichzeitig aktiv sein.
Mit diesen Schaltwerken (=Sequenzer) lassen sich nun komplexe Szenen auf der Modellbahn leichter darstellen, wie z.B. eine Seilbahn, welche hin- und her fährt, ein Bahnübergang, wo vorbildgerecht zuerst das Blinklicht eingeschaltet wird, dann bimmelt es und der Schlagbaum wird langsam per Servo absenkt. Zugleich wird der Stopmagnet für das Faller Carsystem betätigt. Wie das im Detail geht, ist bei Anwendungen in den Beispielen erläutert. Es gibt da unzählige Anwendungen, wie Karussellsteuerungen, Kranbewegungen oder sonstige animierte Objekte.
CV-Parameter für Sequenzer-Mode
- Jedem DCC Befehl ist eine Sequenz und ein Steuerparameter für diese Sequenz zugeordnet.
Der Steuerparameter definiert die Zeit, welche von Schritt zu Schritt vergeht; das ist also die lokale Geschwindigkeit
dieser Sequenz.
Die Sequenz selbst besteht dann aus bis zu 25 Reitern, wobei jeder Reiter aus zwei Datenwörtern (nämlich Zeit und
Zielaktion) besteht. Die
Wortbreite ist je ein Byte (CV).
Neben den direkten Zielaktionen gibt es auch 'Verwaltungsaktionen', die es z.B. erlauben, Sequenzen aneinander anzuhängen und/oder zu wiederholen. Damit lassen sich auch längere Sequenzen mit mehr als 25 Reitern erzeugen. Darüberhinaus ermöglichen Reiter für Eingabeaktionen die Abfrage von Endschaltkontakten oder Bedientastern.
Jede Sequenz hat eine vorgelagerte CV, welche die Untersetzung bezogen auf die echte Zeit angibt:
CV [Base] + 0: SLOW_DOWN
Mit dieser CV wird die Geschwindigkeit des Schaltwerkes eingestellt. Bei einer Einstellung von 1 schaltet das Schaltwerk alle 100ms einen Schritt weiter. (Voreinstellung: 10 (=Schaltgeschwindigkeit 1s))
In Summe besteht also ein Schaltwerk aus 51 CV und es sind 8 solcher Schaltwerk im AniMat vorhanden. Folgende Tabelle stellt das nochmal dar, wobei hier als CV Adresse nur der jeweilige Abstand (Offset) zum Beginn des Schaltwerkes angegeben ist.
CV für ein Schaltwerk | ||||
---|---|---|---|---|
CV 0 | SLOW DOWN | |||
CV 1 | ZEIT | CV 2 | AKTION | Reiter 1 |
CV 3 | ZEIT | CV 4 | AKTION | Reiter 2 |
CV 5 | ZEIT | CV 6 | AKTION | Reiter 3 |
... | ZEIT | ... | AKTION | Reiter 4-24 |
CV 49 | ZEIT | CV 50 | AKTION | Reiter 25 |
Adresse(SLOW_DOWN) = [Base] + [Schaltwerk] * 51
Adresse(ZEIT) = [Base] + [Schaltwerk] * 51 - 1 + [Reiter] * 2
Adresse(AKTION) = [Base] + [Schaltwerk] * 51 + [Reiter] * 2
Definition der Reiter (Nocken)
- Die einzelnen Aktionen in einer Sequenz werden mit sogenannten Reitern definiert.
Ein Reiter besteht aus Zeitpunkt und Zielaktion samt zuhöriger Parameter.
Unbenutzte Reiter sind mit 0xFF 0xFF vorzubelegen.
Die Reiter sind wie folgt kodiert:
Zeitpunkt | 8 Bit | Eingabe einer Zeit als Zahl bezogen auf die jeweils vorhergehende Aktion
in der Sequenz. Eine Zeit von 0 bedeutet als keine zeitliche Lücke zwischen
den Aktionen (wiewohl sie doch aus physikalischen Gründen
knapp nacheinander ausgeführt werden).
Die hier angegebene Zeit bedeutet die Zahl der Ticks, welche bis zur
nächsten Aktion vergehen. Der gültige Bereich beträgt 0 ... 250.
Die tatsächliche Wartezeit ergibt sich, wenn man dieses
Zahl mit der Geschwinidigkeit des Schaltwerkes multipliziert.
Damit lassen sich Zeiten von 100ms bis über 1,7h realisieren.
Zeitangaben über 250 sind reserviert und werden für die Steuerung des Schaltwerkes verwendet. (siehe unten) |
---|---|---|
Operation | 8 Bit | Das ist ein Bitfeld für verschiedenen Zielaktionen, diese sind zusammen mit ihren Parametern in der folgenden Tabelle erläutert. |
Standard-Operationen | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Wert (bin) | Zielaktion | Parameter | Kommentar | ||||||||||||
00aaaass | Ausgang schalten |
|
Der angegebene Ausgang wird in den gewünschten Zustand geschaltet. Bei Phase A wird mit der ON-Phase begonnen, bei Phase B wird mit der OFF-Phase begonnen. | ||||||||||||
01mdssss | Motor stellen |
|
Der Motor dreht mit der eingestellten Verzögerung auf die gewünschte Drehzahl, die internen Stufen sind feiner unterteilt als die Vorgabe hier. | ||||||||||||
100srccc | Servo bewegen |
|
Der Servo führt die angebenene Bewegung aus und positioniert sich auf die angegebene Stellung. Das Servo wird dabei im Multipositionsmode (Segmentmode) bewegt. | ||||||||||||
101***** | reserviert (vermutlich für Stepperansteuerung) | ||||||||||||||
110sssss | Sound abspielen |
|
Der Index 0 schaltet den Sound ab. | ||||||||||||
111***** | reserviert |
Wenn als Zeitangabe eine Zeit von 255 eingetragen wird, dann wird keine normale Operation ausgeführt, sondern eine System-Operation:
System-Operationen | |||||
---|---|---|---|---|---|
Wert (bin) | Zielaktion | Parameter | Kommentar | ||
0000pppp | Eingang = 0 abfragen |
|
Wenn der angegebene Eingang = 1 ist, wird die Sequenz angehalten. Wenn der angegebene Eingang = 0 ist, wird die Ausführung der Sequenz fortgesetzt. | ||
0001pppp | Eingang = 1 abfragen |
|
Wenn der angegebene Eingang = 0 ist, wird die Sequenz angehalten. Wenn der angegebene Eingang = 1 ist, wird die Ausführung der Sequenz fortgesetzt. | ||
00100sss | Sequenzer starten |
|
Es kann auch die aktuelle Sequenz erneut gestartet werden. Dadurch wird diese wiederholt.
Dieser Befehl wird nur ausgeführt, wenn kein
Sequenz-Endetrigger vorliegt. Die aufrufende Sequenz wird nach Ausführung des Befehls beendet. Mit diesem Kommando lassen sich Sequenzen aneinander anfügen und damit auch längere Sequenzen erzeugen. Das Kommando ist unzulässig am Beginn einer Sequenz. | ||
00110sss | Sequenzer beenden |
|
Der zu beendenden Sequenz wird ein Endetrigger geschickt,
diese
führt fortan keine System-Befehle mehr aus (weder Inputabfragen, noch andere Startbefehle). Normale
Schaltbefehlen werden aber noch ausgeführt. Wenn die zu stoppende Sequenz bereits
auf ein Systemereignis wartet (z.B. Eingangsabfrage oder Nachrichtenabfrage), dann wird sie
durch den Endetrigger auch angehalten. Die aufrufende Sequenz wird nicht beendet. Dieses Kommando dient dazu, Endlosschleifen auch wieder abbrechen zu können. | ||
01010sss | Sequenzer Start unterbinden (*) |
|
Die angegebene Sequenz kann nicht parallel zur aktuellen Sequenz gestartet werden.
Dieses muß dann auch wieder freigegeben werden. Dieses Kommando dient dazu, problematische Kombinationen zu unterbinden. | ||
01011sss | Sequenzer Start freigeben (*) |
|
|||
01100nnn | Nachricht löschen |
|
|||
01101nnn | Nachricht setzen |
|
|||
01110nnn | Auf Nachricht warten |
|
Die Sequenz warten auf das Eintreffen der Nachricht Dieses Kommando dient zum Synchronisieren von Sequenzen. Wenn beim Aufruf dieser Operation bereits eine Nachricht vorliegt, so wird die Sequenz sofort fortgesetzt. Wenn keine Nachricht vorliegt, dann wartet die Sequenz. Wenn anschließend eine Nachricht eintrifft, dann arbeitet diese Sequenz weiter. Die eingetroffene Nachricht wird dabei nicht gelöscht. | ||
11111111 | Ende | - | Diese Sequenz ist zu Ende, es erfolgen keine weiteren Aktionen; d.h. nach einer Sequenz sind alle unbenutzten Reitereinträge auf 0xFF 0xFF zu stellen. |
Das Reiterschaltwerk enthält nur die Änderungen, die im Zeitablauf erfolgen. Zu Beginn einer Sequenz sind alle Aktionen in dem Zustand, wie sie von der letzten Aktion hinterlassen wurden. Will man einen bestimmten Startzustand erzwingen, so wird einfach zum Zeitpunkt 0 der gewünschte Startzustand der Aktion eingetragen.
Es dürfen zu einem Zeitpunkt auch mehrere Reiter eingetragen werden (d.h. das Zeitfeld ist dann 0), diese werden dann gleichzeitig ausgewertet.
(*) = noch nicht implementiert, hängt noch von möglichen Applikation ab.
Programmierhilfe
- Die Definition der Reiter und das Erstellen von Sequenzen ist mühsam, wenn man jeweils auf die
Bitdefinitionen zurückgreifen muß. Zur vereinfachten Eingabe gibt es folgende Hilfe:
- durch direkte serielle Verbindung mit dem Dekoder: auf den Erweiterungsstecker wird hierbei ein FTDI-USB-Kabel aufgesteckt, man kann dann direkt mit dem Dekoder kommunizieren. Das geht am schnellsten, weil der zeitraubende Umweg über das langsame DCC-Protokoll entfällt. (Dabei werden Kommandos des Host-API verwendet)
- mittels einer Zentrale: diese wird p50x-Befehlen angesprochen
- mittels TrainProgrammer (das ist ein kostenpflichtiges Programm von www.freiwald.com): damit ist das dann unabhängig von der verwendeten Zentrale. (Hinweis: das geht noch nicht, bis jetzt (Stand Feb.2010) ist das Interface von TP zu Applikationsprogrammen fehlerhaft)

Die einzelnen Reiter werden hier mit Hilfe eines Excel-Spreadsheets berechnet und an den Dekoder übertragen. Für die Übertragung sind 3 Wege möglich:
Die Eingabe erfolgt hier im Klartext (durch Auswahl mit der Maus) und die zugehörigen CV-Einstellungen werden von Excel errechnet. Verschieben von Reitern geht ganz einfach mit den Verschieben- / Kopieren-Funktionen von Excel. Auch die Errechnung der Zeit und Bestimmung der richtigen CV-Adresse geschieht automatisch.
Zum leichteren Test kann man den Dekoder auch direkt mit dem PC verbinden (über eine FTDI-RS232-TTL Kabel) und die Befehle für die Aktionen direkt eingeben. Auch die CVs lassen sich auf diesem Weg direkt und schnell schreiben.