Files
HundM_awl/=A01+UH06-KF00/Programmbausteine/Module/MHMOmniBereich_Plus.awl
T

1318 lines
52 KiB
Plaintext

=== FB 2275: MHMOmniBereich_Plus [STL] ===
INTERFACE:
Input:
Bereichs_Nr : Int // Aufruf für Bereich
ErrQuit : Bool // Ablaufstörung quittieren
B_BereichsAnfang : Bool // Sensor Trolley fährt in Bereich
B_BereichsEnde : Bool // Sensor Trolley istam BereichsEnde
B_Zähl : Bool // Sensor Trolley hat Bereich verlassen
B_Stau_raus : Bool // Sensor Stau im Bereich rausfahren
Start_Ok : Bool // Starten ist erlauTrolley
Antrieb_Bereich_aktiv : Bool // Bereichs-Antrieb aktiv
Antrieb_plus_aktiv : Bool // Antrieb plus aktiv
RestZeit_Bereich_plus : Int := 999 // Bereich +1: Restzeit bis AFS stoppt (s)
Output:
Antrieb_Bereich_vor : Bool // Bereichs-Antrieb einschalten
Antrieb_Bereich_stop : Bool // Bereichs-Antrieb stoppen
Error : Word // Störungen übergeben
InOut:
Antrieb_Bereich_start : Bool // Bereichs-Antrieb mit Zeit starten
Antrieb_plus_vor : Bool // Antrieb plus einschalten
Antrieb_plus_start : Bool // Antrieb plus mit Zeit starten
Antrieb_minus_vor : Bool // Antrieb minus einschalten
hStOk : Bool // Anzeige Start n. Störung aktivieren
Static:
Res20 : Array[1..4] of Int // Reserve
Para : Struct // Parameter
Bereich_DL_DB : Int // Einsprung Bereich-Datenliste-DB
Frei22 : Int
Frei24 : Int
Res30 : Array[1..2] of Int // Reserve
Bereich : "UDLHMOmniBereich_Plus" // Statische Bereichdaten (aus DL)
Dyn : Struct // Dynamische Daten
Status : Struct
Trolley_kommt_in_Bereich : Bool // Trolley kommt in Bereich (Signal von Bereich-1)
Trolley_ist_im_Bereich : Bool // Trolley fährt in Bereich
Trolley_am_BereichsEnde : Bool // Trolley ist am BereichsEnde
Trolley_wartet_auf_Ziel-FC : Bool
Trolley_wartet_Bereich+1 : Bool // Trolley wartet auf Bereich +1
Trolley_fährt_aus : Bool // Trolley fährt aus
Trolley_draussen : Bool // Trolley ist ausgefahren
Error_aktiv : Bool // Störung vorhanden
Reset_aktiv : Bool := TRUE // Reset aktiv
Anfangs-Sensor_ausgewertet : Bool
Ende-Sensor_ausgewertet : Bool
Inilauf_aktiv : Bool
Trolley an Raus-Sensor : Bool // Trolley ist am Raus-Sensor
Stau_an_Raus-Sensor : Bool // Stau an Raus-Sensor (kein Zählen mehr)
HMI : Struct
Bereich_resetten : Bool // Bereich resetten (IN:HMI, Out:PLC)
Sk : "USk_ILS" // Status der Schrittkette
Rueckmld : Struct
RET_VAL_BLKMOV_Bereich : Int // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_Bereich : Byte
Error : "UErrHMOmniBereich"
Stau_Zeit : Int // Sensor B_VorSep ist belegt [100ms]
Leer_Zeit : Int
Stop_Ursache : Word // Stop-Stelle: Nw + Position
Gefahrene_Trolleys : DInt // Anzahl der getätigten Vereinzelungstakte
Laufzähler : Int // Laufzähler
Wartezeit : Int // Wartezeit (kein EInfahren erlaubt) [s]
Trolley_DL : Struct // AB DW350: Liste der Trolleys im Lager
Datenlistenkopf : Struct
KOPF : Word := WORD#16#DA01 // Datenliste-Kennnung (DA) / Datensatzlänge in Word (1 - 128)
LAENGE : Int := 10 // Länge der Datenliste (maximale Anzahl der Datensätze)
STAMMDATEN : Int := 1 // Stammdatenlänge in Word (1 - 9)
INDDB : Int // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
LAENGEINDDB : Int // Länge des indizierten DB in Word (nur bei Stammdaten = 1 erlaubt !!!)
INDDATEN_WANDEL_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
LETZTERZUGRIFF : Int // Speicherung des letzten Zugriffs
Belegt14 : Int // reserviert von Sort-Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze (nicht bei ind.Zugriff!)
Reserve18 : Int // Reserve
Trolley : Array[1..10] of Int // TrolleyZeit bis Ende (s)
Endekennung : Word := WORD#16#DAEE // Datensort-Ende-Kennung (DBEE)
Restzeit : Int // Diese Zeit hat Trolley noch zum Fahren (s)
Timer_Rein : TON_TIME
Timer_Raus : 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 : Array[1..2] of Int // Reserve
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
Constant:
--- NW 1: Parameter-Übergabe ---
L Bereichs_Nr
L 274 // Einsprung Bereich-DL
T Para.Bereich_DL_DB // vor Aufruf übergeben!
--- NW 2: Anzeige OP ---
L 252 // Bereichsstop aktiv
AN Dyn.Sk.Bereich_ok // Also: Bereichsstop / Not-Aus
JC w010
L 253
AN Dyn.Sk.Auto_akt // Keine Betriebsart
AN Dyn.Sk.Hand_akt
JC w010
L 255 // Handbetrieb aktiv
A Dyn.Sk.Hand_akt
JC w010
L Dyn.Sk.Akt_Schritt // Aktiver Schritt
w010: T Dyn.Sk.OP_Schritt
--- NW 3: 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
--- NW 4: HMI-Zeug ---
// Von HMI:
A Dyn.HMI.Bereich_resetten
R Dyn.HMI.Bereich_resetten // von HMI
S Dyn.Sk.Reset // SK zurücksetzen
--- NW 5: Sensoren entprellen ---
// Rein-Sensor entprellen:
AN B_BereichsAnfang
A Dyn.Status."Anfangs-Sensor_ausgewertet"
A Antrieb_Bereich_aktiv
= "M200.0"
CALL SYS "TON" (IN:="M200.0", PT:=t#7s, Q:=?, ET:=?)
A Dyn.Timer_Rein.Q
R Dyn.Status."Anfangs-Sensor_ausgewertet"
// Ende-Sensor entprellen:
AN B_BereichsEnde
A Dyn.Status."Ende-Sensor_ausgewertet"
A Antrieb_Bereich_aktiv
A Antrieb_plus_aktiv
= "M200.0"
CALL SYS "TON" (IN:="M200.0", PT:=t#6s, Q:=?, ET:=?)
A Dyn.Timer_Raus.Q
R Dyn.Status."Ende-Sensor_ausgewertet"
--- NW 6: Schrittkette zurücksetzen ---
A 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:
A ErrQuit // Überwachungszeit abgelaufen quittieren
A(
A Dyn.Status.Trolley_am_BereichsEnde
AN 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
JCN 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
JU RET
en04: NOP 0
--- NW 7: Störungen nach Außen übergeben ---
L 0
T "MW200"
A Dyn.Error.Bereich_DL // Bereich-Datenliste fehlerhaft
= "M200.0"
A Dyn.Error.Undef_Bereich // undefinierter Bereich
= "M200.1"
A Dyn.Error.Err_Trolley_nicht_am_Ende // Trolley fährt nicht in Bereich
= "M200.2"
A Dyn.Sk.Err_Uebzeit
= Dyn.Error.Err_Uebzeit // Überwachungzeit ist abgelaufen
= "M200.3"
NEG
R Dyn.Sk.Err_Uebzeit_AnzOk
A Dyn.Sk.Err_Schritt
= Dyn.Error.Err_Schritt // Schritt-Nummer ist nicht definiert
= "M200.4"
A Dyn.Error.Err_Stau_Eingang
= "M200.5"
A Dyn.Error.Err_BLKMov // Error bei Block kopieren
= "M200.6"
A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
= "M200.7"
A Dyn.Error.Err_Raus_Sensor // Raus-/Belade-Sensor wird nicht erreicht (oder dauernd aktiv)!
= "M201.0"
A Dyn.Error.Err11 // Trolley-Ziel nicht bekannt
= "M201.1"
A Dyn.Error.Err12 // Weichen-Datenliste fehlerhaft
= "M201.2"
A Dyn.Error.Err13 // undefinierte Weiche
= "M201.3"
A Dyn.Error.Err14 // Weiche bleibt belegt
= "M201.4"
A Dyn.Error.Err15
= "M201.5"
A Dyn.Error.Err16
= "M201.6"
A Dyn.Error.Err17
= "M201.7"
// Andere Meldung als Überwachungszeit aktiv ?:
L "MW200"
L 2#1111_0111_1111_1111
AW
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
A 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:
A(
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
--- NW 8: 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
JC en06 // Ja !
T "MW200" // Search-Daten
CALL FC "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)
JBI G_Ok
A "M199.0"
JCN w060
SET
= Dyn.Error.Bereich_DL // Bereichdatenbank fehlerhaft
L 16#A061
T Dyn.Stop_Ursache
JU RET
w060: SET
S Dyn.Error.Undef_Bereich // undefinierter Bereich
L 16#A062
T Dyn.Stop_Ursache
JU 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 SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=Dyn.Rueckmld.RET_VAL_BLKMOV_Bereich, DSTBLK:=Bereich) // Datenliste-Daten speichern | #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
JC RET
L Bereich.Bereichs_Typ // Bereichtyp = 174 (Normal)
L 2275 // Dieser Aufruf-FB ?
==I // Ja !
JC 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
JU RET
// Defaultwerte übergeben:
w061: NOP 0
JU RET
en06: NOP 0
--- NW 9: 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
--- NW 10: Antrieb zusätzlich starten / stoppen ---
// Antrieb -1:
A(
O Dyn.Error.Err_Stau_Eingang // Stau bei Einfahrt
O Dyn.Status."Anfangs-Sensor_ausgewertet"
)
A Antrieb_Bereich_aktiv
S Antrieb_minus_vor
// Bereichs-Antrieb starten:
A ErrQuit // Überwachungszeit abgelaufen quittieren
O
A B_BereichsAnfang
AN 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:
A 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:
A Dyn.Error.Err_Trolley_nicht_am_Ende
O
A Dyn.Status.Trolley_am_BereichsEnde
AN Dyn.Status."Trolley_fährt_aus"
O
A Dyn.Status."Trolley_fährt_aus"
A Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche)
AN Antrieb_plus_aktiv // //Antrieb plus aktiv
S Antrieb_Bereich_stop // Antrieb stoppen
// Antrieb +1:
L Dyn.Raus_Trolleys
L 0 // Trolles unterwegs?
>I // Ja!
AN 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
--- NW 11: Plus: Trolley ist an Zähl-/Stau-Sensor ---
A "B_Zähl"
= Trolley_draussen
A Trolley_draussen
JC B_Raus
AN Dyn.Status."Trolley an Raus-Sensor"
AN Dyn.Status."Stau_an_Raus-Sensor"
ON "100ms-Impuls"
ON Dyn.Sk.Bereich_ok
JC 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
AN Dyn.Status."Stau_an_Raus-Sensor"
JC RDel
CAC
L 200 // Nach ca. 20s
>=I
JC RDel
JU 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?:
A Dyn.Status."Stau_an_Raus-Sensor"
R Dyn.Status."Stau_an_Raus-Sensor"
JCN En10
L 0 // Bisher gefahrene Trolleys löschen
T Dyn.Raus_Trolleys
T Dyn."Zeit_Ohne_B_Zähl"
T Dyn.Stau_Zeit_RausSensor
JU En10
B_Raus: L 0
T Dyn."Zeit_Ohne_B_Zähl"
T Dyn."Zeit_Ausfahren_Ohne_B_Zähl"
// Einmalig:
AN Dyn.Status."Trolley an Raus-Sensor"
S Dyn.Status."Trolley an Raus-Sensor" // Raus-Sensor ausgewertet
JCN Xn10 // Negierter Sprung
L Dyn.Raus_Trolleys
+ -1 // Ausgefahrene Trolleys -1
T Dyn.Raus_Trolleys
L 0
>=I
JC Xn10
T Dyn.Raus_Trolleys // Minimum übergeben
// Stau an B_Raus:
Xn10: AN "100ms-Impuls"
O Dyn.Status."Stau_an_Raus-Sensor"
JC En10
L Dyn.Stau_Zeit_RausSensor
+ 1 // StauZeit +1
T Dyn.Stau_Zeit_RausSensor
L 90 // Nach ca. 9s
>=I
JCN En10 // Negierter Sprung
L 0 // Zeit löschen
T Dyn.Stau_Zeit_RausSensor
SET
S Dyn.Status."Stau_an_Raus-Sensor"
En10: NOP 0
--- NW 12: 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
JC RTTD
AN Antrieb_plus_aktiv
A Bereich.Parameter_allg.Antrieb_Plus_vorhanden
ON "1s-Impuls"
O Dyn.Error.Err_Raus_Sensor // Trolley fährt nicht aus
JC 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
JCN En12 // Negierter Sprung!
L Dyn.Raus_Trolleys
+ -1
T Dyn.Raus_Trolleys
JU 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
--- NW 13: Laufzähler ---
AN Antrieb_Bereich_aktiv
ON "1s-Impuls"
JC X900
L Dyn."Laufzähler"
+ +1
T Dyn."Laufzähler"
// Laufzähler rücksetzen?:
A Dyn.Status.Trolley_ist_im_Bereich
JC Warte
L 1 // Rücksetzen
T Dyn."Laufzähler"
Warte: L Dyn.Wartezeit
+ -1
T Dyn.Wartezeit
L 0 // Minimum unterschritten?
>=I // Nein!
JC X900
T Dyn.Wartezeit // Minimum übergeben
X900: NOP 0
--- NW 14: Anfangs-Sensor auswerten ---
L Bereich.Bereich_Dyn_DB
T SSDB
L Bereich.Bereich_Dyn_DW
L 110
+I
T SSDW
A B_BereichsAnfang
A Antrieb_Bereich_aktiv
AN Dyn.Status."Anfangs-Sensor_ausgewertet"
S Dyn.Status."Anfangs-Sensor_ausgewertet"
JCN 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
JC Save
L Bereich.Fahrzeit
L Dyn."Laufzähler"
+I // Abstand dazu addieren
T "MW220"
// Eintrag in Trolley-Bereichsliste
Save: CALL FC "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
--- NW 15: Ende-Sensor auswerten ---
A ErrQuit // Überwachungszeit abgelaufen quittieren
A 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
JC Delete
A B_BereichsEnde
A(
O Antrieb_Bereich_aktiv
O Dyn.Error.Err_Trolley_nicht_am_Ende
)
AN Dyn.Status."Ende-Sensor_ausgewertet"
S Dyn.Status."Ende-Sensor_ausgewertet"
JCN EndeEn // Negierter Sprung
A Dyn.Status.Inilauf_aktiv
R Dyn.Status.Inilauf_aktiv
JCN Delete // Negierter Sprung
L Dyn."Laufzähler"
+ -3 // damit mehr Sicherheit!
T Bereich.Fahrzeit // Abstand speichern
// /Austrag aus Trolley-Bereichsliste
Delete: CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#F100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196") // 1.Datensatz lesen
CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#E100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196") // Angegebenen Datensatz austragen
EndeEn: NOP 0
--- NW 16: Restzeit ermitteln ---
// Keine Daten gespeichert?:
AN Dyn.Status.Trolley_ist_im_Bereich
L 999 // Einfahren erlaubt
JU Rest // Aktuell ohne Berechnung
// Auswertung des nächsten Trolleys:
CALL FC "DatenOut" (SSDB:=SSDB, SSDW:=SSDW, PARA:=16#F100, SEARCHDATEN:="MW220", RE_VAL:="MB199", OUTDATEN:="MW220", Position:="MW196") // 1.Datensatz lesen
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!
)
JC KeinEinfahren // Einfahren nicht erlaubt
L Dyn.Restzeit
L 0 // sinnvoller Wert?
>=I // Ja!
A(
L Dyn.Trolley_DL.Datenlistenkopf.AnzahlEintraege
L Dyn.Trolley_DL.Datenlistenkopf.LAENGE
<I // noch Platz vorhanden!
)
JC RestOk
KeinEinfahren: L 0 // Kein Einfahren
T Dyn.Restzeit // Minimum übrgeben
RestOk: NOP 0
--- NW 17: 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
--- NW 18: Error: Stau Bereich-Eingang ---
// Sensor bei Bereichs-Einfahrt bleibt belegt?:
AN B_BereichsAnfang // Sensor Trolley fährt in Bereich (kein Stau !)
O ErrQuit
R Dyn.Error.Err_Stau_Eingang // Stau bei Einfahrt
JC X090 // StauZeit neu aufziehen
AN "1s-Impuls"
ON Antrieb_Bereich_aktiv
O Dyn.Error.Err_Stau_Eingang // Zeit bereits abgelaufen
JC 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
JCN Xn09
X090: L 0 // Zeiten löschen
T Dyn.Stau_Zeit // Sensor B_VorSep ist belegt [1s]
Xn09: NOP 0
--- NW 19: Schrittkette anhalten ---
A Dyn.Sk.Auto_akt // Automatik ist aktiv
A Dyn.Sk.Bereich_ok
CLR
JU 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
JU RET
en08_Mig: NOP 0
--- NW 20: Sprungverteiler ---
L Dyn.Sk.Neu_Schritt // Schritt, der im nächsten Zyklus aktiv werden soll
L -1 // angegeben ?
==I // Nein !
JC NEU
CAC // 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
JL Ende
JU s000 // Schritt 0
JU s001 // Schritt 1
JU s002 // Schritt 2
JU s003 // Schritt 3
JU s004 // Schritt 4
JU s005 // Schritt 5
JU s006 // Schritt 6
JU s007 // Schritt 7
JU s008 // Schritt 8
JU s009 // Schritt 9
JU s010 // Schritt 10
JU s011 // Schritt 11
JU s012 // Schritt 12
JU s013 // Schritt 13
JU s014 // Schritt 14
JU s015 // Schritt 15
JU s016 // Schritt 16
JU s017 // Schritt 17
JU s018 // Schritt 18
JU s019 // Schritt 19
JU s020 // Schritt 20
JU s021 // Schritt 21
JU s022 // Schritt 22
JU s023 // Schritt 23
JU s024 // Schritt 24
JU s025 // Schritt 25
JU s026 // Schritt 26
JU s027 // Schritt 27
JU s028 // Schritt 28
JU s029 // Schritt 29
JU s030 // Schritt 30
Ende: S Dyn.Sk.Err_Schritt // Undefinierter Schritt
L 16#A131
T Dyn.Stop_Ursache
JU RET
Neu_Mig: A Dyn.Sk.Err_Uebzeit
JCN Sk
L 16#A132
T Dyn.Stop_Ursache
JU RET
Sk: T Dyn.Sk.Akt_Schritt
L 0 // Zeitwerte löschen
T Dyn.Sk.Terr_Zelle
T Dyn.Sk.Tok_Zelle
JU NEU
// Nicht programmierte Schritte:
// s000: SPA Ende
// s001: SPA Ende
// s002: SPA Ende
// s003: SPA Ende
// s004: SPA Ende
// s005: SPA Ende
s006: JU Ende
s007: JU Ende
s008: JU Ende
s009: JU Ende
s010: JU Ende
s011: JU Ende
s012: JU Ende
s013: JU Ende
s014: JU Ende
s015: JU Ende
s016: JU Ende
s017: JU Ende
s018: JU Ende
s019: JU Ende
s020: JU Ende
s021: JU Ende
s022: JU Ende
s023: JU Ende
s024: JU Ende
s025: JU Ende
s026: JU Ende
s027: JU Ende
s028: JU Ende
s029: JU Ende
s030: JU Ende
--- NW 21: Schritt X: Reserve ---
SET // Weiterschaltbedingung
= Weiter
// Schrittaktionen:
SET
L 16#B001
T Dyn.Stop_Ursache
A Weiter // Weiterschaltbedingung ist erfüllt
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
L 0 // Angabe der Wartezeit (*10ms)
JC Plus // Nächsten Schritt starten
L 1 // Weiter mit Schritt 1
JC Neu_Mig // Bei diesem Schritt weiter
SET
A Dyn.Sk.Auto_akt // Automatik ist aktiv
A Dyn.Sk.Bereich_ok
= Ueb_akt // Überwachungszeit aktivieren
L 50 // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
JU RET
--- NW 22: Schritt 0: Warten auf Trolley am Bereichs-Ende ---
s000: SET // Weiterschaltbedingung
A B_BereichsEnde // Trolley im Bereich erkannt
A(
O Antrieb_Bereich_aktiv
O Dyn.Error.Err_Trolley_nicht_am_Ende
)
= Weiter
// Schrittaktionen:
SET
R Dyn.Error.Err_Trolley_raus
// Antriebe:
// siehe Nw10
A Weiter // Weiterschaltbedingung ist erfüllt
R Dyn.Sk.Err_Uebzeit // Sofort weiter !
L 0 // Angabe der Wartezeit (*10ms)
JC Plus // Nächsten Schritt starten
L 16#B001
T Dyn.Stop_Ursache
// Überwachungszeit starten:
A Dyn.Status.Trolley_ist_im_Bereich
A Antrieb_Bereich_aktiv
= Ueb_akt // Überwachungszeit aktivieren
// Reset aktiv?
A Dyn.Status.Reset_aktiv
A Dyn.Sk.Err_Uebzeit
R Dyn.Sk.Err_Uebzeit
JC Reset_fertig
L Restzeit_errechnet
L -20 // Trolley schon 20s überfällig
<I
AN Dyn.Status.Inilauf_aktiv
AN Dyn.Status.Reset_aktiv
O Dyn.Sk.Err_Uebzeit
S Dyn.Error.Err_Trolley_nicht_am_Ende
// Bei Üb.Zeit -> Kein Trolley drin!
A Dyn.Sk.Err_Uebzeit
JCN X000 // Negierter Sprung
SET
R Dyn.Sk.Err_Uebzeit
R Dyn.Error.Err_Trolley_nicht_am_Ende
JU Delete // Trolley aus Liste löschen
X000: L Bereich."Übzeit_in_Bereich"
JU 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 FC "DatenReset" (SSDB:=SSDB, SSDW:=SSDW, RE_VAL:="MB199")
JU ENDE_Mig
--- NW 23: Schritt 1: Trolley ist am Bereichsende ---
s001: NOP 0
// Schrittaktionen:
SET
= Weiter
R Dyn.Error.Err_Trolley_nicht_am_Ende
AN Weiter
JC RET
L 2 // Weiter mit Schritt 2 (Ziel-FC?)
JU Neu_Mig // Bei diesem Schritt weiter
--- NW 24: Schritt 2: Ziel-FC ---
s002: NOP 0
// Schrittaktionen:
SET
S Dyn.Status.Trolley_am_BereichsEnde
S Dyn.Status."Trolley_wartet_auf_Ziel-FC"
AN ZielFC_vorhanden
R Dyn.Status."Trolley_wartet_auf_Ziel-FC"
L 3 // Weiter mit Schritt 3 (Ausfahren ok?)
JC 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 DB[ZielFC] // Beeinflussung der Weiterfahrt
L 16#B102
T Dyn.Stop_Ursache
AN "M180.6" // Weiterfahrt von Ziel-FC erlaubt
JC RET
L 3 // Weiter mit Schritt 3 (Ausfahren ok?)
JU Neu_Mig // Bei diesem Schritt weiter
--- NW 25: Schritt 3: Start ok ? ---
s003: NOP 0
// Schrittaktionen:
// Anlage aus oder Störung:
L 16#B031
T Dyn.Stop_Ursache
AN Dyn.Sk.Auto_akt // Automatik ist aktiv
ON Dyn.Sk.Bereich_ok // Bereich ist gestört
JC X003
// Starten erlaut Trolley ?:
L 16#B032
T Dyn.Stop_Ursache
AN Start_Ok // Starten ist erlaubt
JC X003
// Stau im Bereich +1:
L 16#B033
T Dyn.Stop_Ursache
SET
S Dyn.Status."Trolley_wartet_Bereich+1"
A B_Stau_raus // Sensor Stau im Bereich rausfahren
JC X003
// B_Aus_Bereich aktiv:
L 16#B034
T Dyn.Stop_Ursache
L Dyn.Raus_Trolleys
L 0 // Trolleys schon unterwegs?
<>I // Ja!
A 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)!
JC 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
JC X003
// Antriebe aktivieren / aktiv ?:
A Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche)
S Antrieb_plus_vor // Antrieb plus einschalten
A(
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
AN Antrieb_plus_aktiv // Antrieb plus aktiv
A Bereich.Parameter_allg.Antrieb_Plus_vorhanden // Bereich an weiterem Antrieb (Weiche)
JC 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)
JU Neu_Mig // Bei diesem Schritt weiter
X003: L 2 // Beginn mit Schritt 2 (Ziel-FC?)
T Dyn.Sk.Neu_Schritt
JU RET
--- NW 26: Schritt 4: Trolley fährt aus ? ---
s004: SET // Weiterschaltbedingung
AN B_BereichsEnde // Sensor Trolley ist in Bereich
A Antrieb_Bereich_aktiv
A(
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:
A 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)
JC Plus // Nächsten Schritt starten
// Trolley fährt nicht aus:
A Dyn.Sk.Err_Uebzeit
S Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
// Automatisches löschen, falls Sensor spinnt:
AN B_BereichsEnde // Sensor Trolley ist in Bereich
A Dyn.Error.Err_Trolley_raus // Trolley fährt nicht aus
A 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
A Antrieb_plus_aktiv
= Ueb_akt // Überwachungszeit aktivieren
L 20 // Angabe der Überwachungszeit (*1s)
JU tueb // Überwachungszeit
--- NW 27: 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 ?:
AN DraussenFC_vorhanden
JC NoFC // Bei diesem Schritt weiter
L Bereichs_Nr // Bereich-Nr.
T "MW190"
L 0
T "MW198"
UC DB[DraussenFC] // z.Bsp. Daten anpassen
NoFC: JU ENDE_Mig
--- NW 28: 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
JU RET
--- NW 29: Nächsten Schritt aktivieren ---
Plus: T Dyn.Sk.T_ok // Wartezeit übergeben
A Dyn.Sk.Err_Uebzeit // Störung noch nicht quittiert
JC RET
L 0 // keine Wartezeit ?
==I // Ja ! -> sofort weiter
JC w220
AN Warte_neu // Wartezeit neutriggern
JC W220_Mig
L 0
T Dyn.Sk.Tok_Zelle // Wartezeit
W220_Mig: A Warte_stop // Wartezeit stoppen
JC 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 !
JC 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
JU RET
--- NW 30: Überwachungszeit kontrollieren ---
tueb: A 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 ?
AN Dyn.Sk.Err_Uebzeit
JC en24 // Nein !
A Ueb_akt // Überwachungszeit aktivieren
S Dyn.Sk.Err_Uebzeit
L 0 // Zeitwert löschen
T Dyn.Sk.Terr_Zelle
JU RET
en24: NOP 0
--- NW 31: Überwachungszeit +1 ---
AN Dyn.Sk.Ueb_akt // Schrittaktion ist aktiv
ON "1s-Impuls"
JC RET
L Dyn.Sk.Terr_Zelle
+ 1 // Üb.zeit +1s
T Dyn.Sk.Terr_Zelle
JU RET
--- NW 32: Return ---
RET: NOP 0
--- NW 33: Ende ---
BE