Kontakttreiber

Die Kontaktanschlüsse CON0 bis CON3 enthalten zwei Sensorleitungen, die von den externen Reedkontakten mit Masse verbunden werden. Die Masseleitung ist dafür einmal direkt und einmal über einen Widerstand von einem Kiloohm nach außen geführt. Der fünfte Pin ist mit einer Spannungsquelle von 12 Volt verbunden, die externe Sensoren versorgen kann.


Interface für die Kontakte
Kompletter Schaltplan als PDF

Die eigentliche Ansteuerung eines Reedkontaktes besteht jeweils aus einem Pullup-Widerstand und einem Kondensator. Solange der Kontakt offen ist, lädt der Kondensator sich auf und der nachgeschaltete Mikrocontroller sieht einen High-Pegel an seinem Schmitt-Trigger-Eingang. Ein geschlossener Kontakt überbrückt den Kondensator mit einem deutlich kleineren Widerstand, wodurch er sich entlädt. Hält dies lange genug an, wechselt der Eingang des Mikrocontrollers auf einen Low-Pegel. Durch die relativ großen Widerstände wirken bei den Vorgängen Zeitkonstanten von 13 beziehungsweise 0,33 Millisekunden. Dies ist ausreichend, um auch stärkere Störsignale auf der Leitung wirksam zu unterdrücken.

Schutzdioden in der Stufe verhindern, daß von außen angelegte Spannungsquellen die Eingänge des Mikrocontrollers beschädigen können. Um den Aufbau zu vereinfachen, werden statt der 16 nötigen Einzeldioden 4 Brückengleichrichter benutzt, die aber genauso funktionieren. Falls ein massiver Impuls diese Sicherung überwinden sollte, schützen Widerstände von 10 Kiloohm die Eingänge des Mikrocontrollers vor einem Latchup.

Es bietet sich an, die Kontakte nicht direkt sondern über die eingebauten Widerstände von RN4 an die Masse anzuschließen. Der Aufbau reduziert die Störungen noch etwas, außerdem liegen alle dafür benötigten Pins im Stecker direkt nebeneinander. Weitere Hinweise zur den Anschlüssen gibt die Pinbelegung, und wie sich an dem Interface noch andere Sensoren betreiben lassen, ist am Beispiel der Schrankensensoren des Bahnüberganges.

Aufbereitung der Meßwerte

Die Firmware unterdrückt bei der Auswertung zunächst alle Arten von Störungen, die von der Hardware nicht ausgefiltert werden konnten, außerdem verlängert sie Kontaktereignisse zeitlich. Dies ist nötig, damit die beiden Reedkontakte eines Paares auch noch zusammen ausgewertet werden können, wenn der Zug den Kontakt sehr langsam überquert.

  • Voraussetzungen
    • Die Firmware verwaltet pro Reedkontakt einen Zähler, der mit 0 initialisiert wird.
  • Reaktion auf Ereignisse
    • In regelmäßigen Abständen von 10 Millisekunden (mit jedem Slow-Tick) werden die Kontakte abgefragt. Ist einer geschlossen, wird auf seinen Zähler c1=128 addiert, sonst wird c2=4 von dem Zähler subtrahiert.
    • Das Ergebnis wird auf den Bereich von 0 bis 255 begrenzt.
    • Die Zählerstände werden mit einer Hysteresefunktion ausgewertet. Erreicht ein Zähler 255, gilt er für die folgenden Funktionen als aktiviert. Beim Erreichen der 0 wird er entsprechend deaktiviert. Alle anderen Werte ändern den Aktivierungszustand nicht.
    • Dieser Filter wirkt wie ein Tiefpaß mit nachgeschaltetem Schmitt-Trigger, dessen Zeitverhalten von den Konstanten c1 und c2 bestimmt wird.

Spätestens nach dieser Stufe sollten die Sensordaten frei von Fehlern sein.

Richtungen und Redundanz

Die Ergebnisse der Filterung werden abschließend von einem Redundanzmanager ausgewertet. Dieser hat die Aufgabe, die Fahrtrichtung des auslösenden Zuges festzustellen. Dabei werden auch nicht funktionierende Reedkontakte erkannt.

  • Redundanzmanager
    • Beide Reedkontakte eines Kontaktes werden immer zusammen ausgewertet.
    • Bei Aktivierung eines Reedkontaktes, prüft die Firmware auch dessen Partner. Sind beide gleichzeitig aktiv, wird die Richtung des darüberfahrenden Zuges anhand der Auslösereihenfolge ermittelt und gespeichert. Mögliche Ergebnisse sind die Werte vorwärts, rückwärts und unbekannt (gleichzeitige Aktivierung).
    • Wird ein Kontakt wieder inaktiv, ohne daß sein Partner gleichzeitig aktiv war, ist der Partnerkontakt möglicherweise defekt. Der Anwendung wird eine Auslösung mit unbekannter Richtung signalisiert, außerdem protokolliert die Firmware den Fehler.
  • Ausgabedaten
    • Für jedes Kontaktpaar speichert die Firmware zwei Werte, und zwar die Richtung der letzten Auslösung und einen zwei Bit breiten Sequence Counter. Dieser wird bei jeder Auslösung eines Kontaktpaares inkrementiert.

Wahl der Zeitkonstanten

Die erste Filterstufe der Kontaktauswertung kann über zwei Konstanten gesteuert werden. Sie entsprechen Zeitangaben, wobei 2,55 Sekunden geteilt durch den Wert die korrespondierende Zeit ergibt. Die erste Konstante c1 legt die Zeitspanne fest, die ein Reedkontakt geschlossen sein muß, bevor die Firmware ihn registriert. Der Wert 128 entspricht einer Zeit von 20 Millisekunden, die Reaktion erfolgt damit fast sofort. Die Zeit kann durch eine kleinere Konstante aber auch verlängert werden, um von der Hardware nicht ausgefilterte Störungen besser zu unterdrücken.

Entsprechendes gilt für die zweite Konstante c2. Sie gibt die Zeit an, die zwischen dem Auslösen der beiden Reedkontakte eines Paares maximal vergehen darf. Die Einstellung stellt immer einen Kompromiß dar, der aktuelle Wert von 4 setzt die Zeit auf 0,64 Sekunden.

  • Jeder Zug löst den Kontakt beim Überfahren zweimal aus, einmal mit dem Triebwagen und einmal mit dem letzten Waggon. Die Zeit dazwischen muß in jedem Fall länger als die eingestellte Grenze sein, damit die Ereignisse getrennt gewertet werden können. Dieser Faktor begrenzt die Höchstgeschwindigkeit der Züge abhängig von ihrer Länge.
  • Ein Kontaktpaar mit einem defekten Reedkontakt wird erst als aktiv gemeldet, wenn nach dem Überqueren die über c2 eingestellte Zeit verstrichen ist. Bei Höchstgeschwindigkeit ist der Triebwagen nach 0,64 Sekunden bereits 30 Zentimeter hinter dem Kontakt.
  • Züge dürfen einen Kontakt nur so langsam passieren, daß der Magnet beide Reedkontakte innerhalb der Zeitspanne auslöst. Bei 0,64 Sekunden liegt die Mindestgeschwindigkeit bei 4,7 Zentimeter pro Sekunde.

Die Werte der Konstanten orientiert sich an Erfahrungswerten aus dem Betrieb der Anlage. Falls es nötig sein sollte, können sie im Quellcode der Firmware einfach angepaßt werden.