diff --git a/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Draussen_FC.scl b/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Draussen_FC.scl index 01c9fe9..4c2b44e 100644 --- a/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Draussen_FC.scl +++ b/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Draussen_FC.scl @@ -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 diff --git a/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Leser_FC.scl b/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Leser_FC.scl index fe16176..5ed01c8 100644 --- a/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Leser_FC.scl +++ b/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Leser_FC.scl @@ -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 diff --git a/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Ziel_FC.scl b/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Ziel_FC.scl new file mode 100644 index 0000000..731532a --- /dev/null +++ b/SCL-Export/=A01+UH06-KF00/Arbeitsplatz_Ziel_FC.scl @@ -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 / NE_I / JC ") +//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 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 diff --git a/SCL-Export/=A01+UH06-KF00/DatenOut.scl b/SCL-Export/=A01+UH06-KF00/DatenOut.scl index 133ece5..d3be88f 100644 --- a/SCL-Export/=A01+UH06-KF00/DatenOut.scl +++ b/SCL-Export/=A01+UH06-KF00/DatenOut.scl @@ -1,4 +1,4 @@ -FUNCTION "DatenOut" : Void +FUNCTION "DatenOut" : Void TITLE = Datensatz in Datenliste suchen / lesen / loeschen { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH06-KF00/FifoIn.scl b/SCL-Export/=A01+UH06-KF00/FifoIn.scl index cd3f7cf..28f2c0b 100644 --- a/SCL-Export/=A01+UH06-KF00/FifoIn.scl +++ b/SCL-Export/=A01+UH06-KF00/FifoIn.scl @@ -1,4 +1,4 @@ -FUNCTION "FifoIn" : Void +FUNCTION "FifoIn" : Void TITLE = Datensatz in FIFO-DB eintragen { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH06-KF00/HWtoAMR_Ziel_FC.scl b/SCL-Export/=A01+UH06-KF00/HWtoAMR_Ziel_FC.scl index 89a2a63..5d4cbb3 100644 --- a/SCL-Export/=A01+UH06-KF00/HWtoAMR_Ziel_FC.scl +++ b/SCL-Export/=A01+UH06-KF00/HWtoAMR_Ziel_FC.scl @@ -1,4 +1,4 @@ -FUNCTION "HWtoAMRZielFC" : Void +FUNCTION "HWtoAMRZielFC" : Void TITLE = Ziel-FC: HW>AMR { S7_Optimized_Access := 'FALSE' } AUTHOR : AE diff --git a/SCL-Export/=A01+UH06-KF00/HWtoOB_Ziel_FC.scl b/SCL-Export/=A01+UH06-KF00/HWtoOB_Ziel_FC.scl index 4c8e51b..b059711 100644 --- a/SCL-Export/=A01+UH06-KF00/HWtoOB_Ziel_FC.scl +++ b/SCL-Export/=A01+UH06-KF00/HWtoOB_Ziel_FC.scl @@ -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 diff --git a/SCL-Export/=A01+UH06-KF00/MHMOmniSchleuse.scl b/SCL-Export/=A01+UH06-KF00/MHMOmniSchleuse.scl index b7ed1ac..5c8a4b5 100644 --- a/SCL-Export/=A01+UH06-KF00/MHMOmniSchleuse.scl +++ b/SCL-Export/=A01+UH06-KF00/MHMOmniSchleuse.scl @@ -1,4 +1,4 @@ -FUNCTION_BLOCK "MHMOmniSchleuse" +FUNCTION_BLOCK "MHMOmniSchleuse" TITLE = HM-Omni-Schleuse (Schrittkette) { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH06-KF00/MZylinder.scl b/SCL-Export/=A01+UH06-KF00/MZylinder.scl index a9e8ba4..9181756 100644 --- a/SCL-Export/=A01+UH06-KF00/MZylinder.scl +++ b/SCL-Export/=A01+UH06-KF00/MZylinder.scl @@ -1,4 +1,4 @@ -FUNCTION_BLOCK "MZylinder" +FUNCTION_BLOCK "MZylinder" TITLE = Zylinderansteuerung { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH07-KF00/DatenOut.scl b/SCL-Export/=A01+UH07-KF00/DatenOut.scl index 133ece5..d3be88f 100644 --- a/SCL-Export/=A01+UH07-KF00/DatenOut.scl +++ b/SCL-Export/=A01+UH07-KF00/DatenOut.scl @@ -1,4 +1,4 @@ -FUNCTION "DatenOut" : Void +FUNCTION "DatenOut" : Void TITLE = Datensatz in Datenliste suchen / lesen / loeschen { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH07-KF00/EP_Draussen_FC.scl b/SCL-Export/=A01+UH07-KF00/EP_Draussen_FC.scl new file mode 100644 index 0000000..80dac45 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/EP_Draussen_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/EP_Leser_FC.scl b/SCL-Export/=A01+UH07-KF00/EP_Leser_FC.scl new file mode 100644 index 0000000..cfc7302 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/EP_Leser_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/EPtoLP_Draussen.scl b/SCL-Export/=A01+UH07-KF00/EPtoLP_Draussen.scl new file mode 100644 index 0000000..3c83429 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/EPtoLP_Draussen.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/EPtoLP_Ziel_FC.scl b/SCL-Export/=A01+UH07-KF00/EPtoLP_Ziel_FC.scl new file mode 100644 index 0000000..13e0224 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/EPtoLP_Ziel_FC.scl @@ -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 / NE_I / JC ") +//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 THEN RETURN;" (verhaltensgleich, da nach dem +//Dispatch nur noch das Bausteinende folgt). +// +//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!): +// - Dispatch: AWL "L MW190 / L / NE_I / JC " -> 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 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 diff --git a/SCL-Export/=A01+UH07-KF00/FifoIn.scl b/SCL-Export/=A01+UH07-KF00/FifoIn.scl index cd3f7cf..28f2c0b 100644 --- a/SCL-Export/=A01+UH07-KF00/FifoIn.scl +++ b/SCL-Export/=A01+UH07-KF00/FifoIn.scl @@ -1,4 +1,4 @@ -FUNCTION "FifoIn" : Void +FUNCTION "FifoIn" : Void TITLE = Datensatz in FIFO-DB eintragen { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH07-KF00/HWtoVP_Draussen.scl b/SCL-Export/=A01+UH07-KF00/HWtoVP_Draussen.scl new file mode 100644 index 0000000..eb1d040 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/HWtoVP_Draussen.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/HWtoVP_Leser_FC.scl b/SCL-Export/=A01+UH07-KF00/HWtoVP_Leser_FC.scl new file mode 100644 index 0000000..cd29306 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/HWtoVP_Leser_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/HWtoVP_Ziel_FC.scl b/SCL-Export/=A01+UH07-KF00/HWtoVP_Ziel_FC.scl new file mode 100644 index 0000000..7b61b7b --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/HWtoVP_Ziel_FC.scl @@ -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 / NE_I / JC ") +//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 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 diff --git a/SCL-Export/=A01+UH07-KF00/LP_Draussen_FC.scl b/SCL-Export/=A01+UH07-KF00/LP_Draussen_FC.scl new file mode 100644 index 0000000..34c8e67 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/LP_Draussen_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/LPtoHW_Draussen_FC.scl b/SCL-Export/=A01+UH07-KF00/LPtoHW_Draussen_FC.scl new file mode 100644 index 0000000..1d5fdf4 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/LPtoHW_Draussen_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/LPtoHW_Leser_FC.scl b/SCL-Export/=A01+UH07-KF00/LPtoHW_Leser_FC.scl new file mode 100644 index 0000000..b8e5266 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/LPtoHW_Leser_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/LPtoHW_Ziel_FC.scl b/SCL-Export/=A01+UH07-KF00/LPtoHW_Ziel_FC.scl new file mode 100644 index 0000000..0a2ba8a --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/LPtoHW_Ziel_FC.scl @@ -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 / NE_I / JC ") +//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 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 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 diff --git a/SCL-Export/=A01+UH07-KF00/MHMOmniSchleuse.scl b/SCL-Export/=A01+UH07-KF00/MHMOmniSchleuse.scl index d9ea71e..0ec9345 100644 --- a/SCL-Export/=A01+UH07-KF00/MHMOmniSchleuse.scl +++ b/SCL-Export/=A01+UH07-KF00/MHMOmniSchleuse.scl @@ -1,4 +1,4 @@ -FUNCTION_BLOCK "MHMOmniSchleuse" +FUNCTION_BLOCK "MHMOmniSchleuse" TITLE = HM-Omni-Schleuse (Schrittkette) { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH07-KF00/MZylinder.scl b/SCL-Export/=A01+UH07-KF00/MZylinder.scl index a9e8ba4..9181756 100644 --- a/SCL-Export/=A01+UH07-KF00/MZylinder.scl +++ b/SCL-Export/=A01+UH07-KF00/MZylinder.scl @@ -1,4 +1,4 @@ -FUNCTION_BLOCK "MZylinder" +FUNCTION_BLOCK "MZylinder" TITLE = Zylinderansteuerung { S7_Optimized_Access := 'FALSE' } AUTHOR : IBAE diff --git a/SCL-Export/=A01+UH07-KF00/VP_Draussen_FC.scl b/SCL-Export/=A01+UH07-KF00/VP_Draussen_FC.scl new file mode 100644 index 0000000..ac6f94d --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/VP_Draussen_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/VP_Leser_FC.scl b/SCL-Export/=A01+UH07-KF00/VP_Leser_FC.scl new file mode 100644 index 0000000..1894268 --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/VP_Leser_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/VPtoEP_Draussen_FC.scl b/SCL-Export/=A01+UH07-KF00/VPtoEP_Draussen_FC.scl new file mode 100644 index 0000000..63d7e4e --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/VPtoEP_Draussen_FC.scl @@ -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 diff --git a/SCL-Export/=A01+UH07-KF00/VPtoEP_Leser_FC.scl b/SCL-Export/=A01+UH07-KF00/VPtoEP_Leser_FC.scl new file mode 100644 index 0000000..c4236af --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/VPtoEP_Leser_FC.scl @@ -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 / 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 diff --git a/SCL-Export/=A01+UH07-KF00/VPtoEP_Ziel_FC.scl b/SCL-Export/=A01+UH07-KF00/VPtoEP_Ziel_FC.scl new file mode 100644 index 0000000..af45eea --- /dev/null +++ b/SCL-Export/=A01+UH07-KF00/VPtoEP_Ziel_FC.scl @@ -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 / NE_I / JC ") +//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 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