279 lines
13 KiB
Plaintext
279 lines
13 KiB
Plaintext
FUNCTION_BLOCK "MHMEntnahmepuffer"
|
|
TITLE = Omni H&M-EntnahmePuffer-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 Leerpuffer / 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
|
|
EntnahmePuffer_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Leer-Puffer
|
|
B_LeerpufferEinfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Leerpuffer
|
|
END_VAR
|
|
|
|
VAR_OUTPUT
|
|
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben
|
|
END_VAR
|
|
|
|
VAR_IN_OUT
|
|
hStOk : Bool; // Anzeige Start n. Störung aktivieren
|
|
END_VAR
|
|
|
|
VAR
|
|
Res16 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..4] 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
|
|
Entnahmepuffer_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-Datenliste-DB
|
|
Entnahmepuffer_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Leerpuffer-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
|
|
Abruf_ist_möglich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Abruf ist möglich
|
|
Kein_Stop_mehr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
Eintrag_DL_Leerliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_leer (DB500) erfolgt
|
|
Eintrag_DL_Reinliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Einfahren (DB501) erfolgt
|
|
Eintrag_Abrufliste_erfolgt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Eintrag in DLLPPuffer_Ausfahren (DB502) erfolgt
|
|
END_STRUCT;
|
|
Puffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UDLHMEntnahmePuffer"; // Statische Leerpufferdaten (aus DL)
|
|
Dyn : Struct // Dynamische Daten
|
|
Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
Puffer_OUT_leer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer ist leer
|
|
"Puffer_OUT_hat Platz" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Puffer hat noch Kapazität
|
|
"Undef.Trolley_in_Schleuse_OUT" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Undefinierter Trolley in Schleuse unten erkannt
|
|
Trolley_fährt_in_Schleuse_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt in Schleuse (unten)
|
|
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)
|
|
Trolley_fährt_aus_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus (unten)
|
|
MindestZeit_ok_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Schleuse ist MindestZeit geöffnet
|
|
Trolley_draussen_Out { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren
|
|
Trolley_OUT_nicht_in_Schleuse { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt nicht in Schleuse
|
|
Leer_Check_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer wird auf leer gecheckt
|
|
Alles_ausfahren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Alle Trolleys ausfahren
|
|
Leerpuffer_initialisieren { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Leerpuffer initialisieren
|
|
Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden
|
|
Reset_aktiv_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Reset aktiv
|
|
END_STRUCT;
|
|
TrolleyID_Einfahrt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr ist eingefahren
|
|
Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
RET_VAL_BLKMOV_EntnahmePuffer { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf
|
|
RET_VAL_DL_EntnahmePuffer { 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_EntnahmePufferTrolley_IN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenIN-Aufruf
|
|
RET_VAL_DL_EntnahmePufferTrolley_OUT { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
|
|
END_STRUCT;
|
|
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UErrHMEntnahmePuffer";
|
|
Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_Einfahrt ist belegt [1s]
|
|
Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position
|
|
Res500 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..206] of Int;
|
|
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
|
|
Inks_Ok : Bool; // Starten aufgrund der Inks erlaubt
|
|
Puffer_ist_leer : Bool; // Leerpuffer zeitlang ohne Sensor
|
|
Abruf_Trolley_vorne : Bool; // Abruf-Trolley ist in Schleuse
|
|
Oberen_Puffer_Freigeben : Bool;
|
|
GesamtAnzahl : Int;
|
|
SSDW : Int;
|
|
Schleife : Word; // Loopzähler
|
|
Trolley : Int;
|
|
Position : Int;
|
|
END_VAR
|
|
|
|
|
|
BEGIN
|
|
NETWORK
|
|
TITLE = Parameter-Übergabe
|
|
L #EntnahmePuffer_Nr;
|
|
|
|
L 275 ;//Einsprung Puffer-DL
|
|
T #Para.Entnahmepuffer_DL_DB;//vor Aufruf übergeben!
|
|
L 0;
|
|
T #Para.Entnahmepuffer_DL_DW;
|
|
|
|
NETWORK
|
|
TITLE = Statische Entnahmepuffer-Parameter holen
|
|
L #Puffer.EntnahmePuffer_Nr;//Nummer des EntnahmePuffers
|
|
L #EntnahmePuffer_Nr ;//Aufruf-Parameter
|
|
==I;//Identisch ?
|
|
R #Dyn.Error.Entnahmepuffer_DL;//EntnahmePufferdatenbank fehlerhaft
|
|
R #Dyn.Error.Undef_Entnahmepuffer;//undefiniertes EntnahmePuffer
|
|
SPB en06;//Ja !
|
|
|
|
T "MW200";//Search-Daten
|
|
|
|
CALL "DatenOut"
|
|
( SSDB := #Para.Entnahmepuffer_DL_DB ,
|
|
SSDW := #Para.Entnahmepuffer_DL_DW ,
|
|
PARA := WORD#16#0000 ,
|
|
SEARCHDATEN := P#M200.0 ,
|
|
RE_VAL := #Dyn.Rueckmld.RET_VAL_DL_EntnahmePuffer ,
|
|
OUTDATEN := P#M220.0 ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
SPBI G_Ok;
|
|
|
|
U "M199.0";
|
|
SPBN w060;
|
|
|
|
SET;
|
|
= #Dyn.Error.Entnahmepuffer_DL;//EntnahmePufferdatenbank fehlerhaft
|
|
|
|
L 16#A061;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
BEA;
|
|
|
|
w060: SET;
|
|
S #Dyn.Error.Undef_Entnahmepuffer;//undefinierter EntnahmePuffer
|
|
|
|
L 16#0062;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
BEA;
|
|
|
|
//Kennung + Datenbytes
|
|
G_Ok: SET;
|
|
R #Dyn.Error.Entnahmepuffer_DL;//Gefälledatenbank fehlerhaft
|
|
R #Dyn.Error.Undef_Entnahmepuffer;//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_EntnahmePuffer ,
|
|
DSTBLK := #Puffer //#Ziel
|
|
);
|
|
|
|
L 16#0063;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
L #Dyn.Rueckmld.RET_VAL_BLKMOV_EntnahmePuffer;//Rückmeldung
|
|
L 0;//Fehler vorhanden ?
|
|
<>I;//Ja !
|
|
= #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren
|
|
BEB;
|
|
|
|
L #Puffer.Puffer_Typ ;//Puffertyp = 1278 (EntnahmePuffer)
|
|
L 1278 ;//Dieser Aufruf-FB ?
|
|
==I;//Ja !
|
|
SPB w061;
|
|
|
|
SET;
|
|
S #Dyn.Error.Undef_Entnahmepuffer;//undefinierter EntnahmePuffer
|
|
|
|
L 0 ;//EntnahmePuffer ungültig !
|
|
T #Puffer.EntnahmePuffer_Nr;//Nummer des EntnahmePuffers
|
|
|
|
L 16#0064;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
BEA;
|
|
|
|
//Defaultwerte übergeben:
|
|
w061: NOP 0;
|
|
|
|
BEA;
|
|
|
|
en06: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Einfahrenden Trolley verarbeiten
|
|
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"
|
|
);
|
|
|
|
NoNewT: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Error: Stau Bereich-Eingang
|
|
|
|
//Sensor bei Bereichs-Einfahrt bleibt belegt?:
|
|
UN #B_LeerpufferEinfahrt ;//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 = Ende
|
|
BE;
|
|
|
|
END_FUNCTION_BLOCK
|
|
|