API Standard
Baustelle
Interne Kommunikation mit dem Interface in Railware
Diese Beschreibung richtet sich an erfahrene Softwareentwickler, die mit eigenen Applikationen auf das Railware Interface zugreifen möchten.
Wir können keinen Support für die hier beschriebenen Funktionen leisten und keine Anfragen über deren richtige Verwendung beantworten. Einzelne Angaben der Spezifikation können ohne Angabe von Gründen geändert werden.
In Railware kommunizieren alle Gleisbilder, Fahrpulte und andere Programme mit den Digitalsystemen über das Programm 'Inter.exe'.
In Inter.exe befinden sich Protokollimplementationen der unterstützten Digitalsysteme, das Prioritätensystem 'RAILstack', die Funktionen zur Lok- und Zugsteuerung sowie ein Logbuch.
Es wickelt selbsttätig alle Beschleunigungs- oder Bremsoperationen der Züge ab.
Im folgenden wird 'Inter.exe' als Interface bezeichnet.
Alle Programme senden und empfangen Informationen zum und vom Interface über das Windows Nachrichtensystem.
Die Arbeitsweise des Windows Nachrichtensystems sowie der Funktionen 'SendMessage', 'PostMessage', 'RegisterWindowsMessage' und 'WndProc# oder 'Wnd_Proc' werden als bekannt vorausgesetzt.
Wegen der einfachen Struktur der Kommunikation haben wir auf die Bereitstellung eines Tools zur Ansteuerung des Interface verzichtet.
Die dargestellten Beispiele sind in Delphi kodiert, lassen sich aber leicht in andere Sprachen umsetzen, da nur wenige Funktionen der WinAPI verwendet werden. Lesen Sie dazu in den entsprechenden Infos im Windows Platform SDK'.
Die selbsterstellte Applikation kann sich in einem eigenen Ordner befinden.
Eigene Nachrichten in Windows anmelden
Zu Verwendung eigener Nachrichten müssen diese mit einem eindeutigen Namen spezifiziert und ein Handle angefordert werden.
wmdhEinNachrichtenHandle := RegisterWindowMessage ('MessageName');Es können folgende Nachrichten von Ihrer Applikation angemeldet werden:
wmInterface := RegisterWindowMessage ('dhInterface');
wmInsMelder := RegisterWindowMessage ('dhInsMelder');
wmSetBelegt := RegisterWindowMessage ('dhSetBelegt');
wmSignal := RegisterWindowMessage ('dhSignal');
wmWeiche := RegisterWindowMessage ('dhWeiche');
wmKuppler := RegisterWindowMessage ('dhKuppler');
wmDelMelder := RegisterWindowMessage ('dhDelMelder');
wmGetAllMelder := RegisterWindowMessage ('dhGetAllMelder');
wmLok := RegisterWindowMessage ('dhLok');
wmLokUpdate := RegisterWindowMessage ('dhLokUpdate');
wmQuitInter := RegisterWindowMessage ('dhQuitInter');
wmGetFahrNum := RegisterWindowMessage ('dhGetFahrNum');
wmGetGleisNum := RegisterWindowMessage ('dhGetGleisNum');
wmGetDrehNum := RegisterWindowMessage ('dhGetDrehNum');
wmReReadParam := RegisterWindowMessage ('dhReReadParam');
wmDrehkranFunktion := RegisterWindowMessage ('dhDrehkranFunktion');
wmDrehkran := RegisterWindowMessage ('dhDrehkran');
wmFunktion := RegisterWindowMessage ('dhFunktion');
wmSetDecoder := RegisterWindowMessage ('dhSetDecoder');
wmSetLok := RegisterWindowMessage ('dhSetLok');
wmZugHelmoPos := RegisterWindowMessage ('dhZugHelmoPos');
wmUhrMinute := RegisterWindowMessage ('dhUhrMinute');
wmZugSetLokDaten := RegisterWindowMessage ('dhZugSetLokDaten');
wmZugOpen := RegisterWindowMessage ('dhZugOpen');
wmZugClose := RegisterWindowMessage ('dhZugSetZugClose');
wmZugLokSet := RegisterWindowMessage ('dhZugLokSet');
wmZugLokAdd := RegisterWindowMessage ('dhZugLokAdd');
wmZugLokDel := RegisterWindowMessage ('dhZugLokDel');
wmZugSpeed := RegisterWindowMessage ('dhZugZugSpeed');
wmdhZugFunktion := RegisterWindowMessage ('dhZugZugFunktion');
wmdhZugHalt := RegisterWindowMessage ('dhZugHalt');
wmdhZugNothalt := RegisterWindowMessage ('dhZugNothalt');Jedes Programm sollte nur benötigte Meldungen registrieren.
Falls Ihr Programm selbst Nachrichten definiert, sollten keine Bezeichner verwendet werden, die mit ‚wmdh’ beginnen, da Railware weitere hier nicht dokumentierte Nachrichten verwendet.
Nachricht an Interface senden
Senden von Informationen an das Interface erfolgt mit ‚SendMessageÂ’, in bestimmten Fällen auch mit ‚PostMessageÂ’.
Je nach Informationsumfang werden Informationen in TMessage oder in selbstdefinierten Records übertragen. In vielen Fällen reicht die Verwendung von wParam und lParam bzw. wParamHi, wParamLo, lParamHi und lParamLo.
Ein Beispiel:
VAR Msg : TMessage; BEGIN wParam := EineZahl; lParam := EineAndereZahl; SendMessage (ZielWnd,wmEineMessage,wParam,lParam); END;
Nachricht von Interface empfangen
Hierzu muss die Applikation sich in das Nachrichtensystem der Applikation oder eines Fensters (in der Regel das Hauptfenster) einklinken.
In Delphi geschieht dies im Formular durch überschreiben der vorhandenen WndProc::
procedure WndProc (var Msg : TMessage); override;
Neuer Nachrichtenhandler:
PROCEDURE TUserForm.WndProc (var Msg : TMessage);
BEGIN
...
//Abfangen einer Nachricht
If Msg.Msg = wmSignal then
SignalNachrichtVerarbeiten (Msg); //Eigene Behandlungsroutine starten
...
//weitere Nachrichten abfangen
...
// Nachrichten an alten Handler weiterleiten, sonst Hangup.......
Inherited WndProc (Msg);
END;Die Verarbeitung von eigenen Nachrichten sollte so schnell wie möglich geschehen, um Windows nicht unnötig zu verlangsamen. Beachten Sie die Windows Dokumentation.
Interfaceprogramm starten
Starten des Interface 'Inter.exe' erfolgt über die folgende Funktion:
VAR
InterfaceWnd : HWnd; //Wird für alle Aufrufe von SendMessage benötigt
procedure StarteInterface;
begin
//Interface Window finden
InterfaceWnd := FindWindow ('TInterfaceForm','Interface');
//Interface starten, falls nicht gefunden
if (InterfaceWnd = 0) and
(WinExec ('Inter.exe',sw_Normal) <> Error_File_Not_Found) then
InterfaceWnd := FindWindow ('TInterfaceForm','Interface');
end;Falls sich Ihre Applikation in einen anderen Ordner befindet, muss der Pfad zu Inter.exe zusätzlich angegeben werden. Später ist die Angabe von Pfaden nicht erforderlich.
Beachten Sie, dass das Starten eines Digitalsystems evtl. etwas länger dauert. In diesem Fall liefert FindWindow? bereits das FensterHandle?, aber das System ist zu diesem Zeitpunkt noch nicht betriebsbereit. Hier muss evtl. eine Zeitverzögerung eingebaut werden.
Interfaceprogramm beenden
Beendet die Kommunikation mit den Digitalsystemen, schließt die Schnittstellen und beendet das Interfaceprogramm. Alle verwendeten Speicherstrukturen werden aufgelöst. Die Zug- und Lokdaten werden im Datenbanksystem gespeichert.
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
Handle ist das Fensterhandle des aufrufenden Programms.
PostMessage (InterfaceWnd,wmQuitInter,Handle,0);
Belegtmelder anmelden
Das Interface meldet Belegtmeldungen immer nur an Programme und Fenster, die dies explizit angefordert haben. Darüber wird bei bestimmten Digitalsystemen automatisch die maximal zu lesenden Bausteine ermittelt.
Jeder Melderanschluss muss einzeln angemeldet werden:
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
Handle ist das Fensterhandle des aufrufenden Programms.
VAR Msg : TMessage; BEGIN lParamHi := Baustein; //Die Nummer (Adresse) des Meldebausteins lParamLo := Port; //Der Anschluss am Baustein SendMessage (InterfaceWnd,wmInsMelder,Handle,lParam); END;
Belegtmeldung empfangen
Es erfolgt einmalig die Übertragung einer Änderung eines Belegtmelders; unabhängig vom Typ des Digitalsystems. Eventuell müssen beim Start eines Programmes alle Belegtmeldungen explizit angefordert werden (siehe: Alle Belegtmeldungen anfordern).
Empfangene Nachricht: wmSetBelegt
Der Aufbau der Nachricht ist:
Msg.lParamHi = Melder //Nummer des Belegtmeldebausteins Msg.lParamLo = Kontakt //Anschluss des Bausteins Msg.wParamHi = Besetzt //Belegtmeldung 1=Besetzt, 0=Frei
Alle Belegtmeldungen anfordern
Das Interface wird aufgefordert, alle angemeldeten Belegtmelder neu zu übertragen. Dies kann nur ausgeführt werden, wenn es vom Digitalsystem unterstützt wird. Andernfalls werden alle gespeicherten Belegtzustände übertragen.
Die aktuellen Werte werden an alle geöffneten Fenster gesendet.
Da die Abarbeitung längere Zeit in Anspruch nehmen kann, empfiehlt sich die Verwendung von ‚PostMessageÂ’.
Beispiel:
PostMessage (InterfaceWnd,wmGetAllMelder,0,0);
Schaltdecoder stellen (Weichen/Signale etc.)
Stellt einen Decoder in die definierte Stellung. Es erfolgt keine Prüfung der momentanen Stellung. Doppelkommandos müssen vom aufrufenden Programm abgefangen werden.
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
Handle ist das Fensterhandle des aufrufenden Programms.
aDauer bezeichnet die Schaltdauer: 0=kurz, 1=mittel, 2=lang. Die Werte dafür sind in den Interfaceoptionen hinterlegt.
aAdresse ist die zu schaltende Digitaladresse
aParam ist die Stellung. Sie wird aus einem Array ermittelt. Zulässig sind sWn1,sWn2, sHp0, sHp1,sHp2,sVr0,sVr1,sVr2,sSh0,sSh1 sowie sEin und sAus. Der Aufbau von TSignal wird im Anhang beschrieben.
PROCEDURE ifSendDecoder (aDauer : Integer; aAdresse : Word; aParam : TSignal); VAR Msg : TMessage; BEGIN Msg.lParamLo := Ord (aParam); Msg.lParamHi := aDauer; SendMessage (InterfaceWnd,wmWeiche,aAdresse,Msg.lParam); end;
Decoderstellung empfangen
Falls vom Digitalsystem unterstützt, erfolgt die Rückmeldung einer Digitaladresse, die am System geändert wurden, durch diese Nachricht.
Empfangene Nachricht: wmSetDecoder
Msg.wParam = Adresse //Adresse des Decoders Msg.lParam = Stellung //Neue Stellung: 0=Gerade oder Halt, 1=Abzweig oder Fahrt
Lok steuern
Senden von Lokinformationen an das Interface. Dazu wird ein Record verwendet.
Definition von TLokMessage:
TLokMessage = packed record
Msg : Cardinal;
case Integer of
0 : (Speed : Byte; //Fahrstufe
Direct : Byte; //Richtung: 1=Vorwärts, 0=Rückwärts
Funktion : Byte; //Funktion: 0=Aus, 1=Ein
F1F8 : Byte; //Funktionen F0 bis F8
Addr : Word; //Digitaladresse
Reserve : Byte; //F1F4 senden: = 1
//IB: NoForce for Functions = 2
//Priorität: Bremsvorgang = 4
//Lenz3: Funktionen senden = 8
ManufTyp : Byte; //Hersteller: 0=Mot,1=DCC,2=Zimo
//Fahrstufen: Bit0-3 =
// 0=14,1=27,2=28,3=31,4=127}
ResultAL : Word;
ResultAH : Word);
1 : (wParam : LongInt;
lParam : Longint;
Result : Longint);
2 : (WParamLo : Word;
WParamHi : Word;
LParamLo : Word;
LParamHi : Word;
ResultLo : Word;
ResultHi : Word);
end;Beispiel:
procedure SendLokCommand (aLok, aSpeed : Word; aVorwaerts, aFunktion : Boolean; aF1F8 : Byte; aFahrstufen : Integer; aHigh : Boolean);
var
LokMsg : TLokMessage;
Begin
//Adresse und Geschwindigkeit
LokMsg.Speed := aSpeed;
LokMsg.Addr := aLok;
//Richtung
if aVorwaerts then
LokMsg.Direct := 1
else
LokMsg.Direct := 0;
//Funktion 0
if aFunktion then
LokMsg.Funktion := $01
else
LokMsg.Funktion := 0;
//Andere Funktionen
LokMsg.F1F8 := aF1F8;
//Priorität nur 1 setzen, wenn Lok abgebremst werden soll !!!!
if aHigh then
LokMsg.Reserve := LokMsg.Reserve or $04;
case aFahrStufen of
14,15 : LokMsg.ManufTyp := 0;
27 : LokMsg.ManufTyp := 1;
28 : LokMsg.ManufTyp := 2;
31 : LokMsg.ManufTyp := 3;
128 : LokMsg.ManufTyp := 4;
end;
SendMessage (InterfaceWnd,wmLok,LokMsg.wParam,LokMsg.lParam);
end;
Lokinformation empfangen
Falls vom Digitalsystem unterstützt, erfolgt die Rückmeldung von Lokinformationen, die am System geändert wurden, durch diese Nachricht.
Empfangene Nachricht: wmSetLok
Zur Auswertung der in Msg empfangenen Informationen muss ein Typecast von Msg in LokMsg? erfolgen. Die Strukur von LokMsg? ist bei ‚Lok steuern’ beschrieben.
VAR LokMsg absolute Msg;
Zugidentifikation anmelden
Meldet ein Lesegerät eines beliebigen Herstellers am Interface an.
Jeder Empfänger muss einzeln angemeldet werden, unabhängig davon, ob es sich um ein externes System oder ein im Digitalsystem integriertes handelt.
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
Handle ist das Fensterhandle des aufrufenden Programms.
LeseAdresse? ist die Adresse des Transponding Empfängers.
VAR Msg : Tmessage; BEGIN lParamHi := Baustein; //Die Nummer des Meldebausteins lParamLo := Port; //Der Anschluss des Bausteins SendMessage (InterfaceWnd,wmInsMelder,Handle,LeseAdresse); END;
Zugidentifikation empfangen
Falls ein Transpondingsystem konfiguriert wurde, erfolgt die Rückmeldung von Lok- oder Zugpositionen über diese Nachricht. Derzeit ist nur ‚wParamLoÂ’ spezifiziert; andere Werte sind nicht zu verwenden und müssen zwingend 0 sein.
Empfangene Nachricht: wmZugHelmoPos
Lo (Msg.wParamLo) = Adresse //Adresse des Empfängers
Hi (Msg.lParamLo) = Transponder //Nummer des empfangenen Transponder
Hinweis: Diese Spezifikation ist vorläufig und wird in kürze geändert, da verschiedene Hersteller neue Techniken vorbereiten, deren Unterstützung in Vorbereitung ist.
Kommandos zur Zugsteuerung
Die folgenden Funktionen sind implementiert.
Es ist ein Handle für Züge und/oder Lokomotiven erforderlich. Diese Handles müssen aus der Datenbank entnommen werden. Da kein direkter Zugriff auf die Datenbank besteht, wird eine DLL zur Verfügung gestellt.
Ermitteln von Zug- und Loknamen und deren Handles
Die folgenden Funktionen befinden sich in der ‚rwAPI.dll’. Diese DLL muss sich im gleichen Ordner befinden, in dem auch die Datenbanken (*.dat,*.idx,*.blb) sind. Beim starten der DLL muss evtl. der Pfad angegeben werden.
Function GetFirstLoco : ShortString; Function GetNextLoco : ShortString; Function GetFirstTrain : ShortString; Function GetNextTrain : ShortString; Function GetLocoHandle (Loco : ShortString) : Integer; Function GetTrainHandle (Loco : ShortString) : Integer;
Die DLL und ein Demoprogramm ‘TestAPI.exe’ mit Source befindet sich in LINKLINKLINK ‚RailwareAPI.zip’.
Zug anmelden
Erzeugt die benötigten Daten und Tabellen für einen Zug und startet einen Thread, der die Kontrolle übernimmt. Es wird die gespeicherte Lok verwendet.
Das Programm muss sicherstellen, das die Funktion nur einmal für die zu steuernden Züge aufgerufen wird.
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
ZugNummer? ist die Referenznummer des neuen Zuges.
SendMessage (InterfaceWnd,wmZugOpen,ZugNummer,0);
Zug löschen
Speichert alle Daten des angegebenen Zuges und entfernt alle Strukturen aus dem Speicher.
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
ZugNummer? ist die Referenznummer des zu löschenden Zuges.
SendMessage (InterfaceWnd,wmZugClose,ZugNummer,0);
Zug Geschwindigkeit setzen
Beschleunigt oder bremst einen Zug auf eine neue Geschwindigkeit.
Verwendet einen eigenen Nachrichtentyp:
VAR
TZugMessage = packed record
Msg : Cardinal;
case Integer of
0 : (Zug : Word; //Zugnummer aus Datenbank
Speed : Word; //Neue Speed in KmH
Typ : Byte; //0=km/h 1=Stufe
Reserve : Byte; //muss 0 sein
Pause : Word; //Verzögerung um x Millisekunden
ResultAL : Word;
ResultAH : Word);
1 : (wParam : LongInt;
lParam : Longint;
Result : Longint);
2 : (WParamLo : Word;
WParamHi : Word;
LParamLo : Word;
LParamHi : Word;
ResultLo : Word;
ResultHi : Word);
end;Beispiel:
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
VAR ZugMsg : TZugMessage; BEGIN ... ZugMsg.Zug := ZugNummer; //Setzen der Zugnummer ZugMsg.Typ := 0; //Angabe in KmH ZugMsg.Speed := KmH; //Neue Geschwindigkeit ZugMsg.Pause := 0; //Normal: sofort ausführen SendMessage (InterfaceWnd,wmZugSpeed,ZugMsg.wParam,ZugMsg.lParam); ... END;
Zug Anhalten
Der angegebene Zug wird automatisch angehalten. Das Interface berechnet den Bremsweg und steuert den Zug in Abhängigkeit der Lokparameter selbsttätig.
var
TZugHaltMessage = packed record
Msg : Cardinal;
case Integer of
0 : (Zug : Word; //Zugnummer aus Datenbank
Bremsweg : Word; //Bremsweg (Ausrollweg) in cm
Melder : Byte; //unbenutzt
Port : Byte; //unbenutzt
Back : Byte; //muss 0 sein
Reserve : Byte; //muss 0 sein
ResultAL : Word;
ResultAH : Word);
1 : (wParam : LongInt;
lParam : Longint;
Result : Longint);
2 : (WParamLo : Word;
WParamHi : Word;
LParamLo : Word;
LParamHi : Word;
ResultLo : Word;
ResultHi : Word);
end;Dazu ein Beispiel:
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
VAR ZugMsg : TZugHaltMessage; BEGIN ... ZugMsg.Zug := ZugNummer; //Setzen der Zugnummer ZugMsg.Bremsweg := Bemsweg; //Gewünschter Bremsweg in cm ZugMsg.Melder := 0; //Wird nicht benötigt ZugMsg.Port := 0; // ... ZugMsg.Back := 0; // ... ZugMsg.Reserve := 0; //Muss 0 sein SendMessage (InterfaceWnd,wmZugHalt,ZugMsg.wParam,ZugMsg.lParam); ... END;
Zug Nothalt
Es wird ein sofortiger Nothalt für den Zug ausgelöst. Alle älteren Kommandos im RAILstack werden abgebrochen. Unter Nothalt wird der in den Lokparametern festgelegte Typ verwendet.
Dazu ein Beispiel:
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
ZugNummer? ist die Referenznummer des anzuhaltenden Zuges.
BEGIN ... //Zug sofort durch anhalten SendMessage (InterfaceWnd,wmZugNothalt,ZugNummer,0); ... END;
Zug Lok einsetzen oder entfernen
Verwendet eine neue Lokomotive für den Zug oder entfernt sie aus Mehrfachtraktion
Es können bis zu 3 Lokomotiven gekoppelt sein, die in echter Mehrfachtraktion gefahren werden. Dazu werden Lokgeschwindigkeiten individuell aus den Tabellen ermittelt. Bremsvorgänge erfolgen nach einem in Railware beschriebenen Verfahren, falls die Bremswege oder Decodertypen unterschiedlich sind.
TZugLoksMessage = packed record
Msg : Cardinal;
case Integer of
0 : (Zug : Word; //Zugnummer
Lok : Word; //Loknummer der neuen Lok
LokPos : Byte; //Lok 1..3
Mode : Byte; //1=Neu/Wechsel 2=Entfernen
Reserve1 : Byte; //muss 0 sein !!
Reserve2 : Byte; //muss 0 sein !!
ResultAL : Word;
ResultAH : Word);
1 : (wParam : LongInt;
lParam : Longint;
Result : Longint);
2 : (WParamLo : Word;
WParamHi : Word;
LParamLo : Word;
LParamHi : Word;
ResultLo : Word;
ResultHi : Word);
end;
__Zug Lokfunktionen setzen_
Setzt Decoderfunktionen oder Fahrtrichtung für alle an den Zug gekuppelten Lokomotiven.
Definiert und verwendet eine eigene Nachricht:
var
TZugFunktionMessage = packed record
Msg : Cardinal;
0 : (Zug : Word; //Zugnummer aus Datenbank
Direct : Byte; //1-0 = Direction 1=Vorwärts
Funktion : Byte; //1-0 = Funktion
F1F8 : Byte; //7-0 = Funktionen F0 bis F8
Pause : Byte; //Bewirkt Verzögerung um x Sekunden
IgnoreF : Byte; //muss 0 sein, 1=Nur Rtg Wechsel
Reserve2 : Byte; //muss 0 sein
ResultAL : Word;
ResultAH : Word);
1 : (wParam : LongInt;
lParam : Longint;
Result : Longint);
2 : (WParamLo : Word;
WParamHi : Word;
LParamLo : Word;
LParamHi : Word;
ResultLo : Word;
ResultHi : Word);
end;Alle Informationen des Records werden ausgewertet.
Dazu ein Beispiel:
InterfaceWnd? ist das beim Start ermittelte FensterHandle? des Interfaces.
VAR ZugMsg : TZugFunktionMessage; BEGIN ... ZugMsg.Zug := ZugNummer; //Setzen der Zugnummer ZugMsg.Direct := 1; //Fahre vorwärts ZugMsg.Funktion := 0; //Funktion 0 ausschalten ZugMsg.F1F8 := 8; //Funktion F4 einschalten ZugMsg.Pause := 0; //Normalerweise 0 ZugMsg.IgnoreF := 0; //Muss 0 sein !! ZugMsg.Reserve2 := 0; //Muss 0 sein !! SendMessage (InterfaceWnd,wmZugFunktion,ZugMsg.wParam,ZugMsg.lParam); ... END;
Kommunikation zwischen Gleisbildern und eigenen Applikationen
Beschreibung zu einem späteren Zeitpunkt.
Anhang
Zur Steuerung von Schaltdecodern ist diese Definition erforderlich, deren Einträge zwingend in dieser Reihenfolge erfolgen müssen.
Davon dürfen nur die folgenden verwendet werden:
sHp0,sHp1,sHp2,sVr0,sVr1,sVr2,sSh0,sSh1,sWn1,sWn2,sEin,sAus
Senden der nicht freigegebenen Werte kann unabsehbare Folgen haben, da sie lediglich für interne Railware Kommunikation IN Gleisbildern verwendet werden.
TYPE
TSignal = (sNichts,sHp0,sHp1,sHp2,sVr0,sVr1,sVr2,sSh0,sSh1,sSh00,sWn1,sWn2,sWn3,sVr00,
iLok,iKupplerRot,iKupplerGruen,iMelder,iDrehkran,iFunktion,
iDrehL,iDrehR,iDrehOn,iDrehOff,iDrehRt,iDrehGn,iDrehX,sEin,sAus,
sDkw1,sDkw2,sDkw3,sDkw4,sDkw5,sDkw6);
Kategorie: API
Zu dieser Seite haben beigesteuert: admin
.
Page last modified on Dienstag 03 Juli, 2007 16:50CEST by admin.
Der Inhalt dieser Seite unterliegt folgenden Lizenzbestimmungen: Copyright.
