Files
HundM_awl/=A01+UH07-KF00/Programmbausteine/Module/MHMÜberlauf_VP.awl
T

1253 lines
54 KiB
Plaintext

FUNCTION_BLOCK "MHMÜberlauf_VP"
TITLE = Omni H&M-Überlaufstrecke-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 ÜberlaufstreckeVP / 03.2026:
//
//Formaloperanden + Daten bleiben erhalten, damit kein Unterschied bei Zugriffen,
//aber Mittig-Stopper entfernt, usw.
//
//Version: H&M Vollpuffer / 10.2025
//
//Version: Omniflow 2100 / 10.2024
//
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;
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;//Ohne Reaktion, da keine Daten
U #Dyn.HMI.Einlagern_gesperrt;//Wird unten direkt verarbeitet
U #Dyn.HMI.AusLagern_gesperrt;//Wird unten direkt verarbeitet
CLR;
//An HMI:
L 0;
T #Dyn.HMI.ShopGroup_IN;
T #Dyn.HMI.ShopGroup_OUT;
T #Dyn.HMI.Voll_Trolleys_IN;
T #Dyn.HMI.Voll_Trolleys_OUT;
T #Dyn.HMI.Res_Trolleys_IN;
T #Dyn.HMI.Frei_Plätze_IN;
L DINT#0;
T #Dyn.HMI.TrolleyID_Schleuse_IN;
T #Dyn.HMI.TrolleyID_Schleuse_OUT;
NETWORK
TITLE = Schrittkette OUT zurücksetzen
UN #Dyn.Sk_OUT.Reset;//SK zurücksetzen
SPB en04;
//Schrittkette zurücksetzen:
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 aus Reservierungliste austragen
L #Dyn.TrolleyID_Einfahrt;
T "MD220";
L DINT#0;
==I;
SPB NoNewT;
//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"
);
//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 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 = 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 = Puffer oben hat Platz / ist frei
//Puffer hat Platz:
L #Dyn.Reservierungs_DL.Datenlistenkopf.AnzahlEintraege;
L #Puffer.MaxAnzahl_Einfahrt;
<I;
UN #Dyn.Error.Err_Stau_Einfahrt;
= #Status2."Puffer_hat Platz_IN";
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 = 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;
SPA RET;
NETWORK
TITLE = OUT-Schritt 1: Trolley ist in Schleuse
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 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;
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;
BE;
END_FUNCTION_BLOCK