Ampelsteuerung 3

Erfahre wie Du anliegenden Verkehr erkennen kannst und wie dieser die Schaltungen beeinflusst.

Priorisierung an der Ampel

Voraussetzungen:

Beispielanlage öffnen

  • Lade und installiere Dir die Beispielanlagen für die Ampeln “Installer-AK-Tutorial-Ampelkreuzung.zip”
  • Öffne die Beispielanlage “Andreas_Kreuz_Tutorial_Ampelkreuzung-2.anl3” in EEP
  • Öffne die Datei Andreas_Kreuz-Tutorial-Ampelkreuzung-2-main.lua in einem Editor - Du findest sie unter C:\Trend\EEP\LUA\ak\demo-anlagen\tutorial-ampel\.

So funktioniert Priorisierung

… innerhalb einer Fahrspur

Es gibt 4 Arten von Priorisierungen für Fahrspuren. Nur eine davon kann gleichzeitig verwendet werden:

  • Priorisierung nach Wartezeit
    Priorisierung nach Wartezeit
    Werden die Fahrzeuge nicht anhand von unten stehenden Mechanismen erkannt, so erfolgt die Priorisierung dieser Fahrspur anhand der Wartezeit. Die Wartezeit wird immer um eins hochgezählt, wenn diese Fahrspur beim Ändern der Ampelschaltung rot bekommt. Sie wird auf 0 zurükgesetzt, wenn die Ampel grün bekommt.

    Wenn Du keine Priorisierung einrichtest, dann werden die Fahrspuren anhand ihrer Wartezeit geschaltet.
  • Zählen von Fahrzeugen
    Zählen von Fahrzeugen
    Wenn Du die Anzahl der Fahrzeuge einer Fahrspur mit Kontaktpunkten zählst, bekommst Du die bestmögliche Erkennung für mehrere Fahrzeuge.

    Setze für jeder Fahrspur zwei Kontaktpunkte: Den ersten vor der Ampel, der der Fahrspur sagt, dass sich ein weiteres Fahrzeug vor der Ampel befindet. Den zweiten nach der Ampel, der der Fahrspur sagt, dass sich ein Fahrzeug weniger an der Ampel befindet.
  • Erkennen von Fahrzeugen am roten Signal
    Erkennen von Fahrzeugen am roten Signal (nicht empfohlen)
    Du kannst den Verkehr einer Fahrspur erkennen, wenn sie an einer roten Ampel stehen. Die Funktion erkennt Fahrzeuge, die zwischen dem Vor- und Hauptsignal einer roten Ampel stehen - intern wird regelmäßig EEPGetSignalTrainsCount abgefragt.
    Diese Variante wird nicht empfohlen, weil die Fahrzeuge nur zwischen Vor- und Hauptsignal gezählt werden. Ist dieser Abstand zu kurz, werden nicht genügend Fahrzeuge gezählt, ist er zu lang, fahren zu viele Fahrzeuge nach dem Schalten auf rot durch.
  • Erkennen von Fahrzeugen auf Straße
    Erkennen von Fahrzeugen auf Straße (nicht empfohlen)
    Du kannst die Ampelschaltung einer Fahrspur priorisieren, indem Du prüfst, ob auf dem Straßenstück vor der Ampel ein Fahrzeug steht - intern wird dazu EEPRegisterRoadTrack verwendet.
    Diese Variante wird nicht empfohlen, weil sie nicht mehrere Fahrzeuge auf einem Straßenstück erkennt und daher die anstehende Fahrzeugschlange nicht korrekt ist.

Bitte beachte: Pro Fahrspur kann nur ein Mechanismus verwendet werden. Bei mehreren Mechanismen, gewinnt der erste in der folgenden Liste:

  1. Erkennen von Fahrzeugen auf Straßen
  2. Erkennen von Fahrzeugen an Signalen
  3. Zählen mit Kontaktpunkten
  4. Automatisch anhand der Wartezeit

… innerhalb einer Kreuzung

Die nächste Schaltung wird immer durch die höchsten Durchschnittspriorität aller Fahrspuren bestimmt.

Durch das Einbeziehen der Wartezeit wird sichergestellt, dass jede Fahrspur berücksichtigt wird.

⭐ Am besten verwendest Du die Priorisierung für alle Fahrspuren einer Kreuzung - oder für gar keine.

Erkennung mit Strassen (nicht empfohlen)

Erkennen mit Tracks

Priorisierung nach Wartezeit
Erkenne eine belegte Fahrspur daran, ob sich ein Fahrzeug auf dem Straßenstück vor dem Signal befindet.
  • Verwende dazu folgenden Code (lane ist eine Fahrspur):

    local laneSignal1 = TrafficLight:new("LANE WS", 15, TrafficLightModel.Unsichtbar_2er)
    lane = Lane:new("WS", 108, laneSignal1)
    lane:useTrackForQueue(2) -- Erfasst Anforderungen, wenn ein Fahrzeug auf Strasse 2 steht
    
  • Die Code-Zeile ws:zaehleAnStrasseAlle(xx) sorgt dafür, dass die Fahrspur priorisiert wird, wenn das Straßenstück mit der ID xx belegt ist. Dies erfolgt jedoch immer nur für ein Fahrzeug pro Straßenstück.

  • Es können auch mehrere Straßenstücke gleichzeitig beobachtet werden, z.B. für mehrspurige Straßen.

    ws:useTrackForQueue(2)
    ws:useTrackForQueue(3)
    
  • Insgesamt werden alle belegten Straßenstück der Fahrspur als ein Fahrzeug gezählt.

Erkennung mit Signalen (nicht empfohlen)

Erkennen mit Signal

Priorisierung nach Wartezeit
Erkenne eine belegte Fahrspur anhand der Fahrzeuge die am roten Signal warten.

Die Erkennung erfolgt ähnlich wie bei der Straße (Details siehe oben).

lane:useSignalForQueue()

⭐ Die Erkennung funktioniert nur, wenn die Ampel rot ist.

Erkennung mit Kontaktpunkten (empfohlen)

Erkennen mit Kontaktpunkten

Priorisierung nach Wartezeit
Wenn Du die Anzahl der Fahrzeuge einer Fahrspur mit Kontaktpunkten zählst, bekommst Du die bestmögliche Erkennung für mehrere Fahrzeuge.

Setze für jeder Fahrspur zwei Kontaktpunkte:

  1. Vor dem Signal der Fahrspur

    Dieser Kontaktpunkt muss die Funktion lane:vehicleEntered(vehicleName) aufrufen - in der Demo-Anlage wird in den Kontaktpunkten enterLane(Zugname, lane) verwendet.

    ⭐ Achte darauf, dass nur Fahrzeuge den Kontaktpunkt aufrufen, die diese Fahrspur betreten.
    ⭐ Achte darauf, dass der Kontaktpunkt nicht vor einer Verzweigungen liegt, die die Fahrzeuge auf andere Fahrspuren verteilt.

  2. Hinter dem Signal der Fahrspur

    Dieser Kontaktpunkt muss die Funktion lane:vehicleLeft(vehicleName) aufrufen - in der Demo-Anlage wird in den Kontaktpunkten leaveLane(Zugname, lane) verwendet.

    ⭐ Achte darauf, dass nur Fahrzeuge den Kontaktpunkt aufrufen, die die korrekte Fahrspur verlassen.
    ⭐ Achte darauf, dass der Kontaktpunkt hinter der Haltelinie liegt.

Es ist notwendig, dass der Zugname in den Funktionen genutzt wird

------------------------------------------------
-- Damit kommt wird die Variable "Zugname" automatisch durch EEP belegt
-- http://emaps-eep.de/lua/code-schnipsel
------------------------------------------------
setmetatable(_ENV, {
    __index = function(_, k)
        local p = load(k)
        if p then
            local f = function(z)
                local s = Zugname
                Zugname = z
                p()
                Zugname = s
            end
            _ENV[k] = f
            return f
        end
        return nil
    end
})