Files

1451 lines
44 KiB
Plaintext

FUNCTION_BLOCK "MStartSync"
TITLE = Synchronisation Anfang neuer Sortbereich
{ 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 4.12.2014:
//-Entprellung ohne Antrieb!
//
//Version: ILS2100 / 12.01.2010
//
//
VAR_INPUT
Sync_Nr : Int; // Aufruf für Weiche
ErrQuit : Bool; // Ablaufstörung quittieren
B_BT_da : Bool; // Sensor BT ist an Sychronisierstelle
B_RefPunkt : Bool; // Sensor RefHaken am Referenzpunkt erkannt
B_TeachPunk : Bool; // Sensor RefHaken am Teachpunkt erkannt
Antrieb_aktiv : Bool; // Band ist aktiv
END_VAR
VAR_OUTPUT
Error : Word; // Störungen übergeben
END_VAR
VAR_IN_OUT
Antrieb_start : Bool; // Kreiselantrieb starten
hStOk : Bool; // Anzeige Start n. Störung aktivieren
END_VAR
VAR
Teil_IDX_Old : Int; // BT/MT-IDX (wird bei Auslagerung gemeldet)
Teil_Ziel_Old : Int; // BT/MT bei diesem Abwurf-Ziel ausfahren/entladen
Res1 : Array[1..3] of Int; // Reserve
SAVE : Struct
Ink_ohne_Zeit : Int; // Zeit Inkremntalgeberwert ohne Änderung [100ms]
END_STRUCT;
Para : Struct // Parameter
Weichen_DL_DB : Int; // Einsprung Weichen-Datenliste-DB
Weichen_DL_DW : Int; // Einsprung Weichen-Datenliste-DW
Offset_RefPunkt : DInt; // Offset Refpunkt zu TaschenPunkt (für Teachen)
Res1 : Array[1..1] of Int; // Reserve
END_STRUCT;
SyncPkt : "UDLStartSync"; // Fahrbereichs Daten
Dyn : Struct // Dynamische Daten
Status : Struct // Status
TeachModus_Aktiv : Bool; // Teach-Modus ist aktiv
MoreTeach : Bool; // Nächsten Teachpunkt ohne neuen Refpunkt
Res02 : Bool; // Reserve
Res03 : Bool; // Reserve
Res04 : Bool; // Reserve
Res05 : Bool; // Reserve
Res06 : Bool; // Reserve
Res07 : Bool; // Reserve
Res10 : Bool;
Res11 : Bool;
Res12 : Bool;
Res13 : Bool;
Res14 : Bool; // Reserve
Res15 : Bool; // Reserve
Res16 : Bool; // Reserve
Res17 : Bool; // Reserve
END_STRUCT;
Rueckmld : Struct
RET_VAL_BLKMOV_Sync : Int; // Rückmeldung nach BLKMOV-Aufruf
RET_VAL_DL_Weichen_Out : Byte; // Rückmeldung nach DatenOut-Aufruf
RET_VAL_Hauptstrang_In : Byte; // Rückmeldung nach Hauptstrangdaten-In-Aufruf
RET_VAL_TravelFIFO_In : Byte; // Rückmeldung nach Aufruf
RET_VAL_TravelFIFO_Out : Byte; // Rückmeldung nach Aufruf
RET_VAL_Teach_OUT : Byte; // Rückmeldung bei Datenlisten-Zugriff
RET_VAL_Teach_IN : Byte; // Rückmeldung bei Datenlisten-Zugriff
END_STRUCT;
Error : "UErrStartSync";
BT_ausgewertet : Bool; // BT wurde schon ausgewertet
TeachPunkt : Int; // Punkt zum Ein-Teachen
Refpunkt_ausgewertet : Bool; // Referenzpunkt ausgewertet
Refpunkt_ok : Bool; // Referenzpunkt erkannt
Teachpunkt_ausgewertet : Bool; // Teachpunkt ausgewertet
Reset : Bool; // Bereich + FIFO resetten
Ink_Flag : Bool; // Laufflag bei Speicherung
Ref_Flag : Bool; // Lauf-Flag bei Ref-Inkremente
Teach_Flag : Bool; // Lauf-Flag bei Teach-Inkremente
Ende_Flag : Bool; // Lauf-Flag bei Synchron-Ende (MT)
FIFO_Flag : Bool; // Lauf-Flag bei FIFO-Wechsel (sonst Err)
Stop : Bool; // Rein-Separator stoppen
Max_raus : Bool; // Max_Wert wurde schon übertragen
InkZelle : DInt; // Inkzelle: Sync-Sensor dauernd aktiv
Ref_Ink : DInt; // Inkremente bei Referenzpunkt
Teach_Ink : DInt; // Inkremente bei Teachpunkt
Ende_Ink : DInt; // Inkremente bei Synchron-Ende (MT)
FIFO_Ink : DInt; // Inkremente bei FIFO-Wechsel (sonst Err)
END_STRUCT;
Daten : "UBT_Daten";
Max_Wert : DInt; // Maximal erlaubter Zählwert
Lauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv
Flag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet
Ohne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet
Ink_Wert : DInt; // Aktuelle Inkrementalwert
Abstands_Ink : DInt; // Abstands-Inkremente nach Teachen
Sich_Ink : DInt; // Übrige Inks, bevor dann gestoppt wird !
Reserve : Array[1..1] of Int;
END_VAR
VAR_TEMP
Quelle : Any; // Zeiger, wo Rein-Daten sind
Adresse0 : DInt; // Für indirekte Adressierung (Offset 0)
Adresse2 : DInt; // Für indirekte Adressierung (Offset 0)
Adresse4 : DInt; // Für indirekte Adressierung (Offset 4)
Adresse8 : DInt; // Für indirekte Adressierung (Offset 8)
Abwurf_DB : Int; // Abwurf-DB für 1.Rückschaltung
HaupstranglistenDB : Int; // Aktueller Hauptstranglisten-DB
Parameter : Word; // Parameter
sB_BT_da : Bool; // Sensor BT ist an Sychronisierstelle
ZSW2_ENC : Word;
G1_ZSW : Word;
G1_XIST1 : DWord;
G1_XIST2 : DWord; // Positionswert 2, Sensor 1
STW2_ENC : Word; // Steuerwort 2, Encoder
G1_STW : Word; // Steuerwort, Sensor 1
tABS_Resolution : DInt;
tInk_Wert : DInt; // Aktueller Zählerwert
tSpeicherung : DInt; // Speicherung des aktuellen Zählerwerts (für Neustart)
tLastSingelturn_Wert : DInt; // Speicherung des letzten Zählerwerts (für Neustart)
tLauf_Flag : Bool; // Zähl-Lauf mit Flag ist aktiv
tFlag_Lauf_fertig : Bool; // Flag-Lauf wurde beendet
tOhne_Lauf_fertig : Bool; // Ohne Flag-Lauf wurde beendet
tNull_laden : Bool; // Zähler mit 0000 laden
tQuit : Bool;
END_VAR
BEGIN
NETWORK
TITLE = Eingangsvariablen einlesen
L #Sync_Nr;
U #B_BT_da;
= #sB_BT_da;
NETWORK
TITLE = Parameter-Übergabe
L #Sync_Nr;
L "MW178";//Einsprung Weichen-DL
T #Para.Weichen_DL_DB;//vor Aufruf übergeben!
L 0;
T #Para.Weichen_DL_DW;
NETWORK
TITLE = Gesamt: Out-Bits zum Zurücksetzen / temp
UN #Dyn.Max_raus;//Max_Wert wurde schon übertragen
O #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
S #Antrieb_start;//Kreiselantrieb starten
U #ErrQuit;
O #Dyn.Reset ;//Bereich + FIFO resetten
= #tQuit ;//Für ABS-Modul
NETWORK
TITLE = Reset
//Reset oder Tastendruck:
U #ErrQuit;
U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen
U #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt
S #Dyn.Reset;//Bereich + FIFO resetten
U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen
U #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen (Auto-Reset!)
UN #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
S #Dyn.Reset;//Bereich + FIFO resetten
UN #Dyn.Reset;//Bereich + FIFO resetten
SPB en02;
SET;
R #Dyn.Reset;//Bereich + FIFO resetten
R #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft
R #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt
R #Dyn.Error.BLKMov;//Fehler bei Block kopieren
R #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv
R #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft
R #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen
R #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt
R #Dyn.Error.Hauptstrangliste_Err;//Hauptstrangliste fehlerhaft
R #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll
R #Dyn.Error.Inkgeber_Err;//Übergabeliste fehlerhaft
R #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben
R #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden !
R #Dyn.Error.TeachPkt_Datenliste_Err;//Teachdatenliste fehlerhaft
R #Dyn.Error.Kein_Parameter;
R #Dyn.Error.Err_Parameter;
R #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung
SET;
R #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
R #Dyn.Stop;//Rein-Separator stoppen
L 0;
T #Dyn.InkZelle;//Inkzelle: Sync-Sensor dauernd aktiv
L 0;
T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err)
T #Sich_Ink;//Übrige Inks, bevor dann gestoopt wird !
L 0;//Damit statische Werte neu aus Datenbank geholt werden !
T #SyncPkt.Sync_Nr;//Nummer des Sync-Punktes
//Travel-FIFO zurücksetzen:
CALL "FifoReset"
( SSDB := #SyncPkt.TravelFIFO_DB ,
SSDW := #SyncPkt.TravelFIFO_DW ,
PARA := WORD#16#0000 , //normaler FIFO
RE_VAL := "MB199"
);
L "MB199";
T #Dyn.Rueckmld.RET_VAL_TravelFIFO_Out;
L 0;//Aufruf mit Fehler ?
<>I;//Ja !
= #Dyn.Error.TravelFIFO_Err;//Error bei FIFO-Zugriff
//Hauptstrang-Daten zurücksetzen:
CALL "DatenResetSort"
( SSDB := #SyncPkt.Hauptstrang_DL_DB ,
SSDW := #SyncPkt.Hauptstrang_DL_DW ,
RE_VAL := "MB198"
);
L #SyncPkt.Hauptstrang_DL_DB;
+ 1;
T #HaupstranglistenDB;
CALL "DatenResetSort"
( SSDB := #HaupstranglistenDB ,
SSDW := #SyncPkt.Hauptstrang_DL_DW ,
RE_VAL := "MB199"
);
L "MB198";
L "MB199";
L 0;//Aufruf mit Fehler ?
<>I;//Ja !
= #Dyn.Error.Hauptstrangliste_Err;//Hauptstrang-DL fehlerhaft
BEA;
en02: NOP 0;
NETWORK
TITLE = Störungen nach Außen übergeben
L 0;
T "MW200";
U #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft
= "M200.0";
U #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt
= "M200.1";
U #Dyn.Error.BLKMov;//Fehler bei Block kopieren
= "M200.2";
U #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv
= "M200.3";
U #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft
= "M200.4";
U #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen
= "M200.5";
U #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt
= "M200.6";
U #Dyn.Error.Hauptstrangliste_Err;//Hauptstrangliste fehlerhaft
= "M200.7";
U #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll
= "M201.0";
U #Dyn.Error.Inkgeber_Err;//Inkrementalgeber meldet Störung
= "M201.1";
U #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben
= "M201.2";
U #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden !
= "M201.3";
U #Dyn.Error.TeachPkt_Datenliste_Err;//Teachdatenliste fehlerhaft
= "M201.4";
U #Dyn.Error.Kein_Parameter;
= "M201.5";
U #Dyn.Error.Err_Parameter;
= "M201.6";
U #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung
= "M201.7";
L "MW200";
T #Error;//Schnittstelle nach Außen
//Anzeige Start n. Störung aktivieren:
U "Hauptstrang_leer";//Keine Haupstrangdaten vorhanden -> Verklemm-Errors löschen
U(;
O #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen
O #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt
);
O #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv
O #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung
S #hStOk;
NETWORK
TITLE = Statische Sync-Parameter holen
L #SyncPkt.Sync_Nr;//Nummer des Synchron-Puntes
L #Sync_Nr;//Aufruf-Parameter
==I;//Identisch ?
R #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft
R #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt
SPB en03;//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_Out;//Rückmeldung bei Datenbank-Zugriff (Gefälle-DL)
SPBI G_Ok;
U "M199.0";
= #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft
BEB;
SET;
S #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt
BEA;
//Kennung + Datenbytes
G_Ok: SET;
R #Dyn.Error.SyncPkt_DL_Err;//Sync-Punkt-Datenliste fehlerhaft
R #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt
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_Sync ,
DSTBLK := #SyncPkt //#Ziel
);
L #Dyn.Rueckmld.RET_VAL_BLKMOV_Sync;//Rückmeldung
L 0;//Fehler vorhanden ?
<>I;//Ja !
= #Dyn.Error.BLKMov;//Error bei Block kopieren
BEB;
L #SyncPkt.Sync_Typ;//Synchron-Punkt-Typ = 177 (StartSync)
L 177;//Dieser Aufruf-FB ?
==I;//Ja !
SPB en03;
SET;
S #Dyn.Error.Undef_SyncPkt;//undefinierter Synchronpunkt
L 0;//Synchronpunkt ungültig !
T #SyncPkt.Sync_Nr;//Nummer des Synchron-Puntes
BEA;
en03: NOP 0;
NETWORK
TITLE = Störungen quittieren
UN #ErrQuit;
SPB en05;
SET;
R #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden !
R #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll
R #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben
R #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen
R #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung
//Kann nur über Reset zurückgesetzt werden:
// R #Dyn.Error.SyncPkt_DL_Err //Sync-Punkt-Datenliste fehlerhaft
// R #Dyn.Error.Undef_SyncPkt //undefinierter Synchronpunkt
// R #Dyn.Error.BLKMov //Fehler bei Block kopieren
// R #Dyn.Error.Sync_Sensor_aktiv //Sync-Sensor dauernd aktiv
// R #Dyn.Error.TravelFIFO //Travel-FIFO fehlerhaft
// R #Dyn.Error.TravelFIFO_belegt //Travel-FIFO bleibt belegt
// R #Dyn.Error.Hauptstrangliste_Err //Hauptstrangliste fehlerhaft
// R #Dyn.Error.Uebergabeliste_Err //Übergabeliste fehlerhaft
// R #Dyn.Error.TeachPkt_Datenliste_Err //Teachdatenliste fehlerhaft
// R #Dyn.Error.Keine_TeachPktdaten //Keine Teachdaten in Datenliste vorhanden !
// R #Dyn.Error.Err16
//werden weiter unten quittiert:
// R #Dyn.Error.Sync_Sensor_aktiv //Sync-Sensor dauernd aktiv
en05: NOP 0;
NETWORK
TITLE = Auswahl der Wegerfassung
L #SyncPkt.Ink_DB;//Zähler-DB
L 0;//Sinnvolle Angabe ?
<=I;//Nein !
S #Dyn.Error.Kein_Parameter;//Kein Parameter zur Wegerfassung definiert
SPB OK;
U #SyncPkt.Parameter.InkSim;//Inkrementalgeber simulieren
SPB ISim;
U #SyncPkt.Parameter.ET200;//Inkremental-Geber mit Zähler-Baugruppe (ET200)
SPB ET20;
U #SyncPkt.Parameter.Sick_ABS_single;
SPB ABS ;//Inkremental-Geber mit Zähler-Baugruppe (FM350/FM450)
SPA OK;
NETWORK
TITLE = Inkremental-Geber über 10ms-Takte simulieren und Antrieb aktiv
ISim: L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
SET;
R %DBX74.1;//Überlauf
R %DBX74.4;//Flag-Lauf wurde beendet
R %DBX74.5;//Ohne Flag-Lauf wurde beendet
UN #Antrieb_aktiv;//Antrieb ist aktiv
SPB chk;//weitere Kontrollen
L "MW4";//Anzahl der 10ms-Takte (letzter Zyklus)
ITD;
L %DBD80;
+D;//10ms-Takte dazuaddieren
T %DBD80;
SPA chk;//weitere Kontrollen
//Zähler auf 000 setzen ?:
chk: UN %DBX74.6;//Zähler Zero-Load
SPB new;
SET;
R %DBX74.6;
L 0;
T %DBD70;//Zählerwert zum Setzen
SPA load;
//Zähler neu setzen ?:
new: U %DBX74.0;//Zähler Neustart
R %DBX74.0;
SPB load;
//Zähler-Überlauf ?:
L %DBD80;//Aktueller Zählerwert
U %DBX75.0;//Speicherung einfrieren
SPB nos;
T %DBD70;//Speicherung
nos: L %DBD76;//Max. Wert erreicht ?
<=D;//Nein !
SPB OK;
-D;//Restwert als Startwert nehmen !
T %DBD70;//Zählerwert zum Setzen
UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.5;//Ohne Flag-Lauf wurde beendet
U %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.4;//Flag-Lauf wurde beendet
UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.3;
SET;
S %DBX74.1;//Überlauf
load: L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
L %DBD70;//Zählerwert zum Setzen
T %DBD80;
SPA OK;
NETWORK
TITLE = Inkremental-Geber mit Zähler-Baugruppe (ET200)
ET20: L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
L 0;//Adresse sinnvoll ? (also ohne Zählerbaugruppe !)
<=I;//Nein !
S #Dyn.Error.Err_Parameter;//Parameter für ET200 fehlerhaft
SPB OK;
//Zählerwert einlesen:
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
SLW 3;//Pointer erzeugen
T #Adresse0;
L PED[ #Adresse0];
T %DBD80;
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
+ 4;//Offset 4 DWs
SLW 3;//Pointer erzeugen
T #Adresse4;
L PED[ #Adresse4];
T %DBD4;
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
+ 8;
SLW 3;//Pointer erzeugen
T #Adresse8;
L PED[ #Adresse8];
T %DBD8;//eigentlich doppelt
L %DBD80;//Aktueller Zählerwert
L %DBD70;//Speicherung (Zählerwert letzter Zyklus)
<>D;//ist verändert !
SPB Ok_I;
UN #Antrieb_aktiv;//Antrieb ist aktiv
O #ErrQuit;//Ablaufstörung quittieren
SPB X_I;
L #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms]
L "MW4";//Anzahl der 10ms-Takte (letzter Zyklus)
+I;//aufaddieren
T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms]
L 50;//500ms ohne Änderung ?
>=I;//Ja !
S #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung
SPA X_I;
Ok_I: L 0;
T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms]
//Software-Gate öffnen:
X_I: SET;
S %DBX16.0;//SW-Gate öffnen
//Zähler setzen läuft:
U %DBX74.2;//Zähler setzen
O %DBX74.7;//Zähler laden ist aktiv
R %DBX74.5;//Ohne Flag-Lauf wurde beendet
R %DBX74.4;//Flag-Lauf wurde beendet
SPB LOAD_Mig;
//Zähler auf 000 setzen ?:
L 0;
T %DBD12;//Zählerwert zum Setzen
U %DBX74.6;//Zähler Zero-Load
S %DBX74.2;//Zähler setzen
SPB LOAD_Mig;
//Zähler neu setzen ?:
L %DBD70;//Speicherung
T %DBD12;//Zählerwert zum Setzen
U %DBX74.0;//Zähler Neustart
S %DBX74.2;//Zähler setzen
SPB LOAD_Mig;
//Zähler-Überlauf ?:
L %DBD80;//Aktueller Zählerwert
L %DBD76;//Max. Wert erreicht ?
<=D;//Nein !
SPB Ok_Mig;
-D;//Restwert als Startwert nehmen !
T %DBD12;//Zählerwert zum Setzen
UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.5;//Ohne Flag-Lauf wurde beendet
U %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.4;//Flag-Lauf wurde beendet
UN %DBX74.3;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.3;
SET;
S %DBX74.1;//Überlauf
S %DBX74.2;//Zähler setzen
LOAD_Mig: U %DBX74.2;//Zähler setzen
= %DBX17.0;//Load_Val
SPBN Ok_Mig;
//Daten an Zähler senden:
L %DBD12;
T PAD[ #Adresse0];
Ok_Mig: L %DBW16;
T PAW[ #Adresse4];
//Zählerstatus einlesen:
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
+ 4;//Offset 4 DWs
SLW 3;//Pointer erzeugen
T #Adresse4;
L PED[ #Adresse4];
T %DBD4;
L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
U %DBX74.2;//Zähler setzen
U %DBX4.0;//Zähler wird geladen (Modul-Rückmeldung)
S %DBX74.7;//Zähler laden ist aktiv
R %DBX74.2;//Zähler setzen
U %DBX74.7;//Zähler laden ist aktiv
UN %DBX4.0;//Zähler wird geladen (Modul-Rückmeldung)
R %DBX74.7;//Zähler laden ist aktiv
R %DBX74.6;//Zähler Zero-Load
R %DBX74.0;//Zähler Neustart
R %DBX74.1;//Überlauf
U %DBX74.2;//Zähler setzen
O %DBX74.7;//Zähler laden ist aktiv
O %DBX4.0;//Zähler wird geladen (Modul-Rückmeldung)
SPB Fake;
L %DBD80;//Aktueller Zählerwert
L 0;//Sinnvoller Wert ?
<=D;//Nein !
O %DBX75.0;//Speicherung einfrieren
SPB OK;
L %DBD80;//Aktueller Zählerwert
T %DBD70;//Speicherung
SPA OK;
Fake: L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
L %DBD12;//Während Neusetzen Loadwert übergeben
T %DBD80;
SPA OK;
NETWORK
TITLE = Inkremental-Geber mit Zähler-Baugruppe (ABS single)
ABS: L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
L 0;//Adresse sinnvoll ? (also ohne Zählerbaugruppe !)
<=I;//Nein !
S #Dyn.Error.Err_Parameter;//Parameter für ET200 fehlerhaft
SPB OK;
//Zählerwert einlesen:
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
SLW 3;//Pointer erzeugen
T #Adresse0;
L EW[ #Adresse0];
T %DBW0;
T #ZSW2_ENC;
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der ET200-Zählerbaugruppe
+ 2 ;//Offset 2 DWs
SLW 3;//Pointer erzeugen
T #Adresse2;
L EW[ #Adresse2];
T %DBW0;
T #G1_ZSW;
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der Zählerbaugruppe
+ 4;//Offset 4 DWs
SLW 3;//Pointer erzeugen
T #Adresse4;
L ED[ #Adresse4];
T %DBD4;
T #G1_XIST1;
L #SyncPkt.Ink_HW_Adress;//Hardware-Adresse der Zählerbaugruppe
+ 8;
SLW 3;//Pointer erzeugen
T #Adresse8;
L ED[ #Adresse8];
T %DBD8;
T #G1_XIST2;
//Gespeicherte Werte einlesen:
L %DBD80;
T #tInk_Wert;
L %DBD70;
T #tSpeicherung;
L %DBD16;
T #tLastSingelturn_Wert;
L %DBD20;
T #tABS_Resolution;
U %DBX74.3;
= #tLauf_Flag;
U %DBX74.4;
= #tFlag_Lauf_fertig;
U %DBX74.5;
= #tOhne_Lauf_fertig;
U %DBX74.6;
= #tNull_laden;
CALL "Sick_ABS_single"
( ZSW2_ENC := #ZSW2_ENC ,
G1_ZSW := #G1_ZSW ,
G1_XIST1 := #G1_XIST1 ,
G1_XIST2 := #G1_XIST2 ,
Resolution := #tABS_Resolution ,
MaxValue := #Max_Wert ,
Error_Quit := #tQuit ,
STW2_ENC := #STW2_ENC ,
G1_STW := #G1_STW ,
Inkgeber_Err := #Dyn.Error.Inkgeber_Err ,
Ink_Wert := #tInk_Wert ,
Last_Singelturn_Wert := #tLastSingelturn_Wert ,
Lauf_Flag := #tLauf_Flag ,
Flag_Lauf_fertig := #tFlag_Lauf_fertig ,
Ohne_Lauf_fertig := #tOhne_Lauf_fertig ,
Null_laden := #tNull_laden
);
//Steuerwerte übergeben:
L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
L #STW2_ENC;
T PAW[ #Adresse0];
T %DBW12;
L #G1_STW;
T PAW[ #Adresse2];
T %DBW14;
//Werte speichern:
L #tInk_Wert;
T %DBD80;
T %DBD70;
L #tLastSingelturn_Wert;
T %DBD16;
U #tLauf_Flag;
= %DBX74.3;
U #tFlag_Lauf_fertig;
= %DBX74.4;
U #tOhne_Lauf_fertig;
= %DBX74.5;
U #tNull_laden;
= %DBX74.6;
//Ändert sich der Inkwert ?:
L %DBD80 ;//Aktueller Zählerwert
L #tSpeicherung;//Speicherung (Zählerwert letzter Zyklus)
<>D;//ist verändert !
SPB ok_I_Mig;
UN #Antrieb_aktiv;//Antrieb ist aktiv
O #ErrQuit;//Ablaufstörung quittieren
SPB OK;
L #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms]
L "MW4";//Anzahl der 10ms-Takte (letzter Zyklus)
+I;//aufaddieren
T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms]
L 50;//500ms ohne Änderung ?
>=I;//Ja !
S #Dyn.Error.Inkrementalgeber;//Inkrementalgeberwert ohne Änderung
SPA OK;
ok_I_Mig: L 0;
T #SAVE.Ink_ohne_Zeit;//Zeit Inkremntalgeberwert ohne Änderung [10ms]
NETWORK
TITLE = Inkwerte holen
//Daten des Inktremental-Gebers übergeben:
OK: L #SyncPkt.Ink_DB;
T "MW200";
AUF DB[ "MW200"];//Zähler-DB öffnen
L %DBD80;
T #Ink_Wert;
L %DBD76;
T #Max_Wert;
U %DBX74.3;
= #Lauf_Flag;
U %DBX74.4;
= #Flag_Lauf_fertig;
U %DBX74.5;
= #Ohne_Lauf_fertig;
NETWORK
TITLE = Zusatz-DWs an Travel-FIFO übergeben
L #SyncPkt.TravelFIFO_DB;//Travel-FIFO: DB-Nr.
L 0;//sinnvolle Angabe ?
<=I;//Nein !
O(;
L #SyncPkt.TravelFIFO_DW;//Einfahr-FIFO: DW-Nr.
L 0;//Sinnvolle Angabe ?
<I;//Nein !
);
SPB en13;
L 16#0224;//2-4.Zusatz-DWs schreiben
T #Parameter;
//Inkwerte übergeben:
L #Ink_Wert;
T "MD242" ;//Inkwert
L 0;
T "MW246";
U #Lauf_Flag;
= "M246.3";//Flag-Info
U #Flag_Lauf_fertig;
= "M246.4";//Fertig-Info
U #Ohne_Lauf_fertig;
= "M246.5" ;//Fertig-Info
U "10s-Impuls";
= "M247.7";//Übergabe MaxWert aktiv
S #Dyn.Max_raus;//Max_Wert wurde schon übertragen
SPBN w041;
L #Max_Wert;
T "MD242";//MaxWert übergeben
w041: CALL "FifoIn"
( SSDB := #SyncPkt.TravelFIFO_DB ,
SSDW := #SyncPkt.TravelFIFO_DW ,
PARA := #Parameter , //Zusatz-DWs schreiben (s.o.)
INDATEN := P#M200.0 ,
RE_VAL := "MB199"
);
L "MB199";
T #Dyn.Rueckmld.RET_VAL_TravelFIFO_In;
T #Dyn.Rueckmld.RET_VAL_TravelFIFO_In;
SPBI en13;
SET;
S #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft
en13: NOP 0;
NETWORK
TITLE = Kein Sync-Sensor vorhanden
UN #SyncPkt.Parameter.Kein_Sync_B;//Kein Sync-Sensor eingebaut (Daten-Sync)
SPB En04;//Also Sensor verbaut !
CALL "FifoOut"
( SSDB := #SyncPkt.TravelFIFO_DB ,
SSDW := #SyncPkt.TravelFIFO_DW ,
PARA := WORD#16#0000 , //Daten lesen
OUTDATEN := P#M220.0 ,
RE_VAL := "MB199"
);
L "MB199";
T #Dyn.Rueckmld.RET_VAL_TravelFIFO_Out;
L 0;//Aufruf mit Fehler ? (Bit2 = FIFO ist leer auch nicht!)
==I;//Nein !
U #Antrieb_aktiv;
= #sB_BT_da;//Sensor BT ist an Sychronisierstelle
SPA En06;//Überwachungen überspringen
En04: NOP 0;
NETWORK
TITLE = BT ist wieder weg
UN #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
SPB en04_Mig;
L #Dyn.Ende_Ink;//Inkremente bei Synchron-Ende (MT)
L 0;//angegeben ?
<=D;//Nein !
O #sB_BT_da;//Sensor BT ist an Sychronisierstelle
SPB Save;
U #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT)
U #Flag_Lauf_fertig;//Flag-Lauf wurde beendet
O;
UN #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT)
U #Ohne_Lauf_fertig;//Flag-Lauf wurde beendet
SPB w040;//beim Ende des Lauf sind Inkremente uninteressant
U #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT)
U #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv
O;
UN #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT)
UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv
SPBN en04_Mig;
L #Ink_Wert;//Aktuelle Inkrementalwert
L #Dyn.Ende_Ink;//Inkremente bei Synchron-Ende (MT)
<D;
SPB en04_Mig;
w040: SET;
R #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
R #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT)
L 0;
T #Dyn.Ende_Ink;//Inkremente bei Synchron-Ende (MT)
SPA en04_Mig;
//End-Punkt der Synchronisation speichern: (wegen Entprelling)
Save: L #Ink_Wert;//Aktueller Ink-Wert
L #SyncPkt.Entprellung_B_Sync;//Entprellung Snyc-Sensor (in Inkremente)
+D;
T #Dyn.Ende_Ink;//Inkremente bei Synchron-Ende (MT)
U #Lauf_Flag;
= #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT)
L #Max_Wert;//Maximal erlaubter Zählwert
>D;
SPBN en04_Mig;
-D;//Restwert übernehmen
T #Dyn.Ende_Ink;//Inkremente bei Synchron-Ende (MT)
UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv
= #Dyn.Ende_Flag;//Lauf-Flag bei Synchron-Ende (MT)
en04_Mig: NOP 0;
NETWORK
TITLE = Error: Sync-Sensor dauernd aktiv
UN #sB_BT_da;//Sensor Sync ist an Sychronisierstelle
O;
U #Lauf_Flag;//Neuspeicherung nötig
UN #Dyn.Ink_Flag;
O;
UN #Lauf_Flag;//Neuspeicherung nötig
U #Dyn.Ink_Flag;
O #ErrQuit;//Störung quittieren
O #Dyn.Reset;//Bereich resetten
SPB W030;
U #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv
SPB En03_Mig;
L #Dyn.InkZelle;//Speicherung Sensor frei
L 0;//Speicherung vorhanden ?
==D;//Nein !
SPB En03_Mig;
L #Ink_Wert;//Aktueller Ink-Wert
L #Dyn.InkZelle;//Speicherung Sensor frei
-D;//Differenz bilden
L 10;//davon 10%
/D;
L #SyncPkt.Entprellung_B_Sync;//Falls also 10mal Entprellwert, dann
>=D;
S #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv
SPA En03_Mig;
W030: L #Ink_Wert;//Aktueller Ink-Wert
T #Dyn.InkZelle;//Speicherung Sensor frei
U #Lauf_Flag;
= #Dyn.Ink_Flag;//Speicherung Laufflag
SET;
R #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv
En03_Mig: NOP 0;
NETWORK
TITLE = Error: Travel-FIFO bleibt voll
L #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop/Err)
L 0;//sinnvolle Angabe ?
<=D;//Nein !
O #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
O #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt
SPB w061;
U #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err)
U #Flag_Lauf_fertig;//Flag-Lauf wurde beendet
O;
UN #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err)
U #Ohne_Lauf_fertig;//Flag-Lauf wurde beendet
SPB w060;//beim Ende des Lauf sind Inkremente uninteressant
U #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err)
U #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv
O;
UN #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Stop/Err)
UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv
SPBN En06;
L #Ink_Wert;//Aktuelle Inkrementalwert
L #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop/Err)
<D;
S #Antrieb_start;//Kreiselantrieb starten
SPB En06;
w060: UN #Dyn.Stop;//Falls noch nicht gestoppt
S #Dyn.Stop;//Rein-Separator stoppen
SPB w063;
L #SyncPkt.Abstand_StartSep;//Abstand Start-Separator <-> Sync-Sensor (in Inkremente)
L 0;//sinnvoller Wert ?
>D;//Nein !
S #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt
w061: L 0;
T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err)
SET;
R #Dyn.FIFO_Flag;//Flag bei FIFO-Wechsel (sonst Err)
//Kontrolle, ob Daten im Travel-FIFO vorhanden:
CALL "FifoOut"
( SSDB := #SyncPkt.TravelFIFO_DB ,
SSDW := #SyncPkt.TravelFIFO_DW ,
PARA := WORD#16#0000 , //Daten lesen
OUTDATEN := P#M220.0 ,
RE_VAL := "MB199"
);
L "MB199";
L 0;//Aufruf mit Fehler ?
==I;//Nein !
R #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft
SPB w062;
U "M199.2";//FIFO ist leer
R #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft
R #Dyn.Stop;//Rein-Separator stoppen
R #Dyn.Error.TravelFIFO_belegt;//Travel-FIFO bleibt belegt
SPB En06;
SET;
S #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft
SPA En06;
//Inkremente speichern, bei denen spätestens FIFO-Zugriff erfolgen muss (sonst Stop)!
w062: L #SyncPkt.Abstand_StartSep;//Abstand Start-Separator <-> Sync-Sensor (in Inkremente)
L 0;//sinnvoller Wert ?
<=D;//Nein !
SPB En06;
TAK;
/// L MD 220 //Ink-Wert des nächsten BTs beim Vereinzeln
L #Ink_Wert;//Aktueller Ink-Wert
+D;
T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop)
/// U M 224.0 //Lauf-Flag des nächsten BTs beim Vereinzeln
U #Lauf_Flag;
= #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Stop)
L #Max_Wert;//Maximal erlaubter Zählwert
>D;
SPBN En06;
-D;//Restwert übernehmen
T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop)
UN "M224.0";//Lauf-Flag des nächsten BTs beim Vereinzeln (unvertieren)
= #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Stop)
SPA En06;
//Inkremente speichern, bei denen spätestens FIFO leer (sonst Err)
w063: L #SyncPkt.Abstand_StartSep;//Abstand Start-Separator <-> Sync-Sensor (in Inkremente)
L #Ink_Wert;//Aktueller Ink-Wert
+D;
T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err)
U #Lauf_Flag;
= #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Err)
L #Max_Wert;//Maximal erlaubter Zählwert
>D;
SPBN En06;
-D;//Restwert übernehmen
T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Err)
UN #Lauf_Flag;//Zähl-Lauf mit Flag ist aktiv
= #Dyn.FIFO_Flag;//Lauf-Flag bei FIFO-Wechsel (sonst Err)
En06: NOP 0;
NETWORK
TITLE = Sync-Sensor ist aktiv
U #sB_BT_da;//BT ist an Sychronisierstelle
U #Antrieb_aktiv;///bei H&M
UN #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
UN #Dyn.Error.Sync_Sensor_aktiv;//Sync-Sensor dauernd aktiv
UN #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
S #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
SPB Sync;
SPA Teac;
NETWORK
TITLE = Daten aus Travel-FIFO holen
Sync: CALL "FifoOut"
( SSDB := #SyncPkt.TravelFIFO_DB ,
SSDW := #SyncPkt.TravelFIFO_DW ,
PARA := WORD#16#E100 , //Daten lesen + austragen
OUTDATEN := #Daten ,
RE_VAL := "MB199"
);
L "MB199";
T #Dyn.Rueckmld.RET_VAL_TravelFIFO_Out;
L 0;//Aufruf mit Fehler ?
==I;//Nein !
R #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen
SPB X081;
U "M199.2";//FIFO ist leer
S #Dyn.Error.TravelFIFO_leer;//keine Daten im Travel-FIFO eingetragen
SPB X080;
SET;
S #Dyn.Error.TravelFIFO_Err;//Travel-FIFO fehlerhaft
X080: SPA En18;//Keine Reaktion ist am Besten !
L -1;//Null-Daten übergeben
T #Daten.Sort_Info.Teil_IDX;
L -1;//in nächsten Bereich fahren
T #Daten.Sort_Info.Teil_Ziel;
SPA X082;
L #Teil_IDX_Old;//Letzte gültige Daten übergeben
T #Daten.Sort_Info.Teil_IDX;//nicht mehr, da nur Ärger!
L #Teil_Ziel_Old;
T #Daten.Sort_Info.Teil_Ziel;
SPA X082;
//IDX und Ziel speichern (für Travel-FIFO leer,...)
X081: L #Daten.Sort_Info.Teil_IDX;
T #Teil_IDX_Old;
L #Daten.Sort_Info.Teil_Ziel;
T #Teil_Ziel_Old;
//Travel-FIFO-Daten übergeben:
X082: U #Dyn.Stop;//Rein-Separator stoppen
SPB X083;
L #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop)
L #Ink_Wert;//Aktueller Ink-Wert
-D;
T #Sich_Ink;//Übrige Inks, bevor dann gestoppt wird !
X083: L 0;
T #Dyn.FIFO_Ink;//Inkremente bei FIFO-Wechsel (sonst Stop)
U #SyncPkt.Parameter.Kein_Sync_B;
R #Dyn.BT_ausgewertet;//BT wurde schon ausgewertet
NETWORK
TITLE = Daten für Haupstrangdaten aufbereiten
//Sync-Info:
L #Ink_Wert;//Aktuelle Inkrementalwert (Start-Sync-Zähler)
T #Daten.Start_Ink;
U #Lauf_Flag;//Start-Flag übergeben (für evtl. Fahrsync)
= #Daten.Start_Flag;
//Sort-Info werden von Travel-FIFO übernommen
//Quell_Info:
L #SyncPkt.Sync_Nr;//Identifikation des Synchron-Punktes
T #Daten.Quelle;
T #Daten.letzte_Position;
NETWORK
TITLE = Daten in Haupstrangdaten eintragen
L #SyncPkt.Hauptstrang_DL_DB;//Hauptstrang-DB
T #HaupstranglistenDB;//Aktueller Hauptstrang-DB
L 0;//angegeben ?
==I;//Nein !
S #Dyn.Error.Keine_Hauptstrangliste;//Keine Hauptstrangliste zum Eintragen angegeben
SPB En18;
UN #Lauf_Flag;//Start-Flag
SPB w180;
L #SyncPkt.Hauptstrang_DL_DB;//Hauptstrang-DB
+ 1;//DB+1 bei Flaglauf !
T #HaupstranglistenDB;//Aktueller Hauptstrang-DB
w180: CALL "DatenInSort"//Hauptstrangliste mit Lauf-Flag
( SSDB := #HaupstranglistenDB , //Aktueller Hauptstrang-DB
SSDW := #SyncPkt.Hauptstrang_DL_DW ,
INDATEN := #Daten ,
RE_VAL := "MB199"
);
L "MB199";
T #Dyn.Rueckmld.RET_VAL_Hauptstrang_In;
U "M199.2";//Hauptstrangliste ist voll
S #Dyn.Error.Hauptstrangliste_voll;//Hauptstrangliste ist voll
SPB En18;
U "M199.7";//Eintrag richtig erfolgt
SPB En18;
SET;
S #Dyn.Error.Hauptstrangliste_Err;//Error bei Hauptstrang-Zugriff
En18: NOP 0;
NETWORK
TITLE = Teach-Modus aktiv ?
Teac: L #Dyn.TeachPunkt;//Punkt zum Ein-Teachen
L 0;//bekannt ?
<>I;//Ja !
U #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
SPB en20;
L 0;
T #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt
T #Dyn.Teach_Ink;//Inkremente bei Teachpunkt
T #Abstands_Ink;//Abstands-Inkremente nach Teachen
SET;
R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
R #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente
R #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente
R #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet
R #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet
R #Dyn.Refpunkt_ok;//Referenzpunkt erkannt
BEA;
en20: NOP 0;
NETWORK
TITLE = Ref-Inkremente speichern
UN #B_RefPunkt;//Sensor RefBT am Referenzpunkt erkannt
R #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet
U #B_RefPunkt;//Sensor RefBT am Referenzpunkt erkannt
UN #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet
SPBN en21;
L #Ink_Wert;//Aktuelle Inkrementalwert
T #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt
U #Lauf_Flag;
= #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente
SET;
S #Dyn.Refpunkt_ausgewertet;//Referenzpunkt ausgewertet
S #Dyn.Refpunkt_ok;//Referenzpunkt erkannt
L 0;
T #Dyn.Teach_Ink;//Inkremente bei Teachpunkt
T #Abstands_Ink;//Abstands-Inkremente nach Teachen
SET;
R #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet
R #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente
en21: NOP 0;
NETWORK
TITLE = Teach-Inkremente speichern
UN #B_TeachPunk;//Sensor RefHaken am Teachpunkt erkannt
U #Antrieb_aktiv;//Antrieb aktiv
R #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet
UN #B_TeachPunk;//Sensor RefHaken am Teachpunkt erkannt
O #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet
ON #Dyn.Refpunkt_ok;//Referenzpunkt erkannt
ON #Antrieb_aktiv ;//Antrieb aktiv
BEB;
L #Ink_Wert;//Aktuelle Inkrementalwert
T #Dyn.Teach_Ink;//Inkremente bei Teachpunkt
U #Lauf_Flag;
= #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente
SET;
S #Dyn.Teachpunkt_ausgewertet;//Teachpunkt ausgewertet
NETWORK
TITLE = Abstand ermitteln
UN #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente
UN #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente
O;
U #Dyn.Ref_Flag;//Lauf-Flag bei Ref-Inkremente
U #Dyn.Teach_Flag;//Lauf-Flag bei Teach-Inkremente
SPBN w230;
//Inkremente im gleichem Lauf:
L #Dyn.Teach_Ink;//Inkremente bei Teachpunkt
L #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt
-D;
T #Abstands_Ink;//Abstands-Inkremente nach Teachen
SPA en23;
w230: L #Max_Wert;//Max. Wert beim Zähler
L #Dyn.Ref_Ink;//Inkremente bei Referenzpunkt
-D;
L #Dyn.Teach_Ink;//Inkremente bei Teachpunkt
+D;
T #Abstands_Ink;
en23: NOP 0;
NETWORK
TITLE = Teach-Inkremente in Datenbank abspeichern
L #Dyn.TeachPunkt;//Punkt zum Ein-Teachen
T "MW200";
CALL "DatenOut"
( SSDB := #Para.Weichen_DL_DB ,
SSDW := #Para.Weichen_DL_DW ,
PARA := WORD#16#0000 , //Nach angegeben Datensatz suchen
SEARCHDATEN := P#M200.0 ,
RE_VAL := "MB199" ,
OUTDATEN := P#M200.0 ,
Position := "MW196"
);
L "MB199";
T #Dyn.Rueckmld.RET_VAL_Teach_OUT;
U "M199.7";//Datensatz ist vorhanden
SPB w240;
U "M199.6";//Datensatz ist nicht vorhanden
= #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden !
R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
BEB;
SET;
R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
S #Dyn.Error.TeachPkt_Datenliste_Err;
BEA;
w240: L #Abstands_Ink;
L #Para.Offset_RefPunkt;//Offset Refpunkt zu SyncPunkt (für Teachen)
+D;
T "MD218";
CALL "DatenIn"
( SSDB := #Para.Weichen_DL_DB ,
SSDW := #Para.Weichen_DL_DW ,
INDATEN := P#M200.0 ,
RE_VAL := "MB199"
);
UN #Dyn.Status.MoreTeach;//Nächsten Teachpunkt ohne neuen Refpunkt
R #Dyn.Refpunkt_ok;//Referenzpunkt erkannt
L "MB199";
T #Dyn.Rueckmld.RET_VAL_Teach_IN;
U "M199.7";//Datensatz ist vorhanden
SPB MORE;
U "M199.6";//Datensatz ist nicht vorhanden
= #Dyn.Error.Keine_TeachPktdaten;//Teach-Punkt in Datenliste nicht vorhanden !
R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
BEB;
SET;
R #Dyn.Status.TeachModus_Aktiv;//Teach-Modus ist aktiv
S #Dyn.Error.TeachPkt_Datenliste_Err;
BEA;
MORE: UN #Dyn.Status.MoreTeach;//Nächsten Teachpunkt ohne neuen Refpunkt
BEB;
CALL "DatenOut"
( SSDB := #Para.Weichen_DL_DB ,
SSDW := #Para.Weichen_DL_DW ,
PARA := WORD#16#FF00 , //Nach nächsten Datensatz suchen
SEARCHDATEN := P#M200.0 ,
RE_VAL := "MB199" ,
OUTDATEN := P#M200.0 ,
Position := "MW196"
);
L "MW206";//Weichentyp
L 178;//Sorterweiche ?
<>I;//Nein!
O "M199.2" ;//Listenende erreicht!
SPB TEND;
L "MW200";
T #Dyn.TeachPunkt ;//Punkt zum Ein-Teachen
BEA;
TEND: L 0;
T #Dyn.TeachPunkt;
BEA;
NETWORK
TITLE = Ende
//
//
BE;
END_FUNCTION_BLOCK