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

874 lines
34 KiB
Plaintext

=== FB 1280: MHMOmniWeiche_Plus [STL] ===
INTERFACE:
Input:
Weichen_Nr : Int // Aufruf für Weiche
ErrQuit : Bool // Ablaufstörung quittieren
Fahren_Ok : Bool // Fahren Ok
B_Ziel_gerade : Bool // Ziel-Sensor gerade
B_Ziel_abzweig : Bool // Ziel-Sensor abzweig
Antrieb_Weiche_aktiv : Bool // Weichen-Antrieb aktiv
Antrieb_Gerade_aktiv : Bool // Gerade-Antrieb aktiv
Antrieb_Abzweig_aktiv : Bool // Abzweig-Antrieb aktiv
Weiche_ist_AST : Bool // Weiche ist auf Arbeitsstellung
Output:
Y_Weiche_gerade : Bool // Weiche auf Gerade schalten
Y_Weiche_abzweig : Bool // Weiche auf Abzweig schalten
Error : Word // Störungen übergeben
InOut:
Antrieb_Weiche_vor : Bool // Weichenantrieb einschalten
Antrieb_Weiche_stop : Bool // Weichenantrieb stoppen
Antrieb_Weiche_gerade_vor : Bool // Weichenantrieb gerade einschalten
Antrieb_Weiche_gerade_stop : Bool // Weichenantrieb gerade stoppen
Antrieb_Weiche_abzweig_vor : Bool // Weichenantrieb abzweig einschalten
Antrieb_Weiche_abzweig_stop : Bool // Weichenantrieb abzweig stoppen
hStOk : Bool // Anzeige Start n. Störung aktivieren
Static:
SAVE : Struct
Schleusen_DB : Int // Schleuse-1-DB
Schleuse-1_DW : Int // Schleuse-1-DW
Res : Array[1..3] of Int // Reserve
Para : Struct // Parameter
Weichen_DL_DB : Int // Einsprung Weichen-Datenliste-DB
Weichen_DL_DW : Int // Einsprung Weichen-Datenliste-DW
Schleusen_DL_DB : Int // Einsprung Schleuse-Datenliste-DB
Schleusen_DL_DW : Int // Einsprung Schleuse-Datenliste-DW
Res1 : Array[1..1] of Int // Reserve
Weiche : "UDLHMOmniWeiche_2fach_Plus" // Fahrbereichs Daten
Dyn : Struct // Dynamische Daten fürs Einfahren
Status : Struct // Status
Weiche_frei : Bool // Rückmeldung: Weiche ist wieder frei
Kein_StartOk : Bool // Input StartOk <>1
Weiche_abzweigen : Bool // Weiche auf Abzweig schalten
Weiche_geradeaus : Bool // Weiche auf Gerade schalten
MindestZeit_ok : Bool // Mindestzeit für Weichendurchfahrt erreicht?
Ziel_erreicht : Bool // Ziel erreicht
Frei06 : Bool
Weiche_aktiv : Bool // Weiche ist aktiv
Auto_akt : Bool
Hand_akt : Bool
Bereich_ok : Bool
MindestZeit_nachtriggern : Bool // Mindestzeit nachtriggern (von Schleuse -1)
Warten_auf_Mindestzeit : Bool // Mindestzeit noch nicht abgelaufen
Res15 : Bool
Error_aktiv : Bool // Störung vorhanden
Reset_aktiv : Bool := TRUE // Reset aktiv
TrolleyID : DInt // Trolley-Nr (Eintrag Schleuse, Austrag Weiche)
Weichen_Ziel : Word // Weichen-Ziel (Eintrag Schleuse, Austrag Weiche)
Schleuse -1 : Int // Schleuse, woher Ziel kam
Zwischen_Ziel : Word // Zwischen-Ziel
HMI : Struct
TrolleyID_Weiche : DInt // Trolley-Nr im Weichenbereich (IN:PLC, OUT:PLC)
WeichenZiel : DInt // Ziel im Weichenbereich (IN:PLC, OUT:PLC)
Weiche_resetten : Bool // Weiche resetten (IN:HMI, Out:PLC)
Rueckmld : Struct
RET_VAL_BLKMOV_Weiche : Int // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_Weichen : Byte // Rückmeldung nach DatenOut-Aufruf
RET_VAL_DL_Schleusen : Byte // Rückmeldung nach DatenOut-Aufruf
Error : "UErrOmniWeiche_2fach"
FahrKontrolle : Struct
Para_Mindestzeit : Int // BM erst nach dieser Zeit im Ziel
Para_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt
Akt_Mindestzeitzeit : Int // BM erst nach dieser Zeit im Ziel
Akt_Überwachungszeit : Int // BM nach dieser Zeit in Weiche verklemmt
Leer_Zeit : Int // Lager ist frei [1s]
Schalttakte : DInt // Anzahl der getätigten Umschaltungen
Frei200 : Array[1..44] of Int
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Parameter : Word // Parameter
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt // Startwert mit Offset 0
Bereich+1ID : Int
Bereich+1_DB : Int
Keine_Einfahrt : Bool // Keine Einfahrt angemeldet
Err_Bereich+1 : Bool
Weichen_Trolleys : Bool // Weichen-Trolleys vorhanden
ZielSensor_aktiv : Bool
Abzweig_Ziel : Bool
Gerade_Ziel : Bool
Antriebe_ein : Bool
Constant:
--- NW 1: Parameter-Übergabe ---
L Weichen_Nr // Aufruf-Parameter (für Baustein beobachten)
L 279 // Einsprung Weichen-DL
T Para.Weichen_DL_DB // vor Aufruf übergeben!
L 0
T Para.Weichen_DL_DW
L 274 // Einsprung Schleuse-DL
T Para.Schleusen_DL_DB // vor Aufruf übergeben!
L 0
T Para.Schleusen_DL_DW
SET
R ZielSensor_aktiv // Temp
R Weichen_Trolleys
R Antriebe_ein
R Abzweig_Ziel
R Gerade_Ziel
--- NW 2: Gesamt: Out-Bits zum Zurücksetzen ---
L Weichen_Nr
SET
// R #Y_Weiche_gerade //Wegen Reset
// R #Y_Weiche_abzweig //Wegen Reset
SET // Erst mal
R Dyn.Status.Weiche_frei
S Dyn.Status.Weiche_aktiv
--- NW 3: HMI-Zeug ---
// Von HMI:
A Dyn.HMI.Weiche_resetten
R Dyn.HMI.Weiche_resetten // von HMI
S Dyn.Status.Reset_aktiv
JCN HMI1
L 0
T Dyn.Leer_Zeit // da kein Sk
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
SET
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
// An HMI:
HMI1: L Dyn.TrolleyID
T Dyn.HMI.TrolleyID_Weiche
L Dyn.Weichen_Ziel
T Dyn.HMI.WeichenZiel
--- NW 4: Störungen nach Außen übergeben ---
L 0
T "MB200"
A Dyn.Error.Weichen_DL // Weichen-Datenliste fehlerhaft
= "M200.0"
A Dyn.Error.Undef_Weiche // undefinierte Weiche
= "M200.1"
A Dyn.Error.BLKMov // Fehler bei Block kopieren
= "M200.2"
A Dyn.Error."Undef_Bereich+1"
= "M200.3"
A Dyn.Error.Frei04
= "M200.4"
A Dyn.Error.Frei05
= "M200.5"
A Dyn.Error.Ziel_undefiniert
= "M200.6"
A Dyn.Error.Err_Schleusen_DL
= "M200.7"
A Dyn.Error."Err_Undef_Schleuse-1"
= "M201.0"
A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen)
= "M201.1"
A Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen)
= "M201.2"
A Dyn.Error.Gerade_Sensor_aktiv
= "M201.3"
A Dyn.Error.Abzweig_Sensor_aktiv
= "M201.4"
A Dyn.Error.Gerade_Bereich_belegt
= "M201.5"
A Dyn.Error.Abzweig_Bereich_belegt
= "M201.6"
A Dyn.Status.Reset_aktiv
= Dyn.Error.Reset_aktiv
= "M201.7"
L "MW200"
T Error // Schnittstelle nach Außen
// Störung vorhanden:
L 0
<>I // Ja !
= Dyn.Status.Error_aktiv
// Anzeige Start n. Störung aktivieren:
A Dyn.Error."Übzeit_Gerade" // BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen)
O Dyn.Error."Übzeit_Abzweig" // BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen)
S hStOk
--- NW 5: Statische Weichen-Parameter holen ---
L Weiche.Weichen_Nr // Nummer der Weiche
L Weichen_Nr // Aufruf-Parameter
==I // Identisch ?
R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
R Dyn.Error.Undef_Weiche // undefinierte Weiche
JC en06_Mig // Ja !
T "MW200" // Search-Daten
CALL FC "DatenOut" (SSDB:=Para.Weichen_DL_DB, SSDW:=Para.Weichen_DL_DW, 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_Weichen // Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
JBI G_Ok
A "M199.0"
= Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
BEC
SET
S Dyn.Error.Undef_Weiche // undefinierte Weiche
BEU
// Kennung + Datenbytes
G_Ok: SET
R Dyn.Error.Weichen_DL // Weichendatenbank fehlerhaft
R Dyn.Error.Undef_Weiche // undefinierte Weiche
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 40 // 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_Weiche, DSTBLK:=Weiche) // Datenliste-Daten speichern | #Ziel
L Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche // Rückmeldung
L 0 // Fehler vorhanden ?
<>I // Ja !
= Dyn.Error.BLKMov // Error bei Block kopieren
BEC
L Weiche.Weichen_Typ // Weichentyp = 1280 (HM-Weiche 2fach_Plus)
L 1280 // Dieser Aufruf-FB ?
==I // Ja !
JC en06_Mig
SET
S Dyn.Error.Undef_Weiche // undefinierte Weiche
L 0 // Weiche ungültig !
T Weiche.Weichen_Nr // Nummer der Weiche
BEU
en06_Mig: NOP 0
--- NW 6:
---
AN Dyn.Status.Reset_aktiv
JC En06
SET
S Antrieb_Weiche_vor
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
AN Antrieb_Weiche_aktiv
ON "1s-Impuls"
JC En06
L Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
+ +1
T Dyn.Leer_Zeit // Zeit für LeerCheck [1s]
L Weiche.Wartezeit_bis_Weiche_leer // Leer-Zeit erreicht ?
<I // Nein !
JC En06
// Dyn.Daten löschen:
SET
R Dyn.Status.Reset_aktiv
R Dyn.Status.Weiche_abzweigen
R Dyn.Status.Weiche_geradeaus
L DINT#0
T Dyn.TrolleyID
L 0
T Dyn.Weichen_Ziel
T Dyn.Zwischen_Ziel
T Dyn."Schleuse -1"
T Dyn.Leer_Zeit
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
T SAVE.Schleusen_DB
T SAVE."Schleuse-1_DW"
// Rückmeldungen löschen:
L 0
T Dyn.Rueckmld.RET_VAL_DL_Weichen
T Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche
T Dyn.Rueckmld.RET_VAL_DL_Schleusen
// Störungen löschen:
SET
R Dyn.Error.Weichen_DL
R Dyn.Error.Undef_Weiche
R Dyn.Error.BLKMov
R Dyn.Error."Undef_Bereich+1"
R Dyn.Error.Frei04
R Dyn.Error.Frei05
R Dyn.Error.Ziel_undefiniert
R Dyn.Error.Err_Schleusen_DL
R Dyn.Error."Err_Undef_Schleuse-1"
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
R Dyn.Error.Gerade_Sensor_aktiv
R Dyn.Error.Abzweig_Sensor_aktiv
R Dyn.Error.Gerade_Bereich_belegt
R Dyn.Error.Abzweig_Bereich_belegt
R Dyn.Status.Warten_auf_Mindestzeit
R Dyn.Error.Reset_aktiv // Reset ist aktiv
L 0 // Damit statische Werte neu aus Datenbank geholt werden !
T Weiche.Weichen_Nr // Nummer der Weiche
BEU
En06: NOP 0
--- NW 7: Einsprung Schleuse -1 ermitteln ---
L Dyn."Schleuse -1" // Nr. der Schleuse -1 [In/OUT von Schleuse -1 / Reset]
T "MW200" // Search-Daten
L 0 // angegeben ?
==I // Nein !
= Keine_Einfahrt
JC En08
L SAVE.Schleusen_DB // Weichen-FIFO-DB
L 0 // Einsprung-Zeiger bekannt ?
>I // Ja !
R Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
R Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
JC En08
CALL FC "DatenOut" (SSDB:=Para.Schleusen_DL_DB, SSDW:=Para.Schleusen_DL_DW, 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_Schleusen // Rückmeldung bei Datenbank-Zugriff (Weichen-DL)
JBI W_Ok
A "M199.0"
= Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
BEC
SET
S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
BEU
W_Ok: L "MW224" // Rein-FIFO-DB
T SAVE.Schleusen_DB // Weichen-FIFO-DB
L 0 // sinnvoller Wert ?
<=I // Nein !
S Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
BEC
L "MW226" // Schleuse -1
T SAVE."Schleuse-1_DW"
En08: NOP 0
--- NW 8:
---
// Antrieb zusätzlich starten:
A ErrQuit // Überwachungszeit abgelaufen quittieren
S Antrieb_Weiche_vor // Weichenantrieb starten
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
AN ErrQuit
AN Keine_Einfahrt
JC En08_Mig
// Störungen löschen:
SET
R Dyn.Error.Ziel_undefiniert
R Dyn.Error.Err_Schleusen_DL
R Dyn.Error."Err_Undef_Schleuse-1"
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
R Dyn.Error.Gerade_Sensor_aktiv
R Dyn.Error.Abzweig_Sensor_aktiv
R Dyn.Error.Gerade_Bereich_belegt
R Dyn.Error.Abzweig_Bereich_belegt
// Kann nur über Reset zurückgesetzt werden:
// / R #Dyn.Error.Weichen_DL
// / R #Dyn.Error.Undef_Weiche
// / R #Dyn.Error.BLKMov
// / R #Dyn.Error."Undef_Bereich+1"
// / R #Dyn.Error.Frei04
// / R #Dyn.Error.Frei05
// / R #Dyn.Error.Reset_aktiv//Reset ist aktiv
En08_Mig: NOP 0
--- NW 9: Einfahrt angemeldet/reserviert ? ---
A Keine_Einfahrt // Also keine Schleuse -1 aktiv
AN Dyn.Status.Warten_auf_Mindestzeit
O Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
O Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
JCN Schalt // Negierter Sprung!
// Einsprung löschen:
L 0
T SAVE.Schleusen_DB
T SAVE."Schleuse-1_DW"
// Weichendaten löschen:
L DINT#0
T Dyn.TrolleyID
L 0
T Dyn.Weichen_Ziel
T Dyn.Zwischen_Ziel
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
SET
R Dyn.Status.Kein_StartOk
R Dyn.Status.MindestZeit_ok
R Dyn.Status.Ziel_erreicht
R Dyn.Status.Weiche_geradeaus
R Dyn.Status.Weiche_abzweigen
JU Ret // Weichen-Checkerei überspringen
--- NW 10: Weiche aufgrund vom Weichen-Ziel checken ---
// Ziel-Check für Kontrolle:
Schalt: L Dyn.Weichen_Ziel
L Weiche.Abzweig.Ziel // Abzweig-Ziel?
==I // Ja!
= Abzweig_Ziel
CAC
L Weiche.Gerade.Ziel // Gerade-Ziel?
==I // Ja!
= Gerade_Ziel
// Sind noch Teile im Weichenbereich?:
L SAVE."Schleuse-1_DW"
ITD
T AR1Start // Startwert mit Offset 0
L AR1Start // Startwert mit Offset 0
+ DINT#162
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
L DBW [AR1Zeiger] // Raus-Trolleys von Schleuse-1 (DBW162)
L 0 // Teile vorhanden?
>I // JA !
= Weichen_Trolleys
// Evtl. Weiche umschalten:
A Weichen_Trolleys // Trolleys im Weichenbereich!
A(
O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
O Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
)
JC en10
A Dyn.Status.MindestZeit_ok
R Dyn.Status.Warten_auf_Mindestzeit
A Dyn.Status.Warten_auf_Mindestzeit
JC en10
A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
O Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
O Dyn.Status.Warten_auf_Mindestzeit
R Dyn.Error.Ziel_undefiniert
R Dyn.Error.Gerade_Sensor_aktiv
R Dyn.Error.Abzweig_Sensor_aktiv
R Dyn.Error.Gerade_Bereich_belegt
R Dyn.Error.Abzweig_Bereich_belegt
JC en10
AN Fahren_Ok
= Dyn.Status.Kein_StartOk
JC Ret
// Ziel-Check zum Schalten:
L Dyn.Weichen_Ziel
L 0
==I
S Dyn.Error.Ziel_undefiniert
JC New
CAC
L Weiche.Abzweig.Ziel // Abzweig-Ziel?
==I // Ja!
JC Abzweigen
CAC
L Weiche.Gerade.Ziel // Gerade-Ziel?
==I // Ja!
JC Gerade
SET
S Dyn.Error.Ziel_undefiniert
JU New
Gerade: NOP 0
// Gerade-Fahrt gewünscht**************************************************
// Ziel-Sensor-Check:
A B_Ziel_gerade
= Dyn.Error.Gerade_Sensor_aktiv
A Dyn.Error.Gerade_Sensor_aktiv // Muss erst quittiert werden!
JC New
// Trolley geradeaus fahren:
SET
S Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
R Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
S Dyn.Status.Warten_auf_Mindestzeit
// Zeiten speichern:
L Weiche.Gerade.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein
T Dyn.FahrKontrolle.Para_Mindestzeit
L Weiche.Gerade."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben
T Dyn.FahrKontrolle."Para_Überwachungszeit"
JU en10
Abzweigen: NOP 0
// Abzweig-Fahrt gewünscht**************************************************
// Ziel-Sensor-Check:
A B_Ziel_abzweig
= Dyn.Error.Abzweig_Sensor_aktiv
A Dyn.Error.Abzweig_Sensor_aktiv // Muss erst quittiert werden!
JC New
// Trolly abzweigen fahren:
SET
S Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
R Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
S Dyn.Status.Warten_auf_Mindestzeit
// Zeiten speichern:
L Weiche.Abzweig.Mindestzeit // Nach dieser Zeit kann Trolley erst aus Weiche sein
T Dyn.FahrKontrolle.Para_Mindestzeit
L Weiche.Abzweig."Überwachungszeit" // Nach dieser Zeit muss Trolley Zielbereich erreicht haben
T Dyn.FahrKontrolle."Para_Überwachungszeit"
JU en10
New: AN ErrQuit
JC en10
L 0 // Reservierung löschen
T Dyn."Schleuse -1"
en10: NOP 0
--- NW 11: Mindestzeit / Überwachungszeit ---
A Gerade_Ziel
A(
ON Y_Weiche_gerade
ON Antrieb_Gerade_aktiv
)
O
A Abzweig_Ziel
A(
ON Y_Weiche_abzweig
ON Antrieb_Abzweig_aktiv
)
JC W011
// Mindestzeit neu triggern: (von Schleuse -1)
A Dyn.Status.MindestZeit_nachtriggern
R Dyn.Status.MindestZeit_nachtriggern
S Dyn.Status.Warten_auf_Mindestzeit
JCN X011 // Negierter Sprung
W011: L 0
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
JU y011
// Zeiten aufaddieren:
X011: AN "1s-Impuls" // 1s-Impuls
ON Antrieb_Weiche_aktiv
JC X08E
L Dyn.FahrKontrolle.Akt_Mindestzeitzeit
+ 1
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
y011: L Dyn.FahrKontrolle.Akt_Mindestzeitzeit
L Dyn.FahrKontrolle.Para_Mindestzeit
>=I
= Dyn.Status.MindestZeit_ok
JCN X080
T Dyn.FahrKontrolle.Akt_Mindestzeitzeit
X080: A Dyn.Error."Übzeit_Gerade"
O Dyn.Error."Übzeit_Abzweig"
ON "1s-Impuls" // 1s-Impuls
ON Antrieb_Weiche_aktiv
JC X08E
L Dyn.FahrKontrolle."Akt_Überwachungszeit"
+ 1
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
L Dyn.FahrKontrolle."Para_Überwachungszeit"
<I // Max.Zeit erreicht ?
JC X08E // Nein
// Überwachungszeit ist abgelaufen:
A Dyn.Status.Weiche_geradeaus
S Dyn.Error."Übzeit_Gerade"
A Dyn.Status.Weiche_abzweigen
S Dyn.Error."Übzeit_Abzweig"
L 0 // Zeiten neu initialisieren
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
X08E: NOP 0
--- NW 12: Ziel ist erreicht ---
A Dyn.Status.Weiche_geradeaus
A B_Ziel_gerade
S ZielSensor_aktiv
R Dyn.Error."Übzeit_Gerade"
A Dyn.Status.Weiche_abzweigen
A B_Ziel_abzweig
S ZielSensor_aktiv
R Dyn.Error."Übzeit_Abzweig"
JC Ziel_AOk
JU X09E
Ziel_AOk: A Dyn.Status.Ziel_erreicht // Einmaliger Durchlauf
JC X09E
SET
S Dyn.Status.Ziel_erreicht
L Dyn.Schalttakte
+ DINT#1 // Auf Abzweig umgeschaltet +1
T Dyn.Schalttakte
X09E: A ZielSensor_aktiv
O Dyn.Status.Reset_aktiv
JCN En12 // Negierter Sprung
L 0 // Zeiten neu initialisieren
T Dyn.FahrKontrolle."Akt_Überwachungszeit"
SET
R Dyn.Error."Übzeit_Gerade"
R Dyn.Error."Übzeit_Abzweig"
En12: NOP 0
--- NW 13: RET: Weiche schalten ---
Ret: A Dyn.Status.Reset_aktiv
O Weichen_Trolleys
JC En13
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
R Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
S Y_Weiche_gerade // nicht mit =, damit Weichenstellung erst bei Änderung schaltet!
R Y_Weiche_abzweig
A Dyn.Status.Weiche_abzweigen // Weiche auf Abzweig schalten
S Y_Weiche_abzweig
R Y_Weiche_gerade // nicht mit =, damit Weichenstellung erst bei Änderung schaltet!
En13: NOP 0
--- NW 14: Antriebe ansteuern / stoppen ? ---
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
O Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
ON Keine_Einfahrt // Also ist Schleuse -1 aktiv
O Weichen_Trolleys
= Antriebe_ein
A Antriebe_ein
O Dyn.Status.Reset_aktiv
S Antrieb_Weiche_vor // Weichenantrieb starten
A Antriebe_ein
A Dyn.Status.Weiche_geradeaus
O Dyn.Status.Reset_aktiv
S Antrieb_Weiche_gerade_vor // Antrieb gerade einschalten
A Antriebe_ein
A Dyn.Status.Weiche_abzweigen
O Dyn.Status.Reset_aktiv
S Antrieb_Weiche_abzweig_vor // Antrieb abzweig einschalten
// Antriebe stoppen
AN Dyn.Status.Reset_aktiv
A(
AN Keine_Einfahrt // Also ist Schleuse -1 aktiv
A(
AN Fahren_Ok
O
A Dyn.Status.Weiche_abzweigen
A(
ON Weiche_ist_AST
ON Antrieb_Abzweig_aktiv
)
O
A Dyn.Status.Weiche_geradeaus
A(
O Weiche_ist_AST
ON Antrieb_Gerade_aktiv
)
)
ON Dyn.Status.Auto_akt // SystemVoraussetzungen fehlen
O Dyn.Status.Hand_akt
ON Dyn.Status.Bereich_ok
)
S Antrieb_Weiche_stop // Alle Antriebe stoppen
SET // //
R Antrieb_Weiche_stop // Alle Antriebe stoppen////
--- NW 15: Weiche ist frei ---
L SAVE.Schleusen_DB // Alte Speicherung ?
L SAVE."Schleuse-1_DW"
OW
L Dyn.Weichen_Ziel
OW
L 0
==I
A Keine_Einfahrt // Keine Einfahrt aktiv
AN Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
AN Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
AN Dyn.Status.Warten_auf_Mindestzeit
AN Dyn.Status.Reset_aktiv
= Dyn.Status.Weiche_frei
R Dyn.Status.MindestZeit_nachtriggern
NEG
= Dyn.Status.Weiche_aktiv // Zum Abfragen, damit evtl. Förderer nicht ausgeschaltet wird
--- NW 16: Schleuse -1 aktiv / vorhanden ? ---
A Keine_Einfahrt
O Dyn.Error.Err_Schleusen_DL // Schleusen-Datenliste fehlerhaft
O Dyn.Error."Err_Undef_Schleuse-1" // undefinierte Schleuse-1
BEC
L SAVE.Schleusen_DB // Schleusen-DB
L 0 // Einsprung-Zeiger bekannt ?
<=I // Nein !
BEC
// Anmeldung an diese Weiche von Schleuse -1 noch aktiv?:
L SAVE."Schleuse-1_DW"
ITD
T AR1Start // Startwert mit Offset 0
L AR1Start // Startwert mit Offset 0
+ DINT#16
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
L DBW [AR1Zeiger] // Anmeldung von dieser Schleuse (DBW16)
L Weichen_Nr
==I // Ja !
O Dyn.Status.Warten_auf_Mindestzeit
JC Mldg
L 0 // Reservierung löschen
T Dyn."Schleuse -1"
BEU
--- NW 17: Meldung an Schleuse -1: Weiche hat geschaltet ---
Mldg: L AR1Start // Startwert mit Offset 0
+ DINT#71
SLD 3
L 4 // Damit DBX71.4
OD
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
A(
A Dyn.Status.Weiche_geradeaus // Weiche auf Gerade schalten
A Gerade_Ziel
A Y_Weiche_gerade
A Antrieb_Gerade_aktiv
O
A Dyn.Status.Weiche_abzweigen // Gerade hätte Vorrang
A Abzweig_Ziel
A Y_Weiche_abzweig
A Antrieb_Abzweig_aktiv
)
A Fahren_Ok
A Antrieb_Weiche_aktiv // Antrieb aktiv
AN Dyn.Status.Reset_aktiv
= DBX [AR1Zeiger] // Weiche hat geschaltet ? (DBX71.4)
--- NW 18: Meldung an Schleuse -1: Aktuell aktives Ziel ---
// Rückmeldung an Schleuse -1 (Weichenziel):
L AR1Start // Startwert mit Offset 0
+ DINT#166
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
L Dyn.Weichen_Ziel
T DBW [AR1Zeiger] // Zurückgemeldetes WeichenZiel (DBW166)
--- NW 19: Meldung an Schleuse -1: Trolley hat Ziel erreicht ---
L AR1Start // Startwert mit Offset 0
+ DINT#71
SLD 3
L 5 // Damit DBX71.5
OD
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[SAVE.Schleusen_DB] // FABE+ -DB öffnen
A ZielSensor_aktiv
O Dyn.Status.Reset_aktiv
= DBX [AR1Zeiger] // Trolley ausserhalb Weiche (DBX71.5)
--- NW 20: Ende ---
BE