1428 lines
46 KiB
Plaintext
1428 lines
46 KiB
Plaintext
FUNCTION_BLOCK "MHMOmniBereich_Plus"
|
|
TITLE = HM-OmniBereich-Modul Plus
|
|
{ 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: HM-Omniflow 2100 / 09.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: Bereich Mindestzeit öffnen
|
|
//Schritt 16: Trolley ausgefahren ?
|
|
//Schritt 17: Trolley ist draussen
|
|
//Schritt 18: BM wurde vereinzelt
|
|
//Schritt 19: Beladezustand checken
|
|
//Schritt 20: Bereich resetten
|
|
//Schritt 21: Reset ist zu Ende
|
|
//
|
|
VAR_INPUT
|
|
Bereichs_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Bereich
|
|
ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren
|
|
B_BereichsAnfang { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley fährt in Bereich
|
|
B_BereichsEnde { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley istam BereichsEnde
|
|
B_Zähl { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Trolley hat Bereich verlassen
|
|
B_Stau_raus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Sensor Stau im Bereich rausfahren
|
|
Start_Ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Starten ist erlauTrolley
|
|
Antrieb_Bereich_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Bereichs-Antrieb aktiv
|
|
Antrieb_plus_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus aktiv
|
|
RestZeit_Bereich_plus : Int := 999; // Bereich +1: Restzeit bis AFS stoppt (s)
|
|
END_VAR
|
|
|
|
VAR_OUTPUT
|
|
Antrieb_Bereich_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Bereichs-Antrieb einschalten
|
|
Antrieb_Bereich_stop : Bool; // Bereichs-Antrieb stoppen
|
|
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben
|
|
END_VAR
|
|
|
|
VAR_IN_OUT
|
|
Antrieb_Bereich_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Bereichs-Antrieb mit Zeit starten
|
|
Antrieb_plus_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus einschalten
|
|
Antrieb_plus_start { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Antrieb plus mit Zeit starten
|
|
Antrieb_minus_vor : Bool; // Antrieb minus einschalten
|
|
hStOk : Bool; // Anzeige Start n. Störung aktivieren
|
|
END_VAR
|
|
|
|
VAR
|
|
Res20 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..4] of Int; // Reserve
|
|
Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter
|
|
Bereich_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Bereich-Datenliste-DB
|
|
Frei22 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
|
|
Frei24 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
|
|
END_STRUCT;
|
|
Res30 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] of Int; // Reserve
|
|
Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UDLHMOmniBereich_Plus"; // Statische Bereichdaten (aus DL)
|
|
Dyn : Struct // Dynamische Daten
|
|
Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
Trolley_kommt_in_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley kommt in Bereich (Signal von Bereich-1)
|
|
Trolley_ist_im_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt in Bereich
|
|
Trolley_am_BereichsEnde { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist am BereichsEnde
|
|
"Trolley_wartet_auf_Ziel-FC" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
"Trolley_wartet_Bereich+1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley wartet auf Bereich +1
|
|
Trolley_fährt_aus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley fährt aus
|
|
Trolley_draussen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist ausgefahren
|
|
Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden
|
|
Reset_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool := TRUE; // Reset aktiv
|
|
"Anfangs-Sensor_ausgewertet" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
"Ende-Sensor_ausgewertet" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
Inilauf_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
|
|
"Trolley an Raus-Sensor" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Trolley ist am Raus-Sensor
|
|
"Stau_an_Raus-Sensor" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Stau an Raus-Sensor (kein Zählen mehr)
|
|
END_STRUCT;
|
|
HMI : Struct
|
|
Bereich_resetten : Bool; // Bereich resetten (IN:HMI, Out:PLC)
|
|
END_STRUCT;
|
|
Sk { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "USk_ILS"; // Status der Schrittkette
|
|
Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
RET_VAL_BLKMOV_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf
|
|
RET_VAL_DL_Bereich { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte;
|
|
END_STRUCT;
|
|
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UErrHMOmniBereich";
|
|
Stau_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Sensor B_VorSep ist belegt [100ms]
|
|
Leer_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int;
|
|
Stop_Ursache { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Stop-Stelle: Nw + Position
|
|
Gefahrene_Trolleys { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Vereinzelungstakte
|
|
Laufzähler : Int; // Laufzähler
|
|
Wartezeit : Int; // Wartezeit (kein EInfahren erlaubt) [s]
|
|
Trolley_DL { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // AB DW350: Liste der Trolleys im Lager
|
|
Datenlistenkopf { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
|
|
KOPF { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DA01; // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
|
|
LAENGE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 10; // Länge der Datenliste (maximale Anzahl der Datensätze)
|
|
STAMMDATEN { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int := 1; // 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;
|
|
Trolley { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..10] of Int; // TrolleyZeit bis Ende (s)
|
|
Endekennung { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word := WORD#16#DAEE; // Datensort-Ende-Kennung (DBEE)
|
|
END_STRUCT;
|
|
Restzeit : Int; // Diese Zeit hat Trolley noch zum Fahren (s)
|
|
Timer_Rein {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
|
Timer_Raus {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
|
|
Zeit_Ohne_B_In_Schleuse : Int; // Trolley nicht an B_In_Schleuse
|
|
Zeit_Ohne_B_Zähl : Int; // Trolley nicht an B_Zähl
|
|
Zeit_Ausfahren_Ohne_B_Zähl : Int; // Trolley fährt nicht zu B_Zähl
|
|
Raus_Trolleys : Int; // Anzahl der Trolleys zwischen Schleuse und Raus-Sensor
|
|
Stau_Zeit_RausSensor : Int; // Sensor B_AusSep ist belegt [1s]
|
|
Res200 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..2] 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
|
|
ZielFC_vorhanden : Bool;
|
|
DraussenFC_vorhanden : Bool;
|
|
Trolley_draussen : Bool; // Signal: Trolley ist draussen
|
|
Antriebe_starten : Bool;
|
|
ZielFC : Word; // Ziel-FC
|
|
DraussenFC : Word; // Draussen-FC
|
|
AR1Start : DInt; // Startwert mit Offset 0
|
|
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
|
|
SSDW : Int;
|
|
SSDB : Int;
|
|
Restzeit_errechnet : Int;
|
|
END_VAR
|
|
|
|
|
|
BEGIN
|
|
NETWORK
|
|
TITLE = Parameter-Übergabe
|
|
L #Bereichs_Nr;
|
|
|
|
L 274 ;//Einsprung Bereich-DL
|
|
T #Para.Bereich_DL_DB;//vor Aufruf übergeben!
|
|
|
|
NETWORK
|
|
TITLE = Anzeige OP
|
|
L 252;//Bereichsstop aktiv
|
|
UN #Dyn.Sk.Bereich_ok;//Also: Bereichsstop / Not-Aus
|
|
SPB w010;
|
|
|
|
L 253;
|
|
UN #Dyn.Sk.Auto_akt;//Keine Betriebsart
|
|
UN #Dyn.Sk.Hand_akt;
|
|
SPB w010;
|
|
|
|
L 255;//Handbetrieb aktiv
|
|
U #Dyn.Sk.Hand_akt;
|
|
SPB w010;
|
|
|
|
L #Dyn.Sk.Akt_Schritt;//Aktiver Schritt
|
|
w010: T #Dyn.Sk.OP_Schritt;
|
|
|
|
NETWORK
|
|
TITLE = Out-Bits zum Zurücksetzen
|
|
SET ;//Jeden Zyklus neu
|
|
R #Dyn.Status."Trolley_wartet_auf_Ziel-FC";
|
|
R #Dyn.Status."Trolley_wartet_Bereich+1";
|
|
R #Dyn.Status.Trolley_draussen;
|
|
R #Antrieb_Bereich_vor;
|
|
R #Antrieb_Bereich_stop;
|
|
|
|
L 0;
|
|
T #Restzeit_errechnet;
|
|
|
|
NETWORK
|
|
TITLE = HMI-Zeug
|
|
|
|
//Von HMI:
|
|
U #Dyn.HMI.Bereich_resetten;
|
|
R #Dyn.HMI.Bereich_resetten;//von HMI
|
|
S #Dyn.Sk.Reset ;//SK zurücksetzen
|
|
|
|
NETWORK
|
|
TITLE = Sensoren entprellen
|
|
|
|
//Rein-Sensor entprellen:
|
|
UN #B_BereichsAnfang;
|
|
U #Dyn.Status."Anfangs-Sensor_ausgewertet";
|
|
U #Antrieb_Bereich_aktiv;
|
|
= "M200.0";
|
|
|
|
CALL #Dyn.Timer_Rein
|
|
{time_type := 'Time'}
|
|
( IN := "M200.0" ,
|
|
PT := t#7s
|
|
);
|
|
|
|
U #Dyn.Timer_Rein.Q;
|
|
R #Dyn.Status."Anfangs-Sensor_ausgewertet";
|
|
|
|
//Ende-Sensor entprellen:
|
|
UN #B_BereichsEnde;
|
|
U #Dyn.Status."Ende-Sensor_ausgewertet";
|
|
U #Antrieb_Bereich_aktiv;
|
|
U #Antrieb_plus_aktiv;
|
|
= "M200.0";
|
|
|
|
CALL #Dyn.Timer_Raus
|
|
{time_type := 'Time'}
|
|
( IN := "M200.0" ,
|
|
PT := t#6s
|
|
);
|
|
|
|
U #Dyn.Timer_Raus.Q;
|
|
R #Dyn.Status."Ende-Sensor_ausgewertet";
|
|
|
|
NETWORK
|
|
TITLE = Schrittkette zurücksetzen
|
|
U #ErrQuit ;//Überwachungszeit abgelaufen quittieren
|
|
R #Dyn.Sk.Err_Uebzeit;
|
|
R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
R #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)!
|
|
|
|
//Reset oder Trolley kommt am Ende nicht an:
|
|
U #ErrQuit ;//Überwachungszeit abgelaufen quittieren
|
|
U(;
|
|
U #Dyn.Status.Trolley_am_BereichsEnde;
|
|
UN #B_BereichsEnde;//Aber kein Trolley mehr am Sensor
|
|
O #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich
|
|
);
|
|
O #Dyn.Sk.Reset ;//SK zurücksetzen
|
|
SPBN en04;//Negierter Sprung!
|
|
|
|
//Schrittkette zurücksetzen:
|
|
L 0;//Schritt 0: Warten
|
|
T #Dyn.Sk.Akt_Schritt;
|
|
T #Dyn.Raus_Trolleys;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk.Terr_Zelle;
|
|
T #Dyn.Sk.Tok_Zelle;
|
|
|
|
SET;
|
|
R #Dyn.Error.Err_BLKMov;//Error bei Block kopieren
|
|
R #Dyn.Sk.Reset;//SK zurücksetzen
|
|
R #Dyn.Sk.Err_Schritt;//Undefinierter Schritt
|
|
R #Dyn.Sk.Err_Uebzeit;//Sofort weiter !
|
|
R #Dyn.Sk.Reset_Akt ;//Reset ist aktiv
|
|
R #Dyn.Status.Trolley_am_BereichsEnde;
|
|
R #Dyn.Status."Trolley_wartet_auf_Ziel-FC";
|
|
R #Dyn.Status."Trolley_wartet_Bereich+1";
|
|
R #Dyn.Status.Trolley_fährt_aus;
|
|
R #Dyn.Status.Inilauf_aktiv;
|
|
S #Dyn.Status.Reset_aktiv;
|
|
|
|
SET;
|
|
R #Dyn.Error.Bereich_DL;//Bereich-Datenliste fehlerhaft
|
|
R #Dyn.Error.Undef_Bereich;//undefinierter Bereich
|
|
R #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich
|
|
R #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen
|
|
R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert
|
|
R #Dyn.Error.Err_Stau_Eingang;
|
|
R #Dyn.Error.Err_BLKMov;
|
|
R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
R #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
|
|
R #Dyn.Error.Err11;//kein Ziel angegeben
|
|
R #Dyn.Error.Err12;//Weichen-Datenliste fehlerhaft
|
|
R #Dyn.Error.Err13;//undefinierte Weiche
|
|
R #Dyn.Error.Err14;//Weiche bleibt belegt
|
|
R #Dyn.Error.Err15;
|
|
R #Dyn.Error.Err16;
|
|
|
|
L 0;
|
|
T #Dyn.Stau_Zeit ;//Sensor B_VorSep ist belegt [10ms]
|
|
|
|
//Defaultwerte übergeben:
|
|
L 0 ;//Damit statische Werte neu aus Datenbank geholt werden !
|
|
T #Bereich.Bereichs_Nr;//Nummer des Bereichs
|
|
|
|
SPA RET;
|
|
|
|
en04: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Störungen nach Außen übergeben
|
|
L 0;
|
|
T "MW200";
|
|
|
|
U #Dyn.Error.Bereich_DL;//Bereich-Datenliste fehlerhaft
|
|
= "M200.0";
|
|
U #Dyn.Error.Undef_Bereich;//undefinierter Bereich
|
|
= "M200.1";
|
|
U #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich
|
|
= "M200.2";
|
|
U #Dyn.Sk.Err_Uebzeit;
|
|
= #Dyn.Error.Err_Uebzeit;//Überwachungzeit ist abgelaufen
|
|
= "M200.3";
|
|
NOT;
|
|
R #Dyn.Sk.Err_Uebzeit_AnzOk;
|
|
U #Dyn.Sk.Err_Schritt;
|
|
= #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert
|
|
= "M200.4";
|
|
U #Dyn.Error.Err_Stau_Eingang;
|
|
= "M200.5";
|
|
U #Dyn.Error.Err_BLKMov;//Error bei Block kopieren
|
|
= "M200.6";
|
|
U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
= "M200.7";
|
|
U #Dyn.Error.Err_Raus_Sensor;//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
|
|
= "M201.0";
|
|
U #Dyn.Error.Err11;//Trolley-Ziel nicht bekannt
|
|
= "M201.1";
|
|
U #Dyn.Error.Err12;//Weichen-Datenliste fehlerhaft
|
|
= "M201.2";
|
|
U #Dyn.Error.Err13;//undefinierte Weiche
|
|
= "M201.3";
|
|
U #Dyn.Error.Err14;//Weiche bleibt belegt
|
|
= "M201.4";
|
|
U #Dyn.Error.Err15;
|
|
= "M201.5";
|
|
U #Dyn.Error.Err16;
|
|
= "M201.6";
|
|
U #Dyn.Error.Err17;
|
|
= "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.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv !
|
|
R "M200.3";//Üb.Zeit-Meldung nicht an PC senden
|
|
|
|
U #Dyn.Sk.Err_Uebzeit;
|
|
S #Dyn.Sk.Err_Uebzeit_AnzOk;//Störung anzeigen ok, da 2.Zyklus aktiv !
|
|
|
|
L "MW200";
|
|
T #Error;//Schnittstelle nach Außen
|
|
|
|
//Störung vorhanden:
|
|
L 0;
|
|
<>I;//Ja !
|
|
= #Dyn.Status.Error_aktiv;
|
|
S #hStOk;
|
|
|
|
//Antrieb stoppen:
|
|
U(;
|
|
ON #Dyn.Sk.Auto_akt ;//SystemVoraussetzungen fehlen
|
|
O #Dyn.Sk.Hand_akt;
|
|
ON #Dyn.Sk.Bereich_ok;
|
|
);
|
|
S #Antrieb_Bereich_stop;//Antrieb stoppen
|
|
|
|
//Störungen pro Zyklus neu erzeugen:
|
|
SET;
|
|
R #Dyn.Error.Bereich_DL;//Bereich-Datenliste fehlerhaft
|
|
R #Dyn.Error.Undef_Bereich;//undefinierter Bereich
|
|
/// R #Dyn.Error.Err_Trolley_nicht_in_Bereich//Trolley fährt nicht in Bereich
|
|
/// R #Dyn.Error.Err_Uebzeit //Überwachungzeit ist abgelaufen
|
|
R #Dyn.Error.Err_Schritt;//Schritt-Nummer ist nicht definiert
|
|
/// R #Dyn.Error.Err_Stau_Einfahrt//Betriebsart ist nicht möglich
|
|
R #Dyn.Error.Err_BLKMov;
|
|
/// R #Dyn.Error.Err_Trolley_raus//Trolley fährt nicht aus
|
|
/// R #Dyn.Error.Err_Raus_Sensor//Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
|
|
R #Dyn.Error.Err11;//Trolley-Ziel nicht bekannt
|
|
R #Dyn.Error.Err12;//Weichen-Datenliste fehlerhaft
|
|
R #Dyn.Error.Err13;//undefinierte Weiche
|
|
R #Dyn.Error.Err14;//Weiche bleibt belegt
|
|
R #Dyn.Error.Err15 ;//undefinierte Weiche
|
|
R #Dyn.Error.Err16 ;//Weiche bleibt belegt
|
|
R #Dyn.Error.Err17;
|
|
|
|
NETWORK
|
|
TITLE = Statische Bereich-Parameter holen
|
|
L #Bereich.Bereichs_Nr;//Nummer des Bereichs
|
|
L #Bereichs_Nr;//Aufruf-Parameter
|
|
==I;//Identisch ?
|
|
R #Dyn.Error.Bereich_DL;//Bereichdatenbank fehlerhaft
|
|
R #Dyn.Error.Undef_Bereich;//undefinierter Bereich
|
|
SPB en06;//Ja !
|
|
|
|
T "MW200";//Search-Daten
|
|
|
|
CALL "DatenOut"
|
|
( SSDB := #Para.Bereich_DL_DB ,
|
|
SSDW := 0 ,
|
|
PARA := WORD#16#0000 ,
|
|
SEARCHDATEN := P#M200.0 ,
|
|
RE_VAL := "MB199" ,
|
|
OUTDATEN := P#M220.0 ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
L "MB199";
|
|
T #Dyn.Rueckmld.RET_VAL_DL_Bereich;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
|
|
|
|
SPBI G_Ok;
|
|
|
|
U "M199.0";
|
|
SPBN w060;
|
|
|
|
SET;
|
|
= #Dyn.Error.Bereich_DL;//Bereichdatenbank fehlerhaft
|
|
|
|
L 16#A061;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
SPA RET;
|
|
|
|
w060: SET;
|
|
S #Dyn.Error.Undef_Bereich;//undefinierter Bereich
|
|
|
|
L 16#A062;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
SPA RET;
|
|
|
|
//Kennung + Datenbytes
|
|
G_Ok: SET;
|
|
R #Dyn.Error.Bereich_DL;//Gefälledatenbank fehlerhaft
|
|
R #Dyn.Error.Undef_Bereich;//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_Bereich ,
|
|
DSTBLK := #Bereich //#Ziel
|
|
);
|
|
|
|
L 16#A063;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
L #Dyn.Rueckmld.RET_VAL_BLKMOV_Bereich;//Rückmeldung
|
|
L 0;//Fehler vorhanden ?
|
|
<>I;//Ja !
|
|
= #Dyn.Error.Err_BLKMov ;//Error bei Block kopieren
|
|
SPB RET;
|
|
|
|
L #Bereich.Bereichs_Typ;//Bereichtyp = 174 (Normal)
|
|
L 2275 ;//Dieser Aufruf-FB ?
|
|
==I;//Ja !
|
|
SPB w061;
|
|
|
|
SET;
|
|
S #Dyn.Error.Undef_Bereich;//undefinierter Bereich
|
|
|
|
L 0 ;//Bereich ungültig !
|
|
T #Bereich.Bereichs_Nr;//Nummer des Bereichs
|
|
|
|
L 16#A064;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
SPA RET;
|
|
|
|
//Defaultwerte übergeben:
|
|
w061: NOP 0;
|
|
|
|
SPA RET;
|
|
|
|
en06: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Trolleydaten auf Förderer vorhanden
|
|
L #Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege;
|
|
L 0 ;//Trolleys im Bereich?
|
|
>I ;//Ja!
|
|
O #Dyn.Status.Inilauf_aktiv;
|
|
O #Dyn.Status.Reset_aktiv ;//Reset ist aktiv
|
|
= #Dyn.Status.Trolley_ist_im_Bereich;
|
|
|
|
NETWORK
|
|
TITLE = Antrieb zusätzlich starten / stoppen
|
|
|
|
//Antrieb -1:
|
|
U(;
|
|
O #Dyn.Error.Err_Stau_Eingang;//Stau bei Einfahrt
|
|
O #Dyn.Status."Anfangs-Sensor_ausgewertet";
|
|
);
|
|
U #Antrieb_Bereich_aktiv;
|
|
S #Antrieb_minus_vor;
|
|
|
|
//Bereichs-Antrieb starten:
|
|
U #ErrQuit ;//Überwachungszeit abgelaufen quittieren
|
|
O;
|
|
U #B_BereichsAnfang;
|
|
UN #Dyn.Error.Err_Stau_Eingang;//Stau bei Einfahrt (Quittierung oder Sensor=0, wegen Bürstenantrieb
|
|
O #Dyn.Status.Trolley_kommt_in_Bereich;//Signal von Bereich-1
|
|
O #Dyn.Status.Trolley_ist_im_Bereich;
|
|
O #Dyn.Status.Trolley_fährt_aus;
|
|
O #Dyn.Status."Anfangs-Sensor_ausgewertet";
|
|
O #Dyn.Status."Ende-Sensor_ausgewertet";
|
|
O #Dyn.Status.Inilauf_aktiv;
|
|
O #Dyn.Status.Reset_aktiv;
|
|
S #Antrieb_Bereich_start;//Antrieb starten
|
|
|
|
//Bereichsantrieb vor:
|
|
U #Dyn.Status.Trolley_kommt_in_Bereich;//Signal von Bereich-1
|
|
O #B_BereichsAnfang;
|
|
O #Dyn.Status.Trolley_fährt_aus;
|
|
S #Antrieb_Bereich_vor;
|
|
R #Dyn.Status.Trolley_kommt_in_Bereich;//Signal von Bereich-1 (Zyklus)
|
|
|
|
//Bereichs-Antrieb stoppen:
|
|
U #Dyn.Error.Err_Trolley_nicht_am_Ende;
|
|
O;
|
|
U #Dyn.Status.Trolley_am_BereichsEnde;
|
|
UN #Dyn.Status.Trolley_fährt_aus;
|
|
O;
|
|
U #Dyn.Status.Trolley_fährt_aus;
|
|
U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche)
|
|
UN #Antrieb_plus_aktiv;////Antrieb plus aktiv
|
|
S #Antrieb_Bereich_stop;//Antrieb stoppen
|
|
|
|
//Antrieb +1:
|
|
L #Dyn.Raus_Trolleys;
|
|
L 0 ;//Trolles unterwegs?
|
|
>I ;//Ja!
|
|
UN #Dyn.Status."Stau_an_Raus-Sensor";//Stau an Raus-Sensor
|
|
O #Dyn.Status.Trolley_fährt_aus;
|
|
S #Antrieb_plus_start;//Antrieb plus starten
|
|
S #Antrieb_plus_vor ;//Antrieb plus einschalten
|
|
|
|
NETWORK
|
|
TITLE = Plus: Trolley ist an Zähl-/Stau-Sensor
|
|
U #B_Zähl;
|
|
= #Trolley_draussen;
|
|
|
|
U #Trolley_draussen;
|
|
SPB B_Raus;
|
|
|
|
UN #Dyn.Status."Trolley an Raus-Sensor";
|
|
UN #Dyn.Status."Stau_an_Raus-Sensor";
|
|
ON "100ms-Impuls";
|
|
ON #Dyn.Sk.Bereich_ok;
|
|
SPB En10;
|
|
|
|
L #Dyn.Zeit_Ohne_B_Zähl;
|
|
+ 1 ;//Zeit ohne Sensor +100ms
|
|
T #Dyn.Zeit_Ohne_B_Zähl;
|
|
|
|
//B-Raus lange genug frei?:
|
|
L 10 ;//Nach ca. 1s
|
|
>=I;
|
|
UN #Dyn.Status."Stau_an_Raus-Sensor";
|
|
SPB RDel;
|
|
|
|
TAK;
|
|
L 200 ;//Nach ca. 20s
|
|
>=I;
|
|
SPB RDel;
|
|
|
|
SPA En10;
|
|
|
|
RDel: SET;
|
|
R #Dyn.Status."Trolley an Raus-Sensor";
|
|
L 0;
|
|
T #Dyn.Zeit_Ohne_B_Zähl;
|
|
T #Dyn.Stau_Zeit_RausSensor;
|
|
|
|
//War Stau?:
|
|
U #Dyn.Status."Stau_an_Raus-Sensor";
|
|
R #Dyn.Status."Stau_an_Raus-Sensor";
|
|
SPBN En10;
|
|
|
|
L 0;//Bisher gefahrene Trolleys löschen
|
|
T #Dyn.Raus_Trolleys;
|
|
T #Dyn.Zeit_Ohne_B_Zähl;
|
|
T #Dyn.Stau_Zeit_RausSensor;
|
|
|
|
SPA En10;
|
|
|
|
B_Raus: L 0;
|
|
T #Dyn.Zeit_Ohne_B_Zähl;
|
|
T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl;
|
|
|
|
//Einmalig:
|
|
UN #Dyn.Status."Trolley an Raus-Sensor";
|
|
S #Dyn.Status."Trolley an Raus-Sensor";//Raus-Sensor ausgewertet
|
|
SPBN Xn10 ;//Negierter Sprung
|
|
|
|
L #Dyn.Raus_Trolleys;
|
|
+ -1;//Ausgefahrene Trolleys -1
|
|
T #Dyn.Raus_Trolleys;
|
|
|
|
L 0;
|
|
>=I;
|
|
SPB Xn10;
|
|
|
|
T #Dyn.Raus_Trolleys;//Minimum übergeben
|
|
|
|
//Stau an B_Raus:
|
|
Xn10: UN "100ms-Impuls";
|
|
O #Dyn.Status."Stau_an_Raus-Sensor";
|
|
SPB En10;
|
|
|
|
L #Dyn.Stau_Zeit_RausSensor;
|
|
+ 1 ;//StauZeit +1
|
|
T #Dyn.Stau_Zeit_RausSensor;
|
|
|
|
L 90 ;//Nach ca. 9s
|
|
>=I;
|
|
SPBN En10;//Negierter Sprung
|
|
|
|
L 0 ;//Zeit löschen
|
|
T #Dyn.Stau_Zeit_RausSensor;
|
|
|
|
SET;
|
|
S #Dyn.Status."Stau_an_Raus-Sensor";
|
|
|
|
En10: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Plus: Trolley fährt nicht bis Zähl-Sensor
|
|
L #Dyn.Raus_Trolleys;
|
|
L 0 ;//Trolles unterwegs?
|
|
==I;//Nein!
|
|
O #Trolley_draussen ;//Sensor wurde erreicht
|
|
O #Dyn.Status.Reset_aktiv;
|
|
SPB RTTD;
|
|
|
|
UN #Antrieb_plus_aktiv;
|
|
U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;
|
|
ON "1s-Impuls";
|
|
O #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus
|
|
SPB En12;
|
|
|
|
L #Dyn.Zeit_Ausfahren_Ohne_B_Zähl;
|
|
+ 1;
|
|
T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl;
|
|
|
|
//Trolley fährt nicht bis Zähl-Sensor!:
|
|
L #Bereich.Übzeit_aus_Bereich;
|
|
>=I;
|
|
S #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus
|
|
SPBN En12;//Negierter Sprung!
|
|
|
|
L #Dyn.Raus_Trolleys;
|
|
+ -1;
|
|
T #Dyn.Raus_Trolleys;
|
|
|
|
SPA En12;
|
|
|
|
RTTD: L 0;
|
|
T #Dyn.Zeit_Ausfahren_Ohne_B_Zähl;
|
|
|
|
SET;
|
|
R #Dyn.Error.Err_Raus_Sensor;//Trolley fährt nicht aus
|
|
|
|
En12: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Laufzähler
|
|
UN #Antrieb_Bereich_aktiv;
|
|
ON "1s-Impuls";
|
|
SPB X900;
|
|
|
|
L #Dyn.Laufzähler;
|
|
+ +1;
|
|
T #Dyn.Laufzähler;
|
|
|
|
//Laufzähler rücksetzen?:
|
|
U #Dyn.Status.Trolley_ist_im_Bereich;
|
|
SPB Warte;
|
|
|
|
L 1;//Rücksetzen
|
|
T #Dyn.Laufzähler;
|
|
|
|
Warte: L #Dyn.Wartezeit;
|
|
+ -1;
|
|
T #Dyn.Wartezeit;
|
|
|
|
L 0;//Minimum unterschritten?
|
|
>=I;//Nein!
|
|
SPB X900;
|
|
|
|
T #Dyn.Wartezeit;//Minimum übergeben
|
|
|
|
X900: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Anfangs-Sensor auswerten
|
|
L #Bereich.Bereich_Dyn_DB;
|
|
T #SSDB;
|
|
|
|
L #Bereich.Bereich_Dyn_DW;
|
|
L 110;
|
|
+I;
|
|
T #SSDW;
|
|
|
|
U #B_BereichsAnfang;
|
|
U #Antrieb_Bereich_aktiv;
|
|
UN #Dyn.Status."Anfangs-Sensor_ausgewertet";
|
|
S #Dyn.Status."Anfangs-Sensor_ausgewertet";
|
|
SPBN ReinEn;//Negierter Sprung
|
|
|
|
//Abstand schon gespeichert?:
|
|
L #Bereich.Fahrzeit;
|
|
L 1 ;//Sinnvoller Wert?
|
|
<=I;//Nein !
|
|
L 999;//Bei Inilauf
|
|
T "MW220";
|
|
S #Dyn.Status.Inilauf_aktiv;
|
|
SPB Save;
|
|
|
|
L #Bereich.Fahrzeit;
|
|
L #Dyn.Laufzähler;
|
|
+I;//Abstand dazu addieren
|
|
T "MW220";
|
|
|
|
//Eintrag in Trolley-Bereichsliste
|
|
Save: CALL "DatenIn"
|
|
( SSDB := #SSDB ,
|
|
SSDW := #SSDW ,
|
|
INDATEN := P#M220.0 ,
|
|
RE_VAL := "MB199"
|
|
);
|
|
|
|
//Wartezeit (Einlagern blöckieren) speichern:
|
|
L 6 ;//6s wegen nach 5s draussen
|
|
T #Dyn.Wartezeit ;//Damit genügend Abstand zwischen 2 Trolleys
|
|
|
|
ReinEn: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Ende-Sensor auswerten
|
|
U #ErrQuit ;//Überwachungszeit abgelaufen quittieren
|
|
U #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich
|
|
R #Dyn.Error.Err_Trolley_nicht_am_Ende;//Trolley fährt nicht in Bereich
|
|
S #Antrieb_Bereich_start;
|
|
SPB Delete;
|
|
|
|
U #B_BereichsEnde;
|
|
U(;
|
|
O #Antrieb_Bereich_aktiv;
|
|
O #Dyn.Error.Err_Trolley_nicht_am_Ende;
|
|
);
|
|
UN #Dyn.Status."Ende-Sensor_ausgewertet";
|
|
S #Dyn.Status."Ende-Sensor_ausgewertet";
|
|
SPBN EndeEn;//Negierter Sprung
|
|
|
|
U #Dyn.Status.Inilauf_aktiv;
|
|
R #Dyn.Status.Inilauf_aktiv;
|
|
SPBN Delete;//Negierter Sprung
|
|
|
|
L #Dyn.Laufzähler;
|
|
+ -3 ;//damit mehr Sicherheit!
|
|
T #Bereich.Fahrzeit;//Abstand speichern
|
|
|
|
///Austrag aus Trolley-Bereichsliste
|
|
Delete: CALL "DatenOut"
|
|
( SSDB := #SSDB ,
|
|
SSDW := #SSDW ,
|
|
PARA := 16#F100 , //1.Datensatz lesen
|
|
SEARCHDATEN := "MW220" ,
|
|
RE_VAL := "MB199" ,
|
|
OUTDATEN := "MW220" ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
CALL "DatenOut"
|
|
( SSDB := #SSDB ,
|
|
SSDW := #SSDW ,
|
|
PARA := 16#E100 , //Angegebenen Datensatz austragen
|
|
SEARCHDATEN := "MW220" ,
|
|
RE_VAL := "MB199" ,
|
|
OUTDATEN := "MW220" ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
EndeEn: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Restzeit ermitteln
|
|
|
|
//Keine Daten gespeichert?:
|
|
UN #Dyn.Status.Trolley_ist_im_Bereich;
|
|
L 999 ;//Einfahren erlaubt
|
|
SPA Rest;//Aktuell ohne Berechnung
|
|
|
|
//Auswertung des nächsten Trolleys:
|
|
CALL "DatenOut"
|
|
( SSDB := #SSDB ,
|
|
SSDW := #SSDW ,
|
|
PARA := 16#F100 , //1.Datensatz lesen
|
|
SEARCHDATEN := "MW220" ,
|
|
RE_VAL := "MB199" ,
|
|
OUTDATEN := "MW220" ,
|
|
Position := "MW196"
|
|
);
|
|
|
|
L "MW220";//Bei dieser Zeit wird Trolley am B_BereichsEnde erwartet
|
|
L #Dyn.Laufzähler;
|
|
-I;
|
|
T #Restzeit_errechnet;
|
|
Rest: T #Dyn.Restzeit;
|
|
|
|
//Restzeit nullen?:
|
|
//Laufzähler-Überlauf oder sonst Einfahrt blockieren:
|
|
L #Dyn.Laufzähler;
|
|
L 32000;//wird zu groß?
|
|
>I;//Ja !
|
|
O #Dyn.Status.Inilauf_aktiv;
|
|
O #Dyn.Status.Reset_aktiv;
|
|
O #Dyn.Status.Error_aktiv;
|
|
O #Dyn.Status."Anfangs-Sensor_ausgewertet";
|
|
O(;
|
|
L #Dyn.Sk.Akt_Schritt;
|
|
L 0;//Warten auf Trolley?
|
|
<>I ;////Nein, also am Ende, fährt aus,...!
|
|
);
|
|
O(;
|
|
L #Dyn.Wartezeit ;//Damit genügend Abstand zwischen 2 Trolleys
|
|
L 0 ;//Einfahren noch blockieren ?
|
|
>I ;//Ja!
|
|
);
|
|
SPB KeinEinfahren ;//Einfahren nicht erlaubt
|
|
|
|
L #Dyn.Restzeit;
|
|
L 0 ;//sinnvoller Wert?
|
|
>=I;//Ja!
|
|
U(;
|
|
L #Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege;
|
|
L #Dyn.Trolley_DL.Datenlistenkopf.LAENGE;
|
|
<I;//noch Platz vorhanden!
|
|
);
|
|
SPB RestOk;
|
|
|
|
KeinEinfahren: L 0 ;//Kein Einfahren
|
|
T #Dyn.Restzeit ;//Minimum übrgeben
|
|
|
|
RestOk: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Spezial-FCs vorhanden?
|
|
L #Bereich.Ziel_FC;
|
|
T #ZielFC;
|
|
L 0;//Parameter vorhanden ?
|
|
>I ;//Ja!
|
|
= #ZielFC_vorhanden;
|
|
|
|
L #Bereich.Draussen_FC;
|
|
T #DraussenFC;
|
|
L 0;//Parameter vorhanden ?
|
|
>I ;//Ja!
|
|
= #DraussenFC_vorhanden;
|
|
|
|
NETWORK
|
|
TITLE = Error: Stau Bereich-Eingang
|
|
|
|
//Sensor bei Bereichs-Einfahrt bleibt belegt?:
|
|
UN #B_BereichsAnfang;//Sensor Trolley fährt in Bereich (kein Stau !)
|
|
O #ErrQuit;
|
|
R #Dyn.Error.Err_Stau_Eingang;//Stau bei Einfahrt
|
|
SPB X090 ;//StauZeit neu aufziehen
|
|
|
|
UN "1s-Impuls";
|
|
ON #Antrieb_Bereich_aktiv;
|
|
O #Dyn.Error.Err_Stau_Eingang;//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 10 ;//Stau-Zeit erreicht ?
|
|
>=I;//Ja !
|
|
S #Dyn.Error.Err_Stau_Eingang;//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 = Schrittkette anhalten
|
|
U #Dyn.Sk.Auto_akt;//Automatik ist aktiv
|
|
U #Dyn.Sk.Bereich_ok;
|
|
CLR;
|
|
|
|
SPA en08_Mig;//Schrittkette nicht anhalten !
|
|
|
|
SET;
|
|
R #Dyn.Sk.Err_Uebzeit;//Störungen löschen
|
|
R #Dyn.Sk.Err_Schritt;
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk.Terr_Zelle;
|
|
T #Dyn.Sk.Tok_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
en08_Mig: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Sprungverteiler
|
|
L #Dyn.Sk.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.Akt_Schritt;
|
|
|
|
L -1;//Urzustand
|
|
T #Dyn.Sk.Neu_Schritt;//Schritt, der im nächsten Zyklus aktiv werden soll
|
|
|
|
NEU: SET;
|
|
R #Warte_neu;//Wartezeit neutriggern
|
|
R #Warte_stop;//Wartezeit stoppen
|
|
|
|
L #Dyn.Sk.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.Err_Schritt;//Undefinierter Schritt
|
|
|
|
L 16#A131;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
SPA RET;
|
|
|
|
Neu_Mig: U #Dyn.Sk.Err_Uebzeit;
|
|
SPBN Sk;
|
|
|
|
L 16#A132;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
SPA RET;
|
|
|
|
Sk: T #Dyn.Sk.Akt_Schritt;
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk.Terr_Zelle;
|
|
T #Dyn.Sk.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 = Schritt X: Reserve
|
|
SET;//Weiterschaltbedingung
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
|
|
L 16#B001;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk.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
|
|
|
|
SET;
|
|
U #Dyn.Sk.Auto_akt;//Automatik ist aktiv
|
|
U #Dyn.Sk.Bereich_ok;
|
|
= #Ueb_akt;//Überwachungszeit aktivieren
|
|
L 50 ;//Angabe der Überwachungszeit (*1s)
|
|
SPA tueb;//Überwachungszeit
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = Schritt 0: Warten auf Trolley am Bereichs-Ende
|
|
s000: SET;//Weiterschaltbedingung
|
|
U #B_BereichsEnde ;//Trolley im Bereich erkannt
|
|
U(;
|
|
O #Antrieb_Bereich_aktiv;
|
|
O #Dyn.Error.Err_Trolley_nicht_am_Ende;
|
|
);
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
R #Dyn.Error.Err_Trolley_raus;
|
|
|
|
//Antriebe:
|
|
//siehe Nw10
|
|
|
|
U #Weiter ;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk.Err_Uebzeit;//Sofort weiter !
|
|
L 0 ;//Angabe der Wartezeit (*10ms)
|
|
SPB Plus;//Nächsten Schritt starten
|
|
|
|
L 16#B001;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
//Überwachungszeit starten:
|
|
U #Dyn.Status.Trolley_ist_im_Bereich;
|
|
U #Antrieb_Bereich_aktiv;
|
|
= #Ueb_akt ;//Überwachungszeit aktivieren
|
|
|
|
//Reset aktiv?
|
|
U #Dyn.Status.Reset_aktiv;
|
|
U #Dyn.Sk.Err_Uebzeit;
|
|
R #Dyn.Sk.Err_Uebzeit;
|
|
SPB Reset_fertig;
|
|
|
|
L #Restzeit_errechnet;
|
|
L -20 ;//Trolley schon 20s überfällig
|
|
<I;
|
|
UN #Dyn.Status.Inilauf_aktiv;
|
|
UN #Dyn.Status.Reset_aktiv;
|
|
O #Dyn.Sk.Err_Uebzeit;
|
|
S #Dyn.Error.Err_Trolley_nicht_am_Ende;
|
|
|
|
//Bei Üb.Zeit -> Kein Trolley drin!
|
|
U #Dyn.Sk.Err_Uebzeit;
|
|
SPBN X000;//Negierter Sprung
|
|
|
|
SET;
|
|
R #Dyn.Sk.Err_Uebzeit;
|
|
R #Dyn.Error.Err_Trolley_nicht_am_Ende;
|
|
|
|
SPA Delete;//Trolley aus Liste löschen
|
|
|
|
X000: L #Bereich.Übzeit_in_Bereich;
|
|
SPA tueb;//Überwachungszeit
|
|
|
|
Reset_fertig: SET;
|
|
R #Dyn.Status.Reset_aktiv;
|
|
R #Dyn.Status.Inilauf_aktiv;
|
|
|
|
L 0;
|
|
T #Dyn.Raus_Trolleys;
|
|
|
|
//Trolleydaen löschen:
|
|
CALL "DatenReset"
|
|
( SSDB := #SSDB ,
|
|
SSDW := #SSDW ,
|
|
RE_VAL := "MB199"
|
|
);
|
|
|
|
SPA ENDE_Mig;
|
|
|
|
NETWORK
|
|
TITLE = Schritt 1: Trolley ist am Bereichsende
|
|
s001: NOP 0;
|
|
//Schrittaktionen:
|
|
SET;
|
|
= #Weiter;
|
|
R #Dyn.Error.Err_Trolley_nicht_am_Ende;
|
|
|
|
UN #Weiter;
|
|
SPB RET;
|
|
|
|
L 2 ;//Weiter mit Schritt 2 (Ziel-FC?)
|
|
SPA Neu_Mig;//Bei diesem Schritt weiter
|
|
|
|
NETWORK
|
|
TITLE = Schritt 2: Ziel-FC
|
|
s002: NOP 0;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
S #Dyn.Status.Trolley_am_BereichsEnde;
|
|
S #Dyn.Status."Trolley_wartet_auf_Ziel-FC";
|
|
|
|
UN #ZielFC_vorhanden;
|
|
R #Dyn.Status."Trolley_wartet_auf_Ziel-FC";
|
|
L 3 ;//Weiter mit Schritt 3 (Ausfahren ok?)
|
|
SPB Neu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
SET;//Rückmeldungen erst mal resetten
|
|
R "M180.6";//Weiterfahrt von Ziel-FC erlaubt
|
|
L #Bereichs_Nr ;//Bereich-Nr.
|
|
T "MW190";//übergeben
|
|
L 0 ;//Erst mal nullen
|
|
T "MW194" ;//übergeben
|
|
T "MW196" ;//übergeben
|
|
T "MW198" ;//Weichenziel
|
|
|
|
UC FC[ #ZielFC] ;//Beeinflussung der Weiterfahrt
|
|
|
|
L 16#B102;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
UN "M180.6" ;//Weiterfahrt von Ziel-FC erlaubt
|
|
SPB RET;
|
|
|
|
L 3 ;//Weiter mit Schritt 3 (Ausfahren ok?)
|
|
SPA Neu_Mig;//Bei diesem Schritt weiter
|
|
|
|
NETWORK
|
|
TITLE = Schritt 3: Start ok ?
|
|
s003: NOP 0;
|
|
|
|
//Schrittaktionen:
|
|
|
|
//Anlage aus oder Störung:
|
|
L 16#B031;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
UN #Dyn.Sk.Auto_akt ;//Automatik ist aktiv
|
|
ON #Dyn.Sk.Bereich_ok ;//Bereich ist gestört
|
|
SPB X003;
|
|
|
|
//Starten erlaut Trolley ?:
|
|
L 16#B032;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
UN #Start_Ok ;//Starten ist erlaubt
|
|
SPB X003;
|
|
|
|
//Stau im Bereich +1:
|
|
L 16#B033;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
SET;
|
|
S #Dyn.Status."Trolley_wartet_Bereich+1";
|
|
|
|
U #B_Stau_raus ;//Sensor Stau im Bereich rausfahren
|
|
SPB X003;
|
|
|
|
//B_Aus_Bereich aktiv:
|
|
L 16#B034;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
L #Dyn.Raus_Trolleys;
|
|
L 0;//Trolleys schon unterwegs?
|
|
<>I;//Ja!
|
|
U #Dyn.Status."Trolley an Raus-Sensor";
|
|
O #Dyn.Status."Stau_an_Raus-Sensor";
|
|
= #Dyn.Error.Err_Raus_Sensor;//Raus-Sensor wird nicht erreicht (oder dauernd aktiv)!
|
|
SPB X003;
|
|
|
|
//Zu viele Raus-Trolleys unterwegs:
|
|
L 16#B027;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
L #Dyn.Raus_Trolleys;//Gestartete Trolleys
|
|
L #Bereich.MaxRausTrolleys;//Erlaubte Anzahl gestarteter Trolleys
|
|
>=I;
|
|
SPB X003;
|
|
|
|
//Antriebe aktivieren / aktiv ?:
|
|
U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche)
|
|
S #Antrieb_plus_vor;//Antrieb plus einschalten
|
|
|
|
U(;
|
|
O #Antrieb_plus_aktiv;//Antrieb plus aktiv
|
|
ON #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche)
|
|
);
|
|
S #Antrieb_Bereich_vor;//Antrieb einschalten
|
|
|
|
L 16#B036;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
UN #Antrieb_plus_aktiv;//Antrieb plus aktiv
|
|
U #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche)
|
|
SPB X003;
|
|
|
|
SET;
|
|
R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
|
|
L #Dyn.Raus_Trolleys;
|
|
+ 1;//Gestartete Trolleys + 1
|
|
T #Dyn.Raus_Trolleys;
|
|
|
|
L 4 ;//Weiter mit Schritt 4 (Trolley fährt aus)
|
|
SPA Neu_Mig ;//Bei diesem Schritt weiter
|
|
|
|
X003: L 2 ;//Beginn mit Schritt 2 (Ziel-FC?)
|
|
T #Dyn.Sk.Neu_Schritt;
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = Schritt 4: Trolley fährt aus ?
|
|
s004: SET ;//Weiterschaltbedingung
|
|
UN #B_BereichsEnde ;//Sensor Trolley ist in Bereich
|
|
U #Antrieb_Bereich_aktiv;
|
|
U(;
|
|
O #Antrieb_plus_aktiv;//Antrieb plus aktiv
|
|
ON #Bereich.Parameter_allg.Antrieb_Plus_vorhanden;//Bereich an weiterem Antrieb (Weiche)
|
|
);
|
|
= #Weiter;
|
|
|
|
//Schrittaktionen:
|
|
SET;
|
|
S #Dyn.Status.Trolley_fährt_aus;
|
|
|
|
//Antriebe:
|
|
//siehe Nw10
|
|
|
|
//5 s ohne Trolley-Signal:
|
|
U #Weiter;//Weiterschaltbedingung ist erfüllt
|
|
R #Dyn.Sk.Err_Uebzeit;//Sofort weiter !
|
|
R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
L 500 ;//Angabe der Wartezeit (*10ms)
|
|
SPB Plus ;//Nächsten Schritt starten
|
|
|
|
//Trolley fährt nicht aus:
|
|
U #Dyn.Sk.Err_Uebzeit;
|
|
S #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
|
|
//Automatisches löschen, falls Sensor spinnt:
|
|
UN #B_BereichsEnde ;//Sensor Trolley ist in Bereich
|
|
U #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
U #Dyn.Sk.Err_Uebzeit;
|
|
R #Dyn.Sk.Err_Uebzeit;
|
|
R #Dyn.Error.Err_Trolley_raus;//Trolley fährt nicht aus
|
|
|
|
L 16#B041;
|
|
T #Dyn.Stop_Ursache;
|
|
|
|
U #Antrieb_plus_aktiv;
|
|
= #Ueb_akt ;//Überwachungszeit aktivieren
|
|
L 20 ;//Angabe der Überwachungszeit (*1s)
|
|
SPA tueb ;//Überwachungszeit
|
|
|
|
NETWORK
|
|
TITLE = Schritt 5: Trolley ist draussen
|
|
s005: NOP 0;
|
|
|
|
//Trolley hat Bereich verlassen:
|
|
SET;
|
|
S #Dyn.Status.Trolley_draussen;//1 Zyklus
|
|
R #Dyn.Status.Trolley_am_BereichsEnde;
|
|
R #Dyn.Status.Trolley_fährt_aus;
|
|
|
|
L #Dyn.Gefahrene_Trolleys;
|
|
+ DINT#1 ;//Gefahrene Trolleys +1
|
|
T #Dyn.Gefahrene_Trolleys;
|
|
|
|
//Draussen-FC ?:
|
|
UN #DraussenFC_vorhanden;
|
|
SPB NoFC ;//Bei diesem Schritt weiter
|
|
|
|
L #Bereichs_Nr ;//Bereich-Nr.
|
|
T "MW190";
|
|
|
|
L 0;
|
|
T "MW198";
|
|
|
|
UC FC[ #DraussenFC] ;//z.Bsp. Daten anpassen
|
|
|
|
NoFC: SPA ENDE_Mig;
|
|
|
|
NETWORK
|
|
TITLE = Schrittkette beenden
|
|
ENDE_Mig: L 0;//Schritt 0: Warten
|
|
T #Dyn.Sk.Akt_Schritt;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk.Terr_Zelle;
|
|
T #Dyn.Sk.Tok_Zelle;
|
|
|
|
SET;
|
|
R #Dyn.Sk.Err_Uebzeit;
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = Nächsten Schritt aktivieren
|
|
Plus: T #Dyn.Sk.T_ok;//Wartezeit übergeben
|
|
|
|
U #Dyn.Sk.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.Tok_Zelle;//Wartezeit
|
|
|
|
W220_Mig: U #Warte_stop;//Wartezeit stoppen
|
|
SPB RET;
|
|
|
|
L #Dyn.Sk.Tok_Zelle;
|
|
L "MW4";//Wartezeit +10ms
|
|
+I;
|
|
T #Dyn.Sk.Tok_Zelle;//Wartezeit
|
|
L #Dyn.Sk.T_ok;//abgelaufen ?
|
|
<I;//Nein !
|
|
SPB RET;
|
|
|
|
w220: L #Dyn.Sk.Akt_Schritt;
|
|
+ 1;//Schritt +1
|
|
T #Dyn.Sk.Akt_Schritt;
|
|
|
|
L 0;//Zeitwerte löschen
|
|
T #Dyn.Sk.Terr_Zelle;
|
|
T #Dyn.Sk.Tok_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = Überwachungszeit kontrollieren
|
|
tueb: U #Ueb_akt;
|
|
= #Dyn.Sk.Ueb_akt;//Für Statuskontrolle
|
|
|
|
T #Dyn.Sk.T_Err;//Für Statuskontrolle
|
|
L #Dyn.Sk.Terr_Zelle;//Maximalzeit
|
|
>I;//abgelaufen ?
|
|
UN #Dyn.Sk.Err_Uebzeit;
|
|
SPB en24;//Nein !
|
|
|
|
U #Ueb_akt;//Überwachungszeit aktivieren
|
|
S #Dyn.Sk.Err_Uebzeit;
|
|
|
|
L 0;//Zeitwert löschen
|
|
T #Dyn.Sk.Terr_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
en24: NOP 0;
|
|
NETWORK
|
|
TITLE = Überwachungszeit +1
|
|
UN #Dyn.Sk.Ueb_akt;//Schrittaktion ist aktiv
|
|
ON "1s-Impuls";
|
|
SPB RET;
|
|
|
|
L #Dyn.Sk.Terr_Zelle;
|
|
+ 1 ;//Üb.zeit +1s
|
|
T #Dyn.Sk.Terr_Zelle;
|
|
|
|
SPA RET;
|
|
|
|
NETWORK
|
|
TITLE = Return
|
|
RET: NOP 0;
|
|
|
|
NETWORK
|
|
TITLE = Ende
|
|
BE;
|
|
|
|
END_FUNCTION_BLOCK
|
|
|