qrailway 0.9
|
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
In diesem Fall wird der zweite Teil der Regel geprüft:
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.
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.
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.
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).
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.
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.
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).
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).