Encoding war falsch mit BOM. Weitere Funktionen konvertiert.

This commit is contained in:
2026-07-07 17:04:22 +02:00
parent 52bcd08879
commit 4c2ebb6427
29 changed files with 1949 additions and 12 deletions
@@ -1,4 +1,4 @@
FUNCTION "Arbeitsplatz_Draussen_FC" : Void
FUNCTION "Arbeitsplatz_Draussen_FC" : Void
TITLE = Draussen-FC: AMR Arbeitsplaetze
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
@@ -1,4 +1,4 @@
FUNCTION "Arbeitsplatz_Leser_FC" : Void
FUNCTION "Arbeitsplatz_Leser_FC" : Void
TITLE = Leser-FC: AMR Arbeitsplätze
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
@@ -0,0 +1,527 @@
FUNCTION "Arbeitsplatz_Ziel_FC" : Void
TITLE = Ziel-FC: AMR Arbeitsplätze
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC1181 "Arbeitsplatz_Ziel_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und wurde per "UC FC[..]" indirekt aus
//AWL aufgerufen -> aus SCL nicht compilierbar. Er liest ausschliesslich globale
//Merker (MW190 = Schleusen-Nr, MW194 = angefordertes Weichen-Ziel, MB-/BG-Merker)
//und ruft die Zielbausteine voll qualifiziert auf -> keine echte Registerabhaengigkeit.
//Als SCL-Baustein entfaellt die Option und er ist direkt aus SCL aufrufbar
//(CASE 1181 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC <Ende>")
//ist als CASE ueber die Schleusen-Nr (MW190) ausgefuehrt. Da die Schleusen-Nrn
//paarweise verschieden sind, kann pro Aufruf hoechstens ein Zweig zutreffen; ein
//AWL-BEU/BEC im getroffenen Zweig ist daher als RETURN bzw. "IF <RLO> THEN RETURN;"
//umgesetzt (verhaltensgleich, da nach dem Dispatch nur noch das Bausteinende folgt).
//Die Merker-Schnittstelle (MW190/MW194 vom Aufrufer gelesen, MW198 = Weichenziel
//ausgegeben, M180.6 = Weiterfahrt-Freigabe, MW832 = Anzeigewert) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - Schleuse 3481 (NW3): der Zweig liest die Temp-Variable "EndZiel", die in
// diesem Zweig NIE beschrieben wird (im AWL undefinierter L-Stack-/Akku-Wert).
// Verhalten 1:1 uebernommen -> Wert ist undefiniert. UNBEDINGT PRUEFEN!
// - Schleuse 3285 (NW15): "Error_SendFIFO" (Temp) wird gelesen, aber im ganzen
// Baustein nie gesetzt -> undefiniert (wie im AWL). PRUEFEN!
// - Schleuse 3241 (NW4): Ausgangsparameter "AMR_Platz" von
// "LeerTrolley to AMR-Platz ermitteln" ist Section=Output -> in SCL mit "=>"
// versorgt (statt ":="). ShopGroup-Konstante DINT#-1 (TypedConstant) 1:1.
// - Wort-Merker (MW190/MW194/MW198/MW832) und die Word-Temp "EndZiel" werden gegen
// Word-Konstanten (W#16#..) direkt verglichen; MW190 wird fuer den CASE ueber
// WORD_TO_INT in Int gewandelt (AWL: NE_I gegen dezimale Konstante).
// - DB-/Member-Namen mit Sonderzeichen (Umlaut, "-", ">") sind einzeln gequotet.
VAR_TEMP
Ziel_hex : Word;
Ziel_int : Int;
Zielebene : Word;
Error : Byte;
Position : Int;
Lager_DB : Int;
Lager_DW : Int;
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt; // Startwert mit Offset 0
SSDW : Int;
EndZiel : Word;
Variante : Int;
AbrufID : DInt;
Fahrlisten_TrolleyID : DInt;
Fahrlisten_AbrufID : DInt;
Fahrlisten_Lager : Int;
Trolley_unbekannt : Bool; // Trolley ist nicht in DL
Error_SendFIFO : Bool;
END_VAR
BEGIN
// NW1: Rueckmeldungen erst mal resetten (Weiterfahrt von Ziel-FC erlaubt)
"M180.6" := FALSE;
// AWL: UC FC1181 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3456: // Schleuse 3456: (Vor Aufzug)
IF NOT "DZuführung_OmniFahren"."Aufzug_freiräumen" THEN
"M180.6" := TRUE;
END_IF;
3481: // Schleuse 3481: (Vor 180-Grad ByPass)
// Hinweis: "EndZiel" (Temp) wird hier gelesen, aber im Zweig nie gesetzt -> Wert undefiniert (wie AWL)!
IF ("EndZiel" AND W#16#F000) = W#16#B000 THEN // MPS? -> abbiegen (ByPass)
"MW198" := W#16#3383; // Weichenziel
// Quell-Steuerung:
IF (NOT "DZuführung_OmniFahren".Weiche_3482_frei)
OR ("MB3353" AND NOT "MB3362") THEN
RETURN; // Weiche von 2.Quelle belegt / andere Quelle aktiv
END_IF;
IF NOT "DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."WeicheByPass_von_Haupt-Sep_belegt"
AND NOT "DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt"
AND NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_PS1.Stat.B_Akt
AND NOT "BG3361"
AND NOT "DArbeitsplätze_Sensoren".An_BG3383.Stat.B_Akt
AND NOT "BG3383"
AND NOT "MB3383" THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
"DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_ByPass-Sep_belegt" := TRUE;
"DZuführung_OmniFahren".Weiche_3482_frei := FALSE; // Weiche jetzt von dieser Quelle belegt
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3483; // Weichenziel
IF NOT "DZuführung_OmniFahren"."Übergang_3485"."Am_Übergang".Stat.B_Akt THEN // nicht am Übergang
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
END_IF;
3241: // Schleuse 3241: (Vor Einfahrt PS5)
IF "MB3241" THEN
RETURN;
END_IF;
"EndZiel" := W#16#0;
"DPS5_OmniFahren".Schleuse_vor_Einfahrt.Dyn.Trolley_EndZiel := W#16#0; // Damit Schleuse Info hat
"MW832" := W#16#0; // damit in Beobachtungsbild sichtbar
// AMR-Platz, der LeerTrolleys benoetigt, ermitteln:
"LeerTrolley to AMR-Platz ermitteln"(
Erlaubter_Bereich := W#16#0000, // Beide Bereiche erlaubt
AMR_Platz => "EndZiel");
IF "EndZiel" = W#16#0 THEN
RETURN; // Kein Leertrolley benötigt
END_IF;
// Trolleydaten in DL aendern (Endziel uebergeben):
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DPS5_OmniFahren".Schleuse_vor_Einfahrt.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DPS5_OmniFahren".Schleuse_vor_Einfahrt.Dyn.TrolleyID_Schleuse,
Endziel := "EndZiel",
ShopGroup := DINT#-1);
"DPS5_OmniFahren".Schleuse_vor_Einfahrt.Dyn.Trolley_EndZiel := "EndZiel"; // Damit Schleuse Info hat
"MW832" := "EndZiel"; // damit in Beobachtungsbild sichtbar
// Auswertung:
IF ("EndZiel" = W#16#A500) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // PS5 anfahren
"MW198" := W#16#3242; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_PS5.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3264; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_PS5.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
END_IF;
3243: // Schleuse 3243: (Vorstau PS5)
IF "DPS5_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3245: // Schleuse 3245: (ABP1/PS5)
IF "DPS5_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3251: // Schleuse 3251: (ABP2/PS5)
IF "DPS5_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3255: // Schleuse 3255: (ABP3/PS5)
IF "DPS5_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3262: // Schleuse 3262: (Ausfahrt PS5)
IF "DPS5_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DPS5_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS5_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3265: // Schleuse 3265: (Vor Ausfahrt PS5)
IF "DPS5_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DPS5_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS5_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
3271: // Schleuse 3271: (Vor Einfahrt PS4)
IF ("MW194" = W#16#A400) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // PS4 anfahren
"MW198" := W#16#3272; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_PS4.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3270; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_PS4.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
END_IF;
3273: // Schleuse 3273: (Vorstau PS4)
IF "DPS4_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3275: // Schleuse 3275: (ABP1/PS4)
IF "DPS4_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3281: // Schleuse 3281: (ABP2/PS4)
IF "DPS4_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3285: // Schleuse 3285: (ABP3/PS4)
IF "DPS4_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
IF NOT "Error_SendFIFO" THEN // Hinweis: Temp nie gesetzt -> undefiniert (wie AWL)!
"DPS4_OmniFahren".Sks_Arbeitsplatz.Dyn.SS."Trolley_ist_in_Platz_3_eingefahren>PC" := FALSE;
END_IF;
3291: // Schleuse 3291: (Ausfahrt PS4)
IF NOT "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN
"MW198" := W#16#3294; // Weichenziel
ELSE
"MW198" := W#16#3302; // PS3 erst mal anfahren!
END_IF;
IF "DPS4_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DPS4_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS4_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3293: // Schleuse 3293: (Vor Einfahrt PS3)
IF "DPS4_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
RETURN;
END_IF;
IF ("MW194" = W#16#A300) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // PS3 anfahren
"MW198" := W#16#3302; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_PS3.Stat.B_Akt THEN
"M180.6" := TRUE;
"DPS4_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3294; // Weichenziel
IF "DPS4_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_PS3.Stat.B_Akt THEN
"M180.6" := TRUE;
"DPS4_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
END_IF;
3303: // Schleuse 3303: (Vorstau PS3)
IF "DPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3305: // Schleuse 3305: (ABP1/PS3)
IF "DPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3311: // Schleuse 3311: (ABP2/PS3)
IF "DPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3315: // Schleuse 3315: (ABP3/PS3)
IF "DPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3321: // Schleuse 3321: (Ausfahrt PS3)
IF "DPS3_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3323: // Schleuse 3323: (Vor Ausfahrt PS3)
IF "DPS3_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
3331: // Schleuse 3331: (Vor Einfahrt PS2)
IF ("MW194" = W#16#A200) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // PS2 anfahren
"MW198" := W#16#3332; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_PS2.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3330; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_PS2.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
END_IF;
3333: // Schleuse 3333: (Vorstau PS2)
IF "DPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3335: // Schleuse 3335: (ABP1/PS2)
IF "DPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3341: // Schleuse 3341: (ABP2/PS2)
IF "DPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3345: // Schleuse 3345: (ABP3/PS2)
IF "DPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3351: // Schleuse 3351: (Ausfahrt PS2)
IF NOT "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN
"MW198" := W#16#3361; // Weichenziel
ELSE
"MW198" := W#16#3362; // PS1 erst mal anfahren!
END_IF;
IF "DPS2_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt"
AND NOT "DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_ByPass-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3353: // Schleuse 3353: (Vor Einfahrt PS1)
IF "DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
RETURN;
END_IF;
IF ("MW194" = W#16#A100) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // PS1 anfahren
"MW198" := W#16#3362; // Weichenziel
IF "DPS2_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_PS1.Stat.B_Akt THEN
"M180.6" := TRUE;
"DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3361; // Weichenziel
// Quell-Steuerung:
IF (NOT "DZuführung_OmniFahren".Weiche_3482_frei)
OR "MB3482" // Reinweiche aktiv
OR "MB3361" THEN
RETURN;
END_IF;
IF NOT "DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_ByPass-Sep_belegt"
AND NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_PS1.Stat.B_Akt
AND NOT "BG3361" THEN
"M180.6" := TRUE;
"DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
"DPS2_OmniFahren".Vorfahrt_Ausfahrweiche."WeicheByPass_von_Haupt-Sep_belegt" := TRUE;
"DZuführung_OmniFahren".Weiche_3482_frei := FALSE; // Weiche jetzt von dieser Quelle belegt
END_IF;
END_IF;
3363: // Schleuse 3363: (Vorstau PS1)
IF "DPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3365: // Schleuse 3365: (ABP1/PS1)
IF "DPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3371: // Schleuse 3371: (ABP2/PS1)
IF "DPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3375: // Schleuse 3375: (ABP3/PS1)
IF "DPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3381: // Schleuse 3381: (Ausfahrt PS1)
IF "DPS1_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3383: // Schleuse 3383: (Vor Ausfahrt PS1)
IF "DPS1_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
"M180.6" := TRUE;
"DPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
3390: // Schleuse 3390: (Vor Einfahrt MPS3)
IF ("MW194" = W#16#B300) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // MPS3 anfahren
"MW198" := W#16#3392; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_MPS3.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3391; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_MPS3.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
END_IF;
3393: // Schleuse 3393: (Vorstau MPS3)
IF "DMPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3395: // Schleuse 3395: (ABP1/MPS3)
IF "DMPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3401: // Schleuse 3401: (ABP2/MPS3)
IF "DMPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3405: // Schleuse 3405: (ABP3/MPS3)
IF "DMPS3_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3411: // Schleuse 3411: (Ausfahrt MPS3)
IF "DMPS3_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DMPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" THEN
"M180.6" := TRUE;
"DMPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3413: // Schleuse 3413: (Vor Ausfahrt MPS3)
IF "DMPS3_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DMPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
"M180.6" := TRUE;
"DMPS3_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
3421: // Schleuse 3421: (Vor Einfahrt MPS2)
IF ("MW194" = W#16#B200) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // MPS2 anfahren
"MW198" := W#16#3422; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_MPS2.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3445; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_MPS2.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
END_IF;
3423: // Schleuse 3423: (Vorstau MPS2)
IF "DMPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3425: // Schleuse 3425: (ABP1/MPS2)
IF "DMPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3431: // Schleuse 3431: (ABP2/MPS2)
IF "DMPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3435: // Schleuse 3435: (ABP3/MPS2)
IF "DMPS2_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3441: // Schleuse 3441: (Ausfahrt MPS2)
IF NOT "DZuführung_OmniFahren"."Aufzug_freiräumen"
AND "DMPS2_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DMPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" THEN
"M180.6" := TRUE;
"DMPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3443: // Schleuse 3443: (Vor Ausfahrt MPS2)
IF NOT "DZuführung_OmniFahren"."Aufzug_freiräumen"
AND "DMPS2_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DMPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
"M180.6" := TRUE;
"DMPS2_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
3450: // Schleuse 3450: (Vor Einfahrt MPS1)
IF ("MW194" = W#16#B100) OR "DZuführung_OmniFahren".Alle_ABPs_anfahren THEN // MPS1 anfahren
"MW198" := W#16#3452; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_Einfahrt_MPS1.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
ELSE // Rest gerade fahren
"MW198" := W#16#3451; // Weichenziel
IF NOT "DArbeitsplätze_Sensoren".Stau_nach_Einfahrt_MPS1.Stat.B_Akt THEN
"M180.6" := TRUE;
END_IF;
END_IF;
3453: // Schleuse 3453: (Vorstau MPS1)
IF "DMPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Vorstau.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3455: // Schleuse 3455: (ABP1/MPS1)
IF "DMPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_1.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3461: // Schleuse 3461: (ABP2/MPS1)
IF "DMPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_2.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3465: // Schleuse 3465: (ABP3/MPS1)
IF "DMPS1_OmniFahren".Sks_Arbeitsplatz.Dyn.Platz_3.Freigabe_an_Stopper THEN
"M180.6" := TRUE;
END_IF;
3471: // Schleuse 3471: (Ausfahrt MPS1)
IF "DMPS1_OmniFahren".Prio_Ausfahrt.Out.ABP_Schleuse_starten
AND NOT "DMPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" THEN
"M180.6" := TRUE;
"DMPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" := TRUE;
END_IF;
3473: // Schleuse 3473: (Vor Ausfahrt MPS1)
IF "DMPS1_OmniFahren".Prio_Ausfahrt.OUT.Haupt_Schleuse_starten
AND NOT "DMPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Ausfahr-Sep_belegt" THEN
"M180.6" := TRUE;
"DMPS1_OmniFahren".Vorfahrt_Ausfahrweiche."Weiche_von_Haupt-Sep_belegt" := TRUE;
END_IF;
3543: // Schleuse 3543: (BST 4)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
+1 -1
View File
@@ -1,4 +1,4 @@
FUNCTION "DatenOut" : Void
FUNCTION "DatenOut" : Void
TITLE = Datensatz in Datenliste suchen / lesen / loeschen
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
+1 -1
View File
@@ -1,4 +1,4 @@
FUNCTION "FifoIn" : Void
FUNCTION "FifoIn" : Void
TITLE = Datensatz in FIFO-DB eintragen
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
@@ -1,4 +1,4 @@
FUNCTION "HWtoAMRZielFC" : Void
FUNCTION "HWtoAMRZielFC" : Void
TITLE = Ziel-FC: HW>AMR
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
+1 -1
View File
@@ -1,4 +1,4 @@
FUNCTION "HWtoOB_Ziel_FC" : Void
FUNCTION "HWtoOB_Ziel_FC" : Void
TITLE = Ziel-FC: HW>OB
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
@@ -1,4 +1,4 @@
FUNCTION_BLOCK "MHMOmniSchleuse"
FUNCTION_BLOCK "MHMOmniSchleuse"
TITLE = HM-Omni-Schleuse (Schrittkette)
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
+1 -1
View File
@@ -1,4 +1,4 @@
FUNCTION_BLOCK "MZylinder"
FUNCTION_BLOCK "MZylinder"
TITLE = Zylinderansteuerung
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
+1 -1
View File
@@ -1,4 +1,4 @@
FUNCTION "DatenOut" : Void
FUNCTION "DatenOut" : Void
TITLE = Datensatz in Datenliste suchen / lesen / loeschen
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
@@ -0,0 +1,46 @@
FUNCTION "EP_Draussen_FC" : Void
TITLE = Draussen-FC: EntnahmePuffer
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC3182 "EP_Draussen_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich den globalen Merker MW190
//(Schleusen-Nr) liest und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist damit direkt aus SCL aufrufbar (CASE 3182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: "L MW190 / L <Schleuse> / NE_I / JC") ist als CASE
//ueber die Schleusen-Nr ausgefuehrt. Die Merker-Schnittstelle (MW190 vom Aufrufer
//gesetzt) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - keine (Konstanten/Symbole 1:1 uebernommen).
BEGIN
// NW1: Rueckmeldung - Rueckmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// NW2: Schleuse 4503 (Sorter EP): Ausgefahren?
// AWL: L MW190 / L 4503 / NE_I / JC X4503E (Aufruf von Schleuse 4503?)
CASE WORD_TO_INT("MW190") OF
4503:
// Trolleydaten in DB1000 loeschen, da danach zum LP faehrt und dann kein Leser mehr!
"Trolleydaten_löschen"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX); // IDX
// Daten in Sep 4503 loeschen:
"DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_IDX := DINT#0; // IDX
"DEP_Sorter".Sorter_MB4503.Dyn.Scanner.Rec_DEST_Ziel := 0;
// AWL: BEU -> Bausteinende (Rest entfaellt, nach dem CASE folgt nur das Bausteinende)
ELSE
; // andere Schleusen-Nr -> nichts tun
END_CASE;
// NW3: Ende (AWL: BE)
END_FUNCTION
+64
View File
@@ -0,0 +1,64 @@
FUNCTION "EP_Leser_FC" : Void
TITLE = Leser-FC: EntnahmePuffer
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Leser
//SCL-Portierung des AWL-Bausteins FC3180 "EP_Leser_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich die globalen Merker MW190
//(Schleusen-Nr), M180.0/M180.1 (Lese-Status) und MW196 (Zwischenziel-Scratch)
//liest/schreibt und den Zielbaustein voll qualifiziert aufruft, gibt es keine
//echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung, der
//Baustein ist direkt aus SCL aufrufbar (CASE 3180 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: "L MW190 / L <Schleuse> / NE_I / JC") ist als CASE
//ueber die Schleusen-Nr ausgefuehrt. Case-Labels sind die dezimalen Int-Konstanten
//aus dem XML. Die Merker-Schnittstelle bleibt erhalten.
//
//Zweig-Muster (nur EIN Netzwerk / eine Schleuse in diesem Baustein):
// AN M180.0 / JC Y / BEU -> bei Lesefehler (M180.0=1): nichts tun
// Y: AN M180.1 / BEC -> nur weiter wenn unbekannt in TrolleysDL (M180.1=1)
// CALL Trolleydaten_neu_anlegen(...)
// => Aufruf nur wenn: NOT M180.0 AND M180.1
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - NW1 "Rueckmeldung" setzt den Scratch-Merker MW196 (evtl. Zwischenziel) auf 0
// (AWL: L 0 / T MW196). Hier als "MW196" := W#16#0000; uebernommen. Falls das
// Symbol "MW196" in der Symboltabelle als Int deklariert ist, statt dessen
// "MW196" := 0; verwenden.
// - ABWEICHEND vom typischen Leser-Muster hat dieser Baustein KEINE
// "L TrolleyID / L DINT#0 / EQ_D / BEC"-Pruefung. Die Aufruf-Bedingung ist im
// AWL-Original ausschliesslich NOT M180.0 AND M180.1 (TrolleyID wird NICHT auf
// <> 0 geprueft) -> 1:1 so uebernommen.
// - Endziel-Parameter war die Wort-Literalkonstante 16#E201 (Entnahme-Puffer 1)
// -> hier W#16#E201.
// - ShopGroup-Parameter war die getypte Konstante DINT#0 -> 1:1 uebernommen.
VAR_TEMP
Zielebene : Word;
END_VAR
BEGIN
// NW1 "Rueckmeldung": Zwischenziel-Scratch (MW196) zuruecksetzen (AWL: L 0 / T MW196)
"MW196" := W#16#0000;
// AWL: UC FC3180 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
4503: // Schleuse 4503: (Sorter EP)
// /In Zukunft Anfrage bei Host!
// Erst mal, da kein Host: Daten in Datenbank neu anlegen
IF NOT "M180.0" AND "M180.1" THEN
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DEP_OmniFahren".Schleuse_4503.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DEP_OmniFahren".Schleuse_4503.Dyn.TrolleyID_Schleuse,
Endziel := W#16#E201,
ShopGroup := DINT#0);
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
@@ -0,0 +1,53 @@
FUNCTION "EPtoLP_Draussen" : Void
TITLE = Draussen-FC: EP > LP
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC4182 "EPtoLP_Draussen" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich den globalen Merker MW190
//(Schleusen-Nr) liest sowie globale DB-Daten voll qualifiziert verwendet, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist damit direkt aus SCL aufrufbar (CASE 4182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Die Merker-Schnittstelle
//(MW190 vom Aufrufer gesetzt) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - Es wird nur eine Schleusen-Nr (4466) ausgewertet; alle anderen Werte fuehren
// (wie im Original per JC ans Netzwerkende) zu keiner Aktion -> CASE ELSE.
// - NE_I vergleicht den geladenen WORD-Wert "Weichen_Ziel" mit der WORD-Konstante
// 16#4461; hier als direkte WORD-Gleichheit (= W#16#4461) uebernommen.
// - Der BEC (bedingtes Bausteinende nach NE_I) ist als IF ... THEN ausgefuehrt:
// nur bei Gleichheit (Weichen_Ziel = W#16#4461) wird Akt_Schritt := 0 gesetzt,
// andernfalls endet der Baustein wirkungslos.
VAR_TEMP
"Error.Bit" : Bool;
END_VAR
BEGIN
// NW1: Rueckmeldung
// Rückmeldungen erst mal resetten (AWL: SET / R M180.6 -> unbedingter Reset)
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// AWL: UC FC4182 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
4466: // NW2: Schleuse 4466 (Vor ByPass vom VP): Ausgefahren ?
// Abzweig? (AWL: L Weichen_Ziel / L 16#4461 / NE_I / BEC)
IF "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Weichen_Ziel = W#16#4461 THEN
// Partner-Trolley will zu LP fahren:
// Bei Partner (Schleuse 4443) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Sk.Akt_Schritt := 0;
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun (AWL: JC ans Netzwerkende)
END_CASE;
// NW3: Ende (AWL: BE)
END_FUNCTION
@@ -0,0 +1,86 @@
FUNCTION "EPtoLP_Ziel_FC" : Void
TITLE = Ziel-FC: EP>LP_OmniFahren
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC4181 "EPtoLP_Ziel_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und wurde per "UC FC[..]" indirekt aus
//AWL aufgerufen -> aus SCL nicht compilierbar. Er liest ausschliesslich globale
//Merker/DBs (MW190 = Schleusen-Nr vom Aufrufer, MB-/BG-Merker, Weichen-DBs) und
//gibt den globalen Merker M180.6 (Weiterfahrt-Freigabe) aus -> keine echte
//Registerabhaengigkeit. Als SCL-Baustein entfaellt die Option und er ist direkt aus
//SCL aufrufbar (CASE 4181 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC <Ende>")
//ist als CASE ueber die Schleusen-Nr (MW190) ausgefuehrt. Da die Schleusen-Nrn
//paarweise verschieden sind, kann pro Aufruf hoechstens ein Zweig zutreffen; ein
//AWL-BEU im getroffenen Zweig ist daher als Zweig-Ende (RETURN nach Bausteinende)
//umgesetzt, ein AWL-BEC als "IF <RLO> THEN RETURN;" (verhaltensgleich, da nach dem
//Dispatch nur noch das Bausteinende folgt).
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - Dispatch: AWL "L MW190 / L <n> / NE_I / JC <Ende>" -> CASE WORD_TO_INT("MW190")
// mit dezimalen Int-Labels (4465, 4466). MW190 (Word) wird fuer den CASE nach Int
// gewandelt (AWL: NE_I gegen dezimale Int-Konstante).
// - Schleuse 4465 (NW2): AWL "SET / S M180.6 / BEU" -> bedingungslos M180.6 := TRUE.
// - Schleuse 4466 (NW3): AWL-BEC ("Warten!") -> "IF <RLO> THEN RETURN;". Der Word-
// Vergleich EQ_I gegen die Word-Konstante 16#4461 ist als direkter Word-Vergleich
// (= W#16#4461) uebersetzt.
// - "MB4445"/"MB4457" (im AWL als O/AN-Bitoperanden verwendet) werden - wie in der
// Vorlage - als Bool-Symbole behandelt. Falls es sich real um Byte-Merker handelt,
// Bitbreite bei Inbetriebnahme pruefen.
// - DB-/Member-Namen mit Sonderzeichen sind einzeln gequotet (hier keine vorhanden).
// - Die VAR_TEMP-Member aus dem XML-Interface sind 1:1 uebernommen, werden in diesem
// Baustein jedoch nicht gelesen/geschrieben (keine uninitialisierten Zugriffe).
VAR_TEMP
Ziel_hex : Word;
Ziel_int : Int;
Zielebene : Word;
Error : Byte;
Position : Int;
Lager_DB : Int;
Lager_DW : Int;
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt; // Startwert mit Offset 0
SSDW : Int;
EndZiel : Word;
Variante : Int;
AbrufID : DInt;
Fahrlisten_TrolleyID : DInt;
Fahrlisten_AbrufID : DInt;
Fahrlisten_Lager : Int;
Trolley_unbekannt : Bool; // Trolley ist nicht in DL
Express_Abruf : Bool;
END_VAR
BEGIN
// NW1: Rueckmeldung - Rueckmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt (Reset)
// AWL: UC FC4181 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
4465: // Bereich 4465: (BST 1)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
4466: // Schleuse 4466: (Vor Einfahrt ByPass)
// Quell-Steuerung:
IF ("DVPtoEP_OmniFahren".Weiche_4445.Dyn.Weichen_Ziel = W#16#4461) // Fahren Trolleys zu BG4461?
OR "MB4445" // Weiche ist auf Abzweig
OR "DVPtoEP_OmniFahren".Weiche_4445.Dyn.Status.Reset_aktiv THEN
RETURN; // Warten !
END_IF;
IF NOT "MB4445" // Weiche Einfahrt ByPass
AND NOT "MB4457"
AND NOT "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
+1 -1
View File
@@ -1,4 +1,4 @@
FUNCTION "FifoIn" : Void
FUNCTION "FifoIn" : Void
TITLE = Datensatz in FIFO-DB eintragen
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
@@ -0,0 +1,98 @@
FUNCTION "HWtoVP_Draussen" : Void
TITLE = Draussen-FC: HW > VP
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC182 "HWtoVP_Draussen" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich globale Merker (MW190 =
//Schleusen-Nr, MD182 = ShopGroup, M180.6) liest und die Zielbausteine voll
//qualifiziert aufruft, gibt es keine echte Registerabhaengigkeit -> die Option
//entfaellt bei der SCL-Fassung, der Baustein ist damit direkt aus SCL aufrufbar
//(CASE 182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. BEC/BEU je Zweig = nach dem
//CASE folgt nur noch das Bausteinende; BEC (bedingtes Bausteinende) ist als
//RETURN, das leere Netzwerkende als Fallthrough des CASE abgebildet. Die
//Merker-Schnittstelle (MW190/MD182/M180.6 vom Aufrufer) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - NW3: "L MD182 / L DINT#-1 / EQ_D" ist als DWORD_TO_DINT("MD182") = DINT#-1
// ausgefuehrt (bit-genau verhaltensgleich zu EQ_D; MD182 ist ein DWORD-Merker
// und wird andernorts via DINT_TO_DWORD beschrieben).
// - NW3: "L Weichen_Ziel / BTI / T Puffer_LinienNr" (BCD-Wort -> Int) ist ueber
// den Projekt-FC "BCD (4stellig)_to_INT" ausgefuehrt. Ergebnis identisch;
// das Fehlerverhalten bei ungueltiger BCD kann abweichen (BTI setzt BIE).
// - NW2: EQ_I-Vergleich Weichen_Ziel gegen die Wort-Konstante 16#4224 ist als
// direkte Wort-Gleichheit (= W#16#4224) abgebildet.
// - Word-Konstante 0 (Parameter "Endziel") als W#16#0 uebernommen.
// - Der FB "Daten_in_SendFIFO_speichern" wird ueber seinen globalen Instanz-DB
// "Daten_für_SendFIFO" aufgerufen; nicht versorgte Parameter behalten (wie im
// AWL) ihren Instanz-DB-Wert. Puffer_LinienNr wird zuvor direkt im Instanz-DB
// gesetzt (entspricht dem AWL-Transfer vor dem CALL).
VAR_TEMP
"Error.Bit" : Bool;
END_VAR
BEGIN
// NW1 (Rueckmeldung): Rueckmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// AWL: UC FC182 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
4207: // NW2: Schleuse 4207 (Vor ByPass vom LP): Ausgefahren ? -- Aufruf von Schleuse 4207?
// Gerade ? Also zum AMR-Bereich? -> dann Bausteinende (AWL: EQ_I / BEC)
IF "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel = W#16#4224 THEN
RETURN; // Ja !
END_IF;
// Partner-Trolley will zu VP fahren:
// Bei Partner (Schleuse 4221) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Sk.Akt_Schritt := 0;
3141: // NW3: Schleuse 3141: (Vor Einfahrt Kontrollplatz) -- Aufruf von Schleuse 3141 ?
// Bei Partner (Schleuse 3136) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DHWtoVP_OmniFahren".Schleuse_3136.Dyn.Sk.Akt_Schritt := 0;
// Leerer Trolley vom Leerpuffer? (ShopGroup = Leer-Trolley?) (AWL: L MD182 / L DINT#-1 / EQ_D / BEC)
IF DWORD_TO_DINT("MD182") = DINT#-1 THEN
RETURN; // Ja ! -> Kein Telegramm!
END_IF;
// GOHDUM an Host senden:
// AWL: L Weichen_Ziel / BTI / T Puffer_LinienNr (BCD-Wort -> Int)
"BCD (4stellig)_to_INT"(
BCD_Wert := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Weichen_Ziel,
Int_Wert => "Daten_für_SendFIFO".Puffer_LinienNr);
"Daten_für_SendFIFO"(
TelegrammKennung[1] := 'G',
TelegrammKennung[2] := 'O',
TelegrammKennung[3] := 'H',
TelegrammKennung[4] := 'D',
TelegrammKennung[5] := 'U',
TelegrammKennung[6] := 'M',
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse,
StationsNr := 3141,
Port := 2,
Ret_Val_FIFO_IN => "MB199",
Error => #"Error.Bit");
// Endziel wieder nullen:
"Trolleydaten_ändern"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse,
Endziel := W#16#0,
ShopGroup := DINT#0);
// AWL: BEU -> Bausteinende (CASE-Zweig endet)
3136: // NW4: Schleuse 3136: (Vor Einfahrt Kontrollplatz) -- Aufruf von Schleuse 3136 ?
// Bei Partner (Schleuse 3141) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Sk.Akt_Schritt := 0;
// AWL: BEU -> Bausteinende (CASE-Zweig endet)
ELSE
; // unbekannte Schleusen-Nr -> nichts tun (AWL: JC ans Netzwerkende)
END_CASE;
// NW5: Ende (AWL: BE)
END_FUNCTION
@@ -0,0 +1,82 @@
FUNCTION "HWtoVP_Leser_FC" : Void
TITLE = Leser-FC: ZG
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Leser
//SCL-Portierung des AWL-Bausteins FC180 "HWtoVP_Leser_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich die globalen Merker MW190
//(Schleusen-Nr), M180.0/M180.1 (Lese-Status) und MW196 (Zwischenziel-Scratch)
//liest bzw. schreibt und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist direkt aus SCL aufrufbar (CASE 180 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Case-Labels sind die dezimalen
//Int-Konstanten aus dem XML. Die Merker-Schnittstelle bleibt erhalten.
//
//Zweig-Muster je Schleuse (in JEDEM der 3 Netzwerke identisch geprueft):
// AN M180.0 / JC Y / BEU -> bei Lesefehler (M180.0=1): nichts tun
// Y: AN M180.1 / BEC -> nur weiter wenn unbekannt in TrolleysDL (M180.1=1)
// L TrolleyID / L DINT#0 / EQ_D / BEC -> nur weiter wenn TrolleyID <> 0
// CALL Trolleydaten_neu_anlegen(...)
// => Aufruf nur wenn: NOT M180.0 AND M180.1 AND TrolleyID <> DINT#0
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - NW1 "Rueckmeldung" setzt den Scratch-Merker MW196 (evtl. Zwischenziel) auf 0
// (AWL: L 0 / T MW196; die Literalkonstante war im XML als Int 0 deklariert).
// Hier als "MW196" := W#16#0000; uebernommen (Word-Merker). Falls das Symbol
// "MW196" in der Symboltabelle als Int deklariert ist, statt dessen
// "MW196" := 0; verwenden.
// - Endziel-Parameter war im Original die Wort-Literalkonstante 16#B000
// (Voll-Puffer-Bereich) -> hier W#16#B000.
// - ShopGroup-Parameter war die getypte Konstante DINT#0 -> 1:1 uebernommen.
// - Alle 3 Zweige nutzen das identische Muster; nur der Schleusen-DB-Pfad variiert.
VAR_TEMP
Zielebene : Word;
END_VAR
BEGIN
// NW1 "Rueckmeldung": Zwischenziel-Scratch (MW196) zuruecksetzen (AWL: L 0 / T MW196)
"MW196" := W#16#0000;
// AWL: UC FC180 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3143: // Schleuse 3143: (Anfrage KontrollPlatz)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3143.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse,
Endziel := W#16#B000,
ShopGroup := DINT#0);
END_IF;
3141: // Schleuse 3141: (Vor Einfahrt KontrollPlatz)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3141.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse,
Endziel := W#16#B000,
ShopGroup := DINT#0);
END_IF;
3134: // Schleuse 3134: (KontrollPlatz)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DHWtoVP_OmniFahren".Schleuse_3134.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3134.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3134.Dyn.TrolleyID_Schleuse,
Endziel := W#16#B000,
ShopGroup := DINT#0);
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
@@ -0,0 +1,229 @@
FUNCTION "HWtoVP_Ziel_FC" : Void
TITLE = Ziel-FC: HW>VP_OmniFahren
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC181 "HWtoVP_Ziel_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und wurde per "UC FC[..]" indirekt aus
//AWL aufgerufen -> aus SCL nicht compilierbar. Er liest ausschliesslich globale
//Merker (MW190 = Schleusen-Nr, MW194 = angefordertes Weichen-Ziel, MD182 = ShopGroup,
//MB-/BG-Merker) und ruft die Zielbausteine voll qualifiziert auf -> keine echte
//Registerabhaengigkeit. Als SCL-Baustein entfaellt die Register-Option und er ist
//direkt aus SCL aufrufbar (CASE 181 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC <Ende>")
//ist als CASE ueber die Schleusen-Nr (MW190) ausgefuehrt. Da die Schleusen-Nrn
//paarweise verschieden sind, kann pro Aufruf hoechstens ein Zweig zutreffen; ein
//AWL-BEU/BEC im getroffenen Zweig ist daher als RETURN bzw. "IF <RLO> THEN RETURN;"
//umgesetzt (verhaltensgleich, da nach dem Dispatch nur noch das Bausteinende folgt).
//Die Merker-Schnittstelle (MW190/MW194 vom Aufrufer gelesen, MW198 = Weichenziel
//ausgegeben, M180.6 = Weiterfahrt-Freigabe) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - NW7 (Schleuse 3141): Der STL-Export enthaelt im Ziel-/Telegramm-Check das
// nicht-standardisierte Token "CAC" (Akku-Restore, bringt den Endziel-Wert MW194
// fuer den zweiten Vergleich zurueck in den Akku). Semantisch werden BEIDE
// Vergleiche gegen MW194 gefuehrt (MW194 = 16#3130 bzw. 16#3127); genau so
// umgesetzt. UNBEDINGT PRUEFEN!
// - NW7 (Schleuse 3141): Im CALL "Daten_in_SendFIFO_speichern" steht als StationsNr
// die Konstante 3143 (LineComment "3141") -> vermutlich Copy-Paste-Fehler im
// Original; Wert 3143 1:1 uebernommen. PRUEFEN!
// - NW9 (Schleuse 3136): Der Ziel-Check liest die Temp-Variable "EndZiel", die im
// gesamten Baustein NIE beschrieben wird (im AWL undefinierter Akku-/L-Stack-Wert).
// Verhalten 1:1 uebernommen -> Wert ist undefiniert. UNBEDINGT PRUEFEN!
// - Der Temp-Member "Error.Bit" traegt im Interface einen Punkt im Namen; er ist als
// gequoteter Bezeichner "Error.Bit" uebernommen (separater Member neben "Error").
// - Wort-Merker (MW194/MW198) und die Word-Temp "EndZiel" werden gegen Word-Konstanten
// (W#16#..) direkt verglichen; MW190 wird fuer den CASE ueber WORD_TO_INT in Int
// gewandelt (AWL: NE_I gegen dezimale Konstante). TypedConstant DINT#-1/DINT#0 1:1.
// - CALL "Daten_in_SendFIFO_speichern": Ausgangsparameter (Ret_Val_FIFO_IN, Error) mit
// "=>" versorgt; nicht versorgte Parameter (ohne Zugriff im XML) weggelassen.
// - DB-Zugriffe: DB-Name gequotet, Member-Pfad wie im Original.
VAR_TEMP
Ziel_hex : Word;
Ziel_int : Int;
Zielebene : Word;
Error : Byte;
Position : Int;
Lager_DB : Int;
Lager_DW : Int;
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt; // Startwert mit Offset 0
SSDW : Int;
EndZiel : Word;
Variante : Int;
AbrufID : DInt;
Fahrlisten_TrolleyID : DInt;
Fahrlisten_AbrufID : DInt;
Fahrlisten_Lager : Int;
Trolley_unbekannt : Bool; // Trolley ist nicht in DL
Express_Abruf : Bool;
"Error.Bit" : Bool;
END_VAR
BEGIN
// NW1: Rueckmeldung - Rueckmeldungen erst mal resetten (Weiterfahrt von Ziel-FC erlaubt)
"M180.6" := FALSE;
// AWL: UC FC181 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3731: // Schleuse 3731: (BST 2)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE;
4203: // Bereich 4203: Weiterfahren erlaubt ? (AFS von BST)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE;
4207: // Schleuse 4207: (Vor BypPass von LP)
// Quell-Steuerung:
IF ("DLPtoHW_OmniFahren".Weiche_4223.Dyn.Weichen_Ziel = W#16#4211) // Fahren Trolleys zu BG4211?
OR "MB4223" // Weiche ist auf Abzweig
OR "DLPtoHW_OmniFahren".Weiche_4223.Dyn.Status.Reset_aktiv THEN
RETURN; // Warten!
END_IF;
// Ziel-Check:
IF NOT "MB4223" // Weiche Einfahrt ByPass
AND NOT "MB4210"
AND NOT "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt
AND NOT "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
3145: // Bereich 3145: Weiterfahren erlaubt ? (AFS von 1.Ebene)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE;
3143: // Schleuse 3143: (Anfrage KontrollPlatz)
IF "MD182" = DINT#-1 THEN // ShopGroup = Leer-Trolley?
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
RETURN; // Kein Telegramm!
END_IF;
IF "SGes".Ohne_PC_Fahren THEN // Also ohne Anfrage
"M180.6" := TRUE;
// -> N3143 (Trolleydaten neu anlegen, Telegramm-Block ueberspringen)
ELSE
// GOHDReqM an Host senden:
IF "DHWtoVP_OmniFahren".Schleuse_3143.Status2.Telegramm_gesendet THEN
"M180.6" := TRUE;
RETURN;
END_IF;
IF "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse = 0 THEN // Barcode bekannt?
RETURN; // Warten!
END_IF;
"Daten_für_SendFIFO"(TelegrammKennung[1] := 'G',
TelegrammKennung[2] := 'O',
TelegrammKennung[3] := 'H',
TelegrammKennung[4] := 'D',
TelegrammKennung[5] := 'R',
TelegrammKennung[6] := 'e',
TelegrammKennung[7] := 'q',
TelegrammKennung[8] := 'M',
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse,
StationsNr := 3143,
Port := 2,
Ret_Val_FIFO_IN => "MB199",
Error => "Error.Bit");
IF NOT "Error.Bit" THEN
"DHWtoVP_OmniFahren".Schleuse_3143.Status2.Telegramm_gesendet := TRUE;
END_IF;
END_IF;
// N3143: Trolleydaten neu anlegen (Falls noch als Daten-Leiche vorhanden war):
"Trolleydaten_neu_anlegen"(Gesamt_Trolley_DL := "DHWtoVP_OmniFahren".Schleuse_3143.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3143.Dyn.TrolleyID_Schleuse,
Endziel := W#16#0000, // Kein Ziel
ShopGroup := DINT#0);
3141: // Schleuse 3141: (Vor Einfahrt Kontrollplatz)
// Quell-Steuerung:
IF ("DHWtoVP_OmniFahren".Schleuse_3136.Dyn.Raus_Trolleys > 0) // Weiche von 2.Quelle schon belegt
OR "MB3136" THEN // Andere Quelle aktiv
RETURN;
END_IF;
// Leerer Trolley vom Leerpuffer? / Telegramm schon gesendet? / Ziel-Check:
IF ("MD182" = DINT#-1) // Leer-Trolley?
OR "SGes".Ohne_PC_Fahren THEN // Also Ziel simulieren -> Kein Telegramm!
// G3141: gerade fahren (zum VP)
"MW198" := W#16#3127; // Weichenziel
IF NOT "DHWtoVP_Sensoren".Stau_BG3127.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
ELSIF ("MW194" <> W#16#3130) // Endziel sinnvoll? (nochmalige Anfrage)
AND ("MW194" <> W#16#3127)
AND NOT "DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet THEN
// T3141: GOHDReqM an Host senden
IF "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse = 0 THEN // Barcode bekannt?
RETURN; // Warten!
END_IF;
"Daten_für_SendFIFO"(TelegrammKennung[1] := 'G',
TelegrammKennung[2] := 'O',
TelegrammKennung[3] := 'H',
TelegrammKennung[4] := 'D',
TelegrammKennung[5] := 'R',
TelegrammKennung[6] := 'e',
TelegrammKennung[7] := 'q',
TelegrammKennung[8] := 'M',
TrolleyID := "DHWtoVP_OmniFahren".Schleuse_3141.Dyn.TrolleyID_Schleuse,
StationsNr := 3143, // LineComment im Original: 3141
Port := 2,
Ret_Val_FIFO_IN => "MB199",
Error => "Error.Bit");
IF NOT "Error.Bit" THEN
"DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet := TRUE;
END_IF;
ELSIF "MW194" = W#16#3130 THEN // Kontroll-Platz? -> Abzweig fahren
// A3141:
"MW198" := W#16#3130; // Weichenziel
IF NOT "DHWtoVP_Sensoren".Stau_BG3130.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
ELSIF "MW194" = W#16#3127 THEN // Zum VP?
// G3141: gerade fahren (zum VP)
"MW198" := W#16#3127; // Weichenziel
IF NOT "DHWtoVP_Sensoren".Stau_BG3127.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
ELSE
IF "10s-Impuls" THEN // Nach 10s: erneute Anfrage
"DHWtoVP_OmniFahren".Schleuse_3141.Status2.Telegramm_gesendet := FALSE;
END_IF;
END_IF;
3134: // Schleuse 3134: (Kontrollplatz)
// Trolley kann gestartet werden: (Vorerst immer)
"PF0136" := "BG3134" AND "Clock_2Hz"; // Trolley ist in Schleuse
// Ausfahren mit Taste:
IF "SF0136" THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
3136: // Schleuse 3136: (Vor Ausfahrt Kontrollplatz)
// Quell-Steuerung:
IF ("DHWtoVP_OmniFahren".Schleuse_3141.Dyn.Raus_Trolleys > 0) // Weiche von 2.Quelle schon belegt
OR "MB3141" THEN // Andere Quelle aktiv
RETURN;
END_IF;
// Ziel-Check:
// Hinweis: Temp "EndZiel" wird hier gelesen, aber im Baustein nie gesetzt -> Wert undefiniert (wie AWL)!
IF "EndZiel" = W#16#BAAA THEN // Kontroll-Platz? -> Abzweig fahren
// A3136:
"MW198" := W#16#3130; // Weichenziel
IF NOT "DHWtoVP_Sensoren".Stau_BG3130.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
ELSE
// G3136:
"MW198" := W#16#3127; // Weichenziel
IF NOT "DHWtoVP_Sensoren".Stau_BG3127.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
@@ -0,0 +1,47 @@
FUNCTION "LP_Draussen_FC" : Void
TITLE = Draussen-FC: LeerPuffer
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC5182 "LP_Draussen_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich den globalen Merker MW190
//(Schleusen-Nr) liest und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist damit direkt aus SCL aufrufbar (CASE 5182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: "L MW190 / L <Schleuse> / NE_I / JC") ist als CASE
//ueber die Schleusen-Nr ausgefuehrt. Die Merker-Schnittstelle (MW190 vom Aufrufer
//gesetzt) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - keine (Konstanten/Symbole 1:1 uebernommen).
BEGIN
// NW1: Rueckmeldung - Rueckmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// NW2: Schleuse 3305 (vor Sorter LP): Ausgefahren?
// AWL: L MW190 / L 3305 / NE_I / JC X3305E (Aufruf von Schleuse 3305?)
CASE WORD_TO_INT("MW190") OF
3305:
"Reservierung_in_Puffer_eintragen"(
TrolleyID := "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX,
Ziel := "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel,
ShopGroup := DINT#0,
Gesamt_Trolley_DL := 0);
// Daten in Sep 3305 loeschen:
"DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX := DINT#0; // IDX
"DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel := 0;
// AWL: BEU -> Bausteinende (Rest entfaellt, nach dem CASE folgt nur das Bausteinende)
ELSE
; // andere Schleusen-Nr -> nichts tun
END_CASE;
// NW3: Ende (AWL: BE)
END_FUNCTION
@@ -0,0 +1,106 @@
FUNCTION "LPtoHW_Draussen_FC" : Void
TITLE = Draussen-FC: LP>HW
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC6182 "LPtoHW_Draussen_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich den globalen Merker MW190
//(Schleusen-Nr) liest und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist damit direkt aus SCL aufrufbar (CASE 6182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Die Merker-Schnittstelle
//(MW190 vom Aufrufer gesetzt) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - Der Vergleich "Weichen_Ziel EQ_I 16#4224" (Schleuse 4221) war im AWL ein
// Int-Vergleich auf einem Word-Operanden; hier als direkte Word-Gleichheit
// (= W#16#4224) uebernommen. Bitmuster identisch -> Verhalten gleich.
// - Das AWL-Interface enthaelt keine Temp-Variablen -> kein VAR_TEMP.
BEGIN
// NW1 Rückmeldung: Rückmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// AWL: UC FC6182 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3323: // Schleuse 3323 (Trolley-Beladung): Ausgefahren?
// Evtl. erkannten Sack löschen:
"DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt := FALSE;
// Trolleydaten ändern:
IF "DLeerPufferStrecken".DurchfahrModus.Aktiv THEN
// Leer-Trolley für VP-Daten:
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
Endziel := W#16#B000, // Vollpuffer
ShopGroup := DINT#-1); // ShopGroup = -1 bei Leertrolly für Vollpuffer!
// Standort übermitteln:
"Trolley_DL_Neue_Pos"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
Position := W#16#7108, // Leser 7108
ShopGroup := DINT#0,
Err => "M199.0");
"DLeerPufferStrecken".DurchfahrModus.RestTrolleys := "DLeerPufferStrecken".DurchfahrModus.RestTrolleys - 1;
// Noch Rest-Trolleys vorhanden?
IF "DLeerPufferStrecken".DurchfahrModus.RestTrolleys > 0 THEN
RETURN; // Ja! -> beenden (AWL BEC)
END_IF;
"DLeerPufferStrecken".DurchfahrModus.Aktiv := FALSE; // Erst mal beenden
// AWL BEU -> Bausteinende
ELSE
// SackTrolley: Sack-Trolleydaten erzeugen
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
Endziel := W#16#AAAA, // AMR-Bereich
ShopGroup := DINT#0);
// Standort übermitteln:
"Trolley_DL_Neue_Pos"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
Position := W#16#7108, // Leser 7108
ShopGroup := DINT#0,
Err => "M199.0");
// Umschalten auf Durchfahr-Modus:
IF "DLeerPufferStrecken".DurchfahrModus.Anmelden THEN
"DLeerPufferStrecken".DurchfahrModus.Anmelden := FALSE;
"DLeerPufferStrecken".DurchfahrModus.Aktiv := TRUE;
END_IF;
// AWL BEU -> Bausteinende
END_IF;
4221: // Schleuse 4221 (Vor ByPass zum VP): Ausgefahren?
// Evtl. erkannten Sack löschen:
"DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt := FALSE;
// Gerade? Also zum AMR-Bereich?
IF "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Weichen_Ziel = W#16#4224 THEN
// Trolley fährt zum AMR:
// Trolleydaten in DB1000 löschen, da zum AMR fährt und danach kein Leser mehr!
"Trolleydaten_löschen"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse);
// AWL BEU -> Bausteinende
ELSE
// Trolley fährt zu VP:
// Bei Partner (Schleuse 4207) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Sk.Akt_Schritt := 0;
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
// NW4 Ende (AWL BE)
END_FUNCTION
@@ -0,0 +1,73 @@
FUNCTION "LPtoHW_Leser_FC" : Void
TITLE = Leser-FC: LP > HW
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Leser
//SCL-Portierung des AWL-Bausteins FC6180 "LPtoHW_Leser_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich die globalen Merker MW190
//(Schleusen-Nr), M180.0/M180.1 (Lese-Status) und MW196 (Zwischenziel-Scratch)
//liest bzw. schreibt und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist direkt aus SCL aufrufbar (CASE 6180 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Case-Labels sind die dezimalen
//Int-Konstanten aus dem XML. Die Merker-Schnittstelle bleibt erhalten.
//
//Zweig-Muster je Schleuse (in JEDEM der 2 Netzwerke identisch geprueft):
// AN M180.0 / JC Y / BEU -> bei Lesefehler (M180.0=1): nichts tun
// Y: AN M180.1 / BEC -> nur weiter wenn unbekannt in TrolleysDL (M180.1=1)
// L TrolleyID / L DINT#0 / EQ_D / BEC -> nur weiter wenn TrolleyID <> 0
// CALL Trolleydaten_neu_anlegen(...)
// => Aufruf nur wenn: NOT M180.0 AND M180.1 AND TrolleyID <> DINT#0
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - NW1 "Rueckmeldung" setzt den Scratch-Merker MW196 (evtl. Zwischenziel) auf 0
// (AWL: L 0 / T MW196; die Literalkonstante war im XML als Int 0 deklariert).
// Hier als "MW196" := W#16#0000; uebernommen (Word-Merker). Falls das Symbol
// "MW196" in der Symboltabelle als Int deklariert ist, statt dessen
// "MW196" := 0; verwenden.
// - Endziel-Parameter ist je Zweig verschieden und war im Original eine Wort-
// Literalkonstante: Schleuse 3323 -> 16#A000 (Leerpuffer-Bereich) -> W#16#A000;
// Schleuse 4221 -> 16#AAAA (AMR-Bereich) -> W#16#AAAA.
// - ShopGroup-Parameter war die getypte Konstante DINT#0 -> 1:1 uebernommen.
// - Beide Zweige nutzen das identische Muster; nur Schleusen-DB-Pfad und Endziel variieren.
VAR_TEMP
Zielebene : Word;
END_VAR
BEGIN
// NW1 "Rueckmeldung": Zwischenziel-Scratch (MW196) zuruecksetzen (AWL: L 0 / T MW196)
"MW196" := W#16#0000;
// AWL: UC FC6180 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3323: // Schleuse 3323: (Trolley-Beladung)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DLPtoHW_OmniFahren".Schleuse_3323.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DLPtoHW_OmniFahren".Schleuse_3323.Dyn.TrolleyID_Schleuse,
Endziel := W#16#A000,
ShopGroup := DINT#0);
END_IF;
4221: // Schleuse 4221: (Vor ByPass zurück zum VP)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DLPtoHW_OmniFahren".Schleuse_4221.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.TrolleyID_Schleuse,
Endziel := W#16#AAAA,
ShopGroup := DINT#0);
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
@@ -0,0 +1,141 @@
FUNCTION "LPtoHW_Ziel_FC" : Void
TITLE = Ziel-FC: LP>HW
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC6181 "LPtoHW_Ziel_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und wurde per "UC FC[..]" indirekt aus
//AWL aufgerufen -> aus SCL nicht compilierbar. Er liest ausschliesslich globale
//Merker (MW190 = Schleusen-Nr, MW194 = angefordertes Weichen-Ziel, MB-/BG-Merker)
//und gibt globale Merker aus (MW198 = Weichenziel, M180.6 = Weiterfahrt-Freigabe)
//-> keine echte Registerabhaengigkeit. Als SCL-Baustein entfaellt die Option und
//er ist direkt aus SCL aufrufbar (CASE 6181 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC <Ende>")
//ist als CASE ueber die Schleusen-Nr (MW190) ausgefuehrt. Da die Schleusen-Nrn
//paarweise verschieden sind, kann pro Aufruf hoechstens ein Zweig zutreffen; ein
//AWL-BEU/BEC im getroffenen Zweig ist daher als RETURN bzw. "IF <RLO> THEN RETURN;"
//umgesetzt (verhaltensgleich, da nach dem Dispatch nur noch das Bausteinende folgt).
//Die Merker-Schnittstelle (MW190 vom Aufrufer gelesen, MW198 = Weichenziel
//ausgegeben, M180.6 = Weiterfahrt-Freigabe) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - Schleuse 4221 (NW4): das AWL prueft "Vollpuffer" ueber den DB-Wort-Wert
// "DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Trolley_EndZiel = W#16#B000 (EQ_I) und
// routet danach ueber MW198 (Abzweig W#16#4211 / Gerade W#16#4224). Die
// AWL-Sprungfolge "JC A4221 / JC G4221 / JU G4221" ist als IF/ELSE umgesetzt:
// das zweite "JC G4221" ist im AWL wirkungslos (RLO=0 nach nicht genommenem
// JC A4221) -> beide Nicht-Abzweig-Pfade fuehren nach G4221 (Gerade). Das
// "BEC" (Quell-Steuerung) ist als "IF <RLO> THEN RETURN; END_IF;" umgesetzt.
// - Vergleiche: Wort-DB-Wert gegen Wort-Konstante als direkte Gleichheit (AWL EQ_I),
// Int-DB-Wert (Raus_Trolleys) mit "> 0" (AWL GT_I gegen 0). MW190 wird fuer den
// CASE ueber WORD_TO_INT in Int gewandelt (AWL: NE_I gegen dezimale Konstante).
// - Word-Transfers "L 16#.. / T MW198" sind als "MW198" := W#16#..; umgesetzt.
// - DB-Namen sind als Symbol gequotet (z.B. "DLeerPufferStrecken"); Member-Pfade
// aus den Symbol-Components.
// - Der Baustein ruft KEINE Fremd-FCs auf (reine Merker-/DB-Auswertung).
// - Die VAR_TEMP-Member aus der AWL-Schnittstelle sind 1:1 uebernommen, werden in
// diesem Baustein aber nicht verwendet -> keine uninitialisierten Temp-Zugriffe.
VAR_TEMP
Ziel_hex : Word;
Ziel_int : Int;
Zielebene : Word;
Error : Byte;
Position : Int;
Lager_DB : Int;
Lager_DW : Int;
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt; // Startwert mit Offset 0
SSDW : Int;
EndZiel : Word;
Variante : Int;
AbrufID : DInt;
Fahrlisten_TrolleyID : DInt;
Fahrlisten_AbrufID : DInt;
Fahrlisten_Lager : Int;
Trolley_unbekannt : Bool; // Trolley ist nicht in DL
Express_Abruf : Bool;
END_VAR
BEGIN
// NW1: Rueckmeldung - Rueckmeldungen erst mal resetten (Weiterfahrt von Ziel-FC erlaubt)
"M180.6" := FALSE;
// AWL: UC FC6181 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3342: // Schleuse 3342: Weiterfahren erlaubt ? (Vor Trolley-Beladung)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE;
3323: // Schleuse 3323: Weiterfahren erlaubt ? (Trolley-Beladung)
// Umschalten auf Durchfahr-Modus:
IF "DLeerPufferStrecken".DurchfahrModus.Anmelden
AND NOT "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt THEN // Noch kein Sack behängt
"DLeerPufferStrecken".DurchfahrModus.Anmelden := FALSE;
"DLeerPufferStrecken".DurchfahrModus.Aktiv := TRUE;
END_IF;
// Trolley-Err-Anzeige (blau):
"PF0033" := "BG3323" // Trolley ist in Schleuse
AND ( ("DLeerPufferStrecken".DurchfahrModus.Aktiv
AND "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt) // Aber Sack behängt
OR (NOT "DLeerPufferStrecken".DurchfahrModus.Aktiv
AND NOT "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt) ); // Noch kein Sack behängt
// Trolley kann gestartet werden:
"PF0044" := "BG3323" // Trolley ist in Schleuse
AND NOT "DLeerPufferStrecken".DurchfahrModus.Aktiv
AND "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt // Sack behängt
AND "Clock_2Hz";
// Bestätigung durch Bediener:
IF "BG3323" // Trolley ist in Schleuse
AND ( ("SF0044" // Bestätigung mit Taster
AND NOT "DLeerPufferStrecken".DurchfahrModus.Aktiv
AND "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt) // Sack behängt
// Durchfahr-Modus aktiv:
OR ("DLeerPufferStrecken".DurchfahrModus.Aktiv
AND NOT "DLPtoHW_Sensoren".Sack_BG3324.Stat.B_Akt) ) THEN // Aber Sack behängt
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
4221: // Schleuse 4221: (Vor ByPass zum VP)
// Ziel-Check:
IF ("DLPtoHW_OmniFahren".Schleuse_4221.Dyn.Trolley_EndZiel = W#16#B000) // Vollpuffer ?
AND NOT "DLPtoHW_Sensoren".Sack_BG4222.Stat.B_Akt THEN // Kein Sack erkannt
// A4221: Abzweig fahren
"MW198" := W#16#4211; // Weichenziel
// Quell-Steuerung:
IF ("DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Raus_Trolleys > 0) // Trolleys zur Weiche MB4210 unterwegs?
OR "DHWtoVP_OmniFahren".Schleuse_4207.Dyn.Status.Reset_aktiv
OR "MB4207" THEN // Andere Quelle aktiv
RETURN;
END_IF;
IF NOT "DHWtoVP_Sensoren".Stau_BG4210.Stat.B_Akt
AND NOT "DHWtoVP_Sensoren".Stau_BG4211.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
ELSE
// G4221: Gerade fahren (Rest Gerade fahren)
"MW198" := W#16#4224; // Weichenziel
IF NOT "DLPtoHW_Sensoren".Stau_BG4224.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
END_IF;
4235: // Schleuse 4235: (BST 2)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE;
3722: // Schleuse 3722: Übergabe an UH06/AMR
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
@@ -1,4 +1,4 @@
FUNCTION_BLOCK "MHMOmniSchleuse"
FUNCTION_BLOCK "MHMOmniSchleuse"
TITLE = HM-Omni-Schleuse (Schrittkette)
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
+1 -1
View File
@@ -1,4 +1,4 @@
FUNCTION_BLOCK "MZylinder"
FUNCTION_BLOCK "MZylinder"
TITLE = Zylinderansteuerung
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
@@ -0,0 +1,68 @@
FUNCTION "VP_Draussen_FC" : Void
TITLE = Draussen-FC: VollPuffer
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC1182 "VP_Draussen_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich den globalen Merker MW190
//(Schleusen-Nr) liest und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist damit direkt aus SCL aufrufbar (CASE 1182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Die Merker-Schnittstelle
//(MW190 vom Aufrufer gesetzt) bleibt erhalten. BEU je Zweig = nach dem CASE
//folgt nur noch das Bausteinende, daher keine weitere Aktion noetig.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - Vor den CALL-Aufrufen standen im AWL reine Akku-Ladebefehle ohne Transfer
// (NW2: L MD182 / L ...Rec_IDX; NW3: L MD182 / L ...Trolley_ShopGroup).
// Diese "toten" Ladungen hatten keine Wirkung (Parameter werden am CALL
// vollstaendig explizit versorgt) und entfallen.
// - NW3 enthielt "SET" gefolgt von einem auskommentierten "R M83.1"
// (LineComment "/ R \"M83.1\""). Ohne aktive Anweisung bleibt SET wirkungslos
// und entfaellt.
BEGIN
// NW1 (Rueckmeldung): Rueckmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// AWL: UC FC1182 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3121: // NW2: Schleuse 3121 (Sorter VP_A von KontrollPlatz): Ausgefahren?
"Reservierung_in_Puffer_eintragen"(
TrolleyID := "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX,
Ziel := "DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel,
ShopGroup := "MD182",
Gesamt_Trolley_DL := 1000);
// Daten in Sep 3121 loeschen:
"DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX := DINT#0; // IDX
"DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel := 0;
// Bei Partner (Schleuse 3123) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DVP_OmniFahren".Schleuse_3123.Dyn.Sk.Akt_Schritt := 0;
"DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX := DINT#0; // IDX
"DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel := 0;
3123: // NW3: Schleuse 3123 (Sorter VP_A von RueckfuehrStrecke): Ausgefahren?
"Reservierung_in_Puffer_eintragen"(
TrolleyID := "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX,
Ziel := "DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel,
ShopGroup := "MD182",
Gesamt_Trolley_DL := 1000);
// Daten in Sep 3123 loeschen:
"DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_IDX := DINT#0; // IDX
"DVP_Sorter_A".Sorter_MB3123.Dyn.Scanner.Rec_DEST_Ziel := 0;
// Bei Partner (Schleuse 3121) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DVP_OmniFahren".Schleuse_3121.Dyn.Sk.Akt_Schritt := 0;
"DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_IDX := DINT#0; // IDX
"DVP_Sorter_A".Sorter_MB3121.Dyn.Scanner.Rec_DEST_Ziel := 0;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun (AWL: JC ans Netzwerkende)
END_CASE;
END_FUNCTION
+92
View File
@@ -0,0 +1,92 @@
FUNCTION "VP_Leser_FC" : Void
TITLE = Leser-FC: Vollpuffer
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Leser
//SCL-Portierung des AWL-Bausteins FC1180 "VP_Leser_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich die globalen Merker MW190
//(Schleusen-Nr), M180.0/M180.1 (Lese-Status) und MW196 (Zwischenziel-Scratch)
//nutzt und die Zielbausteine voll qualifiziert aufruft, gibt es keine echte
//Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung, der Baustein
//ist direkt aus SCL aufrufbar (CASE 1180 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Case-Labels sind die dezimalen
//Int-Konstanten aus dem XML. Die Merker-Schnittstelle bleibt erhalten.
//
//Zweig-Muster (in 3121/3123 identisch geprueft):
// AN M180.0 / JC Y / BEU -> bei Lesefehler (M180.0=1): nichts tun
// Y: AN M180.1 / BEC -> nur weiter wenn unbekannt in TrolleysDL (M180.1=1)
// L TrolleyID / L DINT#0 / EQ_D / BEC -> nur weiter wenn TrolleyID <> 0
// CALL Trolleydaten_neu_anlegen(...)
// => Aufruf nur wenn: NOT M180.0 AND M180.1 AND TrolleyID <> DINT#0
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - NW1 "Rueckmeldung" setzt den Scratch-Merker MW196 (evtl. Zwischenziel) auf 0
// (AWL: L 0 / T MW196; das Original laedt die Int-Literalkonstante 0 und
// transferiert sie in das Wort-Merkerwort MW196). Hier als "MW196" := W#16#0000;
// Falls das Symbol "MW196" in der Symboltabelle als Int deklariert ist,
// statt dessen "MW196" := 0; verwenden.
// - Schleuse 3244 WEICHT vom Standardmuster ab: sie enthaelt KEINE
// TrolleyID<>0-Pruefung vor dem Aufruf. Der Aufruf erfolgt dort bereits bei
// NOT M180.0 AND M180.1 (siehe Zweig 3244). Zusaetzlich enthaelt der
// Lesefehler-Zweig von 3244 ein wirkungsloses SET und einen auskommentierten
// Befehl S "DVP_OmniFahren".Schleuse_3244.Dyn.HMI.Abzweig_fahren (nur Kommentar,
// keine Aktion) vor dem Bausteinende -> ohne Wirkung uebernommen.
// - Endziel-Parameter war im Original die Wort-Literalkonstante 16#0000 -> hier W#16#0000.
// - ShopGroup-Parameter: in 3121/3123 getypte Konstante DINT#815, in 3244
// DInt-Literalkonstante 815 -> in allen Zweigen als DINT#815 uebernommen.
VAR_TEMP
Zielebene : Word;
END_VAR
BEGIN
// NW1 "Rueckmeldung": Zwischenziel-Scratch (MW196) zuruecksetzen (AWL: L 0 / T MW196)
"MW196" := W#16#0000;
// AWL: UC FC1180 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3121: // Schleuse 3121: (Sorter VP A / KontrollPlatz)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
// /In Zukunft Anfrage bei Host!
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3121.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DVP_OmniFahren".Schleuse_3121.Dyn.TrolleyID_Schleuse,
Endziel := W#16#0000,
ShopGroup := DINT#815);
END_IF;
3123: // Schleuse 3123: (Sorter VP A / RueckfuehrStecke)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
// /In Zukunft Anfrage bei Host!
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3123.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DVP_OmniFahren".Schleuse_3123.Dyn.TrolleyID_Schleuse,
Endziel := W#16#0000,
ShopGroup := DINT#815);
END_IF;
3244: // Schleuse 3244: (nach Puffer-Ausfahrt)
// ABWEICHUNG: kein TrolleyID<>0-Check; Lesefehler-Zweig enthaelt nur ein
// wirkungsloses SET + auskommentiertes S "...Schleuse_3244.Dyn.HMI.Abzweig_fahren"
// /In Zukunft Anfrage bei Host!
IF NOT "M180.0" AND "M180.1" THEN
// Erst mal, da kein Host!
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DVP_OmniFahren".Schleuse_3244.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DVP_OmniFahren".Schleuse_3244.Dyn.TrolleyID_Schleuse,
Endziel := W#16#0000,
ShopGroup := DINT#815);
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
@@ -0,0 +1,59 @@
FUNCTION "VPtoEP_Draussen_FC" : Void
TITLE = Draussen-FC: VollPuffer
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Draussen
//SCL-Portierung des AWL-Bausteins FC2182 "VPtoEP_Draussen_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich den globalen Merker MW190
//(Schleusen-Nr) liest und die Zielbausteine voll qualifiziert aufruft, gibt es
//keine echte Registerabhaengigkeit -> die Option entfaellt bei der SCL-Fassung,
//der Baustein ist damit direkt aus SCL aufrufbar (CASE 2182 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: "L MW190 / L 4443 / NE_I / JC X4443E") ist als CASE
//ueber die Schleusen-Nr ausgefuehrt. Es existiert nur ein Zweig (Schleuse 4443).
//Die Merker-Schnittstelle (MW190 vom Aufrufer gesetzt) bleibt erhalten.
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - AWL "BEU" (Bausteinende) im getroffenen Zweig ist als RETURN abgebildet.
// - MW190 (Word-Merker) wird per WORD_TO_INT gegen die Int-Schleusen-Nr 4443
// verglichen; Weichen_Ziel (Word) wird direkt gegen W#16#4461 verglichen.
// - Keine funktionale Abweichung erwartet; reine Struktur-Portierung.
BEGIN
// NW1 Rueckmeldung: Rueckmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// AWL: UC FC2182 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
4443: // Schleuse 4443 (Vor ByPass zum LP): Ausgefahren?
// Evtl. erkannten Sack loeschen:
"DVPtoEP_Sensoren".Sack_BG4444.Stat.B_Akt := FALSE;
// Abzweig? (AWL: L Weichen_Ziel / L 16#4461 / NE_I / JC EP)
IF "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Weichen_Ziel = W#16#4461 THEN
// Trolley faehrt zum LP:
// Trolleydaten in DB1000 loeschen, da zum LP faehrt und danach kein Leser mehr!
"Trolleydaten_löschen"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse);
// Bei Partner (Schleuse 4466) wieder mit Schritt 0 beginnen (erneuter Ziel-FC-Aufruf)
"DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Sk.Akt_Schritt := 0;
RETURN; // AWL: BEU (Bausteinende)
ELSE
// EP: Trolleydaten in DB1000 aendern
"Trolleydaten_ändern"(
Gesamt_Trolley_DL := 1000,
TrolleyID := "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse,
Endziel := W#16#E000, // Entnahmepuffer
ShopGroup := DINT#0);
END_IF;
ELSE
; // MW190 <> 4443 -> nichts tun (AWL: JC X4443E ans Bausteinende)
END_CASE;
END_FUNCTION
@@ -0,0 +1,61 @@
FUNCTION "VPtoEP_Leser_FC" : Void
TITLE = Leser-FC: VP>EP
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Leser
//SCL-Portierung des AWL-Bausteins FC2180 "VPtoEP_Leser_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und konnte daher nur per UC/CC aus AWL
//aufgerufen werden. Da der Baustein ausschliesslich die globalen Merker MW190
//(Schleusen-Nr), M180.0/M180.1 (Lese-Status) und MW196 (Scratch) verwendet und den
//Zielbaustein voll qualifiziert aufruft, gibt es keine echte Registerabhaengigkeit
//-> die Option entfaellt bei der SCL-Fassung, der Baustein ist direkt aus SCL
//aufrufbar (CASE 2180 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC")
//ist als CASE ueber die Schleusen-Nr ausgefuehrt. Case-Labels sind die dezimalen
//Int-Konstanten aus dem XML. Die Merker-Schnittstelle bleibt erhalten.
//Dieser Baustein enthaelt genau EINEN Zweig (Schleuse 4443).
//
//Zweig-Muster je Schleuse (im Netzwerk geprueft):
// AN M180.0 / JC Y / BEU -> bei Lesefehler (M180.0=1): nichts tun
// Y: AN M180.1 / BEC -> nur weiter wenn unbekannt in TrolleysDL (M180.1=1)
// L TrolleyID / L DINT#0 / EQ_D / BEC -> nur weiter wenn TrolleyID <> 0
// CALL Trolleydaten_neu_anlegen(...)
// => Aufruf nur wenn: NOT M180.0 AND M180.1 AND TrolleyID <> DINT#0
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - NW1 "Rueckmeldung" setzt den Scratch-Merker MW196 (evtl. Zwischenziel) auf 0
// (AWL: L 0 / T MW196). Hier als "MW196" := W#16#0000; uebernommen. Falls das
// Symbol "MW196" in der Symboltabelle als Int deklariert ist, statt dessen
// "MW196" := 0; verwenden.
// - Endziel-Parameter ist im Original die Wort-Literalkonstante 16#C000
// (Entnahme-Puffer-Bereich) -> hier W#16#C000.
// - ShopGroup-Parameter war die getypte Konstante DINT#0 -> 1:1 uebernommen.
VAR_TEMP
Zielebene : Word;
END_VAR
BEGIN
// NW1 "Rueckmeldung": Zwischenziel-Scratch (MW196) zuruecksetzen (AWL: L 0 / T MW196)
"MW196" := W#16#0000;
// AWL: UC FC2180 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
4443: // Schleuse 4443: (Vor ByPass zurück zu LP)
// Daten in Datenbank erzeugen:
IF NOT "M180.0" AND "M180.1" AND ("DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse <> DINT#0) THEN
"Trolleydaten_neu_anlegen"(
Gesamt_Trolley_DL := "DVPtoEP_OmniFahren".Schleuse_4443.Schleuse.Gesamt_Trolley_DL,
TrolleyID := "DVPtoEP_OmniFahren".Schleuse_4443.Dyn.TrolleyID_Schleuse,
Endziel := W#16#C000,
ShopGroup := DINT#0);
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION
@@ -0,0 +1,105 @@
FUNCTION "VPtoEP_Ziel_FC" : Void
TITLE = Ziel-FC: VP>EP
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
FAMILY : Module
NAME : Ziel
//SCL-Portierung des AWL-Bausteins FC2181 "VPtoEP_Ziel_FC" (verhaltensgleich).
//
//Der Baustein hatte im AWL-Original die Bausteineigenschaft "Parameterversorgung
//ueber Register" (ParameterPassing) aktiv und wurde per "UC FC[..]" indirekt aus
//AWL aufgerufen -> aus SCL nicht compilierbar. Er liest ausschliesslich globale
//Merker (MW190 = Schleusen-Nr, vom Aufrufer gesetzt) sowie Sensor-/Schleusen-DBs
//und gibt globale Merker aus (MW198 = Weichenziel, M180.6 = Weiterfahrt-Freigabe)
//-> keine echte Registerabhaengigkeit. Als SCL-Baustein entfaellt die Option und
//er ist direkt aus SCL aufrufbar (CASE 2181 in MHMOmniSchleuse).
//
//Der indirekte Dispatch (AWL: je Netzwerk "L MW190 / L <Schleuse> / NE_I / JC <Ende>")
//ist als CASE ueber die Schleusen-Nr (MW190) ausgefuehrt. Da die Schleusen-Nrn
//paarweise verschieden sind, kann pro Aufruf hoechstens ein Zweig zutreffen; ein
//AWL-BEU im getroffenen Zweig ist daher als Ende des CASE-Zweiges umgesetzt und ein
//AWL-BEC als "IF <RLO> THEN RETURN;" (verhaltensgleich, da nach dem Dispatch nur
//noch das Bausteinende folgt).
//
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
// - MW190 wird fuer den CASE ueber WORD_TO_INT in Int gewandelt (AWL: NE_I gegen
// dezimale Int-Konstante). Word-Merker (MW198) wird mit Word-Konstanten
// (W#16#..) direkt versorgt (AWL: L 16#.. / T MW198).
// - Schleuse 4443 (NW5): ShopGroup-Vergleich gegen TypedConstant DINT#-1 wird 1:1
// als DINT#-1 uebernommen.
// - Schleuse 4443 (NW5): Verzweigung "Abzweig fahren" (JC A4443) vs. "Rest gerade
// fahren" (JU G4443) ist als IF/ELSE ausgefuehrt. Bedingung fuer Abzweig =
// (Trolley_ShopGroup = DINT#-1) UND NICHT Sack_BG4444 erkannt.
// - Globale DB-/Merker-Namen sind gequotet; keiner der hier verwendeten Namen
// enthaelt Sonderzeichen.
// - Alle VAR_TEMP-Member der AWL-Schnittstelle sind deklariert, werden aber im
// Code nicht verwendet (kein uninitialisierter Temp-Zugriff im Baustein).
VAR_TEMP
Ziel_hex : Word;
Ziel_int : Int;
Zielebene : Word;
Error : Byte;
Position : Int;
Lager_DB : Int;
Lager_DW : Int;
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt; // Startwert mit Offset 0
SSDW : Int;
EndZiel : Word;
Variante : Int;
AbrufID : DInt;
Fahrlisten_TrolleyID : DInt;
Fahrlisten_AbrufID : DInt;
Fahrlisten_Lager : Int;
Trolley_unbekannt : Bool; // Trolley ist nicht in DL
Express_Abruf : Bool;
END_VAR
BEGIN
// NW1 (Rueckmeldung): Rueckmeldungen erst mal resetten
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
// AWL: UC FC2181 dispatcht ueber MW190 (Schleusen-Nr, vom Aufrufer gesetzt)
CASE WORD_TO_INT("MW190") OF
3361: // Bereich 3361: Weiterfahren erlaubt ? (Ende MA0060)
IF NOT "DVPtoEP_Sensoren".Stau_BG3362.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
3366: // Schleuse 3366: (BST 1)
// AWL: SET / S M180.6 -> Weiterfahrt bedingungslos erlaubt
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
4441: // Bereich 4441: Weiterfahren erlaubt ? (Ende MA0320)
IF NOT "DVPtoEP_Sensoren".Stau_BG4442.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
4443: // Schleuse 4443: (Vor ByPass zurück zu LP)
// Ziel-Check:
IF ("DVPtoEP_OmniFahren".Schleuse_4443.Dyn.Trolley_ShopGroup = DINT#-1) // leerer Trolley ?
AND NOT "DVPtoEP_Sensoren".Sack_BG4444.Stat.B_Akt THEN // Kein Sack erkannt
// A4443: Abzweig fahren
"MW198" := W#16#4461; // Weichenziel
// Quell-Steuerung:
IF ("DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Raus_Trolleys > 0) // Trolleys zur Weiche MB4210 unterwegs?
OR "DEPtoLP_OmniFahren".Schleuse_4466.Dyn.Status.Reset_aktiv
OR "MB4466" THEN // Andere Quelle aktiv
RETURN;
END_IF;
IF NOT "DEPtoLP_Sensoren".Stau_BG4461.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
ELSE
// G4443: Rest Gerade fahren
"MW198" := W#16#4447; // Weichenziel
IF NOT "DVPtoEP_Sensoren".Stau_BG4447.Stat.B_Akt THEN
"M180.6" := TRUE; // Weiterfahrt ist erlaubt
END_IF;
END_IF;
ELSE
; // unbekannte Schleusen-Nr -> nichts tun
END_CASE;
END_FUNCTION