RgZm Fernbedienung

Allgemeines

Bei entsprechender Konfiguration der RgZm (siehe RgZm Konfiguration) kann die RgZm für eine Betriebsstelle über einen Tcp/IP-Socket ferngesteuert werden. In der RgZm wird ein Socket-Server gestartet, welcher auf Requests zur Fernsteuerung wartet und diese mit entsprechenden Responses quittiert. Die Beschreibung der Syntax des Protokolls erfolgt in EBNF.

Request / Response

Das Protokoll der Fernsteuerung ist Zustandslos. Das heißt auf eine entsprechende Anforderung per Request wird reagiert und mit einem passenden Response geantwortet. Nach diesen Zyklus ist die Fernsteuerung wieder im Ausgangszustand. Jeder Request muß als Handshake eine Versionsinformation vor dem eigentlichen Requestinhalt führen. Erst nach Prüfung ob der Service im Versionsbereich liegt, erfolgt die inhaltliche Verarbeitung des Request.

Requestsyntax:

Request = "handshake" Minversion Maxversion"; request" Requestcontent ";" ;
Minversion = "minversion:" Versionnum ;
Maxversion = "maxversion:" Versionnum ;
Versionnum = Ziffer {Ziffer} "." Ziffer {Ziffer} ;
Ziffer = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

Ist das nicht der Fall, wird als Response ein VersionError geliefert. Entspricht der Response nicht der definierten Syntax, wird ein ProtocolError gesendet.

Emitteln der Belegung

Enthalten ab Version 1.0 bis Version …

Es wird die Belegung der Strecke zum angegebenen Nachbarn übertragen.

Request:

GetBelegung = "occupation of:" Nachbar ;

Response:

SendBelegung = "occupation of:" Nachbar "is" Belegungen ";" ;
Belegungen = Belegung [";" Belegung] [";" Belegung] [";" Belegung] ;
Belegung = Arriving | Departing | Announced | Announcing ;
Arriving = "arriving:" Zug ":" ZugState ;
Departing = "departing:" Zug ":" ZugState ;
Announced = "announced:" Zug ":" ZugState ;
Announcing = "announcing:" Zug ":" ZugState ;
ZugState = "OFFERED_IN" | "ACCEPTED_IN" | "AWAY_IN" |
"OFFERED_OUT" | "ACCEPTED_OUT" | "AWAY_OUT" |
"AWAY_IN_AND_OFFERED_OUT" | "AWAY_IN_AND_ACCEPTED_OUT" |
"AWAY_OUT_AND_OFFERED_IN" | "AWAY_OUT_AND_ACCEPTED_IN" ;

Die vier Belegungstypen reflektieren die vier möglichen Meldezustände welche auf einer Strecke möglich sind. Je nach Streckentyp schließen sie sich teilweise aus. “Announced” kennzeichnet die Voranmeldung vom Nachbarn her, “Announcing” die Voranmeldung zum Nachbarn hin.

Fehler:

NeighborError = "Neighbor not found:" Nachbar ;

Durchfahrt

Enthalten ab Version 1.0, erweitert mit Version 1.1 …

Zugmeldung eines ankommenden Zuges an eine Nachbardienststelle weitermelden, ohne das der Zug über ein eigenes Betriebsstellengleis läuft. Der weiterzumeldende Zug muß sich im ankommenden Streckengleis des “from:” Nachbar befinden. Die Funktion ist nur auf zweigleisigen Strecken möglich.

Erweiterung ab Version 1.1:

Wird die Funktion aufgerufen und in der Zielstrecke befindet sich bereits ein Zug. So wird der Zug in die Voranmeldung der Strecke gesetzt.

Request:

Crossing = "crossing! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;

Response:

SendCrossing = "crossing performed" ;
SendOffering = "offering performed" ; //ab Version 1.1, wenn Ziel-Gleis besetzt und Voranmeldung frei.

Fehler:

FromError = "From-neighbor not found:" Nachbar ;
ToError = "To-neighbor not found:" Nachbar ;
TrainError = "Train not found or not the same:" Zug ;
CrossingFailed = "Crossing not be executed for:" Zug ;

Voranmeldung

Enthalten ab Version 1.1 bis Version …

Zug an eine Nachbardienststelle vormelden. Der weiterzumeldende Zug muß sich im ankommenden Streckengleis des “from:” Nachbar befinden.

Request:

Offering = "offering! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;

Response:

SendOffering = "offering performed" ;

Fehler:

FromError = "From-neighbor not found:" Nachbar ;
ToError = "To-neighbor not found:" Nachbar ;
TrainError = "Train not found or not the same:" Zug ;
OfferingFailed = "Offering not be executed for:" Zug ;

Block belegen

