Drucken

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.

Suche

in: