1421 lines
58 KiB
Plaintext
1421 lines
58 KiB
Plaintext
=== FB 1277: MHMLeerpuffer [STL] ===
|
|
INTERFACE:
|
|
Input:
|
|
LeerPuffer_Nr : Int // Aufruf für Leer-Puffer
|
|
ErrQuit : Bool // Ablaufstörung quittieren
|
|
B_LeerpufferEinfahrt : Bool // Sensor Trolley fährt in Leerpuffer
|
|
B_InSchleuse : Bool // Sensor Trolley ist in Schleuse unten
|
|
B_AusSchleuse : Bool // Sensor Trolley hat Schleuse unten verlassen
|
|
B_Stau_raus_Out : Bool // Sensor Stau im Bereich unten rausfahren
|
|
B_QuerTrolley_Out : Bool // Crash-Trolley auf Crashkurs erkannt
|
|
Antrieb_plus_aktiv : Bool // Kreisel-Antrieb plus aktiv
|
|
Schleuse_geöffnet : Bool // Schleuse unten hat geöffnet
|
|
Output:
|
|
Y_Schleuse_Auf : Bool // Schleuse unten öffnen
|
|
Error : Word // Störungen übergeben
|
|
InOut:
|
|
Start_Ok : Bool // Starten von ausserhalb ist erlaubt
|
|
Antrieb_plus_vor : Bool // Antrieb plus vorfahren
|
|
Antrieb_plus_stoppen : Bool // Antrieb plus stoppen
|
|
hStOk : Bool // Anzeige Start n. Störung aktivieren
|
|
Ausfahr_Inks : Int // Rest-Inks, wo sich Trolley befindet
|
|
Static:
|
|
Res16 : Array[1..2] of Int // Reserve
|
|
SAVE : Struct
|
|
Weichen_DB : Int // Weichen-FIFO-DB
|
|
Weichen_DW : Int // Weichen-FIFO-DW
|
|
Para : Struct // Parameter
|
|
Leerpuffer_DL_DB : Int // Einsprung Leerpuffer-Datenliste-DB
|
|
Leerpuffer_DL_DW : Int // Einsprung Leerpuffer-Datenliste-DW
|
|
Res1 : Array[1..2] of Int // Reserve
|
|
Status2 : Struct
|
|
Einlagern_ist_aktiv : Bool // Puffer mit Einlagern aktiv
|
|
Auslagern_ist_aktiv : Bool // Puffer mit Auslagern aktiv
|
|
Eintrag_DL_Leerliste_erfolgt : Bool // Eintrag in DLLPPuffer_leer (DB500) erfolgt
|
|
Eintrag_DL_Reinliste_erfolgt : Bool // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt
|
|
Eintrag_Abrufliste_erfolgt : Bool // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt
|
|
Puffer : "UDLHMLeerPuffer" // Statische Leerpufferdaten (aus DL)
|
|
Dyn : Struct // Dynamische Daten
|
|
Status : Struct
|
|
Puffer_leer : Bool // Puffer ist leer
|
|
Puffer_hat Platz : Bool // Puffer hat noch Kapazität
|
|
Kein_neuer_Trolley_kommt : Bool // Leerpuffer zeitlang ohne neuen Trolley
|
|
Leer_Check_aktiv : Bool // Leerpuffer wird auf leer gecheckt
|
|
Reset_aktiv : Bool // Reset aktiv
|
|
Trolley_nicht_in_Schleuse : Bool // Trolley fährt nicht in Schleuse > Inilauf gestartet
|
|
Puffer_nicht_leer : Bool // Puffer nicht leer > Inilauf gestartet
|
|
Leerpuffer_initialisieren : Bool // Leerpuffer initialisieren
|
|
MindestZeit_ok : Bool // Schleuse ist MindestZeit geöffnet
|
|
Res711 : Bool
|
|
Res712 : Bool
|
|
Trolley_wartet_Bereich+1 : Bool // Auslagerstrecke noch belegt
|
|
Einen_LeerTrolley_ausfahren : Bool // Einen Leer-Trolley ausfahren
|
|
Trolley_fährt_aus : Bool // Trolley fährt aus Puffer
|
|
Trolley_draussen : Bool // Trolley ist ausgefahren (1 Zyklus)
|
|
Error_aktiv : Bool // Störung vorhanden
|
|
TrolleyID_Einfahrt : DInt // Trolley-Nr ist eingefahren
|
|
HMI : Struct
|
|
Trolleys_LeerPuffer : Int // Anzahl Trolleys unten (IN:PLC, OUT:PLC)
|
|
Res_Trolleys_LeerPuffer : Int // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC)
|
|
Frei_Plätze_LeerPuffer : Int // Freiplätze für Trolleys (IN:PLC, OUT:PLC)
|
|
Schleuse_resetten_Leerpuffer : Bool // Schleuse resetten unten (IN:HMI, Out:PLC)
|
|
LeerPuffer_initialisieren : Bool := 1 // Leerpuffer initialisieren (IN:HMI, Out:PLC)
|
|
Einlagern_gesperrt : Bool // Einlagern gesperrt (IN:HMI, OUT:HMI)
|
|
AusLagern_gesperrt : Bool // AusLagern gesperrt (IN:HMI, OUT:HMI)
|
|
Sk : "USk_Omni" // Status der Schrittkette Schleuse OUT (unten)
|
|
Rueckmld : Struct
|
|
RET_VAL_BLKMOV_Leerpuffer : Int // Rückmeldung nach BLKMOV-Aufruf
|
|
RET_VAL_DL_Leerpuffer : Byte // Rückmeldung nach DatenOut-Aufruf
|
|
RET_VAL_DL_Res : Byte // Rückmeldung nach DatenOut-Aufruf
|
|
RET_VAL_DL_LeerpufferTrolley_IN : Byte // Rückmeldung nach DatenIN-Aufruf
|
|
RET_VAL_DL_LeerpufferTrolley : Byte // Rückmeldung nach DatenOut-Aufruf
|
|
Error : "UErrHMLeerPuffer"
|
|
Stau_Zeit : Int // Sensor B_Einfahrt ist belegt [1s]
|
|
Mindest_Zeit : Int // Sensor B_in_Schleuse unten ist frei [1s]
|
|
Leer_Zeit : Int // Puffer unten ist frei [1s]
|
|
Stop_Ursache : Word // Stop-Stelle: Nw + Position
|
|
Vereinzelungstakte : DInt // Anzahl der getätigten Vereinzelungstakte
|
|
TrolleyID_ausgefahren : DInt // TrolleyID des ausgefahrenen Trolleys
|
|
Res200 : Array[1..38] of Int
|
|
Reservierungs_DL : Struct // AB DW200: Liste der resevierter Trolleys
|
|
Datenlistenkopf : Struct
|
|
KOPF : Word := WORD#16#DA02 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
|
|
LAENGE : Int := 24 // Länge der Datenliste (maximale Anzahl der Datensätze)
|
|
STAMMDATEN : Int := 2 // Stammdatenlänge in Word (1 - 9)
|
|
INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
|
|
INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs
|
|
Belegt14 : Int // reserviert von Sort-Datenliste
|
|
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
|
|
Reserve18 : Int // Reserve
|
|
Res_Trolley : Array[1..24] of Struct // Reservierter Trolley für Leerpuffer
|
|
Trolley_ID : DInt // Trolley_ID
|
|
Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE)
|
|
Res350 : Array[1..16] of Int
|
|
Anzahl_LeerTrolleys : Int // AB DW350: Liste der Trolleys im Leerpuffer
|
|
Res500 : Array[1..74] of Int
|
|
None:
|
|
Reset : Bool := 1
|
|
Temp:
|
|
Quelle : Any // Zeiger, wo Rein-Daten sind
|
|
Ziel : Any // Zeiger, FIFO-Stelle
|
|
Ueb_akt : Bool // Überwachungszeit aktivieren
|
|
Weiter : Bool // Weiterschaltbedingung ist erfüllt
|
|
Warte_neu : Bool // Wartezeit neu triggern
|
|
Warte_stop : Bool // Wartezeit stoppen
|
|
Neu_Trolley_in_Puffer : Bool // Neuer Trolley in Puffer eingefahren
|
|
Inks_Ok : Bool // Starten aufgrund der Inks erlaubt
|
|
GesamtAnzahl : Int
|
|
SSDW : Int
|
|
Constant:
|
|
|
|
--- NW 1: Parameter-Übergabe ---
|
|
L LeerPuffer_Nr
|
|
|
|
L 275 // Einsprung Puffer-DL
|
|
T Para.Leerpuffer_DL_DB // vor Aufruf übergeben!
|
|
L 0
|
|
T Para.Leerpuffer_DL_DW
|
|
|
|
|
|
--- NW 2: Anzeige OP ---
|
|
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
|
|
T Dyn.Sk.OP_Schritt
|
|
|
|
JU OP_Ok
|
|
|
|
w010: T Dyn.Sk.OP_Schritt
|
|
|
|
OP_Ok: NOP 0
|
|
|
|
|
|
--- NW 3: Out-Bits zum Zurücksetzen / Antrieb plus starten ---
|
|
SET // Jeden Zyklus neu
|
|
R Y_Schleuse_Auf
|
|
R Neu_Trolley_in_Puffer
|
|
R Dyn.Status."Trolley_wartet_Bereich+1"
|
|
R Dyn.Status."Trolley_fährt_aus"
|
|
R Dyn.Status.Trolley_draussen
|
|
|
|
A Dyn.Sk.Reset
|
|
O Dyn.Sk.Reset_Akt
|
|
= Dyn.Status.Reset_aktiv
|
|
|
|
SET
|
|
R Inks_Ok
|
|
|
|
// Antrieb zusätlich starten:
|
|
A ErrQuit // Überwachungszeit abgelaufen quittieren
|
|
S Antrieb_plus_vor // Kreisel-Antrieb plus starten
|
|
|
|
|
|
--- NW 4: HMI-Zeug ---
|
|
// Von HMI:
|
|
A Dyn.HMI.Schleuse_resetten_Leerpuffer
|
|
R Dyn.HMI.Schleuse_resetten_Leerpuffer
|
|
S Dyn.Sk.Reset // SK zurücksetzen
|
|
|
|
A Dyn.HMI.LeerPuffer_initialisieren
|
|
S Dyn.Status.Leerpuffer_initialisieren
|
|
R Dyn.HMI.LeerPuffer_initialisieren
|
|
|
|
A Dyn.HMI.Einlagern_gesperrt // Wird unten direkt verarbeitet
|
|
|
|
A Dyn.HMI.AusLagern_gesperrt // Wird unten direkt verarbeitet
|
|
|
|
CLR
|
|
|
|
// An HMI:
|
|
|
|
L Dyn.Anzahl_LeerTrolleys
|
|
T Dyn.HMI.Trolleys_LeerPuffer
|
|
|
|
L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege
|
|
T Dyn.HMI.Res_Trolleys_LeerPuffer
|
|
|
|
L Puffer.MaxAnzahl_LeerPuffer
|
|
L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege
|
|
-I
|
|
L Dyn.Anzahl_LeerTrolleys
|
|
-I
|
|
T Dyn.HMI."Frei_Plätze_LeerPuffer"
|
|
|
|
|
|
--- NW 5: Schrittkette OUT zurücksetzen ---
|
|
AN Dyn.Sk.Reset // SK zurücksetzen
|
|
JC en04
|
|
|
|
// Schrittkette zurücksetzen:
|
|
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.Leer_Zeit // Zeit für LeerCheck [1s]
|
|
|
|
SET
|
|
R Dyn.Status.Einen_LeerTrolley_ausfahren
|
|
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 !
|
|
S Dyn.Sk.Reset_Akt // Reset ist aktiv
|
|
|
|
SET
|
|
R Dyn.Error.Leerpuffer_DL // Leerpuffer-Datenliste fehlerhaft
|
|
R Dyn.Error.Undef_Leerpuffer // undefiniertes Leerpuffer
|
|
R Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen
|
|
R Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert
|
|
R Dyn.Error.Err_Stau_Einfahrt // Stau am Leerpuffer-Eingang
|
|
R Dyn.Error.Err_BLKMov
|
|
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
|
|
|
|
L 0
|
|
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
|
T Dyn.Mindest_Zeit // Sensor B_VorSep ist frei [1s]
|
|
T SAVE.Weichen_DB
|
|
T SAVE.Weichen_DW
|
|
|
|
// Defaultwerte übergeben:
|
|
L 0 // Damit statische Werte neu aus Datenbank geholt werden !
|
|
T Puffer.LeerPuffer_Nr // Nummer des Leerpuffers
|
|
|
|
BEU
|
|
|
|
en04: NOP 0
|
|
|
|
|
|
--- NW 6: Störungen nach Außen übergeben ---
|
|
L 0
|
|
T "MW200"
|
|
|
|
A Dyn.Error.Leerpuffer_DL // Leerpuffer-Datenliste fehlerhaft
|
|
= "M200.0"
|
|
A Dyn.Error.Undef_Leerpuffer // undefinierter Leerpuffer
|
|
= "M200.1"
|
|
A Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse
|
|
AN Dyn.Status.Leerpuffer_initialisieren
|
|
= "M200.2"
|
|
A Dyn.Sk.Err_Uebzeit
|
|
AN Dyn.Error.Err_Trolley_nicht_in_Schleuse // Trolley fährt nicht in Schleuse
|
|
AN Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
|
|
= 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 // Stau am Leerpuffer-Eingang
|
|
= "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_Leerpuffer_nicht_leer
|
|
AN Dyn.Status.Leerpuffer_initialisieren
|
|
= "M201.0"
|
|
CLR
|
|
= "M201.1"
|
|
= "M201.2"
|
|
= "M201.3"
|
|
= "M201.4"
|
|
A Dyn.Error.Err_Raus_Sensor
|
|
= "M201.5"
|
|
CLR
|
|
= "M201.6"
|
|
A Dyn.Sk.Reset_Akt // Reset ist aktiv
|
|
= Dyn.Error.Reset_aktiv
|
|
= "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
|
|
CLR // Es gibt keine Quittier-Störung!
|
|
A Dyn.Sk.Err_Uebzeit
|
|
S hStOk
|
|
|
|
// Störungen pro Zyklus neu erzeugen:
|
|
SET
|
|
R Dyn.Error.Leerpuffer_DL // Leerpuffer-Datenliste fehlerhaft
|
|
R Dyn.Error.Undef_Leerpuffer // undefiniertes Leerpuffer
|
|
// / 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//Stau am Leerpuffer-Eingang
|
|
R Dyn.Error.Err_BLKMov
|
|
// / R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus
|
|
// / R #Dyn.Error.Err_Leerpuffer_nicht_leer//Trolley ohne Daten vorhanden
|
|
R Dyn.Error.Err_Raus_Sensor
|
|
|
|
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 Leerpuffer-Parameter holen ---
|
|
L Puffer.LeerPuffer_Nr // Nummer des Leerpuffers
|
|
L LeerPuffer_Nr // Aufruf-Parameter
|
|
==I // Identisch ?
|
|
R Dyn.Error.Leerpuffer_DL // Leerpufferdatenbank fehlerhaft
|
|
R Dyn.Error.Undef_Leerpuffer // undefiniertes Leerpuffer
|
|
JC en06 // Ja !
|
|
|
|
T "MW200" // Search-Daten
|
|
|
|
CALL FC "DatenOut" (SSDB:=Para.Leerpuffer_DL_DB, SSDW:=Para.Leerpuffer_DL_DW, PARA:=WORD#16#0000, SEARCHDATEN:=P#M200.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_Leerpuffer, OUTDATEN:=P#M220.0, Position:="MW196")
|
|
|
|
JBI G_Ok
|
|
|
|
A "M199.0"
|
|
JCN w060
|
|
|
|
SET
|
|
= Dyn.Error.Leerpuffer_DL // Leerpufferdatenbank fehlerhaft
|
|
|
|
L 16#A071
|
|
T Dyn.Stop_Ursache
|
|
|
|
BEU
|
|
|
|
w060: SET
|
|
S Dyn.Error.Undef_Leerpuffer // undefinierter Leerpuffer
|
|
|
|
L 16#0072
|
|
T Dyn.Stop_Ursache
|
|
|
|
BEU
|
|
|
|
// Kennung + Datenbytes
|
|
G_Ok: SET
|
|
R Dyn.Error.Leerpuffer_DL // Gefälledatenbank fehlerhaft
|
|
R Dyn.Error.Undef_Leerpuffer // 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_Leerpuffer, DSTBLK:=Puffer) // Datenliste-Daten speichern | #Ziel
|
|
|
|
L 16#0073
|
|
T Dyn.Stop_Ursache
|
|
|
|
L Dyn.Rueckmld.RET_VAL_BLKMOV_Leerpuffer // Rückmeldung
|
|
L 0 // Fehler vorhanden ?
|
|
<>I // Ja !
|
|
= Dyn.Error.Err_BLKMov // Error bei Block kopieren
|
|
BEC
|
|
|
|
L Puffer.Puffer_Typ // Puffertyp = 1277 (Leerpuffer)
|
|
L 1277 // Dieser Aufruf-FB ?
|
|
==I // Ja !
|
|
JC w061
|
|
|
|
SET
|
|
S Dyn.Error.Undef_Leerpuffer // undefinierter Leerpuffer
|
|
|
|
L 0 // Leerpuffer ungültig !
|
|
T Puffer.LeerPuffer_Nr // Nummer des Leerpuffers
|
|
|
|
L 16#0074
|
|
T Dyn.Stop_Ursache
|
|
|
|
BEU
|
|
|
|
// Defaultwerte übergeben:
|
|
w061: NOP 0
|
|
|
|
BEU
|
|
|
|
en06: NOP 0
|
|
|
|
|
|
--- NW 8: Störungen quittieren ---
|
|
A ErrQuit // Überwachungszeit abgelaufen quittieren
|
|
R Dyn.Sk.Err_Uebzeit
|
|
|
|
|
|
--- NW 9: Einfahrenden Trolley in Puffer eintragen ---
|
|
L Dyn.TrolleyID_Einfahrt
|
|
T "MD220"
|
|
L DINT#0
|
|
==I
|
|
JC NoNewT
|
|
|
|
SET
|
|
S Neu_Trolley_in_Puffer
|
|
|
|
// Neue Position an Gesamt-Trolley-DL übergeben:
|
|
CALL FC "Trolley_DL_Neue_Pos" (Gesamt_Trolley_DL:=Puffer.Gesamt_Trolley_DL, TrolleyID:=Dyn.TrolleyID_Einfahrt, Position:=Puffer.Puffer_Position, ShopGroup:=Dint#0, Err:="M199.0")
|
|
|
|
// Daten Puffer eintragen checken:
|
|
L Dyn.Anzahl_LeerTrolleys
|
|
+ 1
|
|
T Dyn.Anzahl_LeerTrolleys
|
|
|
|
// Austrag aus Trolley-Reservierungsliste
|
|
L Dyn.TrolleyID_Einfahrt // Eintrag ist erfolgt
|
|
T "MD220"
|
|
|
|
ResOut: L Puffer.Puffer_Dyn_DW
|
|
L Puffer.PufferReservierungsliste_DW
|
|
+I
|
|
T SSDW
|
|
|
|
CALL FC "DatenOut" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:=Dyn.Rueckmld.RET_VAL_DL_Res, OUTDATEN:=P#M220.0, Position:="MW196") // Eintrag löschen | Nicht relevant
|
|
|
|
L DINT#0
|
|
T Dyn.TrolleyID_Einfahrt
|
|
|
|
NoNewT: NOP 0
|
|
|
|
|
|
--- NW 10: Error: Stau Bereich-Eingang ---
|
|
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
|
|
AN B_LeerpufferEinfahrt // Sensor Trolley fährt in Bereich (kein Stau !)
|
|
R Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt
|
|
JC X090 // StauZeit neu aufziehen
|
|
|
|
AN "1s-Impuls"
|
|
O Dyn.Error.Err_Stau_Einfahrt // Zeit bereits abgelaufen
|
|
JC Xn09
|
|
|
|
L Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
|
+ +1
|
|
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
|
|
|
L 25 // Stau-Zeit erreicht ?
|
|
>=I // Ja !
|
|
S Dyn.Error.Err_Stau_Einfahrt // Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
|
|
JCN Xn09
|
|
|
|
X090: L 0 // Zeiten löschen
|
|
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
|
|
|
|
Xn09: NOP 0
|
|
|
|
|
|
--- NW 11: Schleuse: Mindestzeit geöffnet/frei, Position-Inks übergeben ---
|
|
L Dyn.Sk.Akt_Schritt
|
|
L 6 // Mindestzeit ok?
|
|
<>I // Nein!
|
|
O B_InSchleuse // Sensor Trolley in Schleuse vorhanden
|
|
ON "Schleuse_geöffnet" // Schleuse hat geöffnet
|
|
R Dyn.Status.MindestZeit_ok
|
|
JC X100 // FreiZeit neu aufziehen
|
|
|
|
AN "1s-Impuls"
|
|
O
|
|
A Puffer.Parameter_allg.Antrieb_Plus_vorhanden
|
|
AN Antrieb_plus_aktiv
|
|
O Dyn.Status.MindestZeit_ok // Zeit bereits abgelaufen
|
|
JC Xn10
|
|
|
|
L Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s]
|
|
+ +1
|
|
T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s]
|
|
|
|
L Puffer.Mindeszeit_Schleuse_geoeffnet // Mindest-Zeit erreicht ?
|
|
>=I // Ja !
|
|
S Dyn.Status.MindestZeit_ok
|
|
JCN Xn10
|
|
|
|
X100: L 0 // Zeiten löschen
|
|
T Dyn.Mindest_Zeit // Sensor B_im_Sep ist frei [1s]
|
|
|
|
// Schleuse geöffnet: (Position-Inks übergeben)
|
|
Xn10: AN "Schleuse_geöffnet" // Schleuse hat geöffnet
|
|
JC X10E
|
|
|
|
L Ausfahr_Inks
|
|
L Puffer.Puffer_Position_Inks
|
|
>I // Rest-Inks-Wert ist größer!
|
|
JC X10E
|
|
|
|
L Puffer.Puffer_Position_Inks
|
|
T Ausfahr_Inks
|
|
|
|
X10E: NOP 0
|
|
|
|
|
|
--- NW 12: Keine neue Trolley-Einfahrt ? ---
|
|
// Neu-Trolley ist im Puffer:
|
|
A Neu_Trolley_in_Puffer // s.o.
|
|
O B_LeerpufferEinfahrt // Stauklappe
|
|
JC X110
|
|
|
|
AN "1s-Impuls"
|
|
O Dyn.Status.Kein_neuer_Trolley_kommt
|
|
JC Xn11
|
|
|
|
L Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
|
|
+ +1
|
|
T Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
|
|
|
|
L Puffer.Wartezeit_bis_Puffer_leer // Leer-Zeit erreicht ?
|
|
>=I // Ja !
|
|
JCN Xn11
|
|
|
|
T Dyn.Leer_Zeit // Zeit für LeerCheck einfrieren
|
|
|
|
SET
|
|
S Dyn.Status.Kein_neuer_Trolley_kommt
|
|
|
|
JU Xn11
|
|
|
|
X110: L 0 // Zeiten löschen
|
|
T Dyn.Leer_Zeit
|
|
|
|
SET
|
|
R Dyn.Status.Kein_neuer_Trolley_kommt
|
|
|
|
Xn11: NOP 0
|
|
|
|
|
|
--- NW 13: Reservierungs-Check ---
|
|
L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege
|
|
L 0
|
|
==I
|
|
O "MB3305" // Trolley wird gerade vereinzelt
|
|
O "BG3306" // Synchron-Sensor aktiv
|
|
JC NoResCheck // Später -> Hauptstrangdaten checken!
|
|
|
|
// Trolleys noch unterwegs ?
|
|
L "LP_TravelFIFO".Travel_FIFO_BG3306.FIFO.ANZAHL
|
|
L "LP_HS_oF".Datensortkopf.AnzahlEintraege
|
|
+I
|
|
L "LP_HS_mF".Datensortkopf.AnzahlEintraege
|
|
+I
|
|
L 0 // Es sind noch Trolleys unterwegs
|
|
<>I
|
|
JC NoResCheck
|
|
|
|
L Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID
|
|
T "MD220"
|
|
|
|
JU ResOut
|
|
|
|
NoResCheck: NOP 0
|
|
|
|
|
|
--- NW 14: Leer-Check aktiv ---
|
|
// Falls Inilauf aktiv:
|
|
A Dyn.Status.Leerpuffer_initialisieren
|
|
AN Dyn.Status.Leer_Check_aktiv
|
|
S Dyn.Status.Leer_Check_aktiv
|
|
JCN Check // Negierter Sprung
|
|
|
|
L 0 // Zeiten neu aufziehen
|
|
T Dyn.Leer_Zeit
|
|
|
|
SET
|
|
R Dyn.Status.Kein_neuer_Trolley_kommt
|
|
|
|
Check: NOP 0
|
|
// Inilauf, kein Daten aber Trolley ist in Schleuse:
|
|
A Dyn.Status.Leerpuffer_initialisieren
|
|
A B_InSchleuse
|
|
A(
|
|
L Dyn.Anzahl_LeerTrolleys
|
|
L 0
|
|
==I
|
|
)
|
|
AN Dyn.Status.Einen_LeerTrolley_ausfahren
|
|
S Dyn.Status.Einen_LeerTrolley_ausfahren // Trolley zwingend ausfahren
|
|
|
|
// Abbruch, da Trolley ist doch noch in Schleuse gefahren:
|
|
A Dyn.Status.Leerpuffer_initialisieren
|
|
A B_InSchleuse
|
|
A(
|
|
L Dyn.Anzahl_LeerTrolleys // Anzahl wurde eingetragen
|
|
L 0
|
|
>I
|
|
O Dyn.Status.Trolley_nicht_in_Schleuse
|
|
)
|
|
R Dyn.Status.Leerpuffer_initialisieren
|
|
R Dyn.Status.Trolley_nicht_in_Schleuse
|
|
R Dyn.Status.Leer_Check_aktiv
|
|
|
|
AN Dyn.Status.Leer_Check_aktiv
|
|
JC Xn12
|
|
|
|
// Trolley während Check erkannt:
|
|
AN Dyn.Status.Kein_neuer_Trolley_kommt // nichts mehr eingefahren,
|
|
JC Xn12
|
|
|
|
// Aber:
|
|
A "Schleuse_geöffnet" // aber Schleuse noch geöffnet
|
|
O B_InSchleuse // aber Trolley noch in Schleuse
|
|
JCN Fertig // Negierter Sprung
|
|
|
|
L 0 // Zeit neu aufziehen
|
|
T Dyn.Leer_Zeit
|
|
|
|
SET
|
|
R Dyn.Status.Kein_neuer_Trolley_kommt
|
|
|
|
JU Xn12
|
|
|
|
Fertig: SET
|
|
R Dyn.Status.Leer_Check_aktiv
|
|
R Dyn.Status.Trolley_nicht_in_Schleuse
|
|
|
|
A Dyn.Status.Leerpuffer_initialisieren
|
|
R Dyn.Status.Leerpuffer_initialisieren
|
|
JCN Reset // Negierter Sprung
|
|
|
|
L 0
|
|
T Dyn.Anzahl_LeerTrolleys // Minimum übergeben
|
|
|
|
JU Xn12 // Nicht mehr wegen Gefahr der Überfüllung, besser Reservierungen checken
|
|
|
|
// Reservierungs-Liste löschen:
|
|
L Puffer.Puffer_Dyn_DW
|
|
L Puffer.PufferReservierungsliste_DW
|
|
+I
|
|
T SSDW
|
|
|
|
CALL FC "DatenReset" (SSDB:=Puffer.Puffer_Dyn_DB, SSDW:=SSDW, RE_VAL:="MB198")
|
|
|
|
JU Reset
|
|
|
|
Xn12: NOP 0
|
|
|
|
|
|
--- NW 15: Reset aktiv ---
|
|
JU En14
|
|
|
|
Reset: SET
|
|
R Dyn.HMI.LeerPuffer_initialisieren // Button-Anzeige wieder normal
|
|
R Dyn.Status.Trolley_nicht_in_Schleuse
|
|
R Dyn.Status.Puffer_nicht_leer
|
|
R Status2.Eintrag_DL_Leerliste_erfolgt
|
|
R Status2.Eintrag_DL_Reinliste_erfolgt
|
|
R Status2.Eintrag_Abrufliste_erfolgt
|
|
R Dyn.Error.Err_Raus_Sensor
|
|
|
|
L 0
|
|
T Dyn.Leer_Zeit
|
|
T Puffer.LeerPuffer_Nr // Nummer des Leerpuffers (damit Leerpufferdaten neu geholt werden!)
|
|
|
|
En14: NOP 0
|
|
|
|
|
|
--- NW 16: Puffer hat Platz / ist frei / Einlagern aktiv ---
|
|
// Puffer hat Platz:
|
|
L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege
|
|
L Dyn.Anzahl_LeerTrolleys
|
|
+I
|
|
T GesamtAnzahl
|
|
L Puffer.MaxAnzahl_LeerPuffer
|
|
<I
|
|
AN Dyn.Error.Err_Stau_Einfahrt
|
|
AN Dyn.Error.Err_Leerpuffer_nicht_leer
|
|
AN Dyn.Error.Err_Trolley_nicht_in_Schleuse
|
|
AN Dyn.Status.Leerpuffer_initialisieren
|
|
AN Dyn.Status.Leer_Check_aktiv
|
|
AN Dyn.Status.Reset_aktiv
|
|
= Dyn.Status."Puffer_hat Platz"
|
|
|
|
CAC
|
|
L 0 // Trolley im Puffer ?
|
|
==I // Nein!
|
|
A Dyn.Status."Puffer_hat Platz"
|
|
A Dyn.Status.Kein_neuer_Trolley_kommt
|
|
AN B_InSchleuse
|
|
= Dyn.Status.Puffer_leer
|
|
R Status2.Einlagern_ist_aktiv
|
|
R Status2.Auslagern_ist_aktiv
|
|
|
|
// Einlagern ist aktiv:
|
|
L GesamtAnzahl
|
|
L 0
|
|
>I
|
|
A Dyn.Status."Puffer_hat Platz"
|
|
AN Status2.Auslagern_ist_aktiv
|
|
S Status2.Einlagern_ist_aktiv
|
|
|
|
A Status2.Auslagern_ist_aktiv // Wegen FIFO
|
|
O Dyn.HMI.Einlagern_gesperrt
|
|
R Status2.Einlagern_ist_aktiv
|
|
|
|
|
|
--- NW 17: Starten aus Leerpuffer aufgrund von Ausfahrsituation ok ---
|
|
L Puffer.Puffer_Position_Inks
|
|
L 0 // Undefiniert ?
|
|
==I // Ja!
|
|
JC X14E
|
|
|
|
L Ausfahr_Inks // Trolles auf Förderer vorbei?
|
|
L 0 // Undefiniert ?
|
|
==I // Ja!
|
|
JC X14E
|
|
|
|
L Puffer.Puffer_Position_Inks
|
|
L 20 // damit vorbeifahrender Trolley größeren Abstand bekommt
|
|
-I
|
|
L Ausfahr_Inks // Trolleys auf Förderer vorbei?
|
|
>I // Ja!
|
|
O(
|
|
L 1 // Minimalwert ?
|
|
==I // Ja !
|
|
)
|
|
= Inks_Ok
|
|
|
|
X14E: NOP 0
|
|
|
|
|
|
--- NW 18: DLPuffer_leer: Ein-/Austrag ---
|
|
AN Dyn.Status.Puffer_leer // Kann mit neuen Leertrolleys bestückt werden!
|
|
O Dyn.HMI.Einlagern_gesperrt
|
|
O Dyn.Status.Leerpuffer_initialisieren
|
|
JC Austrag_Leerliste
|
|
|
|
// Eintrag aus Leerliste:
|
|
L LeerPuffer_Nr
|
|
T "MW220" // Puffer, der leer ist
|
|
|
|
CALL FC "DatenIn" (SSDB:=500, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen
|
|
|
|
AN "M219.6" // Daten wurden überschrieben
|
|
AN "M219.7" // Eintrag ist richtig erfolgt
|
|
JC NoChange_Leerliste
|
|
|
|
SET
|
|
S Status2.Eintrag_DL_Leerliste_erfolgt
|
|
|
|
JU NoChange_Leerliste
|
|
|
|
Austrag_Leerliste: NOP 0
|
|
// Austrag aus Leerliste:
|
|
L LeerPuffer_Nr
|
|
T "MW220" // Puffer, der leer ist
|
|
|
|
CALL FC "DatenOut" (SSDB:=500, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen
|
|
|
|
SET
|
|
R Status2.Eintrag_DL_Leerliste_erfolgt
|
|
|
|
NoChange_Leerliste: NOP 0
|
|
|
|
|
|
--- NW 19: DLPuffer_einfahren: Ein-/Austrag ---
|
|
AN Dyn.Status."Puffer_hat Platz" // Puffer hat kein Platz mehr
|
|
ON Status2.Einlagern_ist_aktiv
|
|
O Dyn.HMI.Einlagern_gesperrt
|
|
O Dyn.Status.Leerpuffer_initialisieren
|
|
R Status2.Einlagern_ist_aktiv
|
|
JC Austrag_Reinliste
|
|
|
|
// Eintrag in Reinliste:
|
|
A(
|
|
L Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege
|
|
L 0 // Reservierung schon erfolgt ?
|
|
>I // Ja!
|
|
O Status2.Einlagern_ist_aktiv
|
|
)
|
|
JCN NoChange_Reinliste // Negierter Sprung
|
|
|
|
L LeerPuffer_Nr // angefahrener Puffer
|
|
T "MW220"
|
|
|
|
CALL FC "DatenIn" (SSDB:=501, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen
|
|
|
|
AN "M219.6" // Daten wurden überschrieben
|
|
AN "M219.7" // Eintrag ist richtig erfolgt
|
|
JC NoChange_Reinliste
|
|
|
|
SET
|
|
S Status2.Eintrag_DL_Reinliste_erfolgt
|
|
|
|
JU NoChange_Reinliste
|
|
|
|
Austrag_Reinliste: NOP 0
|
|
// Austrag aus Reinliste:
|
|
L LeerPuffer_Nr
|
|
T "MW220"
|
|
|
|
CALL FC "DatenOut" (SSDB:=501, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen
|
|
|
|
SET
|
|
R Status2.Eintrag_DL_Reinliste_erfolgt
|
|
|
|
NoChange_Reinliste: NOP 0
|
|
|
|
|
|
--- NW 20: DLPuffer_ausfahren: Ein-/Austrag ---
|
|
A Dyn.Status.Puffer_leer // Kann mit neuen Leertrolleys bestückt werden!
|
|
AN Dyn.Error.Err_Leerpuffer_nicht_leer // Damit Trolley ausgefahren werden kann!
|
|
O Dyn.HMI.AusLagern_gesperrt
|
|
R Dyn.Status.Einen_LeerTrolley_ausfahren
|
|
JC Austrag_Abrufliste
|
|
|
|
// Eintrag aus Abrufliste:
|
|
A B_InSchleuse // Sobald Trolley in Ausfahrschleuse
|
|
JCN NoChange_Abrufliste // Negierter Sprung
|
|
|
|
L LeerPuffer_Nr // angefahrener Puffer
|
|
T "MW220"
|
|
|
|
CALL FC "DatenIn" (SSDB:=502, SSDW:=0, INDATEN:=P#M220.0, RE_VAL:="MB219") // Anforderung in Datenliste eintragen
|
|
|
|
AN "M219.6" // Daten wurden überschrieben
|
|
AN "M219.7" // Eintrag ist richtig erfolgt
|
|
JC NoChange_Abrufliste
|
|
|
|
SET
|
|
S Status2.Eintrag_Abrufliste_erfolgt
|
|
|
|
JU NoChange_Abrufliste
|
|
|
|
Austrag_Abrufliste: NOP 0
|
|
// Austrag aus Abrufliste:
|
|
Austrag: L LeerPuffer_Nr // angefahrener Puffer
|
|
T "MW220"
|
|
|
|
CALL FC "DatenOut" (SSDB:=502, SSDW:=0, PARA:=WORD#16#E100, SEARCHDATEN:=P#M220.0, RE_VAL:="MB219", OUTDATEN:=P#M230.0, Position:="MW196") // Anforderung aus Datenliste löschen
|
|
|
|
SET
|
|
R Status2.Eintrag_Abrufliste_erfolgt
|
|
|
|
NoChange_Abrufliste: NOP 0
|
|
|
|
|
|
--- NW 21: Schrittkette anhalten ---
|
|
A Dyn.Sk.Auto_akt // Automatik ist aktiv
|
|
A Dyn.Sk.Bereich_ok
|
|
JU en08_Mig // Schrittkette nicht anhalten !
|
|
|
|
SET // Störungen löschen
|
|
R Dyn.Sk.Err_Uebzeit
|
|
R Dyn.Sk.Err_Schritt
|
|
|
|
L 0 // Zeitwerte löschen
|
|
T Dyn.Sk.Terr_Zelle
|
|
T Dyn.Sk.Tok_Zelle
|
|
|
|
BEU
|
|
|
|
en08_Mig: NOP 0
|
|
|
|
|
|
--- NW 22: Sprungverteiler ---
|
|
OUT_Sk: 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 Ueb_akt // Überwachungszeit aktivieren
|
|
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#A231
|
|
T Dyn.Stop_Ursache
|
|
|
|
BEU
|
|
|
|
Neu_Mig: A Dyn.Sk.Err_Uebzeit
|
|
JCN Sk
|
|
|
|
L 16#A232
|
|
T Dyn.Stop_Ursache
|
|
|
|
BEU
|
|
|
|
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: JU Ende
|
|
s010: JU Ende
|
|
s011: JU Ende
|
|
s012: JU Ende
|
|
s013: JU Ende
|
|
s014: JU Ende
|
|
s015: JU Ende
|
|
s016: JU Ende
|
|
s017: JU 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 23: Schritt X: Reserve ---
|
|
SET // Weiterschaltbedingung
|
|
= Weiter
|
|
|
|
// Schrittaktionen:
|
|
SET
|
|
|
|
L 16#B001
|
|
T Dyn.Stop_Ursache
|
|
|
|
A Dyn.Sk.Reset_Akt // Reset ist aktiv
|
|
L 20 // Weiter mit Schritt 20
|
|
JC Neu_Mig // Bei diesem Schritt weiter
|
|
|
|
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
|
|
|
|
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
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
|
|
|
|
BEU
|
|
|
|
|
|
--- NW 24: 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
|
|
|
|
// Schrittaktionen:
|
|
SET
|
|
R Dyn.Error.Err_Leerpuffer_nicht_leer
|
|
|
|
A Dyn.Sk.Reset_Akt // Reset ist aktiv
|
|
L 20 // Weiter mit Schritt 20
|
|
JC Neu_Mig // Bei diesem Schritt weiter
|
|
|
|
A Weiter // Weiterschaltbedingung ist erfüllt
|
|
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
|
|
L 100 // Angabe der Wartezeit (*10ms)
|
|
JC Plus // Nächsten Schritt starten
|
|
|
|
L 16#B001
|
|
T Dyn.Stop_Ursache
|
|
|
|
// Trolley soll gestartet werden:
|
|
A Dyn.Status.Einen_LeerTrolley_ausfahren // Von FB5429/2
|
|
A(
|
|
A Dyn.Sk.Err_Uebzeit
|
|
AN B_InSchleuse // Trolley im Schleuse erkannt
|
|
O Dyn.Status.Leerpuffer_initialisieren // Damit Einfahren blockiert wird
|
|
)
|
|
R Dyn.Status.Einen_LeerTrolley_ausfahren // Von FB5429/2
|
|
JCN ÜbStart
|
|
|
|
L "DLP_Auslagern".Auslagern.Auslager_Puffer
|
|
L LeerPuffer_Nr
|
|
<>I
|
|
JC ENDE_Mig
|
|
|
|
L 0
|
|
T "DLP_Auslagern".Auslagern.Auslager_Puffer
|
|
|
|
JU Austrag // Puffer aus Ausfahr-Liste löschen
|
|
|
|
// Überwachungszeit starten:
|
|
ÜbStart: AN B_InSchleuse // Trolley im Schleuse erkannt
|
|
A Dyn.Status.Einen_LeerTrolley_ausfahren // Von FB5429/2
|
|
= Ueb_akt // Überwachungszeit aktivieren
|
|
|
|
// Trolley kommt nicht!:
|
|
L Dyn.Anzahl_LeerTrolleys
|
|
L 0 // Trolleydaten vorhanden ?
|
|
>I // Ja !
|
|
A Dyn.Sk.Err_Uebzeit
|
|
AN B_InSchleuse // Trolley im Schleuse erkannt
|
|
AN Dyn.Status.Trolley_nicht_in_Schleuse
|
|
S Dyn.Status.Trolley_nicht_in_Schleuse
|
|
S Dyn.Status.Leerpuffer_initialisieren // Damit Einfahren blockiert wird
|
|
|
|
L 15 // 15s
|
|
A Dyn.Status.Einen_LeerTrolley_ausfahren // Bei Ausfahrwunsch -> Kurze Zeit
|
|
JC tueb // Überwachungszeit
|
|
|
|
L Puffer."Übzeit_in_Schleuse"
|
|
|
|
JU tueb // Überwachungszeit
|
|
|
|
|
|
--- NW 25: Schritt 1: Trolley ist in Schleuse / Warten auf Bit "Einen Trolley ausfahren" ---
|
|
s001: NOP 0
|
|
|
|
// Schrittaktionen:
|
|
AN B_InSchleuse // Trolley im Schleuse erkannt
|
|
L 0 // Weiter mit Schritt 0
|
|
JC Neu_Mig // Bei diesem Schritt weiter
|
|
|
|
SET
|
|
R Dyn.Error.Err_Trolley_nicht_in_Schleuse
|
|
|
|
// Puffer leer ?:
|
|
A Dyn.Status.Puffer_leer
|
|
AN Dyn.Status.Puffer_nicht_leer
|
|
S Dyn.Status.Puffer_nicht_leer
|
|
S Dyn.Status.Leerpuffer_initialisieren // Damit Einfahren blockiert wird
|
|
|
|
// Spezial-Betriebsarten:
|
|
A Dyn.Status.Einen_LeerTrolley_ausfahren
|
|
L 2 // Weiter mit Schritt 2
|
|
JC Neu_Mig // Bei diesem Schritt weiter
|
|
|
|
L 16#B011
|
|
T Dyn.Stop_Ursache
|
|
|
|
BEU
|
|
|
|
|
|
--- NW 26: Schritt 2: Ausfahren ok ? ---
|
|
s002: NOP 0
|
|
|
|
// Schrittaktionen:
|
|
AN B_InSchleuse // Trolley im Schleuse erkannt
|
|
L 0 // Weiter mit Schritt 0
|
|
JC Neu_Mig // Bei diesem Schritt weiter
|
|
|
|
SET
|
|
S Dyn.Status."Trolley_wartet_Bereich+1"
|
|
|
|
// Anlage aus oder Störung:
|
|
L 16#B020
|
|
T Dyn.Stop_Ursache
|
|
|
|
AN Dyn.Sk.Auto_akt // Automatik ist aktiv
|
|
ON Dyn.Sk.Bereich_ok // Bereich ist gestört
|
|
JC X002
|
|
|
|
// Trolley starten erlaubt ?:
|
|
L 16#B021
|
|
T Dyn.Stop_Ursache
|
|
|
|
AN Start_Ok // Starten ist erlaubt
|
|
JC X002
|
|
|
|
// Stau im Bereich +1:
|
|
L 16#B022
|
|
T Dyn.Stop_Ursache
|
|
|
|
A B_Stau_raus_Out
|
|
JC X002 // Stau
|
|
|
|
// B_Aus_Schleuse aktiv:
|
|
L 16#B023
|
|
T Dyn.Stop_Ursache
|
|
|
|
A Puffer.Parameter_allg.B_AusSep_vorhanden
|
|
A B_AusSchleuse
|
|
= Dyn.Error.Err_Raus_Sensor // Raus-Sensor wird nicht erreicht (oder dauernd aktiv)!
|
|
JC X002
|
|
|
|
// Inks ok ?:
|
|
L 16#B024
|
|
T Dyn.Stop_Ursache
|
|
|
|
SET
|
|
S Antrieb_plus_vor
|
|
|
|
AN Inks_Ok // Starten ist erlaubt
|
|
JC X002
|
|
|
|
// Antriebe aktivieren / aktiv ?:
|
|
A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche)
|
|
S Antrieb_plus_vor // Kreisel-Antrieb plus starten
|
|
|
|
L 16#B025
|
|
T Dyn.Stop_Ursache
|
|
|
|
AN Antrieb_plus_aktiv // Kreisel-Antrieb plus aktiv
|
|
A Puffer.Parameter_allg.Antrieb_Plus_vorhanden // Schleuse an weiterem Antrieb (Weiche)
|
|
BEC
|
|
|
|
L 5 // Nur 1 langes Signal!
|
|
JU Neu_Mig // Bei diesem Schritt weiter
|
|
|
|
X002: L 1 // Auftrag checken
|
|
T Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
BEU
|
|
|
|
|
|
--- NW 27: Schritt 5: Trolley fährt aus/ausgefahren ? ---
|
|
s005: SET // Weiterschaltbedingung
|
|
AN B_InSchleuse // Sensor Trolley ist in Schleuse
|
|
A "Schleuse_geöffnet"
|
|
A Antrieb_plus_aktiv
|
|
= Weiter
|
|
|
|
// Schrittaktionen:
|
|
SET
|
|
S Y_Schleuse_Auf // Schleuse öffnen
|
|
R Start_Ok // Damit kein weiterer Puffer ausfährt
|
|
S Dyn.Status."Trolley_fährt_aus"
|
|
S Antrieb_plus_vor // Kreisel-Antrieb plus starten
|
|
S Status2.Auslagern_ist_aktiv
|
|
|
|
// Trolley ist draussen:
|
|
A(
|
|
O B_AusSchleuse // Sensor Trolley aus Schleuse gefahren
|
|
ON Puffer.Parameter_allg.B_AusSep_vorhanden
|
|
)
|
|
AN B_InSchleuse // Sensor Trolley ist in Schleuse
|
|
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
|
|
L 0
|
|
JC Plus // Nächsten Schritt starten
|
|
|
|
A Weiter // Weiterschaltbedingung ist erfüllt
|
|
R Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
|
|
L 50 // Falls nur mit Sensor gefahren wird, dann Wartezeit!
|
|
JC Plus // Nächsten Schritt starten
|
|
|
|
// Trolley fährt nicht raus!:
|
|
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 0
|
|
JC Plus // Nächsten Schritt starten
|
|
|
|
A Dyn.Sk.Err_Uebzeit
|
|
O B_QuerTrolley_Out // QuerTrolley auf Crashkurs
|
|
S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
|
|
|
|
L 16#B051
|
|
T Dyn.Stop_Ursache
|
|
|
|
AN B_AusSchleuse // Sensor Trolley aus Schleuse gefahren
|
|
JC x052
|
|
|
|
L 16#B052
|
|
T Dyn.Stop_Ursache
|
|
|
|
x052: A Antrieb_plus_aktiv
|
|
= Ueb_akt // Überwachungszeit aktivieren
|
|
L Puffer."Übzeit_aus_Schleuse" // Angabe der Überwachungszeit (*1s)
|
|
JU tueb // Überwachungszeit
|
|
|
|
|
|
--- NW 28: Schritt 6: Schleuse Mindestzeit geöffnet ? ---
|
|
s006: SET // Weiterschaltbedingung
|
|
A Dyn.Status.MindestZeit_ok
|
|
O
|
|
A Puffer.Parameter_allg.B_AusSep_vorhanden
|
|
A B_AusSchleuse // Sensor Trolley aus Schleuse gefahren
|
|
= Weiter
|
|
|
|
// Schrittaktionen:
|
|
A B_QuerTrolley_Out // QuerTrolley auf Crashkurs
|
|
S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
|
|
|
|
SET
|
|
R Start_Ok // Damit kein weiterer Puffer ausfährt
|
|
S Y_Schleuse_Auf // Schleuse öffnen
|
|
S Antrieb_plus_vor // Kreisel-Antrieb plus starten
|
|
S Dyn.Status."Trolley_fährt_aus"
|
|
|
|
A B_InSchleuse // Trolley wieder erkannt
|
|
L 5 // Weiter mit Schritt 5
|
|
JC Neu_Mig // Bei diesem Schritt weiter
|
|
|
|
A Weiter
|
|
L 0
|
|
JC Plus // Nächsten Schritt starten
|
|
|
|
L 16#B061
|
|
T Dyn.Stop_Ursache
|
|
|
|
BEU
|
|
|
|
--- NW 29: Schritt 7: Trolleydaten ändern ---
|
|
s007: SET // Weiterschaltbedingung
|
|
= Weiter
|
|
|
|
// Schrittaktionen:
|
|
SET
|
|
S Dyn.Status.Trolley_draussen // 1 Zyklus
|
|
R Dyn.Status.Einen_LeerTrolley_ausfahren
|
|
|
|
L Dyn.Vereinzelungstakte
|
|
+ DINT#1 // Vereinzelungen +1
|
|
T Dyn.Vereinzelungstakte
|
|
|
|
L Dyn.Anzahl_LeerTrolleys
|
|
+ -1
|
|
T Dyn.Anzahl_LeerTrolleys
|
|
|
|
L 0 // sinnvoller Wert?
|
|
>I // Ja!
|
|
JC ENDE_Mig
|
|
|
|
T Dyn.Anzahl_LeerTrolleys // Minimum übergeben
|
|
|
|
JU ENDE_Mig
|
|
|
|
|
|
--- NW 30: Schritt 20: Schleuse resetten ---
|
|
s020: SET // Weiterschaltbedingung
|
|
= Weiter // Weiterschaltbedingung ist erfüllt
|
|
|
|
// Schrittaktionen:
|
|
A "Schleuse_geöffnet"
|
|
R Start_Ok // Damit kein weiterer Puffer ausfährt
|
|
|
|
L 16#B201
|
|
T Dyn.Stop_Ursache
|
|
|
|
A Weiter // Weiterschaltbedingung ist erfüllt
|
|
L 300 // Angabe der Wartezeit (*10ms)
|
|
JC Plus // Nächsten Schritt starten
|
|
|
|
SET
|
|
= Ueb_akt // Überwachungszeit aktivieren
|
|
L 30 // Angabe der Überwachungszeit (*100ms)
|
|
JU tueb // Überwachungszeit
|
|
|
|
|
|
--- NW 31: Schritt 21: Reset ist zu Ende ---
|
|
s021: SET
|
|
R Dyn.Sk.Reset_Akt // Reset ist aktiv
|
|
R Dyn.HMI.Schleuse_resetten_Leerpuffer
|
|
R Dyn.Status.Einen_LeerTrolley_ausfahren
|
|
|
|
JU ENDE_Mig // Neubeginn
|
|
|
|
|
|
--- NW 32: 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
|
|
|
|
SET
|
|
R Dyn.Sk.Err_Uebzeit
|
|
|
|
BEU
|
|
|
|
|
|
--- NW 33: Nächsten Schritt aktivieren ---
|
|
Plus: T Dyn.Sk.T_ok // Wartezeit übergeben
|
|
|
|
A Dyn.Sk.Err_Uebzeit // Störung noch nicht quittiert
|
|
BEC
|
|
|
|
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
|
|
BEC
|
|
|
|
L Dyn.Sk.Tok_Zelle
|
|
L "MW4" // Wartezeit +10ms
|
|
+I
|
|
T Dyn.Sk.Tok_Zelle // Wartezeit
|
|
L Dyn.Sk.T_ok // abgelaufen ?
|
|
<I // Nein !
|
|
BEC
|
|
|
|
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
|
|
|
|
BEU
|
|
|
|
|
|
--- NW 34: Ü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
|
|
|
|
BEU
|
|
|
|
en24: NOP 0
|
|
|
|
--- NW 35: Überwachungszeit +1 ---
|
|
AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv
|
|
ON "1s-Impuls"
|
|
BEC
|
|
|
|
L Dyn.Sk.Terr_Zelle
|
|
+ 1 // Üb.zeit +1s
|
|
T Dyn.Sk.Terr_Zelle
|
|
|
|
BEU
|
|
|
|
|
|
--- NW 36: Ende ---
|
|
BE
|
|
|