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

935 lines
33 KiB
Plaintext

FUNCTION_BLOCK "MHMOmniWeiche_Plus"
TITLE = OmniWeichen-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : AE
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-960629
//
//Version Plus: HM-Omniflow 2100 / 12.2025
//-kompatibel zu Schleuse_Plus
//
//Version: H&M Omniflow 2100 / 07.2025
//
//Version: Omniflow 2100 / 10.2024
//
VAR_INPUT
Weichen_Nr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Aufruf für Weiche
ErrQuit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ablaufstörung quittieren
Fahren_Ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Fahren Ok
B_Ziel_gerade { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ziel-Sensor gerade
B_Ziel_abzweig { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ziel-Sensor abzweig
Antrieb_Weiche_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : 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
END_VAR
VAR_OUTPUT
Y_Weiche_gerade { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche auf Gerade schalten
Y_Weiche_abzweig { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche auf Abzweig schalten
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Störungen übergeben
END_VAR
VAR_IN_OUT
Antrieb_Weiche_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weichenantrieb einschalten
Antrieb_Weiche_stop { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weichenantrieb stoppen
Antrieb_Weiche_gerade_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weichenantrieb gerade einschalten
Antrieb_Weiche_gerade_stop { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weichenantrieb gerade stoppen
Antrieb_Weiche_abzweig_vor { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weichenantrieb abzweig einschalten
Antrieb_Weiche_abzweig_stop { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weichenantrieb abzweig stoppen
hStOk { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Anzeige Start n. Störung aktivieren
END_VAR
VAR
SAVE { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
Schleusen_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Schleuse-1-DB
"Schleuse-1_DW" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Schleuse-1-DW
Res { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..3] of Int; // Reserve
END_STRUCT;
Para { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Parameter
Weichen_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Weichen-Datenliste-DB
Weichen_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Weichen-Datenliste-DW
Schleusen_DL_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Schleuse-Datenliste-DB
Schleusen_DL_DW { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Einsprung Schleuse-Datenliste-DW
Res1 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..1] of Int; // Reserve
END_STRUCT;
Weiche { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "UDLHMOmniWeiche_2fach_Plus"; // Fahrbereichs Daten
Dyn : Struct // Dynamische Daten fürs Einfahren
Status { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct // Status
Weiche_frei { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Rückmeldung: Weiche ist wieder frei
Kein_StartOk { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Input StartOk <>1
Weiche_abzweigen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche auf Abzweig schalten
Weiche_geradeaus { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche auf Gerade schalten
MindestZeit_ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Mindestzeit für Weichendurchfahrt erreicht?
Ziel_erreicht { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Ziel erreicht
Frei06 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
Weiche_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Weiche ist aktiv
Auto_akt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
Hand_akt { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
Bereich_ok { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
MindestZeit_nachtriggern { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Mindestzeit nachtriggern (von Schleuse -1)
Warten_auf_Mindestzeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Mindestzeit noch nicht abgelaufen
Res15 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool;
Error_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool; // Störung vorhanden
Reset_aktiv { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Bool := TRUE; // Reset aktiv
END_STRUCT;
TrolleyID { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Trolley-Nr (Eintrag Schleuse, Austrag Weiche)
Weichen_Ziel { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Word; // Weichen-Ziel (Eintrag Schleuse, Austrag Weiche)
"Schleuse -1" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Schleuse, woher Ziel kam
Zwischen_Ziel : Word; // Zwischen-Ziel
HMI : Struct
TrolleyID_Weiche { ExternalWritable := 'False'} : DInt; // Trolley-Nr im Weichenbereich (IN:PLC, OUT:PLC)
WeichenZiel { ExternalWritable := 'False'} : DInt; // Ziel im Weichenbereich (IN:PLC, OUT:PLC)
Weiche_resetten : Bool; // Weiche resetten (IN:HMI, Out:PLC)
END_STRUCT;
Rueckmld { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
RET_VAL_BLKMOV_Weiche { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_Weichen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
RET_VAL_DL_Schleusen { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Byte; // Rückmeldung nach DatenOut-Aufruf
END_STRUCT;
Error { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : "UErrOmniWeiche_2fach";
FahrKontrolle { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Struct
Para_Mindestzeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM erst nach dieser Zeit im Ziel
Para_Überwachungszeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM nach dieser Zeit in Weiche verklemmt
Akt_Mindestzeitzeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM erst nach dieser Zeit im Ziel
Akt_Überwachungszeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // BM nach dieser Zeit in Weiche verklemmt
END_STRUCT;
Leer_Zeit { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // Lager ist frei [1s]
Schalttakte { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DInt; // Anzahl der getätigten Umschaltungen
Frei200 { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Array[1..44] of Int;
END_STRUCT;
END_VAR
VAR_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;
END_VAR
BEGIN
NETWORK
TITLE = 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;
NETWORK
TITLE = 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;
NETWORK
TITLE = HMI-Zeug
//Von HMI:
U #Dyn.HMI.Weiche_resetten;
R #Dyn.HMI.Weiche_resetten;//von HMI
S #Dyn.Status.Reset_aktiv;
SPBN 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;
NETWORK
TITLE = Störungen nach Außen übergeben
L 0;
T "MB200";
U #Dyn.Error.Weichen_DL;//Weichen-Datenliste fehlerhaft
= "M200.0";
U #Dyn.Error.Undef_Weiche;//undefinierte Weiche
= "M200.1";
U #Dyn.Error.BLKMov;//Fehler bei Block kopieren
= "M200.2";
U #Dyn.Error."Undef_Bereich+1";
= "M200.3";
U #Dyn.Error.Frei04;
= "M200.4";
U #Dyn.Error.Frei05;
= "M200.5";
U #Dyn.Error.Ziel_undefiniert;
= "M200.6";
U #Dyn.Error.Err_Schleusen_DL;
= "M200.7";
U #Dyn.Error."Err_Undef_Schleuse-1";
= "M201.0";
U #Dyn.Error.Übzeit_Gerade;//BM bei Weiterfahrt in Weiche verklemmt (-> Antrieb stoppen)
= "M201.1";
U #Dyn.Error.Übzeit_Abzweig;//BM bei Ausfahrt in Weiche verklemmt (-> Antrieb stoppen)
= "M201.2";
U #Dyn.Error.Gerade_Sensor_aktiv;
= "M201.3";
U #Dyn.Error.Abzweig_Sensor_aktiv;
= "M201.4";
U #Dyn.Error.Gerade_Bereich_belegt;
= "M201.5";
U #Dyn.Error.Abzweig_Bereich_belegt;
= "M201.6";
U #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:
U #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;
NETWORK
TITLE = 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
SPB en06_Mig;//Ja !
T "MW200";//Search-Daten
CALL "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)
SPBI G_Ok;
U "M199.0";
= #Dyn.Error.Weichen_DL;//Weichendatenbank fehlerhaft
BEB;
SET;
S #Dyn.Error.Undef_Weiche;//undefinierte Weiche
BEA;
//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 BLKMOV//Datenliste-Daten speichern
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche ,
DSTBLK := #Weiche //#Ziel
);
L #Dyn.Rueckmld.RET_VAL_BLKMOV_Weiche;//Rückmeldung
L 0;//Fehler vorhanden ?
<>I;//Ja !
= #Dyn.Error.BLKMov;//Error bei Block kopieren
BEB;
L #Weiche.Weichen_Typ;//Weichentyp = 1280 (HM-Weiche 2fach_Plus)
L 1280 ;//Dieser Aufruf-FB ?
==I;//Ja !
SPB en06_Mig;
SET;
S #Dyn.Error.Undef_Weiche;//undefinierte Weiche
L 0;//Weiche ungültig !
T #Weiche.Weichen_Nr;//Nummer der Weiche
BEA;
en06_Mig: NOP 0;
NETWORK
TITLE = Reset
//
//
UN #Dyn.Status.Reset_aktiv;
SPB En06;
SET;
S #Antrieb_Weiche_vor;
S #Antrieb_Weiche_gerade_vor ;//Antrieb gerade einschalten
S #Antrieb_Weiche_abzweig_vor;//Antrieb abzweig einschalten
UN #Antrieb_Weiche_aktiv;
ON "1s-Impuls";
SPB 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 !
SPB 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
BEA;
En06: NOP 0;
NETWORK
TITLE = 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;
SPB 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
SPB En08;
CALL "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)
SPBI W_Ok;
U "M199.0";
= #Dyn.Error.Err_Schleusen_DL;//Schleusen-Datenliste fehlerhaft
BEB;
SET;
S #Dyn.Error."Err_Undef_Schleuse-1";//undefinierte Schleuse-1
BEA;
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
BEB;
L "MW226" ;//Schleuse -1
T #SAVE."Schleuse-1_DW";
En08: NOP 0;
NETWORK
TITLE = Störungen quittieren
//
//
//Antrieb zusätzlich starten:
U #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
UN #ErrQuit;
UN #Keine_Einfahrt;
SPB 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;
NETWORK
TITLE = Einfahrt angemeldet/reserviert ?
U #Keine_Einfahrt ;//Also keine Schleuse -1 aktiv
UN #Dyn.Status.Warten_auf_Mindestzeit;
O #Dyn.Error.Err_Schleusen_DL;//Schleusen-Datenliste fehlerhaft
O #Dyn.Error."Err_Undef_Schleuse-1";//undefinierte Schleuse-1
SPBN 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;
SPA Ret ;//Weichen-Checkerei überspringen
NETWORK
TITLE = 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;
TAK;
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)
AUF 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:
U #Weichen_Trolleys ;//Trolleys im Weichenbereich!
U(;
O #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten
O #Dyn.Status.Weiche_abzweigen;//Weiche auf Abzweig schalten
);
SPB en10;
U #Dyn.Status.MindestZeit_ok;
R #Dyn.Status.Warten_auf_Mindestzeit;
U #Dyn.Status.Warten_auf_Mindestzeit;
SPB en10;
U #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;
SPB en10;
UN #Fahren_Ok;
= #Dyn.Status.Kein_StartOk;
SPB Ret;
//Ziel-Check zum Schalten:
L #Dyn.Weichen_Ziel;
L 0;
==I;
S #Dyn.Error.Ziel_undefiniert;
SPB New;
TAK;
L #Weiche.Abzweig.Ziel;//Abzweig-Ziel?
==I;//Ja!
SPB Abzweigen;
TAK;
L #Weiche.Gerade.Ziel ;//Gerade-Ziel?
==I;//Ja!
SPB Gerade;
SET;
S #Dyn.Error.Ziel_undefiniert;
SPA New;
Gerade: NOP 0;
//Gerade-Fahrt gewünscht**************************************************
//Ziel-Sensor-Check:
U #B_Ziel_gerade;
= #Dyn.Error.Gerade_Sensor_aktiv;
U #Dyn.Error.Gerade_Sensor_aktiv;//Muss erst quittiert werden!
SPB 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;
SPA en10;
Abzweigen: NOP 0;
//Abzweig-Fahrt gewünscht**************************************************
//Ziel-Sensor-Check:
U #B_Ziel_abzweig;
= #Dyn.Error.Abzweig_Sensor_aktiv;
U #Dyn.Error.Abzweig_Sensor_aktiv;//Muss erst quittiert werden!
SPB 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;
SPA en10;
New: UN #ErrQuit;
SPB en10;
L 0 ;//Reservierung löschen
T #Dyn."Schleuse -1";
en10: NOP 0;
NETWORK
TITLE = Mindestzeit / Überwachungszeit
U #Gerade_Ziel;
U(;
ON #Y_Weiche_gerade;
ON #Antrieb_Gerade_aktiv;
);
O;
U #Abzweig_Ziel;
U(;
ON #Y_Weiche_abzweig;
ON #Antrieb_Abzweig_aktiv;
);
SPB W011;
//Mindestzeit neu triggern: (von Schleuse -1)
U #Dyn.Status.MindestZeit_nachtriggern;
R #Dyn.Status.MindestZeit_nachtriggern;
S #Dyn.Status.Warten_auf_Mindestzeit;
SPBN X011 ;//Negierter Sprung
W011: L 0;
T #Dyn.FahrKontrolle.Akt_Mindestzeitzeit;
SPA y011;
//Zeiten aufaddieren:
X011: UN "1s-Impuls" ;//1s-Impuls
ON #Antrieb_Weiche_aktiv;
SPB 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;
SPBN X080;
T #Dyn.FahrKontrolle.Akt_Mindestzeitzeit;
X080: U #Dyn.Error.Übzeit_Gerade;
O #Dyn.Error.Übzeit_Abzweig;
ON "1s-Impuls" ;//1s-Impuls
ON #Antrieb_Weiche_aktiv;
SPB X08E;
L #Dyn.FahrKontrolle.Akt_Überwachungszeit;
+ 1;
T #Dyn.FahrKontrolle.Akt_Überwachungszeit;
L #Dyn.FahrKontrolle.Para_Überwachungszeit;
<I;//Max.Zeit erreicht ?
SPB X08E ;//Nein
//Überwachungszeit ist abgelaufen:
U #Dyn.Status.Weiche_geradeaus;
S #Dyn.Error.Übzeit_Gerade;
U #Dyn.Status.Weiche_abzweigen;
S #Dyn.Error.Übzeit_Abzweig;
L 0;//Zeiten neu initialisieren
T #Dyn.FahrKontrolle.Akt_Überwachungszeit;
X08E: NOP 0;
NETWORK
TITLE = Ziel ist erreicht
U #Dyn.Status.Weiche_geradeaus;
U #B_Ziel_gerade;
S #ZielSensor_aktiv;
R #Dyn.Error.Übzeit_Gerade;
U #Dyn.Status.Weiche_abzweigen;
U #B_Ziel_abzweig;
S #ZielSensor_aktiv;
R #Dyn.Error.Übzeit_Abzweig;
SPB Ziel_AOk;
SPA X09E;
Ziel_AOk: U #Dyn.Status.Ziel_erreicht;//Einmaliger Durchlauf
SPB X09E;
SET;
S #Dyn.Status.Ziel_erreicht;
L #Dyn.Schalttakte;
+ DINT#1;//Auf Abzweig umgeschaltet +1
T #Dyn.Schalttakte;
X09E: U #ZielSensor_aktiv;
O #Dyn.Status.Reset_aktiv;
SPBN 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;
NETWORK
TITLE = RET: Weiche schalten
Ret: U #Dyn.Status.Reset_aktiv;
O #Weichen_Trolleys;
SPB En13;
U #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;
U #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;
NETWORK
TITLE = Antriebe ansteuern / stoppen ?
U #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;
U #Antriebe_ein;
O #Dyn.Status.Reset_aktiv;
S #Antrieb_Weiche_vor;//Weichenantrieb starten
U #Antriebe_ein;
U #Dyn.Status.Weiche_geradeaus;
O #Dyn.Status.Reset_aktiv;
S #Antrieb_Weiche_gerade_vor ;//Antrieb gerade einschalten
U #Antriebe_ein;
U #Dyn.Status.Weiche_abzweigen;
O #Dyn.Status.Reset_aktiv;
S #Antrieb_Weiche_abzweig_vor;//Antrieb abzweig einschalten
//Antriebe stoppen
UN #Dyn.Status.Reset_aktiv;
U(;
UN #Keine_Einfahrt ;//Also ist Schleuse -1 aktiv
U(;
UN #Fahren_Ok;
O;
U #Dyn.Status.Weiche_abzweigen;
U(;
ON #Weiche_ist_AST;
ON #Antrieb_Abzweig_aktiv;
);
O;
U #Dyn.Status.Weiche_geradeaus;
U(;
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////
NETWORK
TITLE = Weiche ist frei
L #SAVE.Schleusen_DB ;//Alte Speicherung ?
L #SAVE."Schleuse-1_DW";
OW;
L #Dyn.Weichen_Ziel;
OW;
L 0;
==I;
U #Keine_Einfahrt;//Keine Einfahrt aktiv
UN #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten
UN #Dyn.Status.Weiche_abzweigen;//Gerade hätte Vorrang
UN #Dyn.Status.Warten_auf_Mindestzeit;
UN #Dyn.Status.Reset_aktiv;
= #Dyn.Status.Weiche_frei;
R #Dyn.Status.MindestZeit_nachtriggern;
NOT;
= #Dyn.Status.Weiche_aktiv;//Zum Abfragen, damit evtl. Förderer nicht ausgeschaltet wird
NETWORK
TITLE = Schleuse -1 aktiv / vorhanden ?
U #Keine_Einfahrt;
O #Dyn.Error.Err_Schleusen_DL;//Schleusen-Datenliste fehlerhaft
O #Dyn.Error."Err_Undef_Schleuse-1";//undefinierte Schleuse-1
BEB;
L #SAVE.Schleusen_DB ;//Schleusen-DB
L 0;//Einsprung-Zeiger bekannt ?
<=I ;//Nein !
BEB;
//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)
AUF 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;
SPB Mldg;
L 0 ;//Reservierung löschen
T #Dyn."Schleuse -1";
BEA;
NETWORK
TITLE = 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)
AUF DB[ #SAVE.Schleusen_DB];//FABE+ -DB öffnen
U(;
U #Dyn.Status.Weiche_geradeaus;//Weiche auf Gerade schalten
U #Gerade_Ziel;
U #Y_Weiche_gerade;
U #Antrieb_Gerade_aktiv;
O;
U #Dyn.Status.Weiche_abzweigen;//Gerade hätte Vorrang
U #Abzweig_Ziel;
U #Y_Weiche_abzweig;
U #Antrieb_Abzweig_aktiv;
);
U #Fahren_Ok;
U #Antrieb_Weiche_aktiv;//Antrieb aktiv
UN #Dyn.Status.Reset_aktiv;
= DBX[ #AR1Zeiger] ;//Weiche hat geschaltet ? (DBX71.4)
NETWORK
TITLE = 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)
AUF DB[ #SAVE.Schleusen_DB];//FABE+ -DB öffnen
L #Dyn.Weichen_Ziel;
T DBW[ #AR1Zeiger] ;//Zurückgemeldetes WeichenZiel (DBW166)
NETWORK
TITLE = 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)
AUF DB[ #SAVE.Schleusen_DB];//FABE+ -DB öffnen
U #ZielSensor_aktiv;
O #Dyn.Status.Reset_aktiv;
= DBX[ #AR1Zeiger] ;//Trolley ausserhalb Weiche (DBX71.5)
NETWORK
TITLE = Ende
BE;
END_FUNCTION_BLOCK