Enthalten ab Version 1.0, erweitert mit Version 1.1 …

Zugmeldung eines ankommenden Zuges an eine Nachbardienststelle weitermelden, ohne das der Zug über ein eigenes Betriebsstellengleis läuft und ohne das der Zug auf der ankommenden Strecke zurückgeblockt wird. Nach der Ausführung dieses Kommandos sind zwei Blockabschnitte mit dem selben Zug belegt. Dieses Verfahren ist für Blockstellen sinnvoll, wenn der Zug die Blockstelle passiert und so beide Blockabschnitte belegt. Als eines der folgenden Kommandos muß dann das Rückblocken des Zuges erfolgen. Der weiterzumeldende Zug muß sich im ankommenden Streckengleis des “from:” Nachbar befinden. Die Funktion ist nur auf zweigleisigen Strecken möglich.

Erweiterung ab Version 1.1:

Wird die Funktion aufgerufen und in der Zielstrecke befindet sich bereits ein Zug. So wird der Zug in die Voranmeldung der Strecke gesetzt.

Request:

Occupying = "occupy! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;

Response:

SendCrossing = "occupying performed" ;
SendOffering = "offering performed" ; //ab Version 1.1, wenn Ziel-Gleis besetzt und Voranmeldung frei.

Fehler:

FromError = "From-neighbor not found:" Nachbar ;
ToError = "To-neighbor not found:" Nachbar ;
TrainError = "Train not found or not the same:" Zug ;
OccupyingFailed = "Occupying not be executed for:" Zug ;

Block frei melden

Enthalten ab Version 1.0 bis Version …

Frei melden einer ankommenden Strecke für einen Zug der per “Block belegen” schon auf eine abgehende Strecke weiter gemeldet wurde. Dieses Verfahren ist für Blockstellen sinnvoll, wenn der Zug die Blockstelle passiert und so beide Blockabschnitte belegt. Der weiterzumeldende Zug muß sich im abgehenden Streckengleis des “to:” Nachbar befinden. Die Funktion ist nur auf zweigleisigen Strecken möglich.

Request:

BlockingBack = "blocking back! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;

Response:

SendBlockingBack = "blocking back performed" ;

Fehler:

FromError = "From-neighbor not found:" Nachbar ;
ToError = "To-neighbor not found:" Nachbar ;
TrainError = "Train not found or not the same:" Zug ;
BlockingBackFailed = "Blocking back not be executed for:" Zug ;

Emitteln der Gleisbelegung

Enthalten ab Version 1.0 bis Version …

Es wird die Belegung der Betriebsstellengleise mit Zügen geliefert. Alle Gleise der Betriebsstelle werden im Response mitgeliefert. Nicht belegte Gleise enthalten einen Leerstring als Belegung.

Request:

GetBsBelegung = "assignment of station" ;

Response:

SendBsBelegung = "assignment of:" Nachbar "is" Gleisbelegungen ;
Gleisbelegungen = {Gleisbelegung} ;
Gleisbelegung = Gleisnr ":" Zug ";" ;

Gleis der Betriebsstelle belegen

Enthalten ab Version 1.2 bis Version …

Es wird das übergebene Betriebsstellengleis mit der übergebenen Zugnummer belegt. Das Gleis darf nicht belegt sein. Existiert der Zug nicht im Fahrplan, so wird ein Zug erzeugt, ohne ihn in den Fahrplan aufzunehmen. Er erscheint demzufolge nicht in der BFO.

Request:

CreateTrain = "create train" Zug "in track" Gleisnr ";" ;

Response:

SendCreateTrain = "Create train for track" ;

Fehler:

TrackError = "Track not found: " Gleisnr ;
TrackNotEmptyError = "Track not empty" ;
CreateTrackCmdFailedError = "Create train for track failed" ;

Zug annehmen

Enthalten ab Version 1.2 bis Version …

Es wird für den übergebenen Nachbarn der auf dem ankommenden Gleis befindliche Zug angenommen. Das Streckengleis darf nicht belegt sein. Bei einer eingleisigen Strecke, bzw bei Gegengleisverkehr darf ein entgegengesetzt gemeldeter Zug nicht angenommen sein.

Request:

AcceptingFrom = "accepting! from:" Nachbar ";" ;

Response:

AcceptingFromPerformed = "accepting performed" ;

Fehler:

AcceptingFromError = "accepting not be executed for: " Nachbar ;

Zug im Gegengleis annehmen

Enthalten ab Version 1.2 bis Version …

Es wird für den übergebenen Nachbarn der auf dem ankommenden Gegengleis befindliche Zug angenommen. Das Streckengleis darf nicht belegt sein. Ein entgegengesetzt gemeldeter Zug nicht angenommen sein.

