Steuerung der Eisenbahnanlage mit Echtzeitbetriebssystemen

Am Beispiel von QNX und DCL Rail

Falko Menge, Johannes Passing und Michael Perscheid

Agenda

Problemstellung

Performanz

Existierende Implementierung

Lösungsansätze

Betriebssystem

Steuerungs-Software

Echtzeit-Betriebssysteme

QNX

QNX - Architektur

QNX - Zusammenfassung

Projektumgebung

Voraussetzungen

Organisation

Projektverlauf

Schichtenarchitektur



Layer 0 - Hardwareabstraktion

Aufgaben

Layer 0 - Arbeitsweise

Layer 0 - Implementierung

Layer 0 - API


    typedef void ( *STATUS_CALLBACK )(
        IN STATUS newStatus,
        IN STATUS oldStatus );
		
    RCSTATUS RailInitialize(
        IN DWORD dwIoAddress,
        IN DWORD dwReserved,
        IN DWORD dwMaxPollInterval,
        IN DWORD dwS88count,
        IN STATUS_CALLBACK pfnStatusCallback );

    RCSTATUS RailFinalize();

    RCSTATUS RailEnqueueCommand(
        IN DWORD dwCommand,
        IN BOOL fPutInFront,
        IN OPTIONAL COMMAND_CALLBACK pfn,
        IN OPTIONAL DWORD dwCallbackCookie );

    RCSTATUS RailClearQueue( 
        OUT OPTIONAL DWORD *pdwElemCleared );

Layer 0 - Beispiel


    // Initialisierung und Konfiguration
    RCSTATUS rcs = RailInitialize( 
        COM1_ADDRESS,            // I/O-Adresse des COM-Port (COM1) 
        0,                       // Reserviert
        100,                     // Max. Zeit zw. 2 Status-Polls
        S88COUNT,                // # S88-Module auf Anlage
        StatusCallback );        // Callback-Funktionspointer
    if ( RCSTATUS_SUCCESS != rcs ) { /* ... */ }
	
    // Weichenstell-Befehl absetzen
    rcs = RailEnqueueCommand( 
        COMMAND_SWITCH_CURVE(1), // Befehl - Weiche 1 stellen 
        FALSE,                   // ans Ende der Queue
        NULL,                    // kein Callback erwuenscht
        0 );                     // kein Callback erwuenscht
    if ( RCSTATUS_SUCCESS != rcs ) { /* ... */ }
	
    // Ressourcen freigeben
    rcs = RailFinalize();
    if ( RCSTATUS_SUCCESS != rcs ) { /* ... */ }

Layer 1 - Programmierschnittstelle (API)


Layer 1 - Programmierschnittstelle (API)


    bool initDCLRail(
    	unsigned long dwS88count,
    	DCLRAIL_STATUS_CALLBACK pfnDCLRailStatusCallback,
    	unsigned long dwMaxPollInterval,
    	unsigned long dwIoAddress);

    bool closeDCLRail();

    // ...

    bool setTrain(
    	int trainID,
    	int speed,
    	bool function_on,
    	int priority);

    bool setElement(
        int elementid,
    	bool straightOrGreen,
    	int priority);

Layer 1 - Beispiel


    // Initialisierung und Konfiguration
    if ( ! initDCLRail(
        4,                       // Anzahl der S88-Module
        StatusCallback           // Callback-Funktionspointer
        100,                     // Maximale Zeit zwischen 2 Status-Polls (ms)
        COM1_ADDRESS             // I/O-Adresse des COM-Ports (COM1) 
        ) )
    { /* ... */ }
	
    // Befehl an einen Zug absetzen
    if ( ! setTrain( 1, 7 ) )
    { /* ... */ }
	
    // Ressourcen freigeben
    if ( ! closeDCLRail() )
    { /* ... */ }

Layer 2 - Interaktive Shell


Performance-Vergleich

Ausblick


Literaturempfehlungen


zu QNX:


zum Projekt: