TIA SCL Ampel Problem

Aithir

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich hoffe mir kann jemand helfen. Ich programmiere (oder versuche es zumindest) eine Ampelsteuerung mit Fußgängerübergang in SCL.
Allerdings hängt sie sich mitten im Programm auf und ich schaffe es nicht den Fehler zu beheben.
Er läuft ganz normal bis Fußgänger, sowie die Autos, Rot angezeigt bekommen. Bei dem Übergang von Rot auf Rot-Gelb hängt er sich dann auf.
Ich habe schon diverse Sachen versucht, aber nichts hilft ohne den Ablauf zu verändern.

Über einen Rat von euch würde ich mich sehr freuen!

Code:
// Netzwerk 1: Ampelmerker
IF (NOT "Auto_Rot_Gelb_Phase_temp" AND ("Ampel_Merker" OR (NOT "Fusg_Verz_Gruen_temp" AND ("Schalter_links" OR "Schalter_rechts"))))=1
THEN
    "Ampel_Merker" := 1;
  END_IF;
  
  // Netzwerk 2: Grün für Autos
  IF (NOT "Ampel_Merker") =1
THEN
    "Auto_Grün":=1;
  END_IF;
  
  // Netzwerk 3: Dauer Gelbphase
  #Dauer_Gelbphase := S_ODTS(T_NO := "Auto_Gelb_Phase",
     S := "Ampel_Merker",
     TV := t#3s,
     Q => "Auto_Gelb_temp");


// Netzwerk 4: Gelb für Autos
IF ("Ampel_Merker" AND ("Auto_Verz_Rot_temp" OR NOT "Auto_Gelb_temp")) =1
THEN
  "Auto_Gelb" := 1; "Auto_Grün":=0;
  
END_IF;


// Netzwerk 5: Rot für Autos
IF ("Ampel_Merker" AND "Auto_Gelb_temp") =1
THEN
  "Auto_Gelb" := 0; "Auto_Rot" := 1; 
END_IF;


// Netzwerk 5.1: Rot-Gelb
IF ("Ampel_Merker" AND "Auto_Rot_Gelb_Phase_temp") =1
THEN
  "Auto_Rot" := 1; "Auto_Gelb" := 1;
END_IF;


// Netzwerk 5.2: Rot-Gelb-Reset
// test negative Flanke
"RG_neg_FL" := "Auto_Rot_Gelb_Phase_temp" AND NOT "Auto_Rot_Gelb_Phase_temp_alt";
"Auto_Rot_Gelb_Phase_temp_alt" := "Auto_Rot_Gelb_Phase_temp";


IF "RG_neg_FL" =1
THEN
  "Auto_Rot" := 0; "Auto_Gelb" := 0;
END_IF;




// Netzwerk 6: Dauer der Grünphase für Fußgänger
#Dauer_Grünphase_Fußgänger := S_ODTS(T_NO := "Fusg_Gruen_Phase",
     S := "Auto_Rot",
     TV := t#10s,
     Q => "Fusg_Gruen_Phase_temp");


// Netzwerk 7: Grün für Fußgänger
IF (NOT "Fusg_Gruen_Phase_temp" AND "Auto_Rot") =1
THEN
  "Fusg_Gruen" := 1; "Fusg_Rot" := 0;
END_IF;


// Netzwerk 8: Auto-Rotphase-Verzögerung
#Auto_Rotphase_verzögern := S_ODTS(T_NO := "Auto_Verz_Rot",
     S := ("Ampel_Merker" AND "Fusg_Gruen_Phase_temp"),
     TV := t#6s,
     Q => "Auto_Verz_Rot_temp");


// Netzwerk 9: Rot für Fußgänger
IF (NOT "Ampel_Merker" OR ("Ampel_Merker" AND ("Fusg_Gruen_Phase_temp" OR NOT "Auto_Gelb_temp"))) =1
THEN
  "Fusg_Rot" := 1; "Fusg_Gruen" := 0;
  END_IF;


// Netzwerk 10: Dauer der Rot-Gelb-Phase
#Dauer_rot_gelb := S_ODTS(T_NO := "Auto_Rot_Gelb_Phase",
     S := ("Ampel_Merker" AND "Auto_Verz_Rot_temp"),
     TV := t#5s,
     Q => "Auto_Rot_Gelb_Phase_temp");


// Netzwerk 11: Verzögerung für die nächste Grünanforderung
#Nächste_Fusg_Grün_Verzögerung := S_ODTS(T_NO := "Fusg_Verz_Gruen",
     S := ("Ampel_Merker" AND "Auto_Grün"),
     TV := t#1s,
     Q => "Fusg_Verz_Gruen_temp");
 
Hallo,
mir würde für diese Problematik als Erstes das Stichwort "Schrittkette" einfallen - ohne deinen Code jetzt näher analysiert zu haben.
So etwas liesse sich in SCL auch schön umsetzen und gibt dir die Möglichkeit, deinen Ablauf so zu strukturieren, dass du auch verstehst, warum es irgendwo nicht mehr weiter geht.

Gruß
Larry
 
Erstmal entschuldige ich mich für die späte Rückmeldung, ich hatte viel zu tun.
Danke für die schnelle Antwort Larry, ich habe mich mal etwas über Schrittketten schlau gemacht und werde dies mal austesten.

Zum aufhängen mitten im Programm: Wie oben beschrieben verläuft alles in Ordnung bis die Phase kommt in der die Autos wieder fahren dürfen, das wird im Regelfall mit einer Rot-Gelb Phase realisiert.
Allerdings meint mein Programm anstatt wie ich will von Rot über Rot-Gelb nach Grün einfach in der gedachten Rot-Gelb Phase bei Rot zu bleiben. Und nach der abgelaufenen Zeit für Rot-Gelb springt er erst dann darauf.
Und anstatt danach auf Grün zu springen lässt er die beiden letzten Timer aus.
 
Ok das Thema hat sich erledigt. Die Nutzung von Speichernden Einschaltverzögerungen (S_ODTS) war schon komplett falsch, normale S_ODT wären da richtig gewesen. Dazu musste ich eigentlich einen verlängerten Impuls für die Rot-Gelb_Phase nehmen.
Mit der Schrittkette habe ich noch nicht experimentiert, aber trotzdem danke für den Ratschlag...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du solltest Dir gleich angewöhnen, boolsche Variablen nicht mit 0 oder 1 sondern mit FALSe bzw. TRUE zuzuweisen bzw. abzufragen.
Erstere Variante ist zwar auf Grund der impliziten Typumwandlung möglich, aber eine saubere Programmierweise ist das bei Weitem nicht.

Thomas_v2.1 hat in diesem Thread dazu einiges geschrieben und auch die folgendenden Posts sind sicher nicht uninteressant.
 
Zurück
Oben