Files
HundM_awl/=A01+UH06-KF00/Programmbausteine/Module/MHMOmniSchleuse_Plus.awl
T

2339 lines
93 KiB
Plaintext

=== FB 1275: MHMOmniSchleuse_Plus [STL] ===
INTERFACE:
Input:
Schleusen_Nr : Int // Aufruf für Schleuse
ErrQuit : Bool // Ablaufstörung quittieren
B_VorSchleuse : Bool // Sensor Trolley fährt in Bereich
B_InSchleuse : Bool // Sensor Trolley ist in Schleuse
B_Zähl : Bool // Sensor Trolley ist imnächsten Bereich
B_Stau_raus : Bool // Sensor Stau im Bereich rausfahren
Start_Ok : Bool // Starten ist erlauTrolley
Antrieb_Schleuse_aktiv : Bool // Kreisel-Antrieb aktiv
Antrieb_plus_aktiv : Bool // Kreisel-Antrieb plus aktiv
Schleuse_geöffnet : Bool // Schleuse hat geöffnet
RestZeit_Bereich_plus : Int := 999 // Bereich +1: Restzeit bis AFS stoppt (s)
Output:
Y_Schleuse_Auf : Bool // Schleuse öffnen
Error : Word // Störungen übergeben
InOut:
Antrieb_Schleuse_vor : Bool // Schleusen-Antrieb einschalten
Antrieb_Schleuse_start : Bool // Schleusen-Antrieb mit Zeit starten
Antrieb_Schleuse_stop : Bool // Schleusen-Antrieb stoppen
Antrieb_Schleuse_PS : Bool // Schleusen-Antrieb Energie sparen
Antrieb_plus_vor : Bool // Antrieb plus einschalten
Antrieb_plus_start : Bool // Antrieb plus mit Zeit starten
hStOk : Bool // Anzeige Start n. Störung aktivieren
Static:
SAVE : Struct
Weichen_DB : Int // Weichen-FIFO-DB
Weichen_DW : Int // Weichen-FIFO-DW
Weiche+1 : Int // Weiche +1, wo reserviert wurde
Frei18 : Int
Frei20 : Int
Para : Struct // Parameter
Schleusen_DL_DB : Int // Einsprung Schleuse-Datenliste-DB
Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB
Leser_DL_DB : Int // Einsprung Weichen-Datenliste-DB
Status2 : Struct
Trolley_an_Schleuse : Bool // Trolley ist an Schleuse
2.Lesung_aktiv : Bool // 2.Lesung erfolgt
3.Lesung_aktiv : Bool // 3.Lesung erfolgt
TrolleyPos_übergeben : Bool // Trolley-Pos. übergeben
Warten_4.V : Bool // Warten auf 4.V
Weichen-Schritt : Bool // Schritt 13-17 aktiv (Weiche evtl. belegen)
Trolley an Raus-Sensor : Bool // Trolley ist am Raus-Sensor
Stau_an_Raus-Sensor : Bool // Stau an Raus-Sensor (kein Zählen mehr)
Einfahrzeit_lernen : Bool // Ausfahrzeit lernen
Telegramm_gesendet : Bool // Telegramm wurde in Send-FIFO eingetragen
Schleuse : "UDLHMOmniSchleuse_Plus" // Statische Schleusendaten (aus DL)
Dyn : Struct // Dynamische Daten
Status : Struct
Trolley_fährt_in_Schleuse : Bool // Trolley fährt in Schleuse
Trolley_wartet_Lesung : Bool // Trolley wartet auf Auftrag
Trolley_wartet_auf_Ziel-FC : Bool
Trolley_wartet_auf_Weiche+1 : Bool
Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1
Trolley_fährt_aus : Bool // Trolley fährt aus
MindestZeit_ok : Bool // Schleuse ist MindestZeit geöffnet
Trolley_draussen : Bool // Trolley ist ausgefahren
Leser_triggern : Bool
SF_angefordert : Bool
Kein_Stop_mehr : Bool // Kein Stop mehr, Antrieb soll starten
Trolley_fährt_rückwärts : Bool // Trolley in Schleuse rückwärts erkannt
Weiche_geschaltet : Bool
Trolley ausserhalb Weiche : Bool // Trolley hat Weiche verlassen (von Weiche)
Error_aktiv : Bool // Störung vorhanden
Reset_aktiv : Bool := TRUE // Reset aktiv
TrolleyID_Schleuse : DInt // Trolley-Nr in der Schleuse
Trolley_EndZiel : Word // Trolley-EndZiel
Trolley_ZwischenZiel : Word // Trolley-ZwischenZiel
Trolley_ShopGroup : DInt // Trolley-ShopGroup
Weichen_Ziel : Word // Weichen-Ziel (Für WeichenModul von Ziel-FC)
TrolleyID_Eingefahren : DInt // Trolley-Nr von Bereich -1 gemeldet
TrolleyID_ausgefahren : DInt // TrolleyID des ausgefahrenen Trolleys
HMI : Struct
TrolleyID_in_Schleuse : DInt // Trolley-Nr in Schleuse (IN:PLC, OUT:PLC)
TrolleyID_Input : DInt // Trolley-Nr Input (IN:HMI, OUT:PLC)
Schleuse_resetten : Bool // Schleuse resetten (IN:HMI, Out:PLC)
Sk : "USk_ILS" // Status der Schrittkette
Leser : Struct
IN : Struct
xOutReadyForNewScan : Bool // DBX10.1: Reader ist bereit für Leseanforderung
xOutReadingDone : Bool // DBX10.0: Lesevorgang abgeschlossen / Handshake raus
xOutCodeGood : Bool // DBX278.0: Gute Lesung
xOutCodeBad : Bool // DBX278.1: Schlechte Lesung
nOutBarcode : DInt // DBD12: Trolley ID
OUT : Struct
xInStartReading : Bool // DBX4.1: Starte Lesevorgang
xInHandshakeDone : Bool // DBX4.2: Handshake Daten abgeholt
xInErrQuit : Bool // DBX4.4: Fehler rücksetzen
xInReset : Bool // DBX4.5: Allgemeines Rücksetzen des Bausteins
TrolleyID_unbekannt_Schleuse : DInt // TrolleyID unbekannt (Trolley in Schleuse)
Rueckmld : Struct
RET_VAL_BLKMOV_Schleuse : Int // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_Schleuse : Byte
RET_VAL_DL_Weiche : Byte // Rückmeldung nach DatenOut-Aufruf
RET_VAL_DL_Leser : Byte // Rückmeldung nach DatenOut-Aufruf
Error : "UErrHMOmniSchleuse"
Stau_Zeit : Int // Sensor B_VorSep ist belegt [1s]
Mindest_Zeit : Int // Sensor B_VorSep ist frei [1s]
Leer_Zeit : Int
Stop_Ursache : Word // Stop-Stelle: Nw + Position
Vereinzelungstakte : DInt // Anzahl der getätigten Vereinzelungstakte
ZwischenZiel_eingefahren : Word // Trolley-ZwischenZiel von Bereich -1
Zeit_Ohne_B_In_Schleuse : Int // Trolley nicht an B_In_Schleuse
Zeit_Ohne_B_Zähl : Int // Trolley nicht an B_Zähl
Zeit_Ausfahren_Ohne_B_Zähl : Int // Trolley fährt nicht zu B_Zähl
Raus_Trolleys : Int // Anzahl der Trolleys zwischen Schleuse und Raus-Sensor
Stau_Zeit_RausSensor : Int // Sensor B_AusSep ist belegt [1s]
Zurück_gemeldetes_Weichen_Ziel : Word // Von Weiche zurück gemeldetes Weichen-Ziel
SAVE2 : Struct
Leser_DB : Int // Weichen-FIFO-DB
Leser_DD : DInt // Weichen-FIFO-DD
WarteZeit_PS : Int
Restzeit_bis_Schleuse : Int
Res200 : Array[1..11] of Int // Reserve
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ueb_akt : Bool // Überwachungszeit aktivieren
Weiter : Bool // Weiterschaltbedingung ist erfüllt
Warte_neu : Bool // Wartezeit neu triggern
Warte_stop : Bool // Wartezeit stoppen
Kein_Weichenbereich +1 : Bool
Reservierung_Weiche+1_aktiv : Bool
Leser_Zugriff : Bool // Leser-Zugriff vorhanden
LeserFC_vorhanden : Bool
ZielFC_vorhanden : Bool
DraussenFC_vorhanden : Bool
TrolleyID_Bereich-1 : Bool // Trolley--ID von Bereich -1 gemeldet
Trolley_draussen : Bool // Signal: Trolley ist draussen
Antriebe_starten : Bool
Einfahrzeit_nicht_bekannt : Bool
LeserFC : Word // Ziel-FC
ZielFC : Word // Ziel-FC
DraussenFC : Word // Draussen-FC
AR1Start : DInt // Startwert mit Offset 0
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
--- NW 1: Parameter-Übergabe ---
L Schleusen_Nr
L 274 // Einsprung Schleuse-DL
T Para.Schleusen_DL_DB // vor Aufruf übergeben!
L 279 // Einsprung Weichen-DL
T Para.Weichen_DL_DB // vor Aufruf übergeben!
L 273
T Para.Leser_DL_DB
--- NW 2: Anzeige OP ---
A ErrQuit // Überwachungszeit abgelaufen quittieren
R Dyn.Sk.Err_Uebzeit
L 252 // Bereichsstop aktiv
AN Dyn.Sk.Bereich_ok // Also: Bereichsstop / Not-Aus
JC w010
L 253
AN Dyn.Sk.Auto_akt // Keine Betriebsart
AN Dyn.Sk.Hand_akt
JC w010
L 255 // Handbetrieb aktiv
A Dyn.Sk.Hand_akt
JC w010
L Dyn.Sk.Akt_Schritt // Aktiver Schritt
w010: T Dyn.Sk.OP_Schritt
--- NW 3: Out-Bits zum Zurücksetzen ---
SET
R Y_Schleuse_Auf
SET // Jeden Zyklus neu
R Dyn.Status.Trolley_wartet_Lesung
R Dyn.Status."Trolley_wartet_auf_Ziel-FC"
R Dyn.Status."Trolley_wartet_auf_Weiche+1"
R Dyn.Status."Trolley_wartet_Bereich+1"
R Dyn.Status."Trolley_fährt_aus"
R Dyn.Status.Trolley_draussen
R Leser_Zugriff
R Status2."Weichen-Schritt"
A Dyn.Sk.Reset_Akt
= Dyn.Status.Reset_aktiv
--- NW 4: HMI-Zeug ---
// Von HMI:
A Dyn.HMI.Schleuse_resetten
R Dyn.HMI.Schleuse_resetten // von HMI
S Dyn.Sk.Reset // SK zurücksetzen
L Dyn.HMI.TrolleyID_Input // Wird direkt im Programm verwertet (s.u.)
// An HMI:
ToHMI: L Dyn.TrolleyID_Schleuse
T Dyn.HMI.TrolleyID_in_Schleuse
--- NW 5: Schrittkette zurücksetzen ---
A ErrQuit // Überwachungszeit abgelaufen quittieren
R Dyn.Sk.Err_Uebzeit
AN Dyn.Sk.Reset // SK zurücksetzen
JC en04
// Schrittkette zurücksetzen:
L 0 // Schritt 0: Warten
T Dyn.Sk.Akt_Schritt
T Dyn.Raus_Trolleys
L 0 // Zeitwert löschen
T Dyn.Sk.Terr_Zelle
T Dyn.Sk.Tok_Zelle
SET
R Dyn.Error.Err_BLKMov // Error bei Block kopieren
R Dyn.Sk.Reset // SK zurücksetzen
R Dyn.Sk.Err_Schritt // Undefinierter Schritt
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
R Status2.Telegramm_gesendet
S Dyn.Sk.Reset_Akt // Reset ist aktiv
SET
R Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft
R Dyn.Error.Undef_Schleuse // undefinierter Schleuse
R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse
R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen
R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert
R Dyn.Error.Err_Stau_Einfahrt
R Dyn.Error.Err_BLKMov
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
R Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
R Dyn.Error.Err_Ziel // kein Ziel angegeben
R Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft
R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche
R Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt
R Dyn.Error.Err_Kein_LeseErgebnis
R Dyn.Error.Err_Leser_nicht_bereit
L 0
T Dyn.SAVE2.Leser_DB
L DINT#0
T Dyn.SAVE2.Leser_DD
T Dyn.Leser.IN.nOutBarcode
// Defaultwerte übergeben:
L 0 // Damit statische Werte neu aus Datenbank geholt werden !
T Schleuse.Schleusen_Nr // Nummer des Schleuses
JU RET
en04: NOP 0
--- NW 6: Störungen nach Außen übergeben ---
L 0
T "MW200"
A Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft
= "M200.0"
A Dyn.Error.Undef_Schleuse // undefinierter Schleuse
= "M200.1"
A Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse
= "M200.2"
A Dyn.Sk.Err_Uebzeit
= Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen
= "M200.3"
NEG
R Dyn.Sk.Err_Uebzeit_AnzOk
A Dyn.Sk.Err_Schritt
= Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert
= "M200.4"
A Dyn.Error.Err_Stau_Einfahrt
AN B_InSchleuse
AN Y_Schleuse_Auf
= "M200.5"
A Dyn.Error.Err_BLKMov // Error bei Block kopieren
= "M200.6"
A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
= "M200.7"
A Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
= "M201.0"
A Dyn.Error.Err_Ziel // Trolley-Ziel nicht bekannt
= "M201.1"
A Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft
= "M201.2"
A Dyn.Error.Err_Undef_Weiche // undefinierte Weiche
= "M201.3"
A Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt
= "M201.4"
A Dyn.Error.Err_Kein_LeseErgebnis
= "M201.5"
A Dyn.Error.Err_Leser_nicht_bereit
= "M201.6"
A Dyn.Error.Barcode_nicht_bekannt
= "M201.7"
// Andere Meldung als Überwachungszeit aktiv ?:
L "MW200"
L 2#1111_0111_1111_1111
AW
L 2#0000_0000_0000_0000 // Andere Meldung als Üb.zeit aktiv ?
<>I // Ja !
ON Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv !
R "M200.3" // Üb.Zeit-Meldung nicht an PC senden
A Dyn.Sk.Err_Uebzeit
S Dyn.Sk.Err_Uebzeit_AnzOk // Störung anzeigen ok, da 2.Zyklus aktiv !
L "MW200"
T Error // Schnittstelle nach Außen
// Störung vorhanden:
L 0
<>I // Ja !
= Dyn.Status.Error_aktiv
S hStOk
// Antrieb stoppen:
A(
ON Dyn.Sk.Auto_akt // SystemVoraussetzungen fehlen
O Dyn.Sk.Hand_akt
ON Dyn.Sk.Bereich_ok
)
S Antrieb_Schleuse_stop // Antrieb stoppen
// Störungen pro Zyklus neu erzeugen:
SET
R Dyn.Error.Schleuse_DL // Schleuse-Datenliste fehlerhaft
R Dyn.Error.Undef_Schleuse // undefinierter Schleuse
// / R #Dyn.Error.Err_Trolley_nicht_in_Schleuse//Trolley fährt nicht in Schleuse
// / R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen
R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert
// / R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich
R Dyn.Error.Err_BLKMov
// / R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus
// / R #Dyn.Error.Err_Raus_Sensor//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
R Dyn.Error.Err_Ziel // Trolley-Ziel nicht bekannt
R Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft
R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche
R Dyn.Error.Err_Weiche_belegt // Weiche bleibt belegt
// / R #Dyn.Error.Err_Kein_LeseErgebnis
// / R #Dyn.Error.Err_Leser_nicht_bereit
R Dyn.Error.Barcode_nicht_bekannt
AN Dyn.Sk.Err_Uebzeit
R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
--- NW 7: Statische Schleuse-Parameter holen ---
L Schleuse.Schleusen_Nr // Nummer des Schleuses
L Schleusen_Nr // Aufruf-Parameter
==I // Identisch ?
R Dyn.Error.Schleuse_DL // Schleusedatenbank fehlerhaft
R Dyn.Error.Undef_Schleuse // undefinierter Schleuse
JC en06 // Ja !
T "MW200" // Search-Daten
CALL FC "DatenOut" (SSDB:=Para.Schleusen_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
L "MB199"
T Dyn.Rueckmld.RET_VAL_DL_Schleuse // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
JBI G_Ok
A "M199.0"
JCN w060
SET
= Dyn.Error.Schleuse_DL // Schleusedatenbank fehlerhaft
L 16#A061
T Dyn.Stop_Ursache
JU RET
w060: SET
S Dyn.Error.Undef_Schleuse // undefinierter Schleuse
L 16#A062
T Dyn.Stop_Ursache
JU RET
// Kennung + Datenbytes
G_Ok: SET
R Dyn.Error.Schleuse_DL // Gefälledatenbank fehlerhaft
R Dyn.Error.Undef_Schleuse // undefinierte Gefällestrecke
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 20 // Datenwords speichern
T LW2 // Wiederholungen
// Quelle-Pointer erzeugen:
L 0 // Bei Merker = 0 !
T LW4 // DB_Nummer
L 220 // Adresse
SLD 3
L 16#8300_0000 // Kennung: Merker
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse, DSTBLK:=Schleuse) // Datenliste-Daten speichern | #Ziel
L 16#A063
T Dyn.Stop_Ursache
L Dyn.Rueckmld.RET_VAL_BLKMOV_Schleuse // Rückmeldung
L 0 // Fehler vorhanden ?
<>I // Ja !
= Dyn.Error.Err_BLKMov // Error bei Block kopieren
JC RET
L Schleuse.Schleusen_Typ // Schleusetyp = 1275 (HM-Schleuse Plus)
L 1275 // Dieser Aufruf-FB ?
==I // Ja !
JC w061
SET
S Dyn.Error.Undef_Schleuse // undefinierter Schleuse
L 0 // Schleuse ungültig !
T Schleuse.Schleusen_Nr // Nummer des Schleuses
L 16#A064
T Dyn.Stop_Ursache
JU RET
// Defaultwerte übergeben:
w061: NOP 0
JU RET
en06: NOP 0
--- NW 8: Einsprung Weiche plus ermitteln ---
L SAVE.Weichen_DB // Weichen-FIFO-DB
L 0 // Einsprung-Zeiger bekannt ?
>I // Ja !
R "Kein_Weichenbereich +1"
JC En08
L Schleuse.RausWeichen_Nr // Nr. der vorhandenen Weiche
T "MW200" // Search-Daten
L 0 // angegeben ?
==I // Nein !
= "Kein_Weichenbereich +1"
R Dyn.Error.Err_Undef_Weiche // undefinierte Weiche
JC En08
CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
L "MB199"
T Dyn.Rueckmld.RET_VAL_DL_Weiche // Rückmeldung bei Datenbank-Zugriff (Weiche-DL)
JBI W_Ok
A "M199.0"
= Dyn.Error.Err_Weichen_DL // Weichen-Datenliste fehlerhaft
JC En08
SET
S Dyn.Error.Err_Undef_Weiche // undefinierte Weiche
JU En08
W_Ok: L "MW224"
T SAVE.Weichen_DB // Weichen-FIFO-DB
L 0 // sinnvoller Wert ?
<=I // Nein !
S Dyn.Error.Err_Undef_Weiche // undefinierte Weiche
JC En08
L "MW226"
T SAVE.Weichen_DW // Weichen-FIFO-DW
En08: NOP 0
--- NW 9: Trolley in Schleuse entprellen ---
A B_InSchleuse
JC B_ok
AN Status2.Trolley_an_Schleuse
ON "1s-Impuls"
JC Xn08
L Dyn.Zeit_Ohne_B_In_Schleuse
+ 1 // Zeit ohne Sensor +1s
T Dyn.Zeit_Ohne_B_In_Schleuse
L 3 // Nach ca. 3s
<I
JC Xn08
SET
R Status2.Trolley_an_Schleuse
B_ok: L 0
T Dyn.Zeit_Ohne_B_In_Schleuse
Xn08: NOP 0
--- NW 10: Antrieb starten / stoppen / Schleuse geöffnet ---
// Antrieb zusätzlich starten:
A ErrQuit // Überwachungszeit abgelaufen quittieren
O "Schleuse_geöffnet"
S Antrieb_Schleuse_start // Antrieb starten
S Antrieb_plus_start // Kreisel-Antrieb plus starten
A "Schleuse_geöffnet"
R Dyn.Status."Trolley_fährt_in_Schleuse"
L Dyn.Raus_Trolleys
L 0 // Trolles unterwegs?
>I // Ja!
AN Status2."Stau_an_Raus-Sensor" // Stau an Raus-Sensor
O
A B_VorSchleuse // //
AN Dyn.Error.Err_Stau_Einfahrt // //
O "Schleuse_geöffnet"
= Antriebe_starten
A Antriebe_starten
// / UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus
A(
O Dyn.Status.Weiche_geschaltet // Weiche ist aktiv
O "Kein_Weichenbereich +1"
)
A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden
S Antrieb_plus_vor // Antrieb plus einschalten
A Antriebe_starten
// / UN #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus
A(
O Dyn.Status.Weiche_geschaltet // Weiche ist aktiv
O "Kein_Weichenbereich +1"
)
A(
O Antrieb_plus_aktiv
ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden
)
S Antrieb_Schleuse_vor // Antrieb einschalten
// Trolley ist in Schleuse und wartet
A Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt
AN "Schleuse_geöffnet" // Trolley soll ausfahren
A(
ON B_VorSchleuse
O Dyn.Error.Err_Stau_Einfahrt
)
AN Dyn.Status.Kein_Stop_mehr // Wird in Schritt 2 gesetzt
O
A "Schleuse_geöffnet" // Trolley soll ausfahren
A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden
AN Antrieb_plus_aktiv
JC Warten
L 0
T Dyn.WarteZeit_PS
JU NwE10
Warten: L Dyn.WarteZeit_PS
L 3 // ca. 3s rum ?
<I // Nein!
JC Takt
T Dyn.WarteZeit_PS // Zeit einfrieren
SET
S Antrieb_Schleuse_PS // Antrieb in Energie sparen schalten
JU NwE10
Takt: AN "1s-Impuls"
JC NwE10
L Dyn.WarteZeit_PS
+ 1
T Dyn.WarteZeit_PS
NwE10: NOP 0
--- NW 11: Plus: Trolley ist an Zähl-/Stau-Sensor ---
A Dyn.Status."Trolley ausserhalb Weiche" // Rückmeldung von Weiche +1
AN "Kein_Weichenbereich +1" // Also Weiche +1
O "B_Zähl"
= Trolley_draussen
A Trolley_draussen
JC B_Raus
AN Status2."Trolley an Raus-Sensor"
AN Status2."Stau_an_Raus-Sensor"
ON "100ms-Impuls"
ON Dyn.Sk.Bereich_ok
JC En10
L Dyn."Zeit_Ohne_B_Zähl"
+ 1 // Zeit ohne Sensor +100ms
T Dyn."Zeit_Ohne_B_Zähl"
// B-Raus lange genug frei?:
L 10 // Nach ca. 1s
>=I
AN Status2."Stau_an_Raus-Sensor"
JC RDel
CAC
L 200 // Nach ca. 20s
>=I
JC RDel
JU En10
RDel: SET
R Status2."Trolley an Raus-Sensor"
L 0
T Dyn."Zeit_Ohne_B_Zähl"
T Dyn.Stau_Zeit_RausSensor
// War Stau?:
A Status2."Stau_an_Raus-Sensor"
R Status2."Stau_an_Raus-Sensor"
JCN DelRT
L 0 // Bisher gefahrene Trolleys löschen
T Dyn.Raus_Trolleys
T Dyn."Zeit_Ohne_B_Zähl"
T Dyn.Stau_Zeit_RausSensor
// Im Weichenbereich noch Trolleys unterwegs?:
DelRT: L Dyn.Raus_Trolleys
L 0
>I
O "Kein_Weichenbereich +1"
JC En10
// Weiche+1 löschen:
L 0
T SAVE."Weiche+1" // Hier wurde reserviert (Im Weichenmodul wird dann Reservierung gelöscht!)
JU En10
B_Raus: L 0
T Dyn."Zeit_Ohne_B_Zähl"
T Dyn."Zeit_Ausfahren_Ohne_B_Zähl"
// Einmalig:
AN Status2."Trolley an Raus-Sensor"
S Status2."Trolley an Raus-Sensor" // Raus-Sensor ausgewertet
JCN Xn10 // Negierter Sprung
L Dyn.Raus_Trolleys
+ -1 // Ausgefahrene Trolleys -1
T Dyn.Raus_Trolleys
L 0
>=I
JC Xn10
T Dyn.Raus_Trolleys // Minimum übergeben
// Stau an B_Raus:
Xn10: AN "100ms-Impuls"
O Status2."Stau_an_Raus-Sensor"
JC En10
L Dyn.Stau_Zeit_RausSensor
+ 1 // StauZeit +1
T Dyn.Stau_Zeit_RausSensor
L 90 // Nach ca. 9s
>=I
JCN En10 // Negierter Sprung
L 0 // Zeit löschen
T Dyn.Stau_Zeit_RausSensor
SET
S Status2."Stau_an_Raus-Sensor"
En10: NOP 0
--- NW 12: Plus: Trolley fährt nicht bis Zähl-Sensor ---
L Dyn.Raus_Trolleys
L 0 // Trolles unterwegs?
==I // Nein!
O Trolley_draussen // Sensor wurde erreicht
O "Schleuse_geöffnet" // Dann Üb.zeit von Sk
O Dyn.Status.Reset_aktiv
JC RTTD
AN Antrieb_Schleuse_aktiv
O
AN Antrieb_plus_aktiv
A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden
ON "1s-Impuls"
O Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus
JC En12
L Dyn."Zeit_Ausfahren_Ohne_B_Zähl"
+ 1
T Dyn."Zeit_Ausfahren_Ohne_B_Zähl"
// Trolley fährt nicht bis Zähl-Sensor!:
L Schleuse."Übzeit_aus_Schleuse"
>=I
S Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus
JCN En12 // Negierter Sprung!
L Dyn.Raus_Trolleys
+ -1
T Dyn.Raus_Trolleys
JU En12
RTTD: L 0
T Dyn."Zeit_Ausfahren_Ohne_B_Zähl"
SET
R Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus
En12: NOP 0
--- NW 13: Einfahrzeit lernen ---
L Schleuse.EinfahrZeit
L 0 // Ausfahrzeit bekannt ?
==I // Nein !
O Status2.Einfahrzeit_lernen
= Einfahrzeit_nicht_bekannt
A Einfahrzeit_nicht_bekannt
A B_VorSchleuse // Stauklappe bei Einfahrt
A Antrieb_Schleuse_aktiv
AN B_InSchleuse
AN "Schleuse_geöffnet"
S Status2.Einfahrzeit_lernen
A B_InSchleuse
AN "Schleuse_geöffnet"
R Status2.Einfahrzeit_lernen
A Status2.Einfahrzeit_lernen
S Antrieb_Schleuse_vor // Antrieb einschalten
AN Status2.Einfahrzeit_lernen
ON Antrieb_Schleuse_aktiv
ON "1s-Impuls"
JC NoEFZ
L Schleuse.EinfahrZeit
+ 1
T Schleuse.EinfahrZeit
NoEFZ: NOP 0
--- NW 14: PS deaktivieren, da Trolley einfährt ---
A Einfahrzeit_nicht_bekannt // Also bekannt
JC En14
// Neuer Trolley fährt ein:
A B_VorSchleuse
JCN Wait // Negierter Sprung
L Schleuse.EinfahrZeit
T Dyn.Restzeit_bis_Schleuse
// Restzeit zurück zählen:
Wait: AN Antrieb_Schleuse_aktiv
O "Schleuse_geöffnet"
ON "1s-Impuls"
JC X014
L Dyn.Restzeit_bis_Schleuse
+ -1
T Dyn.Restzeit_bis_Schleuse
L 0
>I
JC X014
T Dyn.Restzeit_bis_Schleuse // Minimum übergeben
// Trolley fährt noch ein:
X014: L Dyn.Restzeit_bis_Schleuse
L 0 // Restzeit vorhanden?
>I // Ja !
AN B_InSchleuse
AN "Schleuse_geöffnet"
S Antrieb_Schleuse_vor // Antrieb einschalten (dadurch wird PS-Modus deaktiviert)
En14: NOP 0
--- NW 15: Spezial-FCs vorhanden? ---
L Schleuse.Leser_FC
T LeserFC
L 0 // Parameter vorhanden ?
>I // Ja!
= LeserFC_vorhanden
L Schleuse.Ziel_FC
T ZielFC
L 0 // Parameter vorhanden ?
>I // Ja!
= ZielFC_vorhanden
L Schleuse.Draussen_FC
T DraussenFC
L 0 // Parameter vorhanden ?
>I // Ja!
= DraussenFC_vorhanden
--- NW 16: Error: Stau Bereich-Eingang ---
// TrolleyID zum Einfahren gemeldet / Trolley fährt in Bereich:
L Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1
L DINT#0 // angegeben ?
<>D // Ja !
= "TrolleyID_Bereich-1"
A "TrolleyID_Bereich-1"
O B_VorSchleuse
S Dyn.Status."Trolley_fährt_in_Schleuse"
// Antrieb einschalten:
A B_VorSchleuse
AN B_InSchleuse
AN "Schleuse_geöffnet"
S Antrieb_Schleuse_vor
A B_VorSchleuse
S Antrieb_Schleuse_start
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
AN B_VorSchleuse // Sensor Trolley fährt in Bereich (kein Stau !)
O "Schleuse_geöffnet"
R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt
JC X120 // StauZeit neu aufziehen
AN "1s-Impuls"
O
A Schleuse.Parameter_allg.Antrieb_vorhanden
AN Antrieb_Schleuse_aktiv
O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen
JC Xn12
L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
+ +1
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
L 20 // Stau-Zeit erreicht ?
>=I // Ja !
S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
JCN Xn12
X120: L 0 // Zeiten löschen
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
Xn12: NOP 0
--- NW 17: Schleuse: Mindestzeit geöffnet/frei ---
L Dyn.Sk.Akt_Schritt
L 3 // AusSchleusen aktiv?
<I // Nein!
O(
CAC
L 6 // Mindestzeit ok?
>I // Nein!
)
// / O #B_InSchleuse //Sensor Trolley in Schleuse vorhanden
ON "Schleuse_geöffnet"
R Dyn.Status.MindestZeit_ok
JC X130 // FreiZeit neu aufziehen
A Schleuse.Parameter_allg.Antrieb_vorhanden
AN Antrieb_Schleuse_aktiv
O
A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden
AN Antrieb_plus_aktiv
O Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen
ON "1s-Impuls"
JC Xn13
L Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s]
+ +1
T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s]
L Schleuse.Mindeszeit_Schleuse_geoeffnet // Mindest-Zeit erreicht ?
>=I // Ja !
S Dyn.Status.MindestZeit_ok
JCN Xn13
X130: L 0 // Zeiten löschen
T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s]
Xn13: NOP 0
--- NW 18: Einsprung Leser ermitteln ---
L Dyn.SAVE2.Leser_DB // Leser-FIFO-DB
L 0 // Einsprung-Zeiger bekannt ?
>I // Ja !
S Leser_Zugriff // Leser-Zugriff vorhanden
JC En08L
L Schleuse.Leser_ID // Nr. des vorhandenen Lesers
T "MW200" // Search-Daten
L 0 // angegeben ?
==I // Nein !
JC En08L
CALL FC "DatenOut" (SSDB:=Para.Leser_DL_DB, SSDW:=0, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:="MB199", OUTDATEN:=P#M220.0, Position:="MW196")
L "MB199"
T Dyn.Rueckmld.RET_VAL_DL_Leser // Rückmeldung bei Datenbank-Zugriff (Leser-DL)
JBI W_OkL
SET
S Dyn.Error.Err_Leser_nicht_bereit // Leser-Datenliste fehlerhaft
JU En08L
W_OkL: L "MW222" // Rein-FIFO-DB
T Dyn.SAVE2.Leser_DB // Leser-FIFO-DB
L 0 // sinnvoller Wert ?
<=I // Nein !
S Dyn.Error.Err_Leser_nicht_bereit // undefinierter Leser
JC En08L
L "MD224"
T Dyn.SAVE2.Leser_DD // Leser-FIFO-DD
SET
R Dyn.Error.Err_Leser_nicht_bereit // undefinierter Leser
S Leser_Zugriff // Leser-Zugriff vorhanden
En08L: NOP 0
--- NW 19: Reservierung bei Weiche plus noch aktiv? Nachtriggern ---
A "Kein_Weichenbereich +1"
R "Reservierung_Weiche+1_aktiv"
JC Y11E
OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen
L SAVE.Weichen_DW
ITD
T AR1Start // Startwert mit Offset 0
L AR1Start // Startwert mit Offset 0
+ DINT#78
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L DBW [AR1Zeiger] // Schleuse -1 (DBW 78)
L Schleusen_Nr // Diese Schleuse ?
==I // Ja !
= "Reservierung_Weiche+1_aktiv"
// Mindestzeit nachtriggern: (nach Weiche +1)
AN "Schleuse_geöffnet"
JC Y11E
L AR1Start // Startwert mit Offset 0
+ DINT#71
SLD 3
L 3 // Damit DBX_Bit 3
OD
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
SET
= DBX [AR1Zeiger] // Mindestzeit nachtriggern (71.2)
Y11E: NOP 0
--- NW 20: Leser-Einheit managen (Inputs holen) ---
AN Leser_Zugriff
ON Schleuse.Parameter_allg.Leser_eingebaut
R Dyn.Status.Leser_triggern // für Status-Anzeige
JC NoLeser
// Leserdaten holen:
OPN DB[Dyn.SAVE2.Leser_DB] // Leser -DB öffnen
L Dyn.SAVE2.Leser_DD
T AR1Start // Startwert mit Offset 0
// Offset 10:
L AR1Start // Startwert mit Offset 0
+ DINT#10
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L DBB [AR1Zeiger]
T "MB200"
A "M200.0"
= Dyn.Leser.IN.xOutReadingDone
A "M200.1"
= Dyn.Leser.IN.xOutReadyForNewScan
// Offset 274:
L AR1Start // Startwert mit Offset 0
+ DINT#274
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L DBB [AR1Zeiger]
T "MB200"
A "M200.0"
= Dyn.Leser.IN.xOutCodeGood
A "M200.1"
= Dyn.Leser.IN.xOutCodeBad
// Offset 12:
L AR1Start // Startwert mit Offset 0
+ DINT#12
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L DBD [AR1Zeiger]
T Dyn.Leser.IN.nOutBarcode
NoLeser: NOP 0
--- NW 21: Schrittkette anhalten ---
A Dyn.Sk.Auto_akt // Automatik ist aktiv
A Dyn.Sk.Bereich_ok
CLR
JU en08_Mig // Schrittkette nicht anhalten !
SET
R Dyn.Sk.Err_Uebzeit // Störungen löschen
R Dyn.Sk.Err_Schritt
L 0 // Zeitwerte löschen
T Dyn.Sk.Terr_Zelle
T Dyn.Sk.Tok_Zelle
JU RET
en08_Mig: NOP 0
--- NW 22: Trolley wurde zurück gezogen ---
L Dyn.Sk.Akt_Schritt
L 10 // Trolley schon unterwegs ?
<I // Ja !
O(
CAC
L 12 // Trolley schon unterwegs ?
>I // Ja !
)
O Status2.Trolley_an_Schleuse // Trolley ist noch in Schleuse
O "Schleuse_geöffnet"
JC TrolleyOk
SET
S Antrieb_Schleuse_start
S Dyn.Leser.OUT.xInReset
L 0 // Neubeginn
T Dyn.Sk.Akt_Schritt
AN Schleuse.Parameter_allg.Leser_eingebaut // Falls kein Leser verbaut Daten behalten (falls von Bereich-1 gemeldet)
JC TrolleyOk
T Dyn.Trolley_ZwischenZiel
L DINT#0
T Dyn.TrolleyID_Schleuse
TrolleyOk: NOP 0
--- NW 23: Sprungverteiler ---
L Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
L -1 // angegeben ?
==I // Nein !
JC NEU
CAC // Neuen Schritt übergeben
T Dyn.Sk.Akt_Schritt
L -1 // Urzustand
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
NEU: SET
R Warte_neu // Wartezeit neutriggern
R Warte_stop // Wartezeit stoppen
L Dyn.Sk.Akt_Schritt
JL Ende
JU s000 // Schritt 0
JU s001 // Schritt 1
JU s002 // Schritt 2
JU s003 // Schritt 3
JU s004 // Schritt 4
JU s005 // Schritt 5
JU s006 // Schritt 6
JU s007 // Schritt 7
JU s008 // Schritt 8
JU s009 // Schritt 9
JU s010 // Schritt 10
JU s011 // Schritt 11
JU s012 // Schritt 12
JU s013 // Schritt 13
JU s014 // Schritt 14
JU s015 // Schritt 15
JU s016 // Schritt 16
JU s017 // Schritt 17
JU s018 // Schritt 18
JU s019 // Schritt 19
JU s020 // Schritt 20
JU s021 // Schritt 21
JU s022 // Schritt 22
JU s023 // Schritt 23
JU s024 // Schritt 24
JU s025 // Schritt 25
JU s026 // Schritt 26
JU s027 // Schritt 27
JU s028 // Schritt 28
JU s029 // Schritt 29
JU s030 // Schritt 30
Ende: S Dyn.Sk.Err_Schritt // Undefinierter Schritt
L 16#A131
T Dyn.Stop_Ursache
JU RET
Neu_Mig: A Dyn.Sk.Err_Uebzeit
JCN Sk
L 16#A132
T Dyn.Stop_Ursache
JU RET
Sk: T Dyn.Sk.Akt_Schritt
L 0 // Zeitwerte löschen
T Dyn.Sk.Terr_Zelle
T Dyn.Sk.Tok_Zelle
JU NEU
// Nicht programmierte Schritte:
// s000: SPA Ende
// s001: SPA Ende
// s002: SPA Ende
s003: JU Ende
s004: JU Ende
// s005: SPA Ende
// s006: SPA Ende
// s007: SPA Ende
s008: JU Ende
// s009: SPA Ende
// s010: SPA Ende
// s011: SPA Ende
// s012: SPA Ende
// s013: SPA Ende
// s014: SPA Ende
// s015: SPA Ende
// s016: SPA Ende
// s017: SPA Ende
s018: JU Ende
s019: JU Ende
// s020: SPA Ende
// s021: SPA Ende
s022: JU Ende
s023: JU Ende
s024: JU Ende
s025: JU Ende
s026: JU Ende
s027: JU Ende
s028: JU Ende
s029: JU Ende
s030: JU Ende
--- NW 24: Schritt X: Reserve ---
SET // Weiterschaltbedingung
= Weiter
// Schrittaktionen:
SET
L 16#B001
T Dyn.Stop_Ursache
A Weiter // Weiterschaltbedingung ist erfüllt
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
L 0 // Angabe der Wartezeit (*10ms)
JC Plus // Nächsten Schritt starten
L 1 // Weiter mit Schritt 1
JC Neu_Mig // Bei diesem Schritt weiter
SET
A Dyn.Sk.Auto_akt // Automatik ist aktiv
A Dyn.Sk.Bereich_ok
= Ueb_akt // Überwachungszeit aktivieren
L 50 // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
JU RET
--- NW 25: Schritt 0: Warten auf Trolley ---
s000: SET // Weiterschaltbedingung
A B_InSchleuse // Trolley im Schleuse erkannt
A Dyn.Sk.Auto_akt // Automatik ist aktiv
A Dyn.Sk.Bereich_ok
= Weiter
// Trolley-Schleusendaten löschen:
L DINT#0
T Dyn.TrolleyID_Schleuse
T Dyn.Trolley_ShopGroup
L 0
T Dyn.Trolley_EndZiel
T Dyn.Weichen_Ziel
// HMI-Zeug:
L DINT#0
T Dyn.HMI.TrolleyID_Input
A Dyn.Sk.Reset_Akt // Reset ist aktiv
L 20 // Weiter mit Schritt 20
JC Neu_Mig // Bei diesem Schritt weiter
// Schrittaktionen:
SET
R Dyn.Error.Err_Leser_nicht_bereit
R Dyn.Error.Err_Kein_LeseErgebnis
R Dyn.Status.SF_angefordert
R Status2."TrolleyPos_übergeben"
R Status2.Telegramm_gesendet
A Weiter // Weiterschaltbedingung ist erfüllt
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
L 50 // Angabe der Wartezeit (*10ms)
JC Plus // Nächsten Schritt starten
L 16#B001
T Dyn.Stop_Ursache
A Dyn.Status."Trolley_fährt_in_Schleuse"
AN B_InSchleuse
S Antrieb_Schleuse_vor // Antrieb einschalten
JC S000A
SET
R Dyn.Sk.Err_Uebzeit
L 16#B000
T Dyn.Stop_Ursache
JU RET
// Überwachungszeit starten:
S000A: A Dyn.Status."Trolley_fährt_in_Schleuse"
AN B_InSchleuse // Trolley im Schleuse erkannt
A(
O Antrieb_Schleuse_aktiv
ON Schleuse.Parameter_allg.Antrieb_vorhanden
)
= Ueb_akt // Überwachungszeit aktivieren
A Dyn.Sk.Err_Uebzeit
R Dyn.Sk.Err_Uebzeit
S Dyn.Error.Err_Trolley_nicht_in_Schleuse
R Dyn.Status."Trolley_fährt_in_Schleuse"
L Schleuse."Übzeit_in_Schleuse"
JU tueb // Überwachungszeit
--- NW 26: Schritt 1: Trolley ist in Schleuse / Leser ? / Daten vorhanden ? ---
s001: NOP 0
// Schrittaktionen:
A B_InSchleuse
S Status2.Trolley_an_Schleuse
AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt
A Schleuse.Parameter_allg.Leser_eingebaut
L 0 // Weiter mit Schritt 0
JC Neu_Mig // Bei diesem Schritt weiter
// Zwischen-Ziel von Bereich -1 vorhanden?:
L Dyn.ZwischenZiel_eingefahren
L 0 // Zwischenziel von Bereich -1 vorhanden!
==I // Nein !
O Schleuse.Parameter_allg.Leser_eingebaut // Dann werden Daten neu ermittelt!
JC X001
// Daten von Bereich -1 übergeben:
L Dyn.ZwischenZiel_eingefahren
T Dyn.Trolley_ZwischenZiel
L 0
T Dyn.ZwischenZiel_eingefahren
L Dyn.TrolleyID_Eingefahren
T Dyn.TrolleyID_Schleuse
L DINT#0
T Dyn.TrolleyID_Eingefahren
L 12 // Weiter mit Schritt 12
JU Neu_Mig // Bei diesem Schritt weiter
X001: L 0
T Dyn.Trolley_ZwischenZiel
// Leser vorhanden:
A Schleuse.Parameter_allg.Leser_eingebaut
R Dyn.Error.Err_Kein_LeseErgebnis
L 9 // Weiter mit Schritt 9 (Leser bereit)
JC Neu_Mig // Bei diesem Schritt weiter
// Trolleydaten vorhanden ?: (Übergabe von Bereich -1)
L Dyn.TrolleyID_Eingefahren
T Dyn.TrolleyID_Schleuse
L DINT#0 // Daten vorhanden ?
<>D // Ja !
L 11 // Weiter mit Schritt 11 (Trolleydaten lesen)
JC Neu_Mig // Bei diesem Schritt weiter
// Ziel-FC vorhanden ?:
A ZielFC_vorhanden
L 12 // Weiter mit Schritt 12 (Ziel-FC)
JC Neu_Mig // Bei diesem Schritt weiter
L 14 // Weiter mit Schritt 14 (Weichenbereich +1 vorhanden)
JU Neu_Mig // Bei diesem Schritt weiter
--- NW 27: Schritt 2: Ausfahren ok ? ---
s002: NOP 0
// Schrittaktionen:
AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt
L 0 // Weiter mit Schritt 0
JC Neu_Mig // Bei diesem Schritt weiter
// Anlage aus oder Störung:
L 16#B021
T Dyn.Stop_Ursache
AN Dyn.Sk.Auto_akt // Automatik ist aktiv
ON Dyn.Sk.Bereich_ok // Bereich ist gestört
JC RET
// Starten erlaubt Trolley ?:
L 16#B022
T Dyn.Stop_Ursache
AN Start_Ok // Starten ist erlaubt
JC RET
// Stau im Bereich +1:
L 16#B023
T Dyn.Stop_Ursache
SET
S Dyn.Status."Trolley_wartet_Bereich+1"
A B_Stau_raus // Sensor Stau im Bereich rausfahren
JC RET
// B_Aus_Schleuse aktiv:
L 16#B024
T Dyn.Stop_Ursache
A(
L Dyn.Raus_Trolleys
L 0 // Trolleys schon unterwegs?
<>I // Ja!
O(
L Schleuse.MaxRausTrolleys
L 1 // Nur einer darf ausfahren ?
==I // Ja !
)
)
A Status2."Trolley an Raus-Sensor"
O Status2."Stau_an_Raus-Sensor"
JC RET
// Raus-Weiche bereit?:
L 16#B028
T Dyn.Stop_Ursache
A(
L Dyn.Weichen_Ziel
L Dyn."Zurück_gemeldetes_Weichen_Ziel"
<>I // Nicht identisch !
ON Dyn.Status.Weiche_geschaltet // Rückmeldung von Weiche +1
)
AN "Kein_Weichenbereich +1" // Also Weiche +1
L 15
JC Neu_Mig // Bei diesem Schritt weiter
// Zu viele Raus-Trolleys unterwegs:
L 16#B027
T Dyn.Stop_Ursache
L Dyn.Raus_Trolleys // Gestartete Trolleys
L Schleuse.MaxRausTrolleys // Erlaubte Anzahl gestarteter Trolleys
>=I
JC RET
// Antriebe aktivieren / aktiv ?:
A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche)
S Antrieb_plus_vor // Antrieb plus einschalten
A(
O Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv
ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche)
)
S Antrieb_Schleuse_vor // Antrieb einschalten
L 16#B026
T Dyn.Stop_Ursache
AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv
A Schleuse.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche)
JC RET
AN Antrieb_Schleuse_aktiv // Kreisel-Antrieb aktiv
A Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke
= Dyn.Status.Kein_Stop_mehr
JC RET
L Dyn.Raus_Trolleys
+ 1 // Gestartete Trolleys + 1
T Dyn.Raus_Trolleys
L 5 // Nur 1 langes Signal!
JC Neu_Mig // Bei diesem Schritt weiter
--- NW 28: Schritt 5: Trolley fährt aus ? ---
s005: SET // Weiterschaltbedingung
AN B_InSchleuse // Sensor Trolley ist in Schleuse
A(
O Antrieb_Schleuse_aktiv // Kreisel-Antrieb aktiv
ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke
)
A(
O Antrieb_plus_aktiv
ON Schleuse.Parameter_allg.Antrieb_Plus_vorhanden
)
= Weiter
// Schrittaktionen:
SET
S Y_Schleuse_Auf // Schleuse öffnen
S Dyn.Status."Trolley_fährt_aus"
// Antriebe:
// siehe Nw10
// B in Schleuse aktiv:
A B_InSchleuse // Sensor Trolley ist in Schleuse
JCN X050 // Negierter Sprung
L 0
T Dyn.Sk.Tok_Zelle
// Trolley ist draussen mit 5s-Verzögerung:
X050: A Weiter // Weiterschaltbedingung ist erfüllt
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
L 300
JC Plus // Nächsten Schritt starten
// Trolley fährt nicht raus!:
A Dyn.Sk.Err_Uebzeit
S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
L 16#B051
T Dyn.Stop_Ursache
A Antrieb_Schleuse_aktiv
ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke
= Ueb_akt // Überwachungszeit aktivieren
L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
--- NW 29: Schritt 6: Schleuse Mindestzeit geöffnet ? ---
s006: SET // Weiterschaltbedingung
A Dyn.Status.MindestZeit_ok
AN B_InSchleuse // Sensor Trolley in Schleuse vorhanden
= Weiter
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
// Schrittaktionen:
// Gezählt wird in NW11
SET
S Y_Schleuse_Auf // Schleuse öffnen
S Dyn.Status."Trolley_fährt_aus"
// Erneutes Signal von B in Schleuse ?:
A B_InSchleuse // Sensor Trolley in Schleuse vorhanden
JCN X060 // Negierter Sprung
L 5
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
L 0 // Mindest-Zeit neu starten
T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s]
SET
R Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen
JU RET
// Antriebe:
// siehe Nw10
X060: A Weiter
L 0
JC X006 // Nächsten Schritt starten
L 16#B061
T Dyn.Stop_Ursache
// Trolley fährt nicht raus!:
A Dyn.Sk.Err_Uebzeit
S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
A Antrieb_Schleuse_aktiv
ON Schleuse.Parameter_allg.Antrieb_vorhanden // Schleuse an angetriebener Strecke
= Ueb_akt // Überwachungszeit aktivieren
L Schleuse."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
// Trolley hat Schleuse verlassen:
X006: SET
S Dyn.Status.Trolley_draussen // 1 Zyklus
R Dyn.Status."Trolley_fährt_in_Schleuse"
R Status2.Telegramm_gesendet
L Dyn.Vereinzelungstakte
+ DINT#1 // Vereinzelungen +1
T Dyn.Vereinzelungstakte
// Draussen-FC ?:
AN DraussenFC_vorhanden
JC NoFC // Bei diesem Schritt weiter
L Schleusen_Nr // Schleusen-Nr.
T "MW190"
L Dyn.Trolley_ShopGroup // Shop-Gruppe
T "MD182" // übergeben
L Dyn.Weichen_Ziel
T "MW198" // Weichenziel
UC DB[DraussenFC] // z.Bsp. Daten anpassen
NoFC: L 7 // Weiter mit Schritt 7
JU Neu_Mig // Bei diesem Schritt weiter
--- NW 30: Schritt 7: Fertig ---
s007: SET // Weiterschaltbedingung
// Schrittaktionen:
JU ENDE_Mig
--- NW 31: Schritt 9: Lese-Einheit bereit? ---
s009: SET // Weiterschaltbedingung
L Dyn.Leser.IN.nOutBarcode
L DINT#0
==D
A Dyn.Leser.IN.xOutReadyForNewScan
AN Dyn.Leser.IN.xOutReadingDone
AN Dyn.Leser.IN.xOutCodeGood
AN Dyn.Leser.IN.xOutCodeBad
= Weiter
R Dyn.Error.Err_Leser_nicht_bereit
// Schrittaktionen:
AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt
A Schleuse.Parameter_allg.Leser_eingebaut
R Dyn.Error.Err_Leser_nicht_bereit
L 0 // Weiter mit Schritt 0
JC Neu_Mig // Bei diesem Schritt weiter
A Weiter
= Dyn.Leser.OUT.xInStartReading // Leser triggern
L 0 // Angabe der Wartezeit (*10ms)
JC Plus // Nächsten Schritt starten
// Leser nicht bereit:
A Dyn.Leser.IN.xOutReadingDone // Falls altes Handshake noch gewollt
O Dyn.Leser.IN.xOutCodeGood
O Dyn.Leser.IN.xOutCodeBad
S Dyn.Leser.OUT.xInHandshakeDone
A Dyn.Sk.Err_Uebzeit
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
S Dyn.Error.Err_Leser_nicht_bereit
S Dyn.Leser.OUT.xInErrQuit // Vielleicht hilft es
A Dyn.Error.Err_Leser_nicht_bereit
A ErrQuit // Mit Quittierung dann zusätzlich reset!
S Dyn.Leser.OUT.xInReset
// HMI-TrolleyID bei Leser nicht bereit:
L Dyn.HMI.TrolleyID_Input
L DINT#0
<>D // Ja!
A Dyn.Error.Err_Leser_nicht_bereit
L 0 // Angabe der Wartezeit (*10ms)
JC Plus // Nächsten Schritt starten
SET
= Ueb_akt // Überwachungszeit aktivieren
L 5 // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
--- NW 32: Schritt 10: Warten auf Leseeinheit ---
s010: SET // Weiterschaltbedingung
A Dyn.Leser.IN.xOutReadingDone
A Dyn.Leser.IN.xOutCodeGood
AN Dyn.Leser.IN.xOutCodeBad
= Weiter
R Dyn.Error.Err_Kein_LeseErgebnis
// Schrittaktionen:
AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt
A Schleuse.Parameter_allg.Leser_eingebaut
L 0 // Weiter mit Schritt 0
R Dyn.Error.Err_Kein_LeseErgebnis
JC Neu_Mig // Bei diesem Schritt weiter
SET
R Dyn.Leser.OUT.xInStartReading // Leseeinheit triggern
A Weiter
S Dyn.Leser.OUT.xInHandshakeDone
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
JC X010
SET
S Dyn.Status.Trolley_wartet_Lesung
A Dyn.Error.Err_Leser_nicht_bereit // von Schritt 9
JC LX
A Dyn.Sk.Err_Uebzeit
O Dyn.Leser.IN.xOutCodeBad
S Dyn.Leser.OUT.xInHandshakeDone
JC L2 // Erst bei 3.Fehllesung Error!
L 16#B101
T Dyn.Stop_Ursache
SET
= Ueb_akt // Überwachungszeit aktivieren
L 10 // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
L2: A Status2."2.Lesung_aktiv" // Erst bei 3.Fehllesung Error!
JC L3
SET
S Status2."2.Lesung_aktiv"
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
L 9
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
JU RET
L3: A Status2."3.Lesung_aktiv" // //Erst bei 3.Fehllesung Error!
JC LX
SET
S Status2."3.Lesung_aktiv"
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
L 9
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
JU RET
// Nach 3.Fehl-Lesung erst Leserfehler!
LX: SET
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
S Dyn.Error.Err_Kein_LeseErgebnis
JU NoLesung
// Leserdaten übergeben:
X010: L Dyn.Leser.IN.nOutBarcode
T Dyn.TrolleyID_Schleuse
L DINT#0 // Unbekannt ?
==D // Ja !
O(
CAC
L DINT#-1 // Fehl-Lesung?
==D // Ja !
)
S Dyn.Error.Err_Kein_LeseErgebnis
L 9 // Weiter mit Schritt 9 (Leser bereit)
JC Neu_Mig // Bei diesem Schritt weiter
L 11 // Weiter mit Schritt 11
JU Neu_Mig // Bei diesem Schritt weiter
// Lesefehler:
NoLesung: NOP 0
// HMI-Eingabe?:
// HMI-TrolleyID:
L Dyn.HMI.TrolleyID_Input
T Dyn.TrolleyID_Schleuse
<>D // Ja!
L 0 // Angabe der Wartezeit (*10ms)
R Dyn.Error.Err_Kein_LeseErgebnis
R Dyn.Error.Err_Leser_nicht_bereit // von Schritt 9
JC Plus // Nächsten Schritt starten
// Leser-FC aufrufen:
No_HMIa: AN LeserFC_vorhanden
JC NoLFC
L Schleusen_Nr // Schleusen-Nr.
T "MW190" // übergeben
L Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf
T "MW196"
A Dyn.Error.Err_Kein_LeseErgebnis
= "M180.0"
SET
R "M180.1"
UC DB[LeserFC] // Beeinflussung der Fehllesung
L 16#B102
T Dyn.Stop_Ursache
L "MW196" // Zwischenziel übergeben
T Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf
L 0 // Übergeben ?
<>I // Ja!
L 12 // Weiter mit Schritt 12
R Dyn.Error.Err_Kein_LeseErgebnis
JC Neu_Mig // Bei diesem Schritt weiter
NoLFC: L 9
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
JU RET
--- NW 33: Schritt 11: Trolleydaten aus DL lesen ---
s011: L DINT#0
T Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1
L Dyn.Trolley_ZwischenZiel // /
L Dyn.TrolleyID_Schleuse
T "MD220"
CALL FC "DatenOut" (SSDB:=Schleuse.Gesamt_Trolley_DL, SSDW:=0, PARA:=16#0000, SEARCHDATEN:=P#M220.0, RE_VAL:="MB199", OUTDATEN:=DB1011.DBX0.0, Position:="MW196") // Eintrag lesen
L 16#B111
T Dyn.Stop_Ursache
AN "M199.7"
= Dyn.Error.Barcode_nicht_bekannt
JC UnbekanntBC
// Relevanten Trolleydaten auslesen:
L "TrolleyDL_OutDaten".OUTDaten.EndZiel
T Dyn.Trolley_EndZiel
// ZwischenZiel nicht überschreiben:
L Dyn.Trolley_ZwischenZiel
L 0 // Schon bekannt ?
<>I // Ja !
JC NixZZ
L "TrolleyDL_OutDaten".OUTDaten.ZwischenZiel
T Dyn.Trolley_ZwischenZiel
NixZZ: L "TrolleyDL_OutDaten".OUTDaten.ShopGroup
T Dyn.Trolley_ShopGroup
L 0 // Angabe der Wartezeit (*10ms)
JU Plus // Nächsten Schritt starten
// Unbekannter Trolley:
UnbekanntBC: NOP 0
// HMI-Eingabe?:
// Leser-FC aufrufen:
Nix_HMI: AN LeserFC_vorhanden
JC Nix_LFC
L Schleusen_Nr // Schleusen-Nr.
T "MW190" // übergeben
L Dyn.TrolleyID_Schleuse
T "MD192"
L Dyn.Trolley_ZwischenZiel
T "MW196"
A Dyn.Error.Barcode_nicht_bekannt
= "M180.1"
SET
R "M180.0"
UC DB[LeserFC] // Beeinflussung der Weiterfahrt bei nicht bekanntem Trolley
L "MW196" // ZwischenZiel übergeben
T Dyn.Trolley_ZwischenZiel // Übergabe von Leser-Aufruf
L 0 // Übergeben ?
<>I // Ja!
L 12 // Weiter mit Schritt 12
R Dyn.Error.Err_Kein_LeseErgebnis
JC Neu_Mig // Bei diesem Schritt weiter
Nix_LFC: JU RET
--- NW 34: Schritt 12: Ziel-FC ---
s012: NOP 0
// Schrittaktionen:
AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt
A Schleuse.Parameter_allg.Leser_eingebaut
AN "Schleuse_geöffnet"
L 0 // Weiter mit Schritt 0
JC Neu_Mig // Bei diesem Schritt weiter
SET
S Dyn.Status."Trolley_wartet_auf_Ziel-FC"
AN ZielFC_vorhanden
R Dyn.Status."Trolley_wartet_auf_Ziel-FC"
L 13 // Weiter mit Schritt 13
JC Neu_Mig // Bei diesem Schritt weiter
SET // Rückmeldungen erst mal resetten
R "M180.6" // Weiterfahrt von Ziel-FC erlaubt
L Schleusen_Nr // Schleusen-Nr.
T "MW190" // übergeben
L Dyn.Trolley_ShopGroup // Shop-Gruppe
T "MD182" // übergeben
L Dyn.Trolley_EndZiel // End-Ziel
T "MW194" // übergeben
L Dyn.Trolley_ZwischenZiel
T "MW196" // übergeben
L 0 // Erst mal nullen
T "MW198" // Weichenziel
UC DB[ZielFC] // Beeinflussung der Weiterfahrt
L 16#B122
T Dyn.Stop_Ursache
// Spezial-Fall bei Übergabe an Sorter / Turm (M180.6 wird nie im Ziel-FC gesetzt!)
// aber anderer Partner hat Schleuse extern geöffnet:
A "Schleuse_geöffnet"
AN "M180.6" // Weiterfahrt von Ziel-FC erlaubt
AN Status2."TrolleyPos_übergeben" // Nur einmalig
S Status2."TrolleyPos_übergeben"
JCN Normal // Negierter Sprung
L Dyn.Vereinzelungstakte
+ DINT#1 // Vereinzelungen +1
T Dyn.Vereinzelungstakte
CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Schleuse.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Schleuse, Position:=Schleuse.Leser_ID, ShopGroup:=Dint#0, Err:="M199.0")
// Draussen-FC ?:
AN DraussenFC_vorhanden
JC RET // Bei diesem Schritt weiter
L Schleusen_Nr // Schleusen-Nr.
T "MW190"
UC DB[DraussenFC] // z.Bsp. Daten anpassen
JU RET
Normal: A "M180.6" // Weiterfahrt von Ziel-FC erlaubt
JC X012
AN Schleuse.Parameter_allg.Leser_eingebaut
JC RET
L 11
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
JU RET
X012: L "MW196" // zurückschreiben, falls verändert
T Dyn.Trolley_ZwischenZiel
L "MW198" // Weichenziel übergeben
T Dyn.Weichen_Ziel
L 13 // Weiter mit Schritt 13
JU Neu_Mig // Bei diesem Schritt weiter
--- NW 35: Schritt 13: Schleusen-Position zurückschreiben ---
s013: NOP 0
// Schrittaktionen:
SET
S Status2."Weichen-Schritt"
// Neue Position an Gesamt-Trolley-DL übergeben:
CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Schleuse.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Schleuse, Position:=Schleuse.Leser_ID, ShopGroup:=DInt#0, Err:="M199.0") // für nichts verändern
L 0 // Angabe der Wartezeit (*10ms)
JU Plus // Nächsten Schritt starten
--- NW 36: Schritt 14: Weichenbereich +1 vorhanden ---
s014: NOP 0
// Schrittaktionen:
// Weichenbereich +1 vorhanden?:
A "Kein_Weichenbereich +1"
L 2 // Weiter mit Schritt 2 (Ausfahren ok?)
JC Neu_Mig // Bei diesem Schritt weiter
SET
S Status2."Weichen-Schritt"
L 0 // Angabe der Wartezeit (*10ms)
JU Plus // Nächsten Schritt starten
--- NW 37: Schritt 15: Weichenbereich raus bereit ? ---
s015: NOP 0
// Schrittaktionen:
AN Status2.Trolley_an_Schleuse // Trolley im Schleuse erkannt
L 0 // Weiter mit Schritt 0
JC Neu_Mig // Bei diesem Schritt weiter
SET
S Status2."Weichen-Schritt"
L Dyn.Weichen_Ziel
L 0 // Bekannt ?
<>I // Ja !
JC X15A
L 12 // Ziel-FC ?
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
L 16#B154
T Dyn.Stop_Ursache
JU RET
X15A: SET
S Dyn.Status."Trolley_wartet_auf_Weiche+1"
L 16#B155
T Dyn.Stop_Ursache
L SAVE.Weichen_DB // Weichen-DB
L 0 // Einsprung-Zeiger bekannt ?
>I // Ja !
JC S015A
L 16#B150
T Dyn.Stop_Ursache
JU RET
// Weichendaten auslesen:
S015A: L SAVE.Weichen_DW
ITD
T AR1Start // Startwert mit Offset 0
L AR1Start // Startwert mit Offset 0
+ DINT#70
SLD 3
L 0 // Damit DBX70.0
OD
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L 16#B152
T Dyn.Stop_Ursache
OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen
AN DBX [AR1Zeiger] // Weichenbereich frei ? (DBX70.0)
JC S015B
L 16 // Weiter mit Schritt 16 (Daten an Weiche übergeben)
JU Neu_Mig // Bei diesem Schritt weiter
// Reservierung noch diese Schleuse ?:
S015B: L AR1Start // Startwert mit Offset 0
+ DINT#78
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen
L DBW [AR1Zeiger] // Schleuse -1 (DBW 78)
L Schleusen_Nr // Diese Schleuse ?
<>I // Nein !
JC RET // Warten !
// Dasselbe Weichen-Ziel ?:
L Dyn.Weichen_Ziel // Gewolltes Ziel
L Dyn."Zurück_gemeldetes_Weichen_Ziel" // Aktuell im Weichenbereich aktives Ziel
<>I // Sind nicht identisch !
JC RET // Warten !
L 16 // Weiter mit Schritt 16 (Daten an Weiche übergeben)
JU Neu_Mig // Bei diesem Schritt weiter
--- NW 38: Schritt 16: Daten an Rausweiche übergeben ---
s016: NOP 0
// Schrittaktionen:
SET
S Status2."Weichen-Schritt"
// Daten für Eintrag vorbereiten:
OPN DB[SAVE.Weichen_DB] // FABE+ -DB öffnen
L AR1Start // Startwert mit Offset 0
+ DINT#72
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L Dyn.TrolleyID_Schleuse
T DBD [AR1Zeiger] // Trolley-ID (DBD 72)
L AR1Start // Startwert mit Offset 0
+ DINT#76
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L Dyn.Weichen_Ziel
T DBW [AR1Zeiger] // Weichenziel (DBW 76)
L AR1Start // Startwert mit Offset 0
+ DINT#80
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L Dyn.Trolley_ZwischenZiel
T DBW [AR1Zeiger] // Zwischenziel (DBW 80)
L AR1Start // Startwert mit Offset 0
+ DINT#78
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L Schleusen_Nr
T DBW [AR1Zeiger] // Schleuse -1 (DBW 78)
SET
S "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet (da erst im nächsten Zyklus)
L Schleuse.RausWeichen_Nr // Nr. der vorhandenen Weiche
T SAVE."Weiche+1" // Hier wurde reserviert
L 17 // Weiter mit Schritt 17 (Hat Weiche geschaltet ?)
JU Neu_Mig // Bei diesem Schritt weiter
--- NW 39: Schritt 17: Hat Rausweiche geschaltet ? ---
s017: NOP 0
// Schrittaktionen:
SET
S Status2."Weichen-Schritt"
// Weiche +1 noch mit dieser Schleuse aktiv ?:
AN "Reservierung_Weiche+1_aktiv" // Weiche nicht mehr angemeldet
L 14 // Weiter mit Schritt 14
JC Neu_Mig // Bei diesem Schritt weiter
SET
S Dyn.Status."Trolley_wartet_auf_Weiche+1"
L 16#B170
T Dyn.Stop_Ursache
L Dyn.Weichen_Ziel // Gewolltes Ziel
L Dyn."Zurück_gemeldetes_Weichen_Ziel" // Aktuell im Weichenbereich aktives Ziel
==I // Sind identisch !
A Dyn.Status.Weiche_geschaltet // Rückmeldung von Weiche +1
L 2 // Weiter mit Schritt 2 (Ausfahren ok?)
JC Neu_Mig // Bei diesem Schritt weiter
L 16#B171
T Dyn.Stop_Ursache
JU RET
--- NW 40: Schritt 20: Schleuse resetten (Wartezeit) ---
s020: A B_InSchleuse // Weiterschaltbedingung
= Weiter // Weiterschaltbedingung ist erfüllt
// Schrittaktionen:
SET // ELS in Grundstellung fahren
S Antrieb_Schleuse_vor // Antrieb einschalten
S Antrieb_Schleuse_start // Antrieb starten
A Weiter
O Dyn.Sk.Err_Uebzeit
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
L 21 // Weiter mit Schritt 21
JC Neu_Mig // Bei diesem Schritt weiter
L 16#B201
T Dyn.Stop_Ursache
SET
= Ueb_akt // Überwachungszeit aktivieren
L Schleuse.Wartezeit_bis_leer // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
--- NW 41: Schritt 21: Reset ist zu Ende ---
s021: SET
R Dyn.Sk.Reset_Akt // Reset ist aktiv
R Status2."TrolleyPos_übergeben"
R Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse
R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen
R Dyn.Error.Err_Stau_Einfahrt // Betriebsart ist nicht möglich
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
R Dyn.Status."Trolley_fährt_in_Schleuse"
L 0
T SAVE.Weichen_DB
T SAVE.Weichen_DW
T SAVE."Weiche+1" // Dadurch wird in Weiche Reservierung gelöscht
T Dyn.Raus_Trolleys
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
T Dyn.Mindest_Zeit // Sensor B_VorSep ist frei [1s]
SET
S Dyn.Status.Trolley_draussen
JU ENDE_Mig // Neubeginn
--- NW 42: Schrittkette beenden ---
ENDE_Mig: L 0 // Schritt 0: Warten
T Dyn.Sk.Akt_Schritt
L 0 // Zeitwert löschen
T Dyn.Sk.Terr_Zelle
T Dyn.Sk.Tok_Zelle
T Dyn.ZwischenZiel_eingefahren
L DINT#0
T Dyn.TrolleyID_Eingefahren // Eintrag von Weiche -1
T Dyn.TrolleyID_Schleuse // Daten übergeben
T Dyn.Trolley_ZwischenZiel
T Dyn.Trolley_EndZiel
T Dyn.Weichen_Ziel
SET
R Dyn.Sk.Err_Uebzeit
R Dyn.Status."Trolley_fährt_rückwärts"
R Dyn.Error.Err_Kein_LeseErgebnis
R Status2."2.Lesung_aktiv"
R Status2."3.Lesung_aktiv"
R Status2."TrolleyPos_übergeben"
R Status2.Telegramm_gesendet
// HMI-Zeug:
L DINT#0
T Dyn.HMI.TrolleyID_Input
JU RET
--- NW 43: Nächsten Schritt aktivieren ---
Plus: T Dyn.Sk.T_ok // Wartezeit übergeben
A Dyn.Sk.Err_Uebzeit // Störung noch nicht quittiert
JC RET
L 0 // keine Wartezeit ?
==I // Ja ! -> sofort weiter
JC w220
AN Warte_neu // Wartezeit neutriggern
JC W220_Mig
L 0
T Dyn.Sk.Tok_Zelle // Wartezeit
W220_Mig: A Warte_stop // Wartezeit stoppen
JC RET
L Dyn.Sk.Tok_Zelle
L "MW4" // Wartezeit +10ms
+I
T Dyn.Sk.Tok_Zelle // Wartezeit
L Dyn.Sk.T_ok // abgelaufen ?
<I // Nein !
JC RET
w220: L Dyn.Sk.Akt_Schritt
+ 1 // Schritt +1
T Dyn.Sk.Akt_Schritt
L 0 // Zeitwerte löschen
T Dyn.Sk.Terr_Zelle
T Dyn.Sk.Tok_Zelle
JU RET
--- NW 44: Überwachungszeit kontrollieren ---
tueb: A Ueb_akt
= Dyn.Sk.Ueb_akt // Für Statuskontrolle
T Dyn.Sk.T_Err // Für Statuskontrolle
L Dyn.Sk.Terr_Zelle // Maximalzeit
>I // abgelaufen ?
AN Dyn.Sk.Err_Uebzeit
JC en24 // Nein !
A Ueb_akt // Überwachungszeit aktivieren
S Dyn.Sk.Err_Uebzeit
L 0 // Zeitwert löschen
T Dyn.Sk.Terr_Zelle
JU RET
en24: NOP 0
--- NW 45: Überwachungszeit +1 ---
AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv
ON "1s-Impuls"
JC RET
L Dyn.Sk.Terr_Zelle
+ 1 // Üb.zeit +1s
T Dyn.Sk.Terr_Zelle
JU RET
--- NW 46: Return ---
RET: NOP 0
// Weichen -R ückmeldung löschen:
SET
R Dyn.Status.Weiche_geschaltet
R Dyn.Status."Trolley ausserhalb Weiche"
L 0
T Dyn."Zurück_gemeldetes_Weichen_Ziel"
--- NW 47: Leser-Einheit managen (Outputs schreiben) ---
AN Leser_Zugriff
ON Schleuse.Parameter_allg.Leser_eingebaut
JC NixLeser
// Leserdaten schreiben:
OPN DB[Dyn.SAVE2.Leser_DB] // Leser -DB öffnen
L Dyn.SAVE2.Leser_DD
T AR1Start // Startwert mit Offset 0
// Offset 4:
L AR1Start // Startwert mit Offset 0
+ DINT#4
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
L DBB [AR1Zeiger] // Aktuelle Werte holen
T "MB200"
A Dyn.Leser.OUT.xInStartReading
= "M200.1"
A Dyn.Leser.OUT.xInHandshakeDone
R Dyn.Leser.OUT.xInHandshakeDone
= "M200.2"
A Dyn.Leser.OUT.xInErrQuit
R Dyn.Leser.OUT.xInErrQuit
= "M200.4"
A Dyn.Leser.OUT.xInReset
R Dyn.Leser.OUT.xInReset
= "M200.5"
L "MB200"
T DBB [AR1Zeiger] // Veränderte Werte zurück schreiben
NixLeser: NOP 0
--- NW 48: Ende ---
BE