2695 lines
96 KiB
Plaintext
2695 lines
96 KiB
Plaintext
FUNCTION_BLOCK "MHMVollpuffer"
|
|
TITLE = Omni H&M-Vollpuffer-Modul
|
|
{ S7_Optimized_Access := 'FALSE' }
|
|
AUTHOR : AE
|
|
VERSION : 0.1
|
|
//COPYRIGHT by Ingenieurbüro A.Emmert
|
|
//Ortsstr.33, D-869925 Fuchstal (Germany)
|
|
//Tel.: 0049(0)8243-960629
|
|
//
|
|
//Version: H&M Vollpuffer / 10.2025
|
|
//
|
|
//Version: Omniflow 2100 / 10.2024
|
|
//
|
|
//Schritt 0: Warten auf Trolley
|
|
//Schritt 1: Betriebsart ok/angegeben?
|
|
//Schritt 5: Mit Scanner fahren: Defaultziel ?
|
|
//Schritt 6: Scanner triggern
|
|
//Schritt 7: "DREQ" an PC senden
|
|
//Schritt 8: Warten auf PC-Antwort
|
|
//Schritt 9: PC-Antwort auswerten
|
|
//Schritt 10: Fahrtrichtung ermitteln
|
|
//Schritt 11: Ausfahren ok ?
|
|
//Schritt 12: Warten auf Pin-Signal
|
|
//Schritt 13: Weichenbereich raus bereit ?
|
|
//Schritt 14: Daten an Rausweiche übergeben
|
|
//Schritt 15: Schleuse Mindestzeit öffnen
|
|
//Schritt 16: Trolley ausgefahren ?
|
|
//Schritt 17: Trolley ist draussen
|
|
//Schritt 18: BM wurde vereinzelt
|
|
//Schritt 19: Beladezustand checken
|
|
//Schritt 20: Schleuse resetten
|
|
//Schritt 21: Reset ist zu Ende
|
|
//
|
|
VAR_INPUT
|
|
VollPuffer_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Voll-Puffer
|
|
ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren
|
|
B_VollPufferEinfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in VollPuffer
|
|
B_InSchleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse oben
|
|
B_InSchleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley ist in Schleuse unten
|
|
B_AusSchleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley hat Schleuse unten verlassen
|
|
B_Stau_raus_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich unten rausfahren
|
|
B_QuerTrolley_Out : Bool; // Crash-Trolley auf Crashkurs erkannt
|
|
Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Kreisel-Antrieb plus aktiv
|
|
Schleuse_geöffnet_IN : Bool; // Schleuse oben hat geöffnet
|
|
Schleuse_geöffnet_OUT : Bool; // Schleuse unten hat geöffnet
|
|
END_VAR
|
|
|
|
VAR_OUTPUT
|
|
Y_Schleuse_Auf_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse oben öffnen
|
|
Y_Schleuse_Auf_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse unten öffnen
|
|
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben
|
|
END_VAR
|
|
|
|
VAR_IN_OUT
|
|
Start_Ok : Bool; // Starten von ausserhalb ist erlaubt
|
|
Antrieb_plus_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus starten
|
|
Antrieb_plus_stoppen : Bool; // Antrieb plus stoppen
|
|
hStOk : Bool; // Anzeige Start n. Störung aktivieren
|
|
Ausfahr_Inks : Int; // Rest-Inks, wo sich Trolley befindet
|
|
END_VAR
|
|
|
|
VAR
|
|
Res16 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve
|
|
SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
Weichen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DB
|
|
Weichen_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Weichen-FIFO-DW
|
|
END_STRUCT;
|
|
Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter
|
|
VollPuffer_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung VollPuffer-Datenliste-DB
|
|
VollPuffer_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung VollPuffer-Datenliste-DW
|
|
Res1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve
|
|
END_STRUCT;
|
|
Status2 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
Puffer_leer_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben ist leer
|
|
"Puffer_hat Platz_IN" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben hat noch Kapazität
|
|
Kein_neuer_Trolley_kommt_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben zeitlang ohne neuen Trolley
|
|
Leer_Check_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer oben wird auf leer gecheckt
|
|
Reset_aktiv_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset oben aktiv
|
|
Trolley_nicht_in_Schleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley oben fährt nicht in Schleuse > Inilauf gestartet
|
|
Puffer_nicht_leer_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben nicht leer > Inilauf gestartet
|
|
Puffer_initialisieren_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer oben initialisieren
|
|
MindestZeit_ok_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet
|
|
Frei11 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
Frei12 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
Frei13 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
Alles_ausfahren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Alle Trolleys ausfahren
|
|
Eintrag_DL_Leerliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_leer (DB100) erfolgt
|
|
Eintrag_DL_Reinliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_ShopGroup rein (DB101) erfolgt
|
|
Eintrag_DL_Abrufliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLVPPuffer_ShopGroup raus (DB901) erfolgt
|
|
END_STRUCT;
|
|
Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDLHMVollPuffer"; // Statische VollPufferdaten (aus DL)
|
|
Dyn : Struct // Dynamische Daten
|
|
Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
Puffer_leer_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben ist leer
|
|
"Puffer_hat Platz_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer oben hat noch Kapazität
|
|
Kein_neuer_Trolley_kommt_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer unten zeitlang ohne neuen Trolley
|
|
Leer_Check_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer unten wird auf leer gecheckt
|
|
Reset_aktiv_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset unten aktiv
|
|
Trolley_nicht_in_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley unten fährt nicht in Schleuse > Inilauf gestartet
|
|
Puffer_nicht_leer_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer unten nicht leer > Inilauf gestartet
|
|
Puffer_initialisieren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // VollPuffer unten initialisieren
|
|
MindestZeit_ok_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet
|
|
"Undef.Trolley_in_Schleuse_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Undefinierter Trolley in Schleuse unten erkannt
|
|
Trolley_wartet_Auftrag { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Auftrag (unten)
|
|
"Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1 (unten)
|
|
Einen_VollTrolley_ausfahren_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Einen Voll-Trolley ausfahren
|
|
Trolley_fährt_aus_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus (unten)
|
|
Trolley_draussen_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren
|
|
Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden
|
|
END_STRUCT;
|
|
TrolleyID_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr ist eingefahren
|
|
TrolleyID_Schleuse_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse oben (Daten)
|
|
TrolleyID_Schleuse_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse unten (Daten)
|
|
ShopGroup_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Diese Shopgruppe ist im oberen VollPuffer
|
|
ShopGroup_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Diese Shopgruppe ist im unteren VollPuffer
|
|
ShopGroup_Auftrag_zum_Ausfahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // ShopGroup zum Ausfahren (FFFF = akt.Trolley ausfahren)
|
|
HMI : Struct
|
|
ShopGroup_IN { ExternalWritable := 'False'} : Int; // ShopGroup im VollPuffer oben (IN:PLC, OUT:PLC)
|
|
ShopGroup_OUT { ExternalWritable := 'False'} : Int; // ShopGroup im VollPuffer unten (IN:PLC, OUT:PLC)
|
|
Voll_Trolleys_IN { ExternalWritable := 'False'} : Int; // Anzahl Trolleys oben (IN:PLC, OUT:PLC)
|
|
Voll_Trolleys_OUT { ExternalWritable := 'False'} : Int; // Anzahl Trolleys unten (IN:PLC, OUT:PLC)
|
|
Res_Trolleys_IN { ExternalWritable := 'False'} : Int; // Anzahl reservierte Trolleys oben (IN:PLC, OUT:PLC)
|
|
Frei_Plätze_IN { ExternalWritable := 'False'} : Int; // Freiplätze für Trolleys (IN:PLC, OUT:PLC)
|
|
TrolleyID_Schleuse_IN { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse oben (IN:PLC, OUT:PLC)
|
|
TrolleyID_Schleuse_OUT { ExternalWritable := 'False'} : DInt; // Trolley-Nr in Schleuse unten (IN:PLC, OUT:PLC)
|
|
Schleuse_resetten_IN : Bool; // Schleuse resetten oben (IN:HMI, Out:PLC)
|
|
Schleuse_resetten_OUT : Bool; // Schleuse resetten unten (IN:HMI, Out:PLC)
|
|
Puffer_initialisieren : Bool := 1; // VollPuffer initialisieren (IN:HMI, Out:PLC)
|
|
Einlagern_gesperrt : Bool; // Einlagern gesperrt (IN:HMI, OUT:HMI)
|
|
AusLagern_gesperrt : Bool; // AusLagern gesperrt (IN:HMI, OUT:HMI)
|
|
END_STRUCT;
|
|
Sk_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_Omni" := ((), (), (), (), (), (), (), (), (), (), 1, (), (), (), (), (), ()); // Status der Schrittkette Schleuse IN (oben)
|
|
Sk_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_Omni" := ((), (), (), (), (), (), (), (), (), (), 1, (), (), (), (), (), ()); // Status der Schrittkette Schleuse OUT (unten)
|
|
TrolleyID_doppelt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID doppelt (eingefahrener Trolley)
|
|
TrolleyID_unbekannt_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (eingefahrener Trolley)
|
|
TrolleyID_unbekannt_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'True'} : DInt; // TrolleyID unbekannt (Trolley in Schleuse unten)
|
|
Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
RET_VAL_BLKMOV_VollPuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf
|
|
RET_VAL_DL_VollPuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
|
|
RET_VAL_DL_Res_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
|
|
RET_VAL_DL_VollPufferTrolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenIN-Aufruf
|
|
RET_VAL_DL_VollPufferTrolley_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
|
|
END_STRUCT;
|
|
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UErrHMVollpuffer";
|
|
Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_Einfahrt ist belegt [1s]
|
|
Mindest_Zeit_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_in_Schleuse oben ist frei [1s]
|
|
Mindest_Zeit_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_in_Schleuse unten ist frei [1s]
|
|
Leer_Zeit_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Puffer oben ist frei [1s]
|
|
Leer_Zeit_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Puffer unten ist frei [1s]
|
|
Stop_Ursache_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position
|
|
Stop_Ursache_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position
|
|
Vereinzelungstakte_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte
|
|
TrolleyID_ausgefahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // TrolleyID des ausgefahrenen Trolleys
|
|
ShopGroup_EFL_Gespeichert : DInt; // In EinfahrListe gespeicherte ShopGroup
|
|
ShopGroup_AFL_Gespeichert : DInt; // In AusfahrListe gespeicherte ShopGroup
|
|
Reservierungs_DL { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW200: Liste der resevierter Trolleys
|
|
Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
|
|
LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze)
|
|
STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9)
|
|
INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
|
|
INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs
|
|
Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste
|
|
AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
|
|
Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve
|
|
END_STRUCT;
|
|
Res_Trolley { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Reservierter Trolley für VollPuffer
|
|
Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID
|
|
ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Shop-Gruppe auf Trolley
|
|
END_STRUCT;
|
|
Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE)
|
|
END_STRUCT;
|
|
Res350 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int;
|
|
Trolley_DL_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im VollPuffer
|
|
Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
|
|
LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze)
|
|
STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9)
|
|
INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
|
|
INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs
|
|
Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste
|
|
AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
|
|
Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve
|
|
END_STRUCT;
|
|
VollPuffer_Trolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Trolley im VollPuffer
|
|
Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID
|
|
Abruf_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Reserviert für Ausfahrt
|
|
END_STRUCT;
|
|
Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE)
|
|
END_STRUCT;
|
|
Res500 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..16] of Int;
|
|
Trolley_DL_Ausfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im VollPuffer
|
|
Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA04; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
|
|
LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 12; // Länge der Datenliste (maximale Anzahl der Datensätze)
|
|
STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 2; // Stammdatenlänge in Word (1 - 9)
|
|
INDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LAENGEINDDB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
|
|
INDDATEN_WANDEL_FC { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
|
|
LETZTERZUGRIFF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Speicherung des letzten Zugriffs
|
|
Belegt14 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // reserviert von Sort-Datenliste
|
|
AnzahlEintraege { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
|
|
Reserve18 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Reserve
|
|
END_STRUCT;
|
|
VollPuffer_Trolley_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..12] of Struct // Trolley im VollPuffer
|
|
Trolley_ID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley_ID
|
|
Abruf_ShopGroup { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Reserviert für Ausfahrt
|
|
END_STRUCT;
|
|
Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE)
|
|
END_STRUCT;
|
|
Res700 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..41] of Int; // Reserve
|
|
END_STRUCT;
|
|
END_VAR
|
|
|
|
VAR_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
|
|
"1.Trolley_IN" : Bool;
|
|
Neu_Trolley_in_Puffer_IN : Bool; // Neuer Trolley in Puffer eingefahren
|
|
"1.Trolley_OUT" : Bool;
|
|
Inks_Ok : Bool; // Starten aufgrund der Inks erlaubt
|
|
Puffer_IN_ist_leer : Bool; // VollPuffer zeitlang ohne Sensor
|
|
Puffer_OUT_ist_leer : Bool; // VollPuffer zeitlang ohne Sensor
|
|
Abruf_Trolley_vorne : Bool; // Abruf-Trolley ist in Schleuse
|
|
Oberen_Puffer_Freigeben : Bool;
|
|
Oberen_Puffer_nichts_einfahren : Bool;
|
|
Puffer_B : Bool;
|
|
GesamtAnzahl : Int;
|
|
SSDW : Int;
|
|
Schleife : Word; // Loopzähler
|
|
Trolley : Int;
|
|
Position : Int;
|
|
Akive_ShopGroup : DInt;
|
|
EndZiel : Word;
|
|
ZwischenZiel : Word;
|
|
ShopGroup : DInt;
|
|
Standort : Word;
|
|
Error_Check : Bool;
|
|
END_VAR
|
|
|
|
|
|
BEGIN
|
|
NETWORK
|
|
TITLE = Parameter-Übergabe
|
|
L #VollPuffer_Nr;
|
|
|
|
L 275 ;//Einsprung Puffer-DL
|
|
T #Para.VollPuffer_DL_DB;//vor Aufruf übergeben!
|
|
L 0;
|
|
T #Para.VollPuffer_DL_DW;
|
|
|
|
NETWORK
|
|
TITLE = Anzeige OP
|
|
L 252;//Bereichsstop aktiv
|
|
UN #Dyn.Sk_OUT.Bereich_ok;//Also: Bereichsstop / Not-Aus
|
|
SPB w010;
|
|
|
|
L 253;
|
|
UN #Dyn.Sk_OUT.Auto_akt;//Keine Betriebsart
|
|
UN #Dyn.Sk_OUT.Hand_akt;
|
|
SPB w010;
|
|
|
|
L 255;//Handbetrieb aktiv
|
|
U #Dyn.Sk_OUT.Hand_akt;
|
|
SPB w010;
|
|
|
|
L #Dyn.Sk_IN.Akt_Schritt;//Aktiver Schritt
|
|
T #Dyn.Sk_IN.OP_Schritt;
|
|
L #Dyn.Sk_OUT.Akt_Schritt;//Aktiver Schritt
|
|
T #Dyn.Sk_OUT.OP_Schritt;
|
|
|
|
SPA OP_Ok;
|
|
|
|
w010: T #Dyn.Sk_IN.OP_Schritt;
|
|
T #Dyn.Sk_OUT.OP_Schritt;
|
|
|
|
OP_Ok: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Out-Bits zum Zurücksetzen / Antrieb plus starten
|
|
SET;
|
|
R #Y_Schleuse_Auf_IN;
|
|
R #Y_Schleuse_Auf_OUT;
|
|
R #Puffer_IN_ist_leer;
|
|
R #Puffer_OUT_ist_leer;
|
|
|
|
SET ;//Jeden Zyklus neu
|
|
R #Dyn.Status.Trolley_wartet_Auftrag;
|
|
R #Dyn.Status."Trolley_wartet_Bereich+1";
|
|
R #Dyn.Status.Trolley_fährt_aus_OUT;
|
|
R #Dyn.Status.Trolley_draussen_Out;
|
|
R #"1.Trolley_IN";
|
|
R #"1.Trolley_OUT";
|
|
R #Neu_Trolley_in_Puffer_IN;
|
|
|
|
U #Dyn.Sk_IN.Reset;
|
|
O #Dyn.Sk_IN.Reset_Akt;
|
|
= #Status2.Reset_aktiv_IN;
|
|
|
|
U #Dyn.Sk_OUT.Reset;
|
|
O #Dyn.Sk_OUT.Reset_Akt;
|
|
= #Dyn.Status.Reset_aktiv_OUT;
|
|
|
|
SET;
|
|
R #Inks_Ok;
|
|
|
|
U #Dyn.Sk_OUT.Auto_akt;
|
|
= #Dyn.Sk_IN.Auto_akt;
|
|
U #Dyn.Sk_OUT.Bereich_ok;
|
|
= #Dyn.Sk_IN.Bereich_ok;
|
|
|
|
//Antrieb zusätlich starten:
|
|
U #ErrQuit ;//Überwachungszeit abgelaufen quittieren
|
|
S #Antrieb_plus_start;//Kreisel-Antrieb plus starten
|
|
|
|
NETWORK
|
|
TITLE = HMI-Zeug
|
|
|
|
//Von HMI:
|
|
U #Dyn.HMI.Schleuse_resetten_IN;
|
|
R #Dyn.HMI.Schleuse_resetten_IN;
|
|
S #Dyn.Sk_IN.Reset ;//SK zurücksetzen
|
|
|
|
U #Dyn.HMI.Schleuse_resetten_OUT;
|
|
R #Dyn.HMI.Schleuse_resetten_OUT;
|
|
S #Dyn.Sk_OUT.Reset ;//SK zurücksetzen
|
|
|
|
U #Dyn.HMI.Puffer_initialisieren;
|
|
R #Dyn.HMI.Puffer_initialisieren;
|
|
S #Status2.Puffer_initialisieren_IN;
|
|
S #Dyn.Status.Puffer_initialisieren_OUT;
|
|
|
|
U #Dyn.HMI.Einlagern_gesperrt;//Wird unten direkt verarbeitet
|
|
|
|
U #Dyn.HMI.AusLagern_gesperrt;//Wird unten direkt verarbeitet
|
|
|
|
CLR;
|
|
|
|
//An HMI:
|
|
L #Dyn.ShopGroup_IN;
|
|
T #Dyn.HMI.ShopGroup_IN;
|
|
L #Dyn.ShopGroup_OUT;
|
|
T #Dyn.HMI.ShopGroup_OUT;
|
|
|
|
L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
T #Dyn.HMI.Voll_Trolleys_IN;
|
|
L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
T #Dyn.HMI.Voll_Trolleys_OUT;
|
|
|
|
L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege;
|
|
T #Dyn.HMI.Res_Trolleys_IN;
|
|
|
|
L #Puffer.MaxAnzahl_Einfahrt;
|
|
L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege;
|
|
-I;
|
|
L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
-I;
|
|
T #Dyn.HMI.Frei_Plätze_IN;
|
|
|
|
L #Dyn.TrolleyID_Schleuse_IN;
|
|
T #Dyn.HMI.TrolleyID_Schleuse_IN;
|
|
L #Dyn.TrolleyID_Schleuse_Out;
|
|
T #Dyn.HMI.TrolleyID_Schleuse_OUT;
|
|
|
|
NETWORK
|
|
TITLE = Oberen Puffer für neue ShopGroup freigeben?
|
|
U(;
|
|
L "DLVollPuffer_leer".Datenlistenkopf.AnzahlEintraege;
|
|
L 0 ;//Keine Leer-Puffer mehr vorhanden?
|
|
==I;//Ja !
|
|
O #Dyn.Status.Puffer_leer_OUT;//unterer Puffer ist leer
|
|
O;
|
|
U #Status2.Puffer_leer_IN;//oberer Puffer ist leer
|
|
U #Status2.Alles_ausfahren_OUT;
|
|
);
|
|
U #Status2.Puffer_leer_IN;//Könnte mit neuer ShopGroup bestückt werden!
|
|
= #Oberen_Puffer_Freigeben;
|
|
SPBN En05;//Negierter Sprung
|
|
|
|
L DINT#0;
|
|
T #Dyn.ShopGroup_IN;
|
|
|
|
En05: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Schrittkette IN zurücksetzen
|
|
UN #Dyn.Sk_IN.Reset ;//SK zurücksetzen
|
|
SPB INen04;
|
|
|
|
//Schrittkette zurücksetzen:
|
|
//Automatischer Inilauf bei Reset, falls Trolley nicht in Schleuse:
|
|
U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;
|
|
S #Status2.Trolley_nicht_in_Schleuse_IN;
|
|
S #Status2.Puffer_initialisieren_IN;//Damit Einfahren blockiert wird
|
|
|
|
L 0;//Schritt 0: Warten
|
|
T #Dyn.Sk_IN.Akt_Schritt;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk_IN.Terr_Zelle;
|
|
T #Dyn.Sk_IN.Tok_Zelle;
|
|
T #Dyn.Leer_Zeit_IN;
|
|
|
|
SET;
|
|
R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren
|
|
R #Dyn.Sk_IN.Reset ;//SK zurücksetzen
|
|
R #Dyn.Sk_IN.Err_Schritt;//Undefinierter Schritt
|
|
R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter !
|
|
S #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv
|
|
|
|
SET;
|
|
R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft
|
|
R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer
|
|
R #Status2.Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in Schleuse
|
|
R #Status2.Puffer_nicht_leer_IN;//Puffer unten nicht leer
|
|
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 VollPuffer-Eingang
|
|
R #Dyn.Error.Err_BLKMov;
|
|
|
|
L 0;
|
|
T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s]
|
|
T #Dyn.Mindest_Zeit_IN;//Sensor B_VorSep ist frei [1s]
|
|
T #SAVE.Weichen_DB;
|
|
T #SAVE.Weichen_DW;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
INen04: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Schrittkette OUT zurücksetzen
|
|
UN #Dyn.Sk_OUT.Reset;//SK zurücksetzen
|
|
SPB en04;
|
|
|
|
//Schrittkette zurücksetzen:
|
|
//Automatischer Inilauf bei Reset, falls Trolley nicht in Schleuse:
|
|
U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;
|
|
S #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;
|
|
S #Dyn.Status.Puffer_initialisieren_OUT;//Damit Einfahren blockiert wird
|
|
|
|
L 0;//Schritt 0: Warten
|
|
T #Dyn.Sk_OUT.Akt_Schritt;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk_OUT.Terr_Zelle;
|
|
T #Dyn.Sk_OUT.Tok_Zelle;
|
|
T #Dyn.Leer_Zeit_OUT;
|
|
|
|
SET;
|
|
R #Status2.Alles_ausfahren_OUT;
|
|
R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren
|
|
R #Dyn.Sk_OUT.Reset;//SK zurücksetzen
|
|
R #Dyn.Sk_OUT.Err_Schritt;//Undefinierter Schritt
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter !
|
|
S #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv
|
|
|
|
SET;
|
|
R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft
|
|
R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer
|
|
R #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in Schleuse
|
|
R #Dyn.Status.Puffer_nicht_leer_OUT;//Puffer unten nicht leer
|
|
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 VollPuffer-Eingang
|
|
R #Dyn.Error.Err_BLKMov;
|
|
|
|
L 0;
|
|
T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s]
|
|
T #Dyn.Mindest_Zeit_OUT ;//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.VollPuffer_Nr;//Nummer des VollPuffers
|
|
|
|
BEA;
|
|
|
|
en04: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Störungen nach Außen übergeben
|
|
L 0;
|
|
T "MW200";
|
|
|
|
U #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft
|
|
= "M200.0";
|
|
U #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer
|
|
= "M200.1";
|
|
U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in untere Schleuse
|
|
= "M200.2";
|
|
U #Dyn.Sk_IN.Err_Uebzeit;
|
|
O #Dyn.Sk_OUT.Err_Uebzeit;
|
|
= #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen
|
|
= "M200.3";
|
|
NOT;
|
|
R #Dyn.Sk_OUT.Err_Uebzeit_AnzOk;
|
|
U #Dyn.Sk_OUT.Err_Schritt;
|
|
= #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert
|
|
= "M200.4";
|
|
U #Dyn.Error.Err_Stau_Einfahrt;//Stau am VollPuffer-Eingang
|
|
= "M200.5";
|
|
U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren
|
|
= "M200.6";
|
|
U #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus unterer Schleuse
|
|
= "M200.7";
|
|
U #Dyn.Error.Err_Puffer_nicht_leer_OUT;//Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
|
|
= "M201.0";
|
|
U #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in mittlere Schleuse
|
|
= "M201.1";
|
|
U #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus mittlere Schleuse
|
|
= "M201.2";
|
|
U #Dyn.Error.Err_Puffer_nicht_leer_IN;//Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
|
|
= "M201.3";
|
|
CLR;
|
|
= "M201.4";
|
|
U #Dyn.Error.Err_Raus_Sensor;
|
|
= "M201.5";
|
|
CLR;
|
|
= "M201.6";
|
|
U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv
|
|
= #Dyn.Error.Reset_aktiv;
|
|
= "M201.7";
|
|
|
|
//Andere Meldung als Überwachungszeit aktiv ?:
|
|
L "MW200";
|
|
L 2#1111_0111_1111_1111;
|
|
UW;
|
|
L 2#0000_0000_0000_0000;//Andere Meldung als Üb.zeit aktiv ?
|
|
<>I;//Ja !
|
|
ON #Dyn.Sk_OUT.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv !
|
|
R "M200.3";//Üb.Zeit-Meldung nicht an PC senden
|
|
|
|
U #Dyn.Sk_OUT.Err_Uebzeit;
|
|
S #Dyn.Sk_OUT.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!
|
|
U #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen
|
|
S #hStOk;
|
|
|
|
//Störungen pro Zyklus neu erzeugen:
|
|
SET;
|
|
R #Dyn.Error.Puffer_DL;//VollPuffer-Datenliste fehlerhaft
|
|
R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer
|
|
R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert
|
|
R #Dyn.Error.Err_BLKMov;
|
|
R #Dyn.Error.Err_Puffer_nicht_leer_OUT;//Trolley unten in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
|
|
R #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;//Trolley fährt nicht in unterer Schleuse
|
|
R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus unterer Schleuse
|
|
R #Dyn.Error.Err_Puffer_nicht_leer_IN;//Trolley mittig in Schleuse, obwohl keine Daten! Initialisieren hat gestartet!
|
|
R #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;//Trolley fährt nicht in mittlere Schleuse
|
|
R #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus mittlere Schleuse
|
|
R #Dyn.Error.Err_Raus_Sensor;
|
|
|
|
NETWORK
|
|
TITLE = Statische VollPuffer-Parameter holen
|
|
L #Puffer.VollPuffer_Nr;//Nummer des VollPuffers
|
|
L #VollPuffer_Nr;//Aufruf-Parameter
|
|
==I;//Identisch ?
|
|
R #Dyn.Error.Puffer_DL;//VollPufferdatenbank fehlerhaft
|
|
R #Dyn.Error.Undef_Puffer;//undefiniertes VollPuffer
|
|
SPB en06;//Ja !
|
|
|
|
T "MW200";//Search-Daten
|
|
|
|
CALL "DatenOut"
|
|
( SSDB := #Para.VollPuffer_DL_DB ,
|
|
SSDW := #Para.VollPuffer_DL_DW ,
|
|
PARA := WORD#16#0000 ,
|
|
SEARCHDATEN := P#M200.0 ,
|
|
RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_VollPuffer ,
|
|
OUTDATEN := P#M220.0 ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
SPBI G_Ok;
|
|
|
|
U "M199.0";
|
|
SPBN w060;
|
|
|
|
SET;
|
|
= #Dyn.Error.Puffer_DL;//VollPufferdatenbank fehlerhaft
|
|
|
|
L 16#A061;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
BEA;
|
|
|
|
w060: SET;
|
|
S #Dyn.Error.Undef_Puffer;//undefinierter VollPuffer
|
|
|
|
L 16#0062;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
BEA;
|
|
|
|
//Kennung + Datenbytes
|
|
G_Ok: SET;
|
|
R #Dyn.Error.Puffer_DL;//Gefälledatenbank fehlerhaft
|
|
R #Dyn.Error.Undef_Puffer;//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 BLKMOV//Datenliste-Daten speichern
|
|
{blk_type := 'Variant'}
|
|
( SRCBLK := #Quelle ,
|
|
RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer ,
|
|
DSTBLK := #Puffer //#Ziel
|
|
);
|
|
|
|
L 16#0063;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
L #Dyn.Rueckmld.RET_VAL_BLKMOV_VollPuffer;//Rückmeldung
|
|
L 0;//Fehler vorhanden ?
|
|
<>I;//Ja !
|
|
= #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren
|
|
BEB;
|
|
|
|
L #Puffer.Puffer_Typ ;//Puffertyp = 1276 (Vollpuffer)
|
|
L 1276 ;//Dieser Aufruf-FB ?
|
|
==I;//Ja !
|
|
SPB w061;
|
|
|
|
SET;
|
|
S #Dyn.Error.Undef_Puffer;//undefinierter VollPuffer
|
|
|
|
L 0 ;//VollPuffer ungültig !
|
|
T #Puffer.VollPuffer_Nr;//Nummer des VollPuffers
|
|
|
|
L 16#0064;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
BEA;
|
|
|
|
//Defaultwerte übergeben:
|
|
w061: NOP 0;
|
|
|
|
BEA;
|
|
|
|
en06: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Störungen quittieren
|
|
U #ErrQuit ;//Überwachungszeit abgelaufen quittieren
|
|
R #Dyn.Sk_IN.Err_Uebzeit;
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;
|
|
|
|
NETWORK
|
|
TITLE = Einfahrenden Trolley in Puffer-DL IN eintragen
|
|
L #Dyn.TrolleyID_Einfahrt;
|
|
T "MD220";
|
|
L DINT#0;
|
|
==I;
|
|
SPB NoNewT;
|
|
|
|
SET;
|
|
S #Neu_Trolley_in_Puffer_IN;
|
|
|
|
//Erster einfahrender Trolley ?
|
|
L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;
|
|
==I ;//Ja !
|
|
= #"1.Trolley_IN";
|
|
|
|
//Neue Position an Gesamt-Trolley-DL übergeben:
|
|
CALL "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"
|
|
);
|
|
|
|
//EndZiel löschen:
|
|
CALL "Trolleydaten_ändern"
|
|
( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL ,
|
|
TrolleyID := #Dyn.TrolleyID_Einfahrt ,
|
|
Endziel := 16#0 ,
|
|
ShopGroup := DINT#-1
|
|
);
|
|
|
|
U "M199.0" ;//Kein sinnvolles Ergebnis
|
|
SPBN Ok80 ;//negierter Sprung
|
|
|
|
L "MD220";
|
|
T #Dyn.TrolleyID_unbekannt_Einfahrt;
|
|
|
|
Ok80: UN #"1.Trolley_IN";
|
|
SPB NoFirst;
|
|
|
|
//ShopGroup speichern bei 1.Trolley speichern:
|
|
L "TrolleyDL_OutDaten".OUTDaten.ShopGroup;//von oben "Neue Pos..." übernommen
|
|
T #Dyn.ShopGroup_IN;
|
|
|
|
//Daten Puffer eintragen:
|
|
NoFirst: L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_IN;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
L #Dyn.TrolleyID_Einfahrt;
|
|
T "MD220";
|
|
L DINT#0 ;//Abruf-ShopGroup erst mal löschen!
|
|
T "MD224";
|
|
|
|
CALL "DatenIn"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
INDATEN := P#M220.0 ,
|
|
RE_VAL := "MB199"
|
|
);
|
|
|
|
L "MB199";
|
|
T #Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_IN;//wegen Bit-Auswertung
|
|
|
|
//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 "DatenOut"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
PARA := 16#E100 , //Eintrag löschen
|
|
SEARCHDATEN := P#M220.0 ,
|
|
RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_Res_OUT ,
|
|
OUTDATEN := P#M220.0 , //Nicht relevant
|
|
Position := "MW196"
|
|
);
|
|
|
|
L DINT#0;
|
|
T #Dyn.TrolleyID_Einfahrt;
|
|
|
|
NoNewT: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Error: Stau Bereich-Eingang
|
|
|
|
//Sensor bei Bereichs-Einfahrt bleibt belegt?:
|
|
UN #B_VollPufferEinfahrt ;//Sensor Trolley fährt in Bereich (kein Stau !)
|
|
R #Dyn.Error.Err_Stau_Einfahrt;//Stau bei Einfahrt
|
|
SPB X090 ;//StauZeit neu aufziehen
|
|
|
|
UN "1s-Impuls";
|
|
O #Dyn.Error.Err_Stau_Einfahrt;//Zeit bereits abgelaufen
|
|
SPB 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
|
|
SPBN Xn09;
|
|
|
|
X090: L 0 ;//Zeiten löschen
|
|
T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [1s]
|
|
|
|
Xn09: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Schleuse IN: Mindestzeit geöffnet/frei
|
|
L #Dyn.Sk_IN.Akt_Schritt;
|
|
L 6 ;//Mindestzeit ok?
|
|
<>I;//Nein!
|
|
O #B_InSchleuse_IN ;//Sensor Trolley in Schleuse vorhanden
|
|
ON #Schleuse_geöffnet_IN;//Schleuse hat geöffnet
|
|
R #Status2.MindestZeit_ok_IN;
|
|
SPB INX100 ;//FreiZeit neu aufziehen
|
|
|
|
UN "1s-Impuls";
|
|
O #Status2.MindestZeit_ok_IN;//Zeit bereits abgelaufen
|
|
SPB INX10E;
|
|
|
|
L #Dyn.Mindest_Zeit_IN;//Sensor B_im_Sep ist frei [1s]
|
|
+ +1;
|
|
T #Dyn.Mindest_Zeit_IN;//Sensor B_im_Sep ist frei [1s]
|
|
|
|
L 10 ;//Mindest-Zeit erreicht ?
|
|
>=I;//Ja !
|
|
S #Status2.MindestZeit_ok_IN;
|
|
SPBN INX10E;
|
|
|
|
INX100: L 0 ;//Zeiten löschen
|
|
T #Dyn.Mindest_Zeit_IN;//Sensor B_im_Sep ist frei [1s]
|
|
|
|
INX10E: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Schleuse OUT: Mindestzeit geöffnet/frei, Position-Inks übergeben
|
|
L #Dyn.Sk_OUT.Akt_Schritt;
|
|
L 6 ;//Mindestzeit ok?
|
|
<>I;//Nein!
|
|
O #B_InSchleuse_OUT ;//Sensor Trolley in Schleuse vorhanden
|
|
ON #Schleuse_geöffnet_OUT;//Schleuse hat geöffnet
|
|
R #Dyn.Status.MindestZeit_ok_OUT;
|
|
SPB X100 ;//FreiZeit neu aufziehen
|
|
|
|
UN "1s-Impuls";
|
|
O;
|
|
U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;
|
|
UN #Antrieb_plus_aktiv;
|
|
O #Dyn.Status.MindestZeit_ok_OUT;//Zeit bereits abgelaufen
|
|
SPB Xn10;
|
|
|
|
L #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s]
|
|
+ +1;
|
|
T #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s]
|
|
|
|
L #Puffer.Mindeszeit_Schleuse_geoeffnet ;//Mindest-Zeit erreicht ?
|
|
>=I;//Ja !
|
|
S #Dyn.Status.MindestZeit_ok_OUT;
|
|
SPBN Xn10;
|
|
|
|
X100: L 0 ;//Zeiten löschen
|
|
T #Dyn.Mindest_Zeit_OUT ;//Sensor B_im_Sep ist frei [1s]
|
|
|
|
//Schleuse geöffnet: (Position-Inks übergeben)
|
|
Xn10: UN #Schleuse_geöffnet_OUT ;//Schleuse hat geöffnet
|
|
SPB X10E;
|
|
|
|
L #Ausfahr_Inks;
|
|
L #Puffer.Puffer_Position_Inks;
|
|
>I;//Rest-Inks-Wert ist größer!
|
|
SPB X10E;
|
|
|
|
L #Puffer.Puffer_Position_Inks;
|
|
T #Ausfahr_Inks;
|
|
|
|
X10E: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Keine neue Trolley-Einfahrt Puffer IN ?
|
|
|
|
//Neu-Trolley ist im Puffer oben:
|
|
U #Neu_Trolley_in_Puffer_IN;
|
|
O #B_VollPufferEinfahrt;
|
|
SPB INX110;
|
|
|
|
UN "1s-Impuls";
|
|
O #Status2.Kein_neuer_Trolley_kommt_IN;
|
|
SPB INXn11;
|
|
|
|
L #Dyn.Leer_Zeit_IN ;//Zeit für LeerCheck [1s]
|
|
+ +1;
|
|
T #Dyn.Leer_Zeit_IN ;//Zeit für LeerCheck [1s]
|
|
|
|
L #Puffer.Wartezeit_bis_Puffer_leer;//Leer-Zeit erreicht ?
|
|
>=I;//Ja !
|
|
SPBN INXn11;
|
|
|
|
T #Dyn.Leer_Zeit_IN ;//Zeit für LeerCheck einfrieren
|
|
|
|
SET;
|
|
S #Status2.Kein_neuer_Trolley_kommt_IN;
|
|
|
|
SPA INXn11;
|
|
|
|
INX110: L 0 ;//Zeiten löschen
|
|
T #Dyn.Leer_Zeit_IN;
|
|
|
|
SET;
|
|
R #Status2.Kein_neuer_Trolley_kommt_IN;
|
|
|
|
INXn11: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Keine neue Trolley-Einfahrt Puffer OUT ?
|
|
|
|
//Neu-Trolley ist im Puffer oben:
|
|
U #Schleuse_geöffnet_IN;
|
|
SPB X110;
|
|
|
|
UN "1s-Impuls";
|
|
O #Dyn.Status.Kein_neuer_Trolley_kommt_OUT;
|
|
SPB Xn11;
|
|
|
|
L #Dyn.Leer_Zeit_OUT ;//Zeit für LeerCheck [1s]
|
|
+ +1;
|
|
T #Dyn.Leer_Zeit_OUT ;//Zeit für LeerCheck [1s]
|
|
|
|
L #Puffer.Wartezeit_bis_Puffer_leer;//Leer-Zeit erreicht ?
|
|
>=I;//Ja !
|
|
SPBN Xn11;
|
|
|
|
T #Dyn.Leer_Zeit_OUT ;//Zeit für LeerCheck einfrieren
|
|
|
|
SET;
|
|
S #Dyn.Status.Kein_neuer_Trolley_kommt_OUT;
|
|
|
|
SPA Xn11;
|
|
|
|
X110: L 0 ;//Zeiten löschen
|
|
T #Dyn.Leer_Zeit_OUT;
|
|
|
|
SET;
|
|
R #Dyn.Status.Kein_neuer_Trolley_kommt_OUT;
|
|
|
|
Xn11: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Reservierungs-Check
|
|
L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;
|
|
==I;
|
|
SPB NoResCheck ;//Später -> Hauptstrangdaten checken!
|
|
|
|
L #VollPuffer_Nr;
|
|
L 126;
|
|
>=I;
|
|
= #Puffer_B;//Puffer gehört zu Bereich B
|
|
|
|
//Keine Trolleydaten in Sorter A?
|
|
U "DVP_Sorter_A".Sorter_A_leer;
|
|
UN #Puffer_B ;//Puffer gehört zu Bereich B
|
|
SPB ResDel;
|
|
|
|
//Keine Trolleydaten in Sorter A+B?
|
|
U "DVP_Sorter_A".Sorter_A_leer;
|
|
U "DVP_Sorter_B".Sorter_B_leer;
|
|
U #Puffer_B ;//Puffer gehört zu Bereich B
|
|
SPB ResDel;
|
|
|
|
//Ansonsten über Ziel-Check
|
|
//Daten vom 1.Reservierungs-Trolley holen:
|
|
L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID;
|
|
T "TrolleyDL_SearchDaten".SEARCHDaten.TrolleyID;
|
|
|
|
//Trolleydaten lesen:
|
|
CALL "DatenOut"
|
|
( SSDB := 1000 ,
|
|
SSDW := 0 ,
|
|
PARA := 16#0000 , //Eintrag lesen
|
|
SEARCHDATEN := %DB1012.DBX0.0 ,
|
|
RE_VAL := "MB198" ,
|
|
OUTDATEN := %DB1011.DBX0.0 ,
|
|
Position := "MW200"
|
|
);
|
|
|
|
L "MB198";
|
|
L 2#10000000 ;//Datensatz vorhanden?
|
|
<>I;//Nein!
|
|
SPB NoResCheck;
|
|
|
|
L "TrolleyDL_OutDaten".OUTDaten.EndZiel;
|
|
L 101 ;//VollPuffer ?
|
|
>=I ;//Ja!
|
|
U(;
|
|
TAK;
|
|
L 151 ;//VollPuffer ?
|
|
<=I ;//Ja!
|
|
);
|
|
SPB NoResCheck ;//Warten, Trolley kommt noch!
|
|
|
|
ResDel: L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID;
|
|
T "MD220";
|
|
|
|
SPA ResOut;
|
|
|
|
NoResCheck: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Leer-Check IN aktiv
|
|
|
|
//Falls Inilauf aktiv:
|
|
U #Status2.Puffer_initialisieren_IN;
|
|
UN #Status2.Leer_Check_IN;
|
|
S #Status2.Leer_Check_IN;
|
|
SPBN Check_IN ;//Negierter Sprung
|
|
|
|
L 0 ;//Zeiten neu aufziehen
|
|
T #Dyn.Leer_Zeit_IN;
|
|
|
|
SET;
|
|
R #Status2.Kein_neuer_Trolley_kommt_IN;
|
|
|
|
Check_IN: NOP 0;
|
|
//Abbruch, da Trolley ist doch noch in Schleuse gefahren:
|
|
U #Status2.Puffer_initialisieren_IN;
|
|
U #Status2.Trolley_nicht_in_Schleuse_IN;
|
|
U #B_InSchleuse_IN;
|
|
R #Status2.Puffer_initialisieren_IN;
|
|
R #Status2.Trolley_nicht_in_Schleuse_IN;
|
|
R #Status2.Leer_Check_IN;
|
|
|
|
UN #Status2.Leer_Check_IN;
|
|
SPB INXn12;
|
|
|
|
//Trolley während Check erkannt:
|
|
UN #Status2.Kein_neuer_Trolley_kommt_IN;
|
|
SPB INXn12;
|
|
|
|
//Aber:
|
|
U #Schleuse_geöffnet_IN ;//aber Schleuse noch geöffnet
|
|
O #B_InSchleuse_IN ;//aber Trolley noch in Schleuse
|
|
SPBN Fertig_IN ;//Negierter Sprung
|
|
|
|
L 0 ;//Zeit neu aufziehen
|
|
T #Dyn.Leer_Zeit_IN;
|
|
|
|
SET;
|
|
R #Status2.Kein_neuer_Trolley_kommt_IN;
|
|
|
|
SPA Xn12;
|
|
|
|
Fertig_IN: SET;
|
|
R #Status2.Leer_Check_IN;
|
|
|
|
U #Status2.Puffer_initialisieren_IN;
|
|
R #Status2.Puffer_initialisieren_IN;
|
|
SPBN Reset_IN ;//Negierter Sprung
|
|
|
|
//Trolleyliste löschen:
|
|
L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_IN;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenReset"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
RE_VAL := "MB198"
|
|
);
|
|
|
|
SPA INXn12 ;//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 "DatenReset"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
RE_VAL := "MB198"
|
|
);
|
|
|
|
SPA Reset_IN;
|
|
|
|
INXn12: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Leer-Check OUT aktiv
|
|
|
|
//Falls Inilauf aktiv:
|
|
U #Dyn.Status.Puffer_initialisieren_OUT;
|
|
UN #Dyn.Status.Leer_Check_OUT;
|
|
S #Dyn.Status.Leer_Check_OUT;
|
|
SPBN Check;//Negierter Sprung
|
|
|
|
L 0 ;//Zeiten neu aufziehen
|
|
T #Dyn.Leer_Zeit_OUT;
|
|
|
|
SET;
|
|
R #Dyn.Status.Kein_neuer_Trolley_kommt_OUT;
|
|
|
|
Check: NOP 0;
|
|
//Abbruch, da Trolley ist doch noch in Schleuse gefahren:
|
|
U #Dyn.Status.Puffer_initialisieren_OUT;
|
|
U #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;
|
|
U #B_InSchleuse_OUT;
|
|
CLR;//Ist Blödsinn
|
|
R #Dyn.Status.Puffer_initialisieren_OUT;
|
|
R #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;
|
|
R #Dyn.Status.Leer_Check_OUT;
|
|
|
|
UN #Dyn.Status.Leer_Check_OUT;
|
|
SPB Xn12;
|
|
|
|
//Trolley währen Check erkannt:
|
|
UN #Dyn.Status.Kein_neuer_Trolley_kommt_OUT;
|
|
SPB Xn12;
|
|
|
|
//Aber:
|
|
U #Schleuse_geöffnet_OUT;//aber Schleuse noch geöffnet
|
|
O #B_InSchleuse_OUT ;//aber Trolley noch in Schleuse
|
|
SPBN Fertig ;//Negierter Sprung
|
|
|
|
L 0 ;//Zeit neu aufziehen
|
|
T #Dyn.Leer_Zeit_OUT;
|
|
|
|
SET;
|
|
R #Dyn.Status.Kein_neuer_Trolley_kommt_OUT;
|
|
|
|
SPA Xn12;
|
|
|
|
Fertig: SET;
|
|
R #Dyn.Status.Leer_Check_OUT;
|
|
|
|
U #Dyn.Status.Puffer_initialisieren_OUT;
|
|
R #Dyn.Status.Puffer_initialisieren_OUT;
|
|
SPBN Reset_OUT ;//Negierter Sprung
|
|
|
|
//Trolleyliste löschen:
|
|
L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_Out;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenReset"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
RE_VAL := "MB198"
|
|
);
|
|
|
|
SPA Reset_OUT;
|
|
|
|
Xn12: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Reset IN aktiv
|
|
SPA INEn14;
|
|
|
|
Reset_IN: SET;
|
|
R #Dyn.Sk_IN.Err_Uebzeit;
|
|
R #Status2.Eintrag_DL_Leerliste_erfolgt;
|
|
R #Status2.Eintrag_DL_Reinliste_erfolgt;
|
|
R #Status2.Trolley_nicht_in_Schleuse_IN;
|
|
R #Status2.Puffer_nicht_leer_IN;
|
|
|
|
L DINT#0;
|
|
/// T #Dyn.ShopGroup_IN //siehe Nw 5
|
|
T #Dyn.ShopGroup_EFL_Gespeichert ;//Kein ShopGroup_IN mehr eingetragen
|
|
L 0;
|
|
T #Dyn.Leer_Zeit_IN;
|
|
T #Dyn.ShopGroup_EFL_Gespeichert ;//Kein ShopGroup_IN mehr eingetragen
|
|
|
|
//Trolleyliste löschen:
|
|
L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_IN;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenReset"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
RE_VAL := "MB198"
|
|
);
|
|
|
|
INEn14: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Reset Out aktiv
|
|
SPA En14;
|
|
|
|
Reset_OUT: SET;
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;
|
|
R #Dyn.Status.Puffer_initialisieren_OUT;
|
|
R #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;
|
|
R #Dyn.Status.Puffer_nicht_leer_OUT;
|
|
R #Dyn.HMI.Puffer_initialisieren;//Button-Anzeige wieder normal
|
|
R #Status2.Eintrag_DL_Abrufliste_erfolgt;
|
|
R #Dyn.Error.Err_Raus_Sensor;
|
|
R #Dyn.Status.Trolley_fährt_aus_OUT;
|
|
|
|
L DINT#0;
|
|
T #Dyn.ShopGroup_OUT;
|
|
T #Dyn.ShopGroup_AFL_Gespeichert ;//Kein ShopGroup_OUT mehr eingetragen
|
|
L 0;
|
|
T #Dyn.Leer_Zeit_OUT;
|
|
|
|
//Trolleyliste löschen:
|
|
L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_Out;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenReset"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
RE_VAL := "MB198"
|
|
);
|
|
|
|
En14: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Beide Puffer identische ShopGroup
|
|
L #Dyn.ShopGroup_IN;
|
|
L #Dyn.ShopGroup_OUT;//Gleiche Daten ?
|
|
<>I;//Nein!
|
|
R #Oberen_Puffer_nichts_einfahren;//Einfahrt oben verhindern, sonst evtl. Dauerlauf
|
|
SPB NixGleich;
|
|
|
|
//Sonderfall "Alles ausfahren":
|
|
U #Status2.Alles_ausfahren_OUT;//Unterer Puffer soll leer werden!
|
|
= #Oberen_Puffer_nichts_einfahren;//Einfahrt oben verhindern, sonst evtl. Dauerlauf
|
|
|
|
NixGleich: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Puffer oben hat Platz / ist frei
|
|
|
|
//Puffer hat Platz:
|
|
L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege;
|
|
L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
+I;
|
|
T #GesamtAnzahl;
|
|
|
|
L #Puffer.MaxAnzahl_Einfahrt;
|
|
<I;
|
|
UN #Dyn.Error.Err_Stau_Einfahrt;
|
|
UN #Dyn.Error.Err_Puffer_nicht_leer_IN;
|
|
UN #Status2.Puffer_initialisieren_IN;
|
|
UN #Status2.Reset_aktiv_IN;
|
|
UN #Oberen_Puffer_nichts_einfahren;
|
|
UN #Dyn.HMI.Einlagern_gesperrt;
|
|
= #Status2."Puffer_hat Platz_IN";
|
|
|
|
L #GesamtAnzahl;
|
|
L 0 ;//Trolley im Puffer ?
|
|
==I;//Nein!
|
|
U #Status2."Puffer_hat Platz_IN";
|
|
U #Status2.Kein_neuer_Trolley_kommt_IN;
|
|
UN #B_InSchleuse_IN;
|
|
UN #Dyn.HMI.Einlagern_gesperrt;
|
|
//Sortenreiner Puffer bei genügend Leerstrecken
|
|
U(;
|
|
L "DLVollPuffer_leer".Datenlistenkopf.AnzahlEintraege;
|
|
L 2;//Bei 1 taktet der Eintrag!
|
|
<I ;//Keine Leerstrecke mehr frei!
|
|
O #Dyn.Status.Puffer_leer_OUT;//Dann sorterrein
|
|
);
|
|
= #Status2.Puffer_leer_IN;
|
|
|
|
NETWORK
|
|
TITLE = Puffer unten hat Platz / ist frei
|
|
L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L #Puffer.MaxAnzahl_Ausfahrt;
|
|
<I;
|
|
UN #Dyn.Error.Err_Puffer_nicht_leer_OUT;
|
|
/// UN #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT
|
|
UN #Dyn.Status.Puffer_initialisieren_OUT;
|
|
UN #Dyn.Status.Reset_aktiv_OUT;
|
|
= #Dyn.Status."Puffer_hat Platz_OUT";
|
|
|
|
TAK;
|
|
L 0 ;//Trolley im Puffer ?
|
|
==I;//Nein!
|
|
U #Dyn.Status."Puffer_hat Platz_OUT";
|
|
U #Dyn.Status.Kein_neuer_Trolley_kommt_OUT;
|
|
UN #B_InSchleuse_OUT;
|
|
= #Dyn.Status.Puffer_leer_OUT;
|
|
R #Dyn.Status.Einen_VollTrolley_ausfahren_OUT;
|
|
R #Status2.Alles_ausfahren_OUT;
|
|
|
|
NETWORK
|
|
TITLE = Starten aus VollPuffer aufgrund von Ausfahrsituation ok
|
|
L #Puffer.Puffer_Position_Inks;
|
|
L 0;//Undefiniert ?
|
|
==I;//Ja!
|
|
SPB X14E;
|
|
|
|
L #Ausfahr_Inks ;//Trolles auf Förderer vorbei?
|
|
L 0;//Undefiniert ?
|
|
==I;//Ja!
|
|
SPB 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;
|
|
|
|
NETWORK
|
|
TITLE = DLPuffer_leer: Ein-/Austrag
|
|
L #GesamtAnzahl;
|
|
L 0 ;//Trolleys unterwegs/drin ?
|
|
<>I ;//Ja !
|
|
ON #Status2.Puffer_leer_IN;//Kann mit neuer ShopGroup bestückt werden!
|
|
O #Puffer.Parameter_allg.Kein_Lager;//Überlauf-/Fehler-Strecke
|
|
O #Status2.Puffer_initialisieren_IN;
|
|
O #Dyn.Status.Puffer_initialisieren_OUT;
|
|
SPB Austrag_Leerliste;
|
|
|
|
//Eintrag in Leerliste:
|
|
L #VollPuffer_Nr;
|
|
T "MW220" ;//Puffer, der leer ist
|
|
|
|
CALL "DatenIn"//Anforderung in Datenliste eintragen
|
|
( SSDB := 100 ,
|
|
SSDW := 0 ,
|
|
INDATEN := P#M220.0 ,
|
|
RE_VAL := "MB219"
|
|
);
|
|
|
|
UN "M219.6";//Daten wurden überschrieben
|
|
UN "M219.7";//Eintrag ist richtig erfolgt
|
|
SPB NoChange_Leerliste;
|
|
|
|
SET;
|
|
S #Status2.Eintrag_DL_Leerliste_erfolgt;
|
|
|
|
SPA NoChange_Leerliste;
|
|
|
|
Austrag_Leerliste: NOP 0;
|
|
//Austrag aus Leerliste:
|
|
L #VollPuffer_Nr;
|
|
T "MW220" ;//Puffer, der leer ist
|
|
|
|
CALL "DatenOut"//Anforderung aus Datenliste löschen
|
|
( SSDB := 100 ,
|
|
SSDW := 0 ,
|
|
PARA := WORD#16#E100 ,
|
|
SEARCHDATEN := P#M220.0 ,
|
|
RE_VAL := "MB219" ,
|
|
OUTDATEN := P#M230.0 ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
SET;
|
|
R #Status2.Eintrag_DL_Leerliste_erfolgt;
|
|
|
|
NoChange_Leerliste: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = DLPuffer_ShopGroup_einfahren: Ein-/Austrag
|
|
|
|
//Relevante ShopGroup ermittel:
|
|
L #Dyn.ShopGroup_IN;
|
|
L DINT#0 ;//ShopGroup bekannt ?
|
|
<>D ;//Ja !
|
|
SPB ASG;
|
|
|
|
L #Dyn.Reservierungs_DL.Res_Trolley[1].ShopGroup;
|
|
L DINT#0 ;//Trolleys mit ShopGroup reseviert ?
|
|
<>D ;//Ja !
|
|
SPB ASG;
|
|
|
|
L DINT#0;//wegen TAK
|
|
|
|
ASG: TAK;
|
|
T #Akive_ShopGroup;
|
|
|
|
L #Akive_ShopGroup;
|
|
L DINT#0 ;//Relevante ShopGroup bekannt ?
|
|
==D ;//Nein !
|
|
ON #Status2."Puffer_hat Platz_IN";//Puffer hat kein Platz mehr
|
|
O #Oberen_Puffer_Freigeben;
|
|
O #Puffer.Parameter_allg.Kein_Lager;//Überlauf-/Fehler-Strecke
|
|
O #Status2.Puffer_initialisieren_IN;
|
|
O #Dyn.Status.Puffer_initialisieren_OUT;
|
|
SPB Austrag_Reinliste;
|
|
|
|
//Eintrag in Reinliste:
|
|
L #Akive_ShopGroup;
|
|
L #Dyn.ShopGroup_EFL_Gespeichert;
|
|
==I;//Eintrag schon erfolgt
|
|
SPB NoChange_Reinliste;
|
|
|
|
L #Dyn.Reservierungs_DL.Res_Trolley[1].ShopGroup;
|
|
T "MD222" ;//Übergabe zum Speichern
|
|
L 0 ;//Trolleys mit ShopGroup reseviert ?
|
|
<>D ;//Ja !
|
|
SPB X190;
|
|
|
|
L #Akive_ShopGroup;
|
|
T "MD222" ;//Übergabe zum Speichern
|
|
L 0 ;//ShopGroup bekannt?
|
|
<>D ;//Ja !
|
|
SPB X190;
|
|
|
|
SPA NoChange_Reinliste;
|
|
|
|
X190: L #VollPuffer_Nr ;//angefahrener Puffer
|
|
T "MW220";
|
|
|
|
CALL "DatenIn"//Anforderung in Datenliste eintragen
|
|
( SSDB := 101 ,
|
|
SSDW := 0 ,
|
|
INDATEN := P#M220.0 ,
|
|
RE_VAL := "MB219"
|
|
);
|
|
|
|
UN "M219.6";//Daten wurden überschrieben
|
|
UN "M219.7";//Eintrag ist richtig erfolgt
|
|
SPB NoChange_Reinliste;
|
|
|
|
L #Akive_ShopGroup;
|
|
T #Dyn.ShopGroup_EFL_Gespeichert;//Eingetragene ShopGroup_IN
|
|
|
|
SET;
|
|
S #Status2.Eintrag_DL_Reinliste_erfolgt;
|
|
|
|
SPA NoChange_Reinliste;
|
|
|
|
Austrag_Reinliste: NOP 0;
|
|
//Austrag aus Reinliste:
|
|
L #VollPuffer_Nr;
|
|
T "MW220";
|
|
|
|
CALL "DatenOut"//Anforderung aus Datenliste löschen
|
|
( SSDB := 101 ,
|
|
SSDW := 0 ,
|
|
PARA := WORD#16#E100 ,
|
|
SEARCHDATEN := P#M220.0 ,
|
|
RE_VAL := "MB219" ,
|
|
OUTDATEN := P#M230.0 ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
L DINT#0;
|
|
T #Dyn.ShopGroup_EFL_Gespeichert ;//Kein ShopGroup_IN mehr eingetragen
|
|
|
|
SET;
|
|
R #Status2.Eintrag_DL_Reinliste_erfolgt;
|
|
|
|
NoChange_Reinliste: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = DLPuffer_ShopGroup_abrufen: Ein-/Austrag
|
|
L #Dyn.ShopGroup_OUT;
|
|
L DINT#0 ;//Bekannt ?
|
|
==D ;//Nein !
|
|
O #Dyn.Status.Puffer_leer_OUT;//Kann mit neuer ShopGroup bestückt werden!
|
|
O #Dyn.HMI.AusLagern_gesperrt;
|
|
O #Puffer.Parameter_allg.Kein_Lager;//Überlauf-/Fehler-Strecke
|
|
O #Status2.Puffer_initialisieren_IN;
|
|
O #Dyn.Status.Puffer_initialisieren_OUT;
|
|
SPB Austrag_Abrufliste;
|
|
|
|
//Eintrag aus Abrufliste:
|
|
L #Dyn.ShopGroup_OUT;
|
|
L #Dyn.ShopGroup_AFL_Gespeichert;
|
|
==I;//Eintrag schon erfolgt
|
|
SPB NoChange_Abrufliste;
|
|
|
|
L #VollPuffer_Nr ;//angefahrener Puffer
|
|
T "MW220";
|
|
L #Dyn.ShopGroup_OUT;
|
|
T "MD222";
|
|
|
|
CALL "DatenIn"//Anforderung in Datenliste eintragen
|
|
( SSDB := 102 ,
|
|
SSDW := 0 ,
|
|
INDATEN := P#M220.0 ,
|
|
RE_VAL := "MB219"
|
|
);
|
|
|
|
UN "M219.6";//Daten wurden überschrieben
|
|
UN "M219.7";//Eintrag ist richtig erfolgt
|
|
SPB NoChange_Abrufliste;
|
|
|
|
L #Dyn.ShopGroup_OUT;
|
|
T #Dyn.ShopGroup_AFL_Gespeichert ;//Eingetragene ShopGroup_OUT
|
|
|
|
SET;
|
|
S #Status2.Eintrag_DL_Abrufliste_erfolgt;
|
|
|
|
SPA NoChange_Abrufliste;
|
|
|
|
Austrag_Abrufliste: NOP 0;
|
|
//Austrag aus Abrufliste:
|
|
L #VollPuffer_Nr ;//angefahrener Puffer
|
|
T "MW220";
|
|
|
|
CALL "DatenOut"//Anforderung aus Datenliste löschen
|
|
( SSDB := 102 ,
|
|
SSDW := 0 ,
|
|
PARA := WORD#16#E100 ,
|
|
SEARCHDATEN := P#M220.0 ,
|
|
RE_VAL := "MB219" ,
|
|
OUTDATEN := P#M230.0 ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
L DINT#0;
|
|
T #Dyn.ShopGroup_AFL_Gespeichert ;//Kein ShopGroup_OUT mehr eingetragen
|
|
|
|
SET;
|
|
R #Status2.Eintrag_DL_Abrufliste_erfolgt;
|
|
|
|
NoChange_Abrufliste: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Schrittkette anhalten
|
|
U #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv
|
|
U #Dyn.Sk_OUT.Bereich_ok;
|
|
SPA en08_Mig;//Schrittkette nicht anhalten !
|
|
|
|
SET;//Störungen löschen
|
|
R #Dyn.Sk_IN.Err_Uebzeit;
|
|
R #Dyn.Sk_IN.Err_Schritt;
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;
|
|
R #Dyn.Sk_OUT.Err_Schritt;
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk_IN.Terr_Zelle;
|
|
T #Dyn.Sk_IN.Tok_Zelle;
|
|
T #Dyn.Sk_OUT.Terr_Zelle;
|
|
T #Dyn.Sk_OUT.Tok_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
en08_Mig: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = IN-Sprungverteiler
|
|
L #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
L -1;//angegeben ?
|
|
==I;//Nein !
|
|
SPB INNEU;
|
|
|
|
TAK;//Neuen Schritt übergeben
|
|
T #Dyn.Sk_IN.Akt_Schritt;
|
|
|
|
L -1;//Urzustand
|
|
T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
INNEU: SET;
|
|
R #Ueb_akt ;//Überwachungszeit aktivieren
|
|
R #Warte_neu;//Wartezeit neutriggern
|
|
R #Warte_stop;//Wartezeit stoppen
|
|
|
|
L #Dyn.Sk_IN.Akt_Schritt;
|
|
SPL INEnde;
|
|
SPA INs000 ;//Schritt 0
|
|
SPA INs001 ;//Schritt 1
|
|
SPA INs002 ;//Schritt 2
|
|
SPA INs003 ;//Schritt 3
|
|
SPA INs004 ;//Schritt 4
|
|
SPA INs005 ;//Schritt 5
|
|
SPA INs006 ;//Schritt 6
|
|
SPA INs007 ;//Schritt 7
|
|
SPA INs008 ;//Schritt 8
|
|
SPA INs009 ;//Schritt 9
|
|
SPA INs010 ;//Schritt 10
|
|
SPA INs011 ;//Schritt 11
|
|
SPA INs012 ;//Schritt 12
|
|
SPA INs013 ;//Schritt 13
|
|
SPA INs014 ;//Schritt 14
|
|
SPA INs015 ;//Schritt 15
|
|
SPA INs016 ;//Schritt 16
|
|
SPA INs017 ;//Schritt 17
|
|
SPA INs018 ;//Schritt 18
|
|
SPA INs019 ;//Schritt 19
|
|
SPA INs020 ;//Schritt 20
|
|
SPA INs021 ;//Schritt 21
|
|
SPA INs022 ;//Schritt 22
|
|
SPA INs023 ;//Schritt 23
|
|
SPA INs024 ;//Schritt 24
|
|
SPA INs025 ;//Schritt 25
|
|
SPA INs026 ;//Schritt 26
|
|
SPA INs027 ;//Schritt 27
|
|
SPA INs028 ;//Schritt 28
|
|
SPA INs029 ;//Schritt 29
|
|
SPA INs030 ;//Schritt 30
|
|
INEnde: S #Dyn.Sk_IN.Err_Schritt;//Undefinierter Schritt
|
|
|
|
L 16#AA01;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
INNeu_Mig: U #Dyn.Sk_IN.Err_Uebzeit;
|
|
SPBN INSk;
|
|
|
|
L 16#AA02;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
INSk: T #Dyn.Sk_IN.Akt_Schritt;
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk_IN.Terr_Zelle;
|
|
T #Dyn.Sk_IN.Tok_Zelle;
|
|
L -1;
|
|
T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
SPA INNEU;
|
|
|
|
//Nicht programmierte Schritte:
|
|
//INs000: SPA INEnde
|
|
//INs001: SPA INEnde
|
|
//INs002: SPA INEnde
|
|
INs003: SPA INEnde;
|
|
//INs004 : SPA INEnde
|
|
//INs005: SPA INEnde
|
|
//INs006: SPA INEnde
|
|
//INs007: SPA INEnde
|
|
INs008: SPA INEnde;
|
|
INs009: SPA INEnde;
|
|
INs010: SPA INEnde;
|
|
INs011: SPA INEnde;
|
|
INs012: SPA INEnde;
|
|
INs013: SPA INEnde;
|
|
INs014: SPA INEnde;
|
|
INs015: SPA INEnde;
|
|
INs016: SPA INEnde;
|
|
INs017: SPA INEnde;
|
|
INs018: SPA INEnde;
|
|
INs019: SPA INEnde;
|
|
//INs020: SPA INEnde
|
|
//INs021: SPA INEnde
|
|
INs022: SPA INEnde;
|
|
INs023: SPA INEnde;
|
|
INs024: SPA INEnde;
|
|
INs025: SPA INEnde;
|
|
INs026: SPA INEnde;
|
|
INs027: SPA INEnde;
|
|
INs028: SPA INEnde;
|
|
INs029: SPA INEnde;
|
|
INs030: SPA INEnde;
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt X: Reserve
|
|
SET;//Weiterschaltbedingung
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
|
|
L 16#A001;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
U #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv
|
|
L 20;//Weiter mit Schritt 20
|
|
SPB INNeu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter !
|
|
|
|
L 0;//Angabe der Wartezeit (*10ms)
|
|
SPB INPlus ;//Nächsten Schritt starten
|
|
|
|
L 1;//Weiter mit Schritt 1
|
|
SPB INNeu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
SET;
|
|
U #Dyn.Sk_IN.Auto_akt;//Automatik ist aktiv
|
|
U #Dyn.Sk_IN.Bereich_ok;
|
|
= #Ueb_akt;//Überwachungszeit aktivieren
|
|
L 50 ;//Angabe der Überwachungszeit (*1s)
|
|
SPA INtueb ;//Überwachungszeit
|
|
|
|
SPA OUT_Sk;
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 0: Warten auf Trolley
|
|
INs000: SET ;//Weiterschaltbedingung
|
|
U #B_InSchleuse_IN ;//Trolley im Schleuse erkannt
|
|
U #Dyn.Sk_IN.Auto_akt ;//Automatik ist aktiv
|
|
U #Dyn.Sk_IN.Bereich_ok;
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
R #Dyn.Error.Err_Puffer_nicht_leer_IN;
|
|
|
|
U #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv
|
|
L 20;//Weiter mit Schritt 20
|
|
SPB INNeu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
L 0;
|
|
T #Dyn.TrolleyID_Schleuse_IN;
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter !
|
|
L 100 ;//Angabe der Wartezeit (*10ms)
|
|
SPB INPlus ;//Nächsten Schritt starten
|
|
|
|
L 16#A001;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
//Überwachungszeit starten:
|
|
L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;//Trolleydaten vorhanden ?
|
|
>I ;//Ja !
|
|
UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt
|
|
UN #Schleuse_geöffnet_IN;
|
|
= #Ueb_akt ;//Überwachungszeit aktivieren
|
|
|
|
U #Dyn.Sk_IN.Err_Uebzeit;
|
|
UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt
|
|
UN #Status2.Trolley_nicht_in_Schleuse_IN;//Reset / Inilauf aktiv
|
|
S #Dyn.Error.Err_Trolley_nicht_in_Schleuse_IN;
|
|
|
|
L #Puffer.Übzeit_in_Schleuse;
|
|
|
|
SPA INtueb ;//Überwachungszeit
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 1: Trolley ist in Schleuse / Gleiche Shop-Gruppe?
|
|
INs001: NOP 0;
|
|
|
|
//Schrittaktionen:
|
|
UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt
|
|
L 0 ;//Weiter mit Schritt 0
|
|
T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
SPB OUT_Sk;
|
|
|
|
SET;
|
|
R #Status2.Trolley_nicht_in_Schleuse_IN;
|
|
|
|
//Aber keine Daten mehr ?:
|
|
L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;
|
|
==I;
|
|
SPBN In_Ok;//Negierter Sprung!
|
|
|
|
//Falls ein Trolley reserviert, diesen dann übergeben:
|
|
L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;//Trolley reserviert?
|
|
==I;//Nein!
|
|
S #Status2.Puffer_nicht_leer_IN;
|
|
S #Status2.Puffer_initialisieren_IN;//Damit Einfahren blockiert wird
|
|
SPB In_Ok;
|
|
|
|
//Diesen Trolley als eingefahrenen übergeben:
|
|
L #Dyn.Reservierungs_DL.Res_Trolley[1].Trolley_ID;
|
|
T #Dyn.TrolleyID_Einfahrt;
|
|
|
|
//Puffer unten diesselbe Shop-Gruppe?:
|
|
In_Ok: L #Dyn.ShopGroup_IN;
|
|
L #Dyn.ShopGroup_OUT;
|
|
==D ;//Gleich!
|
|
U(;
|
|
L dint#0;//Und angegeben ?
|
|
<>D;//Ja !
|
|
);
|
|
O #Dyn.Status.Puffer_leer_OUT;//oder leer!
|
|
O #Status2.Puffer_initialisieren_IN;//wird in Schritt 2 gecheckt
|
|
L 2 ;//Weiter mit Schritt 2
|
|
SPB INNeu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
L 16#A011;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
SPA OUT_Sk ;//Warten!
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 2: Nach unten fahren ok ?
|
|
INs002: NOP 0;
|
|
//Schrittaktionen:
|
|
UN #B_InSchleuse_IN ;//Trolley im Schleuse erkannt
|
|
L 0 ;//Weiter mit Schritt 0
|
|
T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
SPB OUT_Sk;
|
|
|
|
//Anlage aus oder Störung:
|
|
L 16#A021;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
UN #Dyn.Sk_IN.Auto_akt ;//Automatik ist aktiv
|
|
ON #Dyn.Sk_IN.Bereich_ok;//Bereich ist gestört
|
|
SPB INX002;
|
|
|
|
//Puffer unten Platz?:
|
|
L 16#A022;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
//Sonderfall Inilauf in beiden Puffern:
|
|
U #Status2.Puffer_initialisieren_IN;
|
|
U #Dyn.Status.Puffer_initialisieren_OUT;
|
|
U #Schleuse_geöffnet_OUT;
|
|
U #B_InSchleuse_OUT;//Nur einmalig
|
|
SPB Y002 ;//Damit schneller fertig
|
|
|
|
UN #Dyn.Status."Puffer_hat Platz_OUT";//Starten ist erlaubt
|
|
SPB INX002;
|
|
|
|
//Kein Antrieb im Puffer:
|
|
Y002: U #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv
|
|
U #Dyn.Sk_OUT.Bereich_ok;
|
|
L 4 ;//Daten an Puffer unten übergeben
|
|
SPB INNeu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
SPA OUT_Sk;
|
|
|
|
INX002: L 1;//Check
|
|
T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
SPA OUT_Sk;
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 4: Pufferdaten unten/oben ändern
|
|
INs004: SET ;//Weiterschaltbedingung
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
//Shop-Group übergeben:
|
|
L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;
|
|
==I ;//Ja !
|
|
= #"1.Trolley_OUT";//Also kommt 1.Trolley
|
|
|
|
UN #"1.Trolley_OUT";
|
|
SPB INNoFirst;
|
|
|
|
//ShopGroup speichern bei 1.Trolley speichern:
|
|
L #Dyn.ShopGroup_IN;
|
|
T #Dyn.ShopGroup_OUT;
|
|
|
|
INNoFirst: NOP 0;
|
|
//Daten an Puffer unten übergeben:
|
|
L #Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Abruf_ShopGroup;
|
|
T "MD224";
|
|
L #Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Trolley_ID;
|
|
T "MD220";
|
|
|
|
//ID: sinnvolle Daten ?
|
|
L DINT#0;
|
|
<>D;
|
|
SPB Daten_ok;
|
|
|
|
L DINT#0 ;//Bleibt trotzdem 0
|
|
T "MD220";
|
|
|
|
//Daten Puffer unten eintragen:
|
|
Daten_ok: L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_Out;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenIn"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
INDATEN := P#M220.0 ,
|
|
RE_VAL := "MB199"
|
|
);
|
|
|
|
//Puffer oben Daten austragen:
|
|
//Austrag aus Trolley-VollPufferliste oben
|
|
L #Dyn.Trolley_DL_Einfahrt.VollPuffer_Trolley_IN[1].Trolley_ID;
|
|
T "MD220";
|
|
|
|
L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_IN;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenOut"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
PARA := 16#E100 , //Eintrag löschen
|
|
SEARCHDATEN := P#M220.0 ,
|
|
RE_VAL := "MB199" ,
|
|
OUTDATEN := P#M220.0 , //Nicht relevant
|
|
Position := "MW196"
|
|
);
|
|
|
|
L 5 ;//Nur 1 langes Signal!
|
|
SPA INNeu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 5: Trolley fährt aus ?
|
|
INs005: SET ;//Weiterschaltbedingung
|
|
UN #B_InSchleuse_IN ;//Sensor Trolley ist in Schleuse
|
|
U #Schleuse_geöffnet_IN;
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
S #Y_Schleuse_Auf_IN;//Schleuse öffnen
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk_IN.Err_Uebzeit;//Sofort weiter !
|
|
R #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus
|
|
L 100 ;//Angabe der Wartezeit (*10ms)
|
|
SPB INPlus ;//Nächsten Schritt starten
|
|
|
|
U #Dyn.Sk_IN.Err_Uebzeit;
|
|
S #Dyn.Error.Err_Trolley_raus_IN;//Trolley fährt nicht aus
|
|
|
|
L 16#B051;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
SET;
|
|
= #Ueb_akt ;//Überwachungszeit aktivieren
|
|
L #Puffer.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s)
|
|
SPA INtueb ;//Überwachungszeit
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 6: Schleuse Mindestzeit geöffnet ?
|
|
INs006: SET ;//Weiterschaltbedingung
|
|
U #Status2.MindestZeit_ok_IN;
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
S #Y_Schleuse_Auf_IN;//Schleuse öffnen
|
|
|
|
U #B_InSchleuse_IN ;//Trolley wieder erkannt
|
|
L 5 ;//Weiter mit Schritt 5
|
|
SPB INNeu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
U #Weiter;
|
|
L 0;
|
|
SPB INPlus ;//Nächsten Schritt starten
|
|
|
|
L 16#B061;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 7: Letzter Trolley oben ?
|
|
INs007: SET ;//Weiterschaltbedingung
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
//Letzter Trolley ausgefahren?:
|
|
L #Dyn.Trolley_DL_Einfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;//Liste leer?
|
|
==I;
|
|
S #Status2.Leer_Check_IN;
|
|
|
|
//Inilauf aktiv?:
|
|
UN #Status2.Puffer_initialisieren_IN;
|
|
SPB INENDE_Mig;
|
|
|
|
L 0 ;//Zeiten löschen
|
|
T #Dyn.Leer_Zeit_IN;
|
|
|
|
SPA INENDE_Mig;
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 20: Schleuse resetten
|
|
INs020: SET ;//Weiterschaltbedingung
|
|
= #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
|
|
//Schrittaktionen:
|
|
L 16#A201;
|
|
T #Dyn.Stop_Ursache_IN;
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
L 300;//Angabe der Wartezeit (*10ms)
|
|
SPB INPlus ;//Nächsten Schritt starten
|
|
|
|
SET;
|
|
= #Ueb_akt;//Überwachungszeit aktivieren
|
|
L 30;//Angabe der Überwachungszeit (*100ms)
|
|
SPA INtueb ;//Überwachungszeit
|
|
|
|
NETWORK
|
|
TITLE = IN-Schritt 21: Reset ist zu Ende
|
|
INs021: SET;
|
|
R #Dyn.Sk_IN.Reset_Akt;//Reset ist aktiv
|
|
R #Dyn.HMI.Schleuse_resetten_IN;
|
|
|
|
SPA INENDE_Mig ;//Neubeginn
|
|
|
|
NETWORK
|
|
TITLE = IN-Schrittkette beenden
|
|
INENDE_Mig: L 0;//Schritt 0: Warten
|
|
T #Dyn.Sk_IN.Akt_Schritt;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk_IN.Terr_Zelle;
|
|
T #Dyn.Sk_IN.Tok_Zelle;
|
|
|
|
SET;
|
|
R #Dyn.Sk_IN.Err_Uebzeit;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
NETWORK
|
|
TITLE = IN-Nächsten Schritt aktivieren
|
|
INPlus: T #Dyn.Sk_IN.T_ok;//Wartezeit übergeben
|
|
|
|
U #Dyn.Sk_IN.Err_Uebzeit ;//Störung noch nicht quittiert
|
|
SPB OUT_Sk;
|
|
|
|
L 0;//keine Wartezeit ?
|
|
==I;//Ja ! -> sofort weiter
|
|
SPB INw220;
|
|
|
|
UN #Warte_neu;//Wartezeit neutriggern
|
|
SPB INW220_Mig;
|
|
|
|
L 0;
|
|
T #Dyn.Sk_IN.Tok_Zelle;//Wartezeit
|
|
|
|
INW220_Mig: U #Warte_stop;//Wartezeit stoppen
|
|
SPB OUT_Sk;
|
|
|
|
L #Dyn.Sk_IN.Tok_Zelle;
|
|
L "MW4";//Wartezeit +10ms
|
|
+I;
|
|
T #Dyn.Sk_IN.Tok_Zelle;//Wartezeit
|
|
L #Dyn.Sk_IN.T_ok;//abgelaufen ?
|
|
<I;//Nein !
|
|
SPB OUT_Sk;
|
|
|
|
INw220: L #Dyn.Sk_IN.Akt_Schritt;
|
|
+ 1;//Schritt +1
|
|
T #Dyn.Sk_IN.Akt_Schritt;
|
|
|
|
L -1;
|
|
T #Dyn.Sk_IN.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk_IN.Terr_Zelle;
|
|
T #Dyn.Sk_IN.Tok_Zelle;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
NETWORK
|
|
TITLE = IN-Überwachungszeit kontrollieren
|
|
INtueb: U #Ueb_akt;
|
|
= #Dyn.Sk_IN.Ueb_akt;//Für Statuskontrolle
|
|
|
|
T #Dyn.Sk_IN.T_Err;//Für Statuskontrolle
|
|
L #Dyn.Sk_IN.Terr_Zelle;//Maximalzeit
|
|
>I;//abgelaufen ?
|
|
UN #Dyn.Sk_IN.Err_Uebzeit;
|
|
SPB INen24 ;//Nein !
|
|
|
|
U #Ueb_akt;//Überwachungszeit aktivieren
|
|
S #Dyn.Sk_IN.Err_Uebzeit;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk_IN.Terr_Zelle;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
INen24: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = IN-Überwachungszeit +1
|
|
UN #Dyn.Sk_IN.Ueb_akt;//Schrittaktion ist aktiv
|
|
ON "1s-Impuls";
|
|
SPB OUT_Sk;
|
|
|
|
L #Dyn.Sk_IN.Terr_Zelle;
|
|
+ 1 ;//Üb.zeit +1s
|
|
T #Dyn.Sk_IN.Terr_Zelle;
|
|
|
|
SPA OUT_Sk;
|
|
|
|
NETWORK
|
|
TITLE = OUT-Sprungverteiler
|
|
OUT_Sk: L #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
L -1;//angegeben ?
|
|
==I;//Nein !
|
|
SPB NEU;
|
|
|
|
TAK;//Neuen Schritt übergeben
|
|
T #Dyn.Sk_OUT.Akt_Schritt;
|
|
|
|
L -1;//Urzustand
|
|
T #Dyn.Sk_OUT.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_OUT.Akt_Schritt;
|
|
SPL Ende;
|
|
SPA s000;//Schritt 0
|
|
SPA s001;//Schritt 1
|
|
SPA s002;//Schritt 2
|
|
SPA s003;//Schritt 3
|
|
SPA s004;//Schritt 4
|
|
SPA s005;//Schritt 5
|
|
SPA s006;//Schritt 6
|
|
SPA s007;//Schritt 7
|
|
SPA s008;//Schritt 8
|
|
SPA s009;//Schritt 9
|
|
SPA s010;//Schritt 10
|
|
SPA s011;//Schritt 11
|
|
SPA s012;//Schritt 12
|
|
SPA s013;//Schritt 13
|
|
SPA s014;//Schritt 14
|
|
SPA s015;//Schritt 15
|
|
SPA s016;//Schritt 16
|
|
SPA s017;//Schritt 17
|
|
SPA s018;//Schritt 18
|
|
SPA s019;//Schritt 19
|
|
SPA s020;//Schritt 20
|
|
SPA s021;//Schritt 21
|
|
SPA s022;//Schritt 22
|
|
SPA s023;//Schritt 23
|
|
SPA s024;//Schritt 24
|
|
SPA s025;//Schritt 25
|
|
SPA s026;//Schritt 26
|
|
SPA s027;//Schritt 27
|
|
SPA s028;//Schritt 28
|
|
SPA s029;//Schritt 29
|
|
SPA s030;//Schritt 30
|
|
Ende: S #Dyn.Sk_OUT.Err_Schritt;//Undefinierter Schritt
|
|
|
|
L 16#A131;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
SPA RET;
|
|
|
|
Neu_Mig: U #Dyn.Sk_OUT.Err_Uebzeit;
|
|
SPBN Sk;
|
|
|
|
L 16#A132;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
SPA RET;
|
|
|
|
Sk: T #Dyn.Sk_OUT.Akt_Schritt;
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk_OUT.Terr_Zelle;
|
|
T #Dyn.Sk_OUT.Tok_Zelle;
|
|
|
|
SPA NEU;
|
|
|
|
//Nicht programmierte Schritte:
|
|
//s000: SPA Ende
|
|
//s001: SPA Ende
|
|
//s002: SPA Ende
|
|
s003: SPA Ende;
|
|
s004: SPA Ende;
|
|
//s005: SPA Ende
|
|
//s006: SPA Ende
|
|
//s007: SPA Ende
|
|
s008: SPA 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: SPA Ende;
|
|
s019: SPA Ende;
|
|
//s020: SPA Ende
|
|
//s021: SPA Ende
|
|
s022: SPA Ende;
|
|
s023: SPA Ende;
|
|
s024: SPA Ende;
|
|
s025: SPA Ende;
|
|
s026: SPA Ende;
|
|
s027: SPA Ende;
|
|
s028: SPA Ende;
|
|
s029: SPA Ende;
|
|
s030: SPA Ende;
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt X: Reserve
|
|
SET;//Weiterschaltbedingung
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
|
|
L 16#B001;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv
|
|
L 20;//Weiter mit Schritt 20
|
|
SPB Neu_Mig;//Bei diesem Schritt weiter
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter !
|
|
L 0 ;//Angabe der Wartezeit (*10ms)
|
|
SPB Plus;//Nächsten Schritt starten
|
|
|
|
L 1;//Weiter mit Schritt 1
|
|
SPB Neu_Mig;//Bei diesem Schritt weiter
|
|
|
|
T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
SET;
|
|
U #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv
|
|
U #Dyn.Sk_OUT.Bereich_ok;
|
|
= #Ueb_akt;//Überwachungszeit aktivieren
|
|
L 50 ;//Angabe der Überwachungszeit (*1s)
|
|
SPA tueb;//Überwachungszeit
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt 0: Warten auf Trolley
|
|
s000: SET;//Weiterschaltbedingung
|
|
U #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt
|
|
U #Dyn.Sk_OUT.Auto_akt ;//Automatik ist aktiv
|
|
U #Dyn.Sk_OUT.Bereich_ok;
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
R #Dyn.Error.Err_Puffer_nicht_leer_OUT;
|
|
|
|
U #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv
|
|
L 20;//Weiter mit Schritt 20
|
|
SPB Neu_Mig;//Bei diesem Schritt weiter
|
|
|
|
L 0;
|
|
T #Dyn.TrolleyID_Schleuse_Out;
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter !
|
|
L 100 ;//Angabe der Wartezeit (*10ms)
|
|
SPB Plus;//Nächsten Schritt starten
|
|
|
|
L 16#B001;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
//Überwachungszeit starten:
|
|
L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;//Trolleydaten vorhanden ?
|
|
>I ;//Ja !
|
|
UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt
|
|
UN #Schleuse_geöffnet_OUT;
|
|
= #Ueb_akt ;//Überwachungszeit aktivieren
|
|
|
|
U #Dyn.Sk_OUT.Err_Uebzeit;
|
|
UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt
|
|
UN #Dyn.Status.Trolley_nicht_in_Schleuse_OUT;//Reset / Inilauf aktiv
|
|
S #Dyn.Error.Err_Trolley_nicht_in_Schleuse_OUT;
|
|
|
|
L #Puffer.Übzeit_in_Schleuse;
|
|
|
|
SPA tueb;//Überwachungszeit
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt 1: Trolley ist in Schleuse / Warten auf Auftrag
|
|
s001: NOP 0;
|
|
|
|
//Schrittaktionen:
|
|
UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt
|
|
L 0 ;//Weiter mit Schritt 0
|
|
SPB Neu_Mig;//Bei diesem Schritt weiter
|
|
|
|
L #Dyn.Trolley_DL_Ausfahrt.VollPuffer_Trolley_Out[1].Trolley_ID;
|
|
T #Dyn.TrolleyID_Schleuse_Out;//Damit bei Ausfahrt angezeigt werden kann
|
|
|
|
//Aber keine Daten mehr ?:
|
|
L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;
|
|
==I;
|
|
S #Dyn.Status.Puffer_nicht_leer_OUT;
|
|
S #Dyn.Status.Puffer_initialisieren_OUT;//Damit Einfahren blockiert wird
|
|
|
|
//Spezial-Betriebsarten:
|
|
U #Dyn.Status.Einen_VollTrolley_ausfahren_OUT;
|
|
O #Status2.Alles_ausfahren_OUT;
|
|
O #Dyn.Status.Puffer_initialisieren_OUT;
|
|
O;
|
|
U #Dyn.Status."Undef.Trolley_in_Schleuse_OUT";
|
|
UN #Schleuse_geöffnet_IN;//Trolley fährt noch ein
|
|
L 2 ;//Weiter mit Schritt 2
|
|
SPB Neu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
//Trolleydaten anzeigen:
|
|
L 16#B011;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
L #Dyn.TrolleyID_Schleuse_Out;
|
|
L DINT#0;
|
|
==D;//Nein!
|
|
= #Dyn.Error.Err_Puffer_nicht_leer_IN;
|
|
SPB RET;
|
|
|
|
//TrolleyID checken, ob in Trolleyliste:
|
|
/// CALL "Trolley_DL_Check_ID"
|
|
// Gesamt_Trolley_DL :=#Puffer.Gesamt_Trolley_DL
|
|
// TrolleyID :=#Dyn.TrolleyID_Schleuse_Out
|
|
// Check_EndZiel :="MW220"//Hier uninteressant
|
|
// Check_ZwischenZiel :="MW220"//Hier uninteressant
|
|
// Check_ShopGroup :="MD220"//Hier uninteressant
|
|
// Check_Standort :="MW220"//Hier uninteressant
|
|
// Err :=#Dyn.Error.Err_TrolleyID_Schleuse_unbekannt
|
|
|
|
//Ausfahr-Auftrag vorhanden?:
|
|
L 16#B012;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
L #Dyn.ShopGroup_Auftrag_zum_Ausfahren;//TrolleyID zum Ausfahren angegeben?
|
|
T "MD220";
|
|
L DINT#0;
|
|
==D;//Nein!
|
|
S #Dyn.Status.Trolley_wartet_Auftrag;
|
|
SPB RET;
|
|
|
|
//Definierten Trolley checken, ob in TrolleyListe vorhanden:
|
|
L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_Out;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenOut"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
PARA := 16#0000 , //Eintrag suchen
|
|
SEARCHDATEN := P#M220.0 ,
|
|
RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_OUT ,
|
|
OUTDATEN := P#M220.0 , //Nicht relevant
|
|
Position := "MW196"
|
|
);
|
|
|
|
L 16#B013;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
L #Dyn.Rueckmld.RET_VAL_DL_VollPufferTrolley_OUT;
|
|
L 2#10000000;
|
|
<>I;
|
|
/// = #Dyn.Error.Err_TrolleyID_nicht_im_Leerpuffer
|
|
S #Dyn.Status.Trolley_wartet_Auftrag;
|
|
SPB RET;
|
|
|
|
L 2 ;//Weiter mit Schritt 2
|
|
SPA Neu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt 2: Ausfahren ok ?
|
|
s002: NOP 0;
|
|
|
|
//Schrittaktionen:
|
|
UN #B_InSchleuse_OUT ;//Trolley im Schleuse erkannt
|
|
L 0 ;//Weiter mit Schritt 0
|
|
SPB 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_OUT;
|
|
|
|
UN #Dyn.Sk_OUT.Auto_akt ;//Automatik ist aktiv
|
|
ON #Dyn.Sk_OUT.Bereich_ok;//Bereich ist gestört
|
|
SPB X002;
|
|
|
|
//Starten erlaut Trolley ?:
|
|
L 16#B021;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
UN #Start_Ok ;//Starten ist erlaubt
|
|
SPB X002;
|
|
|
|
//Inks ok ?:
|
|
L 16#B022;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
UN #Inks_Ok ;//Starten ist erlaubt
|
|
SPB X002;
|
|
|
|
//Stau im Bereich +1:
|
|
L 16#B023;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
U #B_Stau_raus_Out;
|
|
SPB X002 ;//Stau
|
|
|
|
//B_Aus_Schleuse aktiv:
|
|
L 16#B024;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
U #Puffer.Parameter_allg.B_AusSep_vorhanden;
|
|
U #B_AusSchleuse_OUT;
|
|
= #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)!
|
|
SPB X002;
|
|
|
|
//Antriebe aktivieren / aktiv ?:
|
|
U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche)
|
|
S #Antrieb_plus_start;//Kreisel-Antrieb plus starten
|
|
|
|
L 16#B025;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
UN #Antrieb_plus_aktiv;//Kreisel-Antrieb plus aktiv
|
|
U #Puffer.Parameter_allg.Antrieb_Plus_vorhanden;//Schleuse an weiterem Antrieb (Weiche)
|
|
ON #Dyn.Sk_OUT.Auto_akt;//Automatik ist aktiv
|
|
ON #Dyn.Sk_OUT.Bereich_ok;
|
|
SPB RET;
|
|
|
|
L 5 ;//Nur 1 langes Signal!
|
|
SPA Neu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
X002: L 1 ;//Auftrag checken
|
|
T #Dyn.Sk_OUT.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt 5: Trolley fährt aus/ausgefahren ?
|
|
s005: SET ;//Weiterschaltbedingung
|
|
UN #B_InSchleuse_OUT ;//Sensor Trolley ist in Schleuse
|
|
U(;
|
|
O #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren
|
|
ON #Puffer.Parameter_allg.B_AusSep_vorhanden;
|
|
);
|
|
U #Antrieb_plus_aktiv;
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
R #Start_Ok ;//Damit kein weiterer Puffer ausfährt
|
|
S #Y_Schleuse_Auf_OUT ;//Schleuse öffnen
|
|
S #Dyn.Status.Trolley_fährt_aus_OUT;
|
|
S #Antrieb_plus_start;//Kreisel-Antrieb plus starten
|
|
|
|
//Trolley ist draussen:
|
|
U(;
|
|
O #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren
|
|
ON #Puffer.Parameter_allg.B_AusSep_vorhanden;
|
|
);
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter !
|
|
R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus
|
|
L 0;
|
|
SPB Plus ;//Nächsten Schritt starten
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;//Sofort weiter !
|
|
R #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus
|
|
L 50;//Falls nur mit Sensor gefahren wird, dann Wartezeit!
|
|
SPB Plus ;//Nächsten Schritt starten
|
|
|
|
//Trolley fährt nicht raus!:
|
|
U #Dyn.Sk_OUT.Err_Uebzeit;
|
|
O #B_QuerTrolley_Out;//QuerTrolley auf Crashkurs
|
|
S #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus
|
|
|
|
L 16#B051;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
UN #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren
|
|
SPB x052;
|
|
|
|
L 16#B052;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
x052: U #Antrieb_plus_aktiv;
|
|
= #Ueb_akt ;//Überwachungszeit aktivieren
|
|
L #Puffer.Übzeit_aus_Schleuse;//Angabe der Überwachungszeit (*1s)
|
|
SPA tueb ;//Überwachungszeit
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt 6: Schleuse Mindestzeit geöffnet ?
|
|
s006: SET ;//Weiterschaltbedingung
|
|
U #Dyn.Status.MindestZeit_ok_OUT;
|
|
O;
|
|
U #Puffer.Parameter_allg.B_AusSep_vorhanden;
|
|
U #B_AusSchleuse_OUT ;//Sensor Trolley aus Schleuse gefahren
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
U #B_QuerTrolley_Out ;//QuerTrolley auf Crashkurs
|
|
S #Dyn.Error.Err_Trolley_raus_OUT;//Trolley fährt nicht aus
|
|
|
|
SET;
|
|
R #Start_Ok;//Damit kein weiterer Puffer ausfährt
|
|
S #Y_Schleuse_Auf_OUT ;//Schleuse öffnen
|
|
S #Antrieb_plus_start;//Kreisel-Antrieb plus starten
|
|
S #Dyn.Status.Trolley_fährt_aus_OUT;
|
|
|
|
U #B_InSchleuse_OUT;//Trolley wieder erkannt
|
|
L 5 ;//Weiter mit Schritt 5
|
|
SPB Neu_Mig;//Bei diesem Schritt weiter
|
|
|
|
U #Weiter;
|
|
L 0;
|
|
SPB Plus ;//Nächsten Schritt starten
|
|
|
|
L 16#B061;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
SPA RET;
|
|
NETWORK
|
|
TITLE = OUT-Schritt 7: Trolleydaten ändern
|
|
s007: SET ;//Weiterschaltbedingung
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
R #Dyn.Status.Einen_VollTrolley_ausfahren_OUT;
|
|
S #Dyn.Status.Trolley_draussen_Out;//1 Zyklus
|
|
|
|
L #Dyn.Vereinzelungstakte_OUT;
|
|
+ DINT#1;//Vereinzelungen +1
|
|
T #Dyn.Vereinzelungstakte_OUT;
|
|
|
|
//Neue Position B01A an Trolleyliste übergeben:
|
|
CALL "Trolley_DL_Neue_Pos"
|
|
( Gesamt_Trolley_DL := #Puffer.Gesamt_Trolley_DL ,
|
|
TrolleyID := #Dyn.TrolleyID_Schleuse_Out ,
|
|
Position := 16#B01A ,
|
|
ShopGroup := DINT#0 ,
|
|
Err := "M199.0"
|
|
);
|
|
|
|
//Austrag aus Trolley-VollPufferliste
|
|
L #Dyn.TrolleyID_Schleuse_Out;
|
|
T "MD220";
|
|
T #Dyn.TrolleyID_ausgefahren;
|
|
|
|
L #Puffer.Puffer_Dyn_DW;
|
|
L #Puffer.PufferTrolleyliste_DW_Out;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
CALL "DatenOut"
|
|
( SSDB := #Puffer.Puffer_Dyn_DB ,
|
|
SSDW := #SSDW ,
|
|
PARA := 16#E100 , //Eintrag löschen
|
|
SEARCHDATEN := P#M220.0 ,
|
|
RE_VAL := "MB199" ,
|
|
OUTDATEN := P#M220.0 , //Nicht relevant
|
|
Position := "MW196"
|
|
);
|
|
|
|
//Gewollter Trolley ausgefahren?:
|
|
L #Dyn.ShopGroup_Auftrag_zum_Ausfahren;
|
|
L #Dyn.TrolleyID_ausgefahren;
|
|
<>I;//Nicht identisch!
|
|
SPB NixAuftrag;
|
|
|
|
L 0;//Auftrag löschen, da ausgefahren
|
|
T #Dyn.ShopGroup_Auftrag_zum_Ausfahren;
|
|
|
|
//Trolley löschen:
|
|
NixAuftrag: L DINT#0;
|
|
T #Dyn.TrolleyID_Schleuse_Out;
|
|
|
|
//Letzter Trolley ausgefahren?:
|
|
L #Dyn.Trolley_DL_Ausfahrt.Datenlistenkopf.AnzahlEintraege;
|
|
L 0;//Liste leer?
|
|
==I;
|
|
S #Dyn.Status.Leer_Check_OUT;
|
|
|
|
SPA ENDE_Mig;
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt 20: Schleuse resetten
|
|
s020: SET;//Weiterschaltbedingung
|
|
= #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
|
|
//Schrittaktionen:
|
|
U #Schleuse_geöffnet_OUT;
|
|
R #Start_Ok;//Damit kein weiterer Puffer ausfährt
|
|
|
|
L 16#B201;
|
|
T #Dyn.Stop_Ursache_OUT;
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
L 300;//Angabe der Wartezeit (*10ms)
|
|
SPB Plus;//Nächsten Schritt starten
|
|
|
|
SET;
|
|
= #Ueb_akt;//Überwachungszeit aktivieren
|
|
L 30;//Angabe der Überwachungszeit (*100ms)
|
|
SPA tueb;//Überwachungszeit
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schritt 21: Reset ist zu Ende
|
|
s021: SET;
|
|
R #Dyn.Sk_OUT.Reset_Akt;//Reset ist aktiv
|
|
R #Dyn.HMI.Schleuse_resetten_OUT;
|
|
|
|
SPA ENDE_Mig;//Neubeginn
|
|
|
|
NETWORK
|
|
TITLE = OUT-Schrittkette beenden
|
|
ENDE_Mig: L 0;//Schritt 0: Warten
|
|
T #Dyn.Sk_OUT.Akt_Schritt;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk_OUT.Terr_Zelle;
|
|
T #Dyn.Sk_OUT.Tok_Zelle;
|
|
|
|
SET;
|
|
R #Dyn.Sk_OUT.Err_Uebzeit;
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = OUT-Nächsten Schritt aktivieren
|
|
Plus: T #Dyn.Sk_OUT.T_ok;//Wartezeit übergeben
|
|
|
|
U #Dyn.Sk_OUT.Err_Uebzeit ;//Störung noch nicht quittiert
|
|
SPB RET;
|
|
|
|
L 0;//keine Wartezeit ?
|
|
==I;//Ja ! -> sofort weiter
|
|
SPB w220;
|
|
|
|
UN #Warte_neu;//Wartezeit neutriggern
|
|
SPB W220_Mig;
|
|
|
|
L 0;
|
|
T #Dyn.Sk_OUT.Tok_Zelle;//Wartezeit
|
|
|
|
W220_Mig: U #Warte_stop;//Wartezeit stoppen
|
|
SPB RET;
|
|
|
|
L #Dyn.Sk_OUT.Tok_Zelle;
|
|
L "MW4";//Wartezeit +10ms
|
|
+I;
|
|
T #Dyn.Sk_OUT.Tok_Zelle;//Wartezeit
|
|
L #Dyn.Sk_OUT.T_ok;//abgelaufen ?
|
|
<I;//Nein !
|
|
SPB RET;
|
|
|
|
w220: L #Dyn.Sk_OUT.Akt_Schritt;
|
|
+ 1;//Schritt +1
|
|
T #Dyn.Sk_OUT.Akt_Schritt;
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk_OUT.Terr_Zelle;
|
|
T #Dyn.Sk_OUT.Tok_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = OUT-Überwachungszeit kontrollieren
|
|
tueb: U #Ueb_akt;
|
|
= #Dyn.Sk_OUT.Ueb_akt;//Für Statuskontrolle
|
|
|
|
T #Dyn.Sk_OUT.T_Err;//Für Statuskontrolle
|
|
L #Dyn.Sk_OUT.Terr_Zelle;//Maximalzeit
|
|
>I;//abgelaufen ?
|
|
UN #Dyn.Sk_OUT.Err_Uebzeit;
|
|
SPB en24;//Nein !
|
|
|
|
U #Ueb_akt;//Überwachungszeit aktivieren
|
|
S #Dyn.Sk_OUT.Err_Uebzeit;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk_OUT.Terr_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
en24: NOP 0;
|
|
NETWORK
|
|
TITLE = OUT-Überwachungszeit +1
|
|
UN #Dyn.Sk_OUT.Ueb_akt;//Schrittaktion ist aktiv
|
|
ON "1s-Impuls";
|
|
SPB RET;
|
|
|
|
L #Dyn.Sk_OUT.Terr_Zelle;
|
|
+ 1 ;//Üb.zeit +1s
|
|
T #Dyn.Sk_OUT.Terr_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = Ende
|
|
RET: NOP 0;
|
|
|
|
U #Dyn.Status.Puffer_initialisieren_OUT;
|
|
O #Status2.Alles_ausfahren_OUT;
|
|
R #Start_Ok;//Sonst starten Alle auf einmal durcheinander!
|
|
|
|
BE;
|
|
|
|
END_FUNCTION_BLOCK
|
|
|