Request:

AcceptingGglFrom = "accepting in oposite track! from:" Nachbar ";" ;

Response:

AcceptingFromGglPerformed = "accepting in oposite track performed" ;

Fehler:

AcceptingFromError = "accepting in oposite track not be executed for: " Nachbar ;

Syntaxzusammenfassung

Request = "handshake" Minversion Maxversion"; request" Requestcontent ";" ;

Minversion = "minversion:" Versionnum ;
Maxversion = "maxversion:" Versionnum ;
Versionnum = Ziffer {Ziffer} "." Ziffer {Ziffer} ;
Ziffer = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

Nachbar = String - Worttrenner ;
Zug = String ;
Gleisnr = String - Worttrenner ;
String = ? beliebiger Text ? ;
Worttrenner = ( " " | "\t" ) ;

Requestcontent = GetBelegung | GetBsBelegung | Crossing | Occupying | 
                 BlockingBack | Offering | CreateTrain | AcceptingFrom |
                 AcceptingGglFrom;

GetBelegung = "occupation of:" Nachbar ;
GetBsBelegung = "assignment of station" ;
Crossing = "crossing! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;
Occupying = "occupy! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;
BlockingBack = "blocking back! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;
Offering = "offering! of:" Zug "from:" Nachbar "to:" Nachbar ";" ;
CreateTrain = "create train" Zug "in track " Gleisnr ";" ;
AcceptingFrom  = "accepting! from:" Nachbar ";" ;`
AcceptingGglFrom = "accepting in oposite track! from:" Nachbar ";" ;

Response = ErrorMsg | SendBelegung | SendBsBelegung | SendCrossing | 
           SendOccupying | SendOffering | SendBlockingBack | SendCreateTrain |
           AcceptingFromPerformed | AcceptingFromGglPerformed ;

SendBelegung = "occupation of:" Nachbar "is" Belegungen ";" ;
Belegungen = Belegung [";" Belegung] [";" Belegung] [";" Belegung] ;
Belegung = Arriving | Departing | Announced | Announcing ;
Arriving = "arriving:" Zug ":" ZugState ;
Departing = "departing:" Zug ":" ZugState ;
Announced = "announced:" Zug ":" ZugState ;
Announcing = "announcing:" Zug ":" ZugState ;
ZugState = "OFFERED_IN" | "ACCEPTED_IN" | "AWAY_IN" | 
           "OFFERED_OUT" | "ACCEPTED_OUT" | "AWAY_OUT" | 
           "AWAY_IN_AND_OFFERED_OUT" | "AWAY_IN_AND_ACCEPTED_OUT" | 
           "AWAY_OUT_AND_OFFERED_IN" | "AWAY_OUT_AND_ACCEPTED_IN" ;

SendCrossing = "crossing performed" ;
SendOccupying = "occupying performed" ;
SendBlockingBack = "blocking back performed" ;
SendOffering = "offering performed" ; //ab Version 1.1, wenn Ziel-Gleis besetzt und Voranmeldung frei.

SendBsBelegung = "assignment of:" Nachbar "is" Gleisbelegungen ;
Gleisbelegungen = {Gleisbelegung} ;
Gleisbelegung = Gleisnr ":" Zug ";" ;

SendCreateTrain = "Create train for track" ;
AcceptingFromPerformed = "accepting performed" ;
AcceptingFromGglPerformed = "accepting in oposite track performed" ;

ErrorMsg = "sorry message:" Error ;
Error = VersionError | ProtocolError | FromError | ToError |
        NeighborError | TrainError | CrossingFailed | OccupyingFailed | 
        BlockingBackFailed | OfferingFailed | TrackError | TrackNotEmptyError |
        CreateTrackCmdFailedError | AcceptingFromError ;
VersionError = "version not available, my version is:" Versionnum ;
ProtocolError = "communication protokoll error of:" Request ;
FromError = "From-neighbor not found:" Nachbar ;
ToError = "To-neighbor not found:" Nachbar ;
NeighborError = "Neighbor not found:" Nachbar ;
TrainError = "Train not found or not the same:" Zug ;
CrossingFailed = "Crossing not be executed for:" Zug ;
OccupyingFailed = "Occupying not be executed for:" Zug ;
BlockingBackFailed = "Blocking back not be executed for:" Zug ;
OfferingFailed = "Offering not be executed for:" Zug ;
TrackError = "Track not found: " Gleis ;
TrackNotEmptyError = "Track not empty" ;
CreateTrackCmdFailedError = "Create train for track failed" ;
AcceptingFromError = "accepting not be executed for: " Nachbar ;
AcceptingFromError = "accepting in oposite track not be executed for: " Nachbar ;

English