qrailway 0.9

Kapitel 4.e. Signalregeln

Die Regeln für die Steuerung der Signale werden in der Tabelle signalrules abgelegt. Die Signale, d.h. Position im Gleisplan (x,y), Farbe (farbe: gr(ün), ge(lb), ro(t)), Größe (groesse) auf dem Gleisplan sowie Blinkstatus (blink) sind in der Tabelle signals abgelegt. Die Verbindung mit der Hardware erfolgt über die Tabelle hardware. Bei der Ansteuerung wird jedes Licht eines Signals als ein eigenes Signal betrachtet. Insofern kann ein Signal nur die Zustände an oder aus haben.

Für die Ermittlung, welchen Zustand ein Signal hat, werden bis zu maxregel Regeln mit "und" verknüpft und das logische Ergebnis daraus ("wahr" bzw. "falsch") angezeigt ("wahr" bedeutet "an", "falsch" bedeutet "aus"). Der initiale Zustand wird im Feld an der Tabelle signals abgelegt.

Die Auswertung einer Signalregel erfolgt mit jeweils zwei Ganzzahlen. Die Tabelle signalrules legt neben ID-Informationen, wie Signalregel-ID (nur als primary key: keyid), der Regel-ID für das Signal (ruleid, darf je sigid nur einmal auftreten), die Signal-ID (sigid, wird auch in den Tabellen hardware und signals zur Identifikation genutzt), auch die Kriterien für die Verarbeitung fest. Die Verarbeitung ist unabhängig davon, woher die beiden Ganzzahlen stammen, die für die Verarbeitung genutzt werden. Bezeichnen a1 und a2 die beiden Ganzzahlen, so erfolgt eine Verarbeitung der Signalregel nur dann, wenn

\[ \left((\mbox{mini1}\leq \mbox{a1}\leq \mbox{maxi1}) \land \neg \mbox{nicht1}\right) \lor \left(\neg(\mbox{mini1}\leq \mbox{a1}\leq \mbox{maxi1}) \land \mbox{nicht1}\right)\lor (\mbox{maxi1}<0). \]

In diesem Fall wird der zweite Teil der Regel geprüft:

\[ \mbox{sig2} = \left((\mbox{mini2}\leq \mbox{a2}\leq \mbox{maxi2}) \land \neg \mbox{nicht2}\right) \lor \left(\neg(\mbox{mini2}\leq \mbox{a2}\leq \mbox{maxi2}) \land \mbox{nicht2}\right)\lor (\mbox{maxi2}<0). \]

\[ \mbox{sig} = \left(\mbox{sig2} \land \neg \mbox{nicht}\right) \lor \left(\neg(\mbox{sig2}) \land \mbox{nicht}\right) \]

Die doppelte Möglichkeit einer Negation von sig2 ueber nicht2 und nicht ist historisch bedingt. Fuer das Projekt ist deshalb nicht stets 0 (FALSCH). Auch die Negation der Verarbeitungsbedingung ueber nicht1 war fuer das Projekt nicht noetig.

Ist sig WAHR und trifft dies auch auf alle anderen diesem Signal zugeordneten Regeln zu, so leuchtet das Signal (sigid). Die Datenquelle wird durch das Feld crit festgelegt. Die beiden Felder critext1 und critext2 definieren die Datenquelle genauer. Mehr dazu in den folgenden Abschnitten. Nicht verwendete critext1, critext2, a1 und a2 werden auf -1 gesetzt.

Die Vorgehensweise scheint komplex, allerdings lassen sich durch diese logische Verknüpfung der einzelnen Regeln sowie die vielfältigen Invertierungsregeln auch komplexeste Situation für die Schaltung eines Signals formulieren. Beispiele finden sich in der Datenbank für das Projekt.

BAHNHOF

Die Signalquelle BAHNHOF verknüpft den unter critext1 angegebenen Bahnhof mit dem Signal. Die beiden Zahlen stammen dabei aus cBahnhof::SignalGleisStatus(int,int). Ein Signal (0, status), wobei status (0: deaktiviert, 1: eingeschaltet, 2: Durchfahrt, 3: ausgeschaltet) den aktuellen Status des Bahnhofs angeht, wird verschickt bei einer Statusänderung. Ein Signal (i, aktiviert) wird verschickt, wenn Gleis i aktiviert/deaktiviert wird, wobei aktiviert heißt, dass das Gleis in den automatischen Betrieb eingebunden ist und der Bahnhof eingeschaltet oder auf Durchfahrt geschaltet ist.

REED

Die Signalquelle REED verknüpft den unter critext1 angegebenen Reedkontakt mit dem Signal. Die beiden Zahlen stammen dabei aus cKonnektor::SignalKonnektorGruen(int,int). Die erste Zahl gibt die Richtung an (0: in Reglerrichtung, 1: gegen die Reglerrichtung). Das Signal (0,1) wird gesendet, wenn ein Zug in Richtung 0 über den Reedkontakt fährt oder den Reedkontakt in Richtung 0 reserviert hat. Ansonsten wird das Signal (0,0) gesendet. Wenn die zweite Zahl unverändert ist, wird kein erneutes Signal gesendet. Mit den Signalen (1,0) und (1,1) wird analog verfahren.

REGLER

Die Signalquelle REGLER verknüpft den unter critext1 angegebenen Regler mit diesem Signal. Die beiden Zahlen stammen dabei aus cRegler::SignalBesetzt(int,int). Die erste Zahl wird nicht verwendet. Die zweite Zahl gibt den Reglerstatus an (0: nicht besetzt, 1: besetzt).

SEKTION

Die Signalquelle SEKTION verknüpft das unter critext1 angegebene Signal mit diesem Signal. Die beiden Zahlen stammen dabei aus cSektion::SignalBesetzt(int,int). Die erste Zahl gibt die Richtung des Zugs an. Die zweite Zahl gibt an, ob ein Zug auf der Sektion steht.

SEKTION

Die Signalquelle SEKTION verknüpft das unter critext1 angegebene Signal mit diesem Signal. Die beiden Zahlen stammen dabei aus cSektion::SignalBelegtOderBesetzt(int,int). Die erste Zahl gibt die Richtung des Zugs an. Die zweite Zahl gibt an, ob ein Zug auf der Sektion steht oder die Sektion reserviert hat.

SEKTION

Die Signalquelle SIGNAL verknüpft das unter critext1 angegebene Signal mit diesem Signal. Die beiden Zahlen stammen dabei aus cSignal::SignalSignalChanged(int,int). Die erste Zahl wird nicht verwendet. Die zweite Zahl gibt den Signalstatus an (0: aus, 1: an).

WEICHE

Die Signalquelle WEICHE verknüpft die unter critext1 angegebene Weiche mit diesem Signal. Die beiden Zahlen stammen dabei aus cKonnektor::SignalKonnektorWeichenStellung(int,int). Die erste Zahl ist identisch der zweiten Zahl und gibt den Weichenstatus an (0: links, 1: rechts, 2: Mitte, bei Drei-Wege-Weichen).