1318 lines
52 KiB
Plaintext
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
|
|
|