Compare commits
2 Commits
9910240835
...
03a2866cd8
| Author | SHA1 | Date | |
|---|---|---|---|
| 03a2866cd8 | |||
| e9f6d34665 |
@@ -0,0 +1,139 @@
|
||||
FUNCTION "LP_Ziel_FC" : Void
|
||||
TITLE = Ziel-FC: LeerPuffer_OmniFahren
|
||||
{ S7_Optimized_Access := 'FALSE' }
|
||||
AUTHOR : AE
|
||||
FAMILY : Module
|
||||
NAME : Ziel
|
||||
//SCL-Portierung des AWL-Bausteins FC5181 "LP_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) sowie den Bool-Merker "MB3305" und ruft die
|
||||
//Zielbausteine voll qualifiziert auf -> keine echte Registerabhaengigkeit.
|
||||
//Als SCL-Baustein entfaellt die Option und er ist direkt aus SCL aufrufbar
|
||||
//(CASE 5181 in MHMOmniSchleuse).
|
||||
//
|
||||
//Der indirekte Dispatch (AWL: "L MW190 / L 3305 / NE_I / JC X3305E") ist als CASE
|
||||
//ueber die Schleusen-Nr (MW190) ausgefuehrt. Es existiert nur der Zweig 3305; ein
|
||||
//AWL-BEU/BEC im getroffenen Zweig ist als RETURN bzw. "IF <RLO> THEN RETURN;"
|
||||
//umgesetzt (verhaltensgleich, da nach dem Dispatch nur noch das Bausteinende folgt).
|
||||
//Die Merker-Schnittstelle (MW190 vom Aufrufer, M180.6 = Weiterfahrt-Freigabe,
|
||||
//MB199 = DatenOut-Rueckmeldung) bleibt erhalten.
|
||||
//
|
||||
//ABWEICHUNGEN ZUM AWL-ORIGINAL (bei Inbetriebnahme pruefen!):
|
||||
// - DatenOut: der Merker-Scratch-Bereich M220 (Such-/OutDaten-Pointer P#M220.0)
|
||||
// ist durch den lokalen Puffer #DatenPuffer ersetzt (SEARCHDATEN/OUTDATEN sind
|
||||
// VARIANT statt POINTER). MW220/MW224/MW226 werden dadurch NICHT mehr als
|
||||
// Merker beschrieben/gelesen (Ergebnis identisch, keine Merker-Nebenwirkung).
|
||||
// Lager-DB = Datensatz-Wort 2 (=M224), Lager-DW = Wort 3 (=M226).
|
||||
// - BTI (BCD-Wort -> Int, "Damit Int 1-10 als Ziel") ist ueber den Projekt-FC
|
||||
// "BCD (4stellig)_to_INT" ausgefuehrt; Fehlerverhalten bei ungueltiger BCD kann
|
||||
// abweichen (BTI setzt BIE).
|
||||
// - Indirekter DB-Zugriff (AWL: OPEN_DB DB[Lager_DB] / A DBX[AR1Zeiger] mit
|
||||
// Pointer-Arithmetik ADD DINT#70 / SLD 3 / OD 7) ist durch PEEK_BOOL
|
||||
// (area 16#84, byteOffset = Lager_DW+70, bitOffset = 7 -> Bit 7: Inilauf)
|
||||
// ersetzt. Die Temp "AR1Zeiger" wird dadurch nicht mehr benoetigt.
|
||||
// - AWL "CLR / S M180.6": die Set-Operation steht unter RLO=0 (CLR) und wird
|
||||
// daher NICHT ausgefuehrt (bewusst deaktiviert; Weiterfahrt wird ueber
|
||||
// MSorterRein FB5423/5 gestartet). M180.6 bleibt an dieser Stelle unveraendert.
|
||||
// - "MB3305" wird (wie im AWL: A / BEC) als Bool-Symbol behandelt.
|
||||
// - Word-Vergleiche direkt (z.B. (Ziel_hex AND W#16#F000) = W#16#A000);
|
||||
// MW190 wird fuer den CASE ueber WORD_TO_INT in Int gewandelt.
|
||||
// - Zusaetzliche Temp "DatenPuffer" (Array[0..15] of Word, nicht im XML-Interface)
|
||||
// als DatenOut-Puffer eingefuehrt. TypedConstants DINT#70/DINT#1/DINT#0 1:1.
|
||||
// - "Default_Ziel"/"Rec_DEST_Ziel" werden als Int beschrieben (AWL: 16-Bit-T von
|
||||
// Ziel_int); falls die DB-Member als Word deklariert sind -> INT_TO_WORD noetig.
|
||||
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;
|
||||
DatenPuffer : Array[0..15] of Word; // Puffer fuer DatenOut (ersetzt Merker-Scratch M220)
|
||||
END_VAR
|
||||
|
||||
BEGIN
|
||||
// NW1: Rueckmeldung - Rueckmeldungen erst mal resetten
|
||||
"M180.6" := FALSE; // Weiterfahrt von Ziel-FC erlaubt
|
||||
|
||||
// NW2: Schleuse 3305: Weiterfahren erlaubt ? (Sorter LP)
|
||||
// AWL: L MW190 / L 3305 / NE_I / JC X3305E (Aufruf von Schleuse 3305?)
|
||||
CASE WORD_TO_INT("MW190") OF
|
||||
|
||||
3305:
|
||||
IF "MB3305" THEN
|
||||
RETURN; // AWL: A MB3305 / BEC
|
||||
END_IF;
|
||||
|
||||
// Leer-Puffer ermitteln:
|
||||
"Leerpuffer to Rein-Lager ermitteln"(Puffer => "Ziel_hex");
|
||||
|
||||
// Ziel = Leer-Lager?
|
||||
IF ("Ziel_hex" AND W#16#F000) <> W#16#A000 THEN // (AWL: AW F000 / EQ_I A000 / JC LagerOk / BEU)
|
||||
RETURN; // Kein Lager frei!
|
||||
END_IF;
|
||||
|
||||
// AWL: L Ziel_hex / L W#16#FF / AW / BTI / T Ziel_int (Damit Int 1-10 als Ziel!)
|
||||
"BCD (4stellig)_to_INT"(BCD_Wert := ("Ziel_hex" AND W#16#00FF),
|
||||
Int_Wert => "Ziel_int");
|
||||
|
||||
// Check, ob Ziel-Lager Inilauf aktiv hat:
|
||||
#DatenPuffer[0] := INT_TO_WORD("Ziel_int"); // Suchschluessel (AWL: T MW220)
|
||||
"DatenOut"(SSDB := 275,
|
||||
SSDW := 0,
|
||||
PARA := W#16#0000, // Eintrag lesen
|
||||
SEARCHDATEN := #DatenPuffer,
|
||||
RE_VAL => "MB199",
|
||||
Position => #Position,
|
||||
OUTDATEN := #DatenPuffer);
|
||||
|
||||
// AWL: L MB199 / L 2#1111111 / AW / L 0 / NE_I / JC Egal (Bit 7 ausblenden; Fehler vorhanden?)
|
||||
IF BYTE_TO_INT("MB199" AND B#16#7F) = 0 THEN // kein Fehler -> Inilauf pruefen
|
||||
"Lager_DB" := WORD_TO_INT(#DatenPuffer[2]); // AWL: L MW224 / T Lager_DB
|
||||
"Lager_DW" := WORD_TO_INT(#DatenPuffer[3]); // AWL: L MW226 / T Lager_DW
|
||||
"AR1Start" := INT_TO_DINT("Lager_DW"); // Startwert mit Offset 0
|
||||
// AWL: ADD DINT#70 / SLD 3 / OD 7 -> Bit-Pointer auf DBX(Lager_DW+70).7 (Bit 7: Inilauf)
|
||||
IF PEEK_BOOL(area := 16#84,
|
||||
dbNumber := INT_TO_DINT("Lager_DB"), // Lager-DB
|
||||
byteOffset := "AR1Start" + DINT#70, // Offset Status
|
||||
bitOffset := 7) THEN // Lager hat Inilauf aktiv
|
||||
RETURN; // Sonst kann der Inilauf nie beendet werden!
|
||||
END_IF;
|
||||
END_IF;
|
||||
|
||||
// Egal:
|
||||
"DLP_Sorter".Sorter_MB3305.Separator.Default_Ziel := "Ziel_int";
|
||||
"DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_DEST_Ziel := "Ziel_int";
|
||||
|
||||
// Pseudo-IDX uebergeben:
|
||||
// AWL: L Rec_IDX / L DINT#0 / NE_D / BEC (Daten schon erzeugt? Ja!)
|
||||
IF "DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX <> DINT#0 THEN
|
||||
RETURN;
|
||||
END_IF;
|
||||
"DLP_Sorter".Pseudo_IDX := "DLP_Sorter".Pseudo_IDX + DINT#1; // Da kein Leser verbaut
|
||||
"DLP_Sorter".Sorter_MB3305.Dyn.Scanner.Rec_IDX := "DLP_Sorter".Pseudo_IDX; // IDX
|
||||
|
||||
// AWL: CLR / S M180.6 -> Set steht unter RLO=0 (CLR) und wird NICHT ausgefuehrt.
|
||||
// Weiterfahrt wird ueber MSorterRein (FB5423/5) gestartet -> M180.6 bleibt unveraendert.
|
||||
// AWL: BEU -> Bausteinende
|
||||
|
||||
ELSE
|
||||
; // andere Schleusen-Nr -> nichts tun (AWL: X3305E / NOP 0)
|
||||
END_CASE;
|
||||
|
||||
// NW3: Ende (AWL: BE)
|
||||
END_FUNCTION
|
||||
Reference in New Issue
Block a user