Files
HundM_awl/=A01+UH07-KF00/Programmbausteine/Module/MHMEntnahmepuffer.awl
T

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