Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/HundM_awl
This commit is contained in:
@@ -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,4 +1,4 @@
|
||||
FUNCTION "DatenOut" : Void
|
||||
FUNCTION "DatenOut" : Void
|
||||
TITLE = Datensatz in Datenliste suchen / lesen / loeschen
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
|
||||
@@ -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,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,4 +1,4 @@
|
||||
FUNCTION_BLOCK "MZylinder"
|
||||
FUNCTION_BLOCK "MZylinder"
|
||||
TITLE = Zylinderansteuerung
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : IBAE
|
||||
|
||||
@@ -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
|
||||
@@ -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,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,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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user