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 0SLOW DOWN
    CV 1ZEITCV 2AKTIONReiter 1
    CV 3ZEITCV 4AKTIONReiter 2
    CV 5ZEITCV 6AKTIONReiter 3
    ...ZEIT...AKTIONReiter 4-24
    CV 49ZEITCV 50AKTIONReiter 25
    Innerhalb des Dekoders ist eine Basisadresse für Schaltwerke definiert, die zu verwendende Adresse ergibt sich, wenn man die Summe aus Abstand und Basisadresse (=[Base] bildet.

          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:
    Zeitpunkt8 BitEingabe 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 BitDas ist ein Bitfeld für verschiedenen Zielaktionen, diese sind zusammen mit ihren Parametern in der folgenden Tabelle erläutert.
    Standard-Operationen
    Wert (bin)ZielaktionParameterKommentar
    00aaaassAusgang schalten
    aaaa:Ausgangsnummer (z.Z. nur 0..7 erlaubt)
    ss: Zustand
    00: aus
    01:blinkend, Phase A
    10:blinkend, Phase B
    11:ein
    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.
    01mdssssMotor stellen
    m:Motornummer
    d:Drehrichtung
    ssss: Geschwindigkeit, 0=Stillstand, 15=maximale Geschwindigkeit
    Der Motor dreht mit der eingestellten Verzögerung auf die gewünschte Drehzahl, die internen Stufen sind feiner unterteilt als die Vorgabe hier.
    100srcccServo bewegen
    s:Servonummer (momentan nur 0 oder 1 erlaubt)
    r:reserviert
    ccc: Positionsvorgabe gemäß Tabelle, wie sie auch im Multipositionsmode verwendet wird.
    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)    
    110sssssSound abspielen
    sssss:Index des Soundfiles
    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)ZielaktionParameterKommentar
    0000ppppEingang = 0 abfragen
    pppp:Eingangsnummer (z.Z. nur 0..7 erlaubt)
    Wenn der angegebene Eingang = 1 ist, wird die Sequenz angehalten. Wenn der angegebene Eingang = 0 ist, wird die Ausführung der Sequenz fortgesetzt.
    0001ppppEingang = 1 abfragen
    pppp:Eingangsnummer (z.Z. nur 0..7 erlaubt)
    Wenn der angegebene Eingang = 0 ist, wird die Sequenz angehalten. Wenn der angegebene Eingang = 1 ist, wird die Ausführung der Sequenz fortgesetzt.
    00100sssSequenzer starten
    sss:Sequenz, mit der fortgefahren werden soll.
    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.
    00110sssSequenzer beenden
    sss:Sequenz, die beendet werden soll.
    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.
    01010sssSequenzer Start unterbinden (*)
    sss:Sequenz, deren Start blockiert wird.
    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.
    01011sssSequenzer Start freigeben (*)
    sss:Sequenz, deren Start freigegeben wird.
     
    01100nnnNachricht löschen
    nnn:Nachrichtennummer
     
    01101nnnNachricht setzen
    nnn:Nachrichtennummer
     
    01110nnnAuf Nachricht warten
    nnn:Nachrichtnummer
    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.
    11111111Ende - 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.
    Anmerkungen:
      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:
    Schaltwerk
    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:
    • 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 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.