AWL Bausteine aus TIA-Portal Projekt in Workspace

This commit is contained in:
2026-07-08 10:12:56 +02:00
parent 03a2866cd8
commit 32729b3db5
242 changed files with 46463 additions and 83655 deletions
@@ -1,87 +1,97 @@
=== FC 78: BCD (4stellig)_to_INT [STL] ===
INTERFACE:
Input:
BCD_Wert : Word
Output:
Int_Wert : Int
InOut:
Temp:
BCD_Vergleich : Word
Multiplikator : Int
Constant:
Return:
Ret_Val : Void
FUNCTION "BCD (4stellig)_to_INT" : Void
TITLE = BCD-Wert (2-Stellig) in INT-Wert wandeln (Max 00FF)
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
//
//
VAR_INPUT
BCD_Wert : Word;
END_VAR
--- NW 1: Rückmeldung ---
L 0 // erst mal köschen
T Int_Wert
VAR_OUTPUT
Int_Wert : Int;
END_VAR
L 1
T Multiplikator
--- NW 2: BCD-Wert wandeln ---
L BCD_Wert
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
L Multiplikator
L 16
*I
T Multiplikator
L BCD_Vergleich
SRW 4
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
L Multiplikator
L 16
*I
T Multiplikator
L BCD_Vergleich
SRW 4
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
L Multiplikator
L 16
*I
T Multiplikator
L BCD_Vergleich
SRW 4
T BCD_Vergleich
L 16#000F
AW
L Multiplikator
*I
L Int_Wert
+I
T Int_Wert
VAR_TEMP
BCD_Vergleich : Word;
Multiplikator : Int;
END_VAR
--- NW 3: Ende ---
BE
BEGIN
NETWORK
TITLE = Rückmeldung
L 0;//erst mal köschen
T #Int_Wert;
L 1;
T #Multiplikator;
NETWORK
TITLE = BCD-Wert wandeln
L #BCD_Wert;
T #BCD_Vergleich;
L 16#000F;
UW;
L #Multiplikator;
*I;
L #Int_Wert;
+I;
T #Int_Wert;
L #Multiplikator;
L 16;
*I;
T #Multiplikator;
L #BCD_Vergleich;
SRW 4;
T #BCD_Vergleich;
L 16#000F;
UW;
L #Multiplikator;
*I;
L #Int_Wert;
+I;
T #Int_Wert;
L #Multiplikator;
L 16;
*I;
T #Multiplikator;
L #BCD_Vergleich;
SRW 4;
T #BCD_Vergleich;
L 16#000F;
UW;
L #Multiplikator;
*I;
L #Int_Wert;
+I;
T #Int_Wert;
L #Multiplikator;
L 16;
*I;
T #Multiplikator;
L #BCD_Vergleich;
SRW 4;
T #BCD_Vergleich;
L 16#000F;
UW;
L #Multiplikator;
*I;
L #Int_Wert;
+I;
T #Int_Wert;
NETWORK
TITLE = Ende
BE;
END_FUNCTION
@@ -1,50 +1,72 @@
=== FC 99: DBMOV [STL] ===
INTERFACE:
Input:
QuellDB : Int // Quell-DB
QuellDW : Int // Quell-1.DW
ZielDB : Int // Ziel-DB
ZielDW : Int // Ziel-1.DW
Anzahl_DW : Int // Anzahl der zu kopierenden DWs
Output:
RE_VAL : Int // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Constant:
Return:
Ret_Val : Void
FUNCTION "DBMOV" : Void
TITLE = DB-Bereiche kopieren
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : FIFO
NAME : FifoIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-1254
//Version: H&M / 06.12.2025
//
VAR_INPUT
QuellDB : Int; // Quell-DB
QuellDW : Int; // Quell-1.DW
ZielDB : Int; // Ziel-DB
ZielDW : Int; // Ziel-1.DW
Anzahl_DW : Int; // Anzahl der zu kopierenden DWs
END_VAR
--- NW 1: ---
// Kennung + Datenbytes
L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Anzahl_DW // Datenwords speichern
T LW2
T LW12 // Wiederholungen
VAR_OUTPUT
RE_VAL : Int; // Rückmeldung
END_VAR
// Quelle-Pointer erzeugen:
L QuellDB
T LW4 // DB_Nummer
L QuellDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
L ZielDB
T LW14 // DB_Nummer
L ZielDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=RE_VAL, DSTBLK:=Ziel) // Datenliste-Daten speichern
VAR_TEMP
Quelle : Any; // Zeiger, wo Rein-Daten sind
Ziel : Any; // Zeiger, FIFO-Stelle
END_VAR
--- NW 2: Ende ---
BE
BEGIN
NETWORK
TITLE =
//Kennung + Datenbytes
L 16#1004 ;//Kennung 10 + Word=04
T %LW0;
T %LW10;//Any-Kennung, Datentyp
L #Anzahl_DW ;//Datenwords speichern
T %LW2;
T %LW12;//Wiederholungen
//Quelle-Pointer erzeugen:
L #QuellDB;
T %LW4;//DB_Nummer
L #QuellDW ;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD6;//Kennung, Adresse
//Ziel-Pointer erzeugen:
L #ZielDB;
T %LW14;//DB_Nummer
L #ZielDW ;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD16;//Kennung, Adresse
CALL BLKMOV//Datenliste-Daten speichern
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #RE_VAL ,
DSTBLK := #Ziel
);
NETWORK
TITLE = Ende
BE;
END_FUNCTION
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,234 +1,286 @@
=== FC 87: DatenReset [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
IndDB : Word // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
IndDB_Laenge : Int // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
IndDaten_FC : Int // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
Belegt14 : Int // reserviert von Sort-Datenliste
Reserve16 : Int // Reserve
Reserve18 : Int // Reserve
DBDatenliste : Word // Datenlisten-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word // Ende der Datenliste
Schleife : Word // Loopzähler
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
DB_Länge : Int
Constant:
Return:
Ret_Val : Void
FUNCTION "DatenReset" : Void
TITLE = Datenlisten-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : DLISTE
NAME : DatenIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-1254
//Version: P&O / 10.2024
//Version: ILS2100 / 06.11.2009
//
//Datenblock in Datenliste resetten
//SSDB: Datenlisten-DB
//SSDW: Datenlisten-1.DW
//RE_VAL: Rückmeldungen:
// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung
// Bit1: SFC20-Aufruf mit Fehler
// Bit2: Frei
// Bit3: Frei
// Bit4: Frei
// Bit5: Frei
// Bit6: Frei
// Bit7: Frei
//
VAR_INPUT
SSDB : Int; // Datenlisten-DB
SSDW : Int; // Datenlisten-1.DW
END_VAR
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBDatenliste
VAR_OUTPUT
RE_VAL : Byte; // Rückmeldung
END_VAR
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Datenlisten-Bereich
VAR_TEMP
Quelle : Any; // Zeiger, wo Rein-Daten sind
Ziel : Any; // Zeiger, FIFO-Stelle
Kopf : Byte; // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int; // Stammdatenlänge in Word (1 - 9)
IndDB : Word; // Indizierter DB (nur bei Stammdaten = 1 erlaubt !!!)
IndDB_Laenge : Int; // Länge des indizierten DB in Einträge (nur bei Stammdaten = 1 erlaubt !!!)
IndDaten_FC : Int; // FC zum Wandeln der indizierte Daten (nur bei Stammdaten = 1 erlaubt !!!)
Suchzeiger : Int; // Speicherung des letzten Zugriffs / Suchzeiger
Belegt14 : Int; // reserviert von Sort-Datenliste
Reserve16 : Int; // Reserve
Reserve18 : Int; // Reserve
DBDatenliste : Word; // Datenlisten-DB
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word; // Ende der Datenliste
Schleife : Word; // Loopzähler
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
DB_Länge : Int;
END_VAR
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
BEGIN
NETWORK
TITLE = Schnittstellen-DB sinnvoll ?
L #SSDB;
T #DBDatenliste;
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
CALL "TEST_DB_TO_ATTR_DB"
( DB_Number := #DBDatenliste ,
RetVal := #SFC_RET_VAL ,
DB_Length := #SFC_DB_LENGTH ,
Write_Prot := #SFC_WRITE_PROT
);
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
CALL "BCD (4stellig)_to_INT"
( BCD_Wert := #SFC_DB_LENGTH ,
Int_Wert := #DB_Länge
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
O #SFC_WRITE_PROT;
SPB Err0;//kein Datenlisten-Bereich
NETWORK
TITLE = Datenlistekopf holen
//Quelle-Pointer erzeugen:
L 16#1004;//Kennung 10 + Word=04
T %LW0;//Any-Kennung, Datentyp
L 16#000A;//10 Dw´s holen
T %LW2;//Wiederholungen
L #SSDB;
T %LW4;//DB_Nummer
L #SSDW;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD6;//Kennung, Adresse
CALL BLKMOV//1.-10.DW Datenliste holen
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #SFC_RET_VAL ,
DSTBLK := P#L20.0 WORD 10
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
SPB Err1;
NETWORK
TITLE = Zeigerüberprüfung
L #Kopf;//Datenliste-Kopf
L 16#DA;//= Datenlistekennung ?
<>I;//Nein !
SPB Err0;//kein Datenlistebereich
L 1;
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Datenlistebereich
L 128;
>I;
SPB Err0;//kein Datenlistebereich
L 1;
L #Listenlaenge;//Max.Anzahl von Datenblöcken
>I;
SPB Err0;//kein Datenlistebereich
L 1;
L #Stammdaten;//Anzahl der Stammdaten
>I;
SPB Err0;//kein Datenlistebereich
L 9;
>I;
SPB Err0;//kein Datenlistebereich
L #Stammdaten;//Anzahl der Stammdaten
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Datenlistebereich
L #Listenlaenge;//Länge der Datenliste
L #Datensatzlaenge;//Datenblocklänge
*I;
L 2;//DB byteorientiert
*I;
+ 20;//Speichern ab 10.DW
L #SSDW;
+I;
T #Datenlisten_Ende;
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #DBDatenliste];
L #Datenlisten_Ende;
L #DB_Länge;
>I ;//Datenlisten-DB ist zu kurz!
SPB Err0;//kein Datenlisten-Bereich
L DBW[ #AR1Zeiger];
L 16#DAEE;//Datenliste-Endekennung ?
<>I;//Nein !
SPB Err0;//kein Datenlisten-Bereich
NETWORK
TITLE = Indizierung löschen ?
L #IndDB;//Indizierter DB
L 0;//=0 ?
==I;//Kein indizierter DB !
SPB Nw05;
CALL "TEST_DB_TO_ATTR_DB"
( DB_Number := #IndDB ,
RetVal := #SFC_RET_VAL ,
DB_Length := #SFC_DB_LENGTH ,
Write_Prot := #SFC_WRITE_PROT
);
CALL "BCD (4stellig)_to_INT"
( BCD_Wert := #SFC_DB_LENGTH ,
Int_Wert := #DB_Länge
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
O #SFC_WRITE_PROT;
SPB Nw05;//kein Indizier-DB vorhanden
L 0;
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #IndDB];
L #DB_Länge ;//In Bytes angegeben
L400: T #Schleife;
L 0;
T DBB[ #AR1Zeiger] ;//Inhalte löschen
L #AR1Zeiger;
SRD 3;
L DINT#1;
+D;
SLD 3;
T #AR1Zeiger;
L #Schleife;
LOOP L400;
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DA // = Datenlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
NETWORK
TITLE = Datenliste löschen
Nw05: L #SSDW;
+ 12 ;//12.Dw
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
AUF DB[ #DBDatenliste];
L 128
>I
JC Err0 // kein Datenlistebereich
L 0;
T DBW[ #AR1Zeiger] ;//Letzte Speicherung löschen
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
L #SSDW;
+ 16 ;//16.Dw
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
AUF DB[ #DBDatenliste];
L 9
>I
JC Err0 // kein Datenlistebereich
L 0;
T DBW[ #AR1Zeiger] ;//Anzahl Einträge löschen
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L #SSDW;
+ 20 ;//Daten ab 20.Dw
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L #Datensatzlaenge;
L #Listenlaenge;
*I;
L500: T #Schleife;
OPN DB[DBDatenliste]
AUF DB[ #DBDatenliste];
L Datenlisten_Ende
L "DB_Länge"
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L 0;
T DBW[ #AR1Zeiger] ;//Inhalte löschen
L DBW [AR1Zeiger]
L 16#DAEE // Datenliste-Endekennung ?
<>I // Nein !
JC Err0 // kein Datenlisten-Bereich
L #AR1Zeiger;
SRD 3;
L DINT#2;
+D;
SLD 3;
T #AR1Zeiger;
L #Schleife;
LOOP L500;
--- NW 4: Indizierung löschen ? ---
L IndDB // Indizierter DB
L 0 // =0 ?
==I // Kein indizierter DB !
JC Nw05
NETWORK
TITLE = Fehlerausgabe / RET_VAL
SET;//VKE = 1 ohne Fehler !!!
SPA Ok;
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
SPA Err;
Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=IndDB, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
Err: CLR;//VKE = 0 bei Fehler !!!
Ok: T #RE_VAL;
CALL FC "BCD (4stellig)_to_INT" (BCD_Wert:=SFC_DB_LENGTH, Int_Wert:="DB_Länge")
SAVE;//VKE in BIE-Bit speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Nw05 // kein Indizier-DB vorhanden
L 0
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[IndDB]
L "DB_Länge" // In Bytes angegeben
L400: T Schleife
L 0
T DBB [AR1Zeiger] // Inhalte löschen
L AR1Zeiger
SRD 3
L DINT#1
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L400
--- NW 5: Datenliste löschen ---
Nw05: L SSDW
+ 12 // 12.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L 0
T DBW [AR1Zeiger] // Letzte Speicherung löschen
L SSDW
+ 16 // 16.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBDatenliste]
L 0
T DBW [AR1Zeiger] // Anzahl Einträge löschen
L SSDW
+ 20 // Daten ab 20.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L Datensatzlaenge
L Listenlaenge
*I
L500: T Schleife
OPN DB[DBDatenliste]
L 0
T DBW [AR1Zeiger] // Inhalte löschen
L AR1Zeiger
SRD 3
L DINT#2
+D
SLD 3
T AR1Zeiger
L Schleife
LOOP L500
--- NW 6: Fehlerausgabe / RET_VAL ---
SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T RE_VAL
SAVE // VKE in BIE-Bit speichern
END_FUNCTION
@@ -1,183 +1,223 @@
=== FC 90: DatenResetSort [STL] ===
INTERFACE:
Input:
SSDB : Int // Datenlisten-DB
SSDW : Int // Datenlisten-1.DW
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int // Stammdatenlänge in Word (1 - 9)
Belegt06 : Int // reserviert von Datenliste
Belegt08 : Int // reserviert von Datenliste
Belegt10 : Int // reserviert von Datenliste
Belegt12 : Int // reserviert von Datenliste
AnzahlEintraege : Int // Anzahl der eingetragenen Datensätze
Reserve16 : Int // Reserve
Reserve18 : Int // Reserve
Suchzeiger : Int // Speicherung des letzten Zugriffs / Suchzeiger
DBDatenliste : Word // Datenlisten-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word // Ende der Datenliste
Schleife : Word // Loopzähler
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
FUNCTION "DatenResetSort" : Void
TITLE = Datenlisten-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : DLISTE
NAME : DatenIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-1254
//Version: ILS2100 / 06.11.2009
//
//Datenblock in Datenliste resetten
//SSDB: Datenlisten-DB
//SSDW: Datenlisten-1.DW
//RE_VAL: Rückmeldungen:
// Bit0: Kein Datenlistenbereich / falscher Kopfinhalt / Endekennung
// Bit1: SFC20-Aufruf mit Fehler
// Bit2: Frei
// Bit3: Frei
// Bit4: Frei
// Bit5: Frei
// Bit6: Frei
// Bit7: Frei
//
VAR_INPUT
SSDB : Int; // Datenlisten-DB
SSDW : Int; // Datenlisten-1.DW
END_VAR
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBDatenliste
VAR_OUTPUT
RE_VAL : Byte; // Rückmeldung
END_VAR
// CALL TEST_DB
// DB_NUMBER :=#DBDatenliste
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBDatenliste, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Datenlisten-Bereich
VAR_TEMP
Quelle : Any; // Zeiger, wo Rein-Daten sind
Ziel : Any; // Zeiger, FIFO-Stelle
Kopf : Byte; // Datenliste-Kennnung (DA)
Datensatzlaenge : Byte; // Datensatzlänge in Word (01 - F0) F0=128
Listenlaenge : Int; // Länge der Datenliste (maximale Anzahl der Datensätze)
Stammdaten : Int; // Stammdatenlänge in Word (1 - 9)
Belegt06 : Int; // reserviert von Datenliste
Belegt08 : Int; // reserviert von Datenliste
Belegt10 : Int; // reserviert von Datenliste
Belegt12 : Int; // reserviert von Datenliste
AnzahlEintraege : Int; // Anzahl der eingetragenen Datensätze
Reserve16 : Int; // Reserve
Reserve18 : Int; // Reserve
Suchzeiger : Int; // Speicherung des letzten Zugriffs / Suchzeiger
DBDatenliste : Word; // Datenlisten-DB
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
Datenlisten_Ende : Word; // Ende der Datenliste
Schleife : Word; // Loopzähler
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
END_VAR
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#000A // 10 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
BEGIN
NETWORK
TITLE = Schnittstellen-DB sinnvoll ?
L #SSDB;
T #DBDatenliste;
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 10) // 1.-10.DW Datenliste holen
// CALL TEST_DB
// DB_NUMBER :=#DBDatenliste
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
CALL "TEST_DB_TO_ATTR_DB"
( DB_Number := #DBDatenliste ,
RetVal := #SFC_RET_VAL ,
DB_Length := #SFC_DB_LENGTH ,
Write_Prot := #SFC_WRITE_PROT
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
O #SFC_WRITE_PROT;
SPB Err0;//kein Datenlisten-Bereich
--- NW 3: Zeigerüberprüfung ---
L Kopf // Datenliste-Kopf
L 16#DB // = DatenSortlistekennung ?
<>I // Nein !
JC Err0 // kein Datenlistebereich
NETWORK
TITLE = Datenlistekopf holen
//Quelle-Pointer erzeugen:
L 16#1004;//Kennung 10 + Word=04
T %LW0;//Any-Kennung, Datentyp
L 16#000A;//10 Dw´s holen
T %LW2;//Wiederholungen
L #SSDB;
T %LW4;//DB_Nummer
L #SSDW;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD6;//Kennung, Adresse
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
CALL BLKMOV//1.-10.DW Datenliste holen
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #SFC_RET_VAL ,
DSTBLK := P#L20.0 WORD 10
);
L 128
>I
JC Err0 // kein Datenlistebereich
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
SPB Err1;
L 1
L Listenlaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Datenlistebereich
NETWORK
TITLE = Zeigerüberprüfung
L #Kopf;//Datenliste-Kopf
L 16#DB;//= DatenSortlistekennung ?
<>I;//Nein !
SPB Err0;//kein Datenlistebereich
L 1
L Stammdaten // Anzahl der Stammdaten
>I
JC Err0 // kein Datenlistebereich
L 1;
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Datenlistebereich
L 9
>I
JC Err0 // kein Datenlistebereich
L 128;
>I;
SPB Err0;//kein Datenlistebereich
L Stammdaten // Anzahl der Stammdaten
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Datenlistebereich
L 1;
L #Listenlaenge;//Max.Anzahl von Datenblöcken
>I;
SPB Err0;//kein Datenlistebereich
L Listenlaenge // Länge der Datenliste
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 20 // Speichern ab 10.DW
L SSDW
+I
T Datenlisten_Ende
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L 1;
L #Stammdaten;//Anzahl der Stammdaten
>I;
SPB Err0;//kein Datenlistebereich
OPN DB[DBDatenliste]
L 9;
>I;
SPB Err0;//kein Datenlistebereich
L Datenlisten_Ende
L SFC_DB_LENGTH
>I // Datenlisten-DB ist zu kurz!
JC Err0 // kein Datenlisten-Bereich
L #Stammdaten;//Anzahl der Stammdaten
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Datenlistebereich
L DBW [AR1Zeiger]
L 16#DBEE // DatenSortliste-Endekennung ?
<>I // Nein !
JC Err0 // kein Datenlisten-Bereich
L #Listenlaenge;//Länge der Datenliste
L #Datensatzlaenge;//Datenblocklänge
*I;
L 2;//DB byteorientiert
*I;
+ 20;//Speichern ab 10.DW
L #SSDW;
+I;
T #Datenlisten_Ende;
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #DBDatenliste];
--- NW 4: Datenliste löschen ---
L SSDW
+ 14 // 14.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L #Datenlisten_Ende;
L #SFC_DB_LENGTH;
>I;//Datenlisten-DB ist zu kurz!
SPB Err0;//kein Datenlisten-Bereich
OPN DB[DBDatenliste]
L DBW[ #AR1Zeiger];
L 16#DBEE;//DatenSortliste-Endekennung ?
<>I;//Nein !
SPB Err0;//kein Datenlisten-Bereich
L 0
T DBW [AR1Zeiger] // Anzahl Einträge löschen
NETWORK
TITLE = Datenliste löschen
L #SSDW;
+ 14;//14.Dw
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L SSDW
+ 20 // 20.Dw
ITD
SLD 3
T AR1Zeiger // /Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #DBDatenliste];
L Datensatzlaenge
L Listenlaenge
*I
L500: T Schleife
L 0;
T DBW[ #AR1Zeiger];//Anzahl Einträge löschen
L 0 // Daten löschen
T DBW [AR1Zeiger]
L #SSDW;
+ 20;//20.Dw
ITD;
SLD 3;
T #AR1Zeiger;///Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
L AR1Zeiger
SRD 3
L 2
+D
SLD 3
T AR1Zeiger
L #Datensatzlaenge;
L #Listenlaenge;
*I;
L500: T #Schleife;
L Schleife
LOOP L500
L 0;//Daten löschen
T DBW[ #AR1Zeiger];
L #AR1Zeiger;
SRD 3;
L 2;
+D;
SLD 3;
T #AR1Zeiger;
--- NW 5: Fehlerausgabe / RET_VAL ---
SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
L #Schleife;
LOOP L500;
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T RE_VAL
NETWORK
TITLE = Fehlerausgabe / RET_VAL
SET;//VKE = 1 ohne Fehler !!!
SPA Ok;
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
SPA Err;
Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler
SAVE // VKE in BIE-Bit speichern
Err: CLR;//VKE = 0 bei Fehler !!!
Ok: T #RE_VAL;
SAVE;//VKE in BIE-Bit speichern
END_FUNCTION
@@ -1,65 +1,73 @@
=== FC 125: Err_vorhanden [STL] ===
INTERFACE:
Input:
Check_DB : Int
Anfangs_DW : DInt
Ende_DW : DInt
Output:
Stoerung : Bool // Störung vorhanden
ErrDW : DInt
ErrBits : Int
InOut:
Temp:
Anzeige_DB : Int
Zeiger : DInt // Startwert mit Offset 0
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
FUNCTION "Err_vorhanden" : Void
TITLE = Störung aktiv
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
Check_DB : Int;
Anfangs_DW : DInt;
Ende_DW : DInt;
END_VAR
--- NW 1: Check-DB von "Abfangs_DW" bis "Ende_DW" checken ---
SET // GST
R Stoerung
L DINT#-1 // Sonst Störung in DBD0 nicht erkennbar
T ErrDW
L 0
T ErrBits
VAR_OUTPUT
Stoerung : Bool; // Störung vorhanden
ErrDW : DInt;
ErrBits : Int;
END_VAR
L Check_DB
T Anzeige_DB
L Anfangs_DW // Mit diesem DW beginnen
T Zeiger // Zeiger
Loop: L Zeiger // Zeiger
SLD 3
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[Anzeige_DB]
L DBW [AR1Zeiger] // Störungsbits
T ErrBits
L 0 // aktiv ?
<>I // Ja !
JC Err
L Zeiger // Startwert mit Offset 0
L 2
+D
T Zeiger // Zeiger
L Ende_DW // Letztes DW überschritten?
<=D // Nein !
JC Loop
BEU
Err: SET
S Stoerung
L Zeiger // Zeiger
T ErrDW
VAR_TEMP
Anzeige_DB : Int;
Zeiger : DInt; // Startwert mit Offset 0
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
END_VAR
--- NW 2: Ende ---
BE
BEGIN
NETWORK
TITLE = Check-DB von "Abfangs_DW" bis "Ende_DW" checken
SET;//GST
R #Stoerung;
L DINT#-1;//Sonst Störung in DBD0 nicht erkennbar
T #ErrDW;
L 0;
T #ErrBits;
L #Check_DB;
T #Anzeige_DB;
L #Anfangs_DW;//Mit diesem DW beginnen
T #Zeiger;//Zeiger
Loop: L #Zeiger;//Zeiger
SLD 3;
T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #Anzeige_DB];
L DBW[ #AR1Zeiger];//Störungsbits
T #ErrBits;
L 0;//aktiv ?
<>I;//Ja !
SPB Err;
L #Zeiger;//Startwert mit Offset 0
L 2;
+D;
T #Zeiger;//Zeiger
L #Ende_DW;//Letztes DW überschritten?
<=D;//Nein !
SPB Loop;
BEA;
Err: SET;
S #Stoerung;
L #Zeiger;//Zeiger
T #ErrDW;
NETWORK
TITLE = Ende
BE;
END_FUNCTION
@@ -1,327 +1,375 @@
=== FC 84: FIFOChange [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
CH_POS : Int // Position des Eintrags, der zu ändernden Daten
CHANGEDATEN : Pointer // Wechsel-Daten-Schnittstelle
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
Err : Byte // Fehlerbits
MinHolzeiger : Int // Minimum Holzeiger
MaxHolzeiger : Int // Maximum Holzeiger
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
AlleDaten : Word // Anzahl der bytes für alle Daten
Offset : Word // Offset zu überschreibender Datensatz
NixSave : Bool // Status nicht speichern
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt // Startwert mit Offset 0
Constant:
Return:
Ret_Val : Void
FUNCTION "FIFOChange" : Void
TITLE = Fifo-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : FIFO
NAME : FifoIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-960629
//Version: KyungBang00 / 14.04.2009
//
//Datenblock in Fifo überschreiben
//SSDB: FIFO-DB
//SSDW: FIFO-1.DW
//CH_POS: angegebene Position überschreiben
//CHANGEDATEN: Pointer, wo zu ändernde Daten stehen (P#DB1.DBX0.0, P#M220.0)
//RE_VAL: Rückmeldungen:
// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung
// Bit1: SFC20-Aufruf mit Fehler
// Bit2: Fifo ist leer
// Bit3: Falscher Parameter bei Aufruf
// Bit4: Position nicht belegt
// Bit5: Bringzeiger ist ausserhalb
// Bit6: Holzeiger ist ausserhalb
// Bit7: Versatz Bring-/Holzeiger
//
VAR_INPUT
SSDB : Int; // Schnittstellen-DB
SSDW : Int; // Schnittstellen-1.DW
CH_POS : Int; // Position des Eintrags, der zu ändernden Daten
CHANGEDATEN : Pointer; // Wechsel-Daten-Schnittstelle
END_VAR
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBFifo
VAR_OUTPUT
RE_VAL : Byte; // Rückmeldung
END_VAR
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
VAR_TEMP
Quelle : Any; // Zeiger, wo Rein-Daten sind
Ziel : Any; // Zeiger, FIFO-Stelle
Kopf : Byte; // Fifo-Kennung (FF)
Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden
Anzahl : Int; // Anzahl der Datensätze (eingetragene)
Status : Word; // Status des Fifo
Err : Byte; // Fehlerbits
MinHolzeiger : Int; // Minimum Holzeiger
MaxHolzeiger : Int; // Maximum Holzeiger
DBFifo : Word; // FIFO-DB
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
Fifo_Ende : Word; // Ende des Fifo
AlleDaten : Word; // Anzahl der bytes für alle Daten
Offset : Word; // Offset zu überschreibender Datensatz
NixSave : Bool; // Status nicht speichern
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt; // Startwert mit Offset 0
END_VAR
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
BEGIN
NETWORK
TITLE = Schnittstellen-DB sinnvoll ?
L #SSDB;
T #DBFifo;
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL "TEST_DB_TO_ATTR_DB"
( DB_Number := #DBFifo ,
RetVal := #SFC_RET_VAL ,
DB_Length := #SFC_DB_LENGTH ,
Write_Prot := #SFC_WRITE_PROT
);
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
O #SFC_WRITE_PROT;
= #NixSave;//Status nicht speichern
SPB Err0;//kein Fifobereich
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
NETWORK
TITLE = Fifokopfdaten holen
//Quelle-Pointer erzeugen:
L 16#1004;//Kennung 10 + Word=04
T %LW0;//Any-Kennung, Datentyp
L 16#0006;//6 Dw´s holen
T %LW2;//Wiederholungen
L #SSDB;
T %LW4;//DB_Nummer
L #SSDW;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD6;//Kennung, Adresse
L Status
L 2#0000_0000_1110_0000
AW
T Err
JP Err // Kapitalfehler vorhanden
CALL BLKMOV//1.-6.DW FIFO holen
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #SFC_RET_VAL ,
DSTBLK := P#L20.0 WORD 6
);
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
L #Status;
L 2#0000_0000_1110_0000;
UW;
T #Err;
SPP Err;//Kapitalfehler vorhanden
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
SPB Err1;
NETWORK
TITLE = Zeigerüberprüfung
L #Kopf;//Fifo-Kopf
L 16#FF;//= Fifokennung ?
<>I;//Nein !
= #NixSave;//Status nicht speichern
SPB Err0;//kein Fifobereich
L 1;
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Fifobereich
L 128;
>I;
SPB Err0;//kein Fifobereich
L 1;
L #FifoLaenge;//Max.Anzahl von Datenblöcken
>I;
SPB Err0;//kein Fifobereich
L #SSDW;
+ 40;//Speichern ab 20.DW
T #MinHolzeiger;//Minimum Bringzeiger
L #FifoLaenge;//Länge FIFO (in Word)
+ -1;
L #Datensatzlaenge;//Datenblocklänge
*I;
L 2;//DB byteorientiert
*I;
+ 40;//Speichern ab 20.DW
L #SSDW;
+I;
T #MaxHolzeiger;//Maximum Bringzeiger
L #Datensatzlaenge;//Datenblocklänge
L 2;//DB byteorientiert
*I;
L #MaxHolzeiger;//Maximum Holzeiger
+I;//Zeiger Endekennung
T #Fifo_Ende;
ITD;
T #AR1Start;//Startwert mit Offset 0
SLD 3;
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #DBFifo];
L #Fifo_Ende;
L #SFC_DB_LENGTH;
>I;//Fifo-DB ist zu kurz!
SPB Err0;//kein Fifo-Bereich
L DBW[ #AR1Zeiger];
L 16#FFEE;//Fifo-Endekennung ?
<>I;//Nein !
SPB Err0;//kein Fifobereich
L #MinHolzeiger;//Minimum Holzeiger
L #Holzeiger;//Holzeiger
<=I;//Ok ?
SPB W300;//Ja!
L 0;//Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #Holzeiger;//Holzeiger Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #Anzahl;//Anzahl Datensätze
L 0;//Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #MinHolzeiger;//Minimum Holzeiger
T #Bringzeiger;//Bringzeiger
T #Holzeiger;//Holzeiger
W300: L #MaxHolzeiger;//Maximum Holzeiger
<=I;//Ok ?
SPB W301;//Ja!
SPA Err6;//Holzeiger ist ausserhalb
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
W301: L #Bringzeiger;//Bringzeiger
L #Holzeiger;//Holzeiger
==I;//Identisch !
U(;
L #FifoLaenge;
L #Anzahl;//Anzahl der gespeicherten Datensätze
<>I;//Fifo noch nicht voll !
);
U(;
L 0;
<>I;//Datensätze aber noch vorhanden !
);
SPB Err7;//Versatz Bring-/Holzeiger
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L #Bringzeiger;//Bringzeiger
L #Holzeiger;//Holzeiger
<>I;//Ungleich !
U(;
L #FifoLaenge;
L #Anzahl;//Anzahl der gespeicherten Datensätze
==I;//Aber Fifo ist voll !
O(;
L 0;
==I;//Aber keine Datensätze vorhanden !
);
);
SPB Err7;//Versatz Bring-/Holzeiger
L 128
>I
JC Err0 // kein Fifobereich
L #Anzahl;//Anzahl der gespeicherten Datensätze
L 0;
==I;//Keine Datensätze vorhanden !
SPB Err2;//Fifo ist leer
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
NETWORK
TITLE = Offset bilden
L 0;
L #CH_POS;
>=I;
SPB Err3;//falscher Parameter bei Aufruf
L SSDW
+ 40 // Speichern ab 20.DW
T MinHolzeiger // Minimum Bringzeiger
L #FifoLaenge;//Max.Anzahl von Datenblöcken
>I;
SPB Err3;//falscher Parameter bei Aufruf
L FifoLaenge // Länge FIFO (in Word)
+ -1
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T MaxHolzeiger // Maximum Bringzeiger
L #Anzahl;//Anzahl der Datensätze
L #CH_POS;
<I;
SPB Err4;//Fifo ist leer
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L MaxHolzeiger // Maximum Holzeiger
+I // Zeiger Endekennung
T Fifo_Ende
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
+ -1;//1.Teil = Holzeiger !
L #Datensatzlaenge;//Datenblocklänge
*I;
L 2;//DB byteorientiert
*I;
L #Holzeiger;//Holzeiger
+I;
W400: T #Offset;//Schreibzeiger
L #MaxHolzeiger;//Maximum Holzeiger
<=I;
SPB Nw05;
OPN DB[DBFifo]
L #FifoLaenge;//Max.Anzahl von Datenblöcken
L #Datensatzlaenge;//Datenblocklänge
*I;
L 2;//DB byteorientiert
*I;
T #AlleDaten;//Bytes für alle Datensätze
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L #Offset;//Schreibzeiger
L #AlleDaten;
-I;
SPA W400;
L DBW [AR1Zeiger]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
NETWORK
TITLE = Fifodaten überschreiben
//Quelle-Pointer erzeugen:
Nw05: L 16#1004;//Kennung 10 + Word=04
T %LW0;
T %LW10;//Any-Kennung, Datentyp
L #Datensatzlaenge;//Datenbytes speichern
T %LW2;
T %LW12;//Wiederholungen
L MinHolzeiger // Minimum Holzeiger
L Holzeiger // Holzeiger
<=I // Ok ?
JC W300 // Ja!
//DATEN-Pointer übernehmen:
L P##CHANGEDATEN;
LAR1;
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L W[ AR1, P#0.0];
T %LW4;//DB_Nummer
L D[ AR1, P#2.0];
T %LD6;//Kennung, Adresse
L Holzeiger // Holzeiger Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
//Ziel-Pointer erzeugen:
//Kennung + Datenbytes s.o.
L Anzahl // Anzahl Datensätze
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L #SSDB;
T %LW14;//DB_Nummer
L #Offset;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD16;//Kennung, Adresse
L MinHolzeiger // Minimum Holzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
CALL BLKMOV//FIFO-Daten speichern
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #SFC_RET_VAL ,
DSTBLK := #Ziel
);
W300: L MaxHolzeiger // Maximum Holzeiger
<=I // Ok ?
JC W301 // Ja!
JU Err6 // Holzeiger ist ausserhalb
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
SPB Err1;
NETWORK
TITLE = Fehlerausgabe / RET_VAL
SET;//VKE = 1 ohne Fehler !!!
SPA Ok;
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
T #Err;
SPA Err;
Err1: S %L32.1;//SFC20-Aufruf mit Fehler
SPA Err;
Err2: S %L32.2;//Fifo ist voll
SPA Err;
Err3: S %L32.3;//Falscher Parameter
SPA Err;
Err4: S %L32.4;//Position nicht belegt
SPA Err;
Err6: S %L32.6;//Holzeiger außerhalb
SPA Err;
Err7: S %L32.7;//Versatz Bring-/Holzeiger
W301: L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
A(
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
Err: CLR;//VKE = 0 bei Fehler !!!
Ok: L #Err;
T #RE_VAL;
L #Status;
OW;
T #Status;
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
O(
L 0
==I // Aber keine Datensätze vorhanden !
)
)
JC Err7 // Versatz Bring-/Holzeiger
SAVE;//VKE in BIE-Bit speichern
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Keine Datensätze vorhanden !
JC Err2 // Fifo ist leer
NETWORK
TITLE = Fifokopfdaten speichern
U %L32.0;//Falscher Parameter
U #NixSave;//Status nicht speichern
BEB;
L #SSDW;
+ 10;//Status
ITD;
T #AR1Start;//Startwert mit Offset 0
SLD 3;
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
--- NW 4: Offset bilden ---
L 0
L CH_POS
>=I
JC Err3 // falscher Parameter bei Aufruf
AUF DB[ #DBFifo];
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err3 // falscher Parameter bei Aufruf
L #Err;
T DBW[ #AR1Zeiger];
L Anzahl // Anzahl der Datensätze
L CH_POS
<I
JC Err4 // Fifo ist leer
+ -1 // 1.Teil = Holzeiger !
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
L Holzeiger // Holzeiger
+I
W400: T Offset // Schreibzeiger
L MaxHolzeiger // Maximum Holzeiger
<=I
JC Nw05
L FifoLaenge // Max.Anzahl von Datenblöcken
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
T AlleDaten // Bytes für alle Datensätze
L Offset // Schreibzeiger
L AlleDaten
-I
JU W400
--- NW 5: Quelle-Pointer erzeugen: ---
Nw05: L 16#1004 // Kennung 10 + Word=04
T LW0
T LW10 // Any-Kennung, Datentyp
L Datensatzlaenge // Datenbytes speichern
T LW2
T LW12 // Wiederholungen
// DATEN-Pointer übernehmen:
L P#
LAR1
L NoneW [AR1,]
T LW4 // DB_Nummer
L NoneD [AR1,]
T LD6 // Kennung, Adresse
// Ziel-Pointer erzeugen:
// Kennung + Datenbytes s.o.
L SSDB
T LW14 // DB_Nummer
L Offset // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD16 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=Ziel) // FIFO-Daten speichern
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 6: Fehlerausgabe / RET_VAL ---
SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
T Err
JU Err
Err1: S L32.1 // SFC20-Aufruf mit Fehler
JU Err
Err2: S L32.2 // Fifo ist voll
JU Err
Err3: S L32.3 // Falscher Parameter
JU Err
Err4: S L32.4 // Position nicht belegt
JU Err
Err6: S L32.6 // Holzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
--- NW 7: Fifokopfdaten speichern ---
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
L SSDW
+ 10 // Status
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Err
T DBW [AR1Zeiger]
END_FUNCTION
@@ -1,376 +1,423 @@
=== FC 83: FIFOSearch [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
SEARCHDATEN : Pointer // SuchDaten-Schnittstelle
Laenge : Int // Anzahl der DWs zum Vergleichen im Datensatz
Output:
RE_POS : Int // Position des Eintrags, der gesuchten Daten
RE_VAL : Byte // Rückmeldungen
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Ziel : Any // Zeiger, FIFO-Stelle
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
Err : Byte // Fehlerbits
MinHolzeiger : Int // Minimum Holzeiger
MaxHolzeiger : Int // Maximum Holzeiger
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
AR2_Speicher : DWord // Adress-Register 2 zwischenspeichern
DBSuchdaten : Word // Solldaten-DB, falls angegeben
SuchDaten_Startpunkt : Word // SuchDaten-Startpunkt: Adresse
SuchZeiger : Word // Suchzeiger
Schleife : Word // Loopzähler
NixSave : Bool // Status nicht speichern
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt // Startwert mit Offset 0
sRE_POS : Int // Position des Eintrags, der gesuchten Daten
Constant:
Return:
Ret_Val : Void
--- NW 1: Schnittstellen-DB sinnvoll ? ---
TAR2
T AR2_Speicher // AR2 zwischenspeichern
L SSDB
T DBFifo
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
= NixSave // Status nicht speichern
O SFC_WRITE_PROT
JC Err0 // kein Fifobereich
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T sRE_POS // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L20.0 WORD 6) // 1.-6.DW FIFO holen
L Status
L 2#0000_0000_1110_0000
AW
T Err
JP Err // Kapitalfehler vorhanden
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
= NixSave // Status nicht speichern
JC Err0 // kein Fifobereich
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L 128
>I
JC Err0 // kein Fifobereich
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L SSDW
+ 40 // Speichern ab 20.DW
T MinHolzeiger // Minimum Holzeiger
L FifoLaenge // Länge FIFO (in Word)
+ -1
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T MaxHolzeiger // Maximum Holzeiger
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L MaxHolzeiger // Maximum Holzeiger
+I // Zeiger Endekennung
T Fifo_Ende
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
OPN DB[DBFifo]
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L DBW [AR1Zeiger]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L MinHolzeiger // Minimum Holzeiger
L Holzeiger // Holzeiger
<=I // Ok ?
JC W300 // Ja!
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Bringzeiger // Bringzeiger Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L Anzahl // Anzahl Datensätze
L 0 // Grundstellung ?
<>I // Nein !
JC Err6 // Holzeiger ist ausserhalb
L MinHolzeiger // Minimum Holzeiger
T Bringzeiger // Bringzeiger
T Holzeiger // Holzeiger
JU Err2 // Fifo ist leer
W300: L MaxHolzeiger // Maximum Holzeiger
<=I // Ok ?
JC W301 // Ja!
JU Err6 // Holzeiger ist ausserhalb
W301: L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
==I // Identisch !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
<>I // Fifo noch nicht voll !
)
A(
L 0
<>I // Datensätze aber noch vorhanden !
)
JC Err7 // Versatz Bring-/Holzeiger
L Bringzeiger // Bringzeiger
L Holzeiger // Holzeiger
<>I // Ungleich !
A(
L FifoLaenge
L Anzahl // Anzahl der gespeicherten Datensätze
==I // Aber Fifo ist voll !
O(
L 0
==I // Aber keine Datensätze vorhanden !
)
)
JC Err7 // Versatz Bring-/Holzeiger
L Anzahl // Anzahl der gespeicherten Datensätze
L 0
==I // Keine Datensätze vorhanden !
JC Err2 // Fifo ist leer
--- NW 4: Fifodaten suchen ---
L 1
T sRE_POS // RET-POS
L Holzeiger // Holzeiger
T SuchZeiger // Suchzeiger
W400: ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
// DATEN-Pointer übernehmen:
L P#
LAR2
L NoneW [AR2,]
T DBSuchdaten // Solldaten-DB
L DBSuchdaten // Solldaten-DB
L 0 // Angegeben ?
==I // Nein
JC W401
// CALL TEST_DB
// DB_NUMBER :=#DBSuchdaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBSuchdaten, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000 // Fehler vorhanden ?
<>I // Ja !
JC Err1 // SFC20-Aufruf mit Fehler
L NoneD [AR2,] // Kennung, Adresse
L 16#00FF_FFFF // Ohne Kennung
AW
SRW 3 // Ohne Bit
T SuchDaten_Startpunkt
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchDaten_Startpunkt
+I
L SFC_DB_LENGTH
>I // Indaten-DB ist zu kurz
JC Err1 // SFC20-Aufruf mit Fehler
W401: L NoneD [AR2,] // Kennung, Adresse
LAR2
L Laenge // Anzahl der DWs zum Vergleichen im Datensatz
L400: T Schleife
L DBSuchdaten // Solldaten-DB
L 0 // Angegeben ?
==I // Nein
JC W402
OPN DB[DBSuchdaten]
W402: L NoneW [AR2,] // Mit Solldaten überprüfen
OPN DB[DBFifo]
L DBW [AR1Zeiger] // Fifo-Daten lesen
<>I // nicht identisch !
JC W403
L AR1Start // Startwert mit Offset 0
+ DINT#2
T AR1Start // Startwert mit nächstem Offset
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
ADDAR2 P#2.0
L Schleife
LOOP L400
JU Ende // Datensatz ist in Fifo enthalten
W403: L sRE_POS // RET-POS
+ 1
T sRE_POS // RET-POS
L Anzahl // Anzahl der Daten im Fifo
>I // Alle Datensätze sind durchsucht
JC Err2
L Datensatzlaenge // Datenblocklänge
L 2 // DB byteorientiert
*I
L SuchZeiger // Suchzeiger
+I
T SuchZeiger // Suchzeiger
L MaxHolzeiger // Maximum Holzeiger
<=I // Ende erreicht? Nein!
JC W404
L MinHolzeiger // Minimum Holzeiger
T SuchZeiger
W404: L SuchZeiger // Suchzeiger
JU W400
--- NW 5: Fehlerausgabe / RET_VAL ---
Ende: SET // VKE = 1 ohne Fehler !!!
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
T Err
JU Err
Err1: S L32.1 // SFC20-Aufruf mit Fehler
JU Err
Err2: S L32.2 // Fifo ist leer
JU Err
Err6: S L32.6 // Holzeiger außerhalb
JU Err
Err7: S L32.7 // Versatz Bring-/Holzeiger
Err: L 0
T sRE_POS // RET-POS = 0
CLR // VKE = 0 bei Fehler !!!
Ok: L Err
T RE_VAL
L Status
OW
T Status
SAVE // VKE in BIE-Bit speichern
--- NW 6: Fifokopfdaten speichern ---
L AR2_Speicher // AR2 zurückspeichern
LAR2
A L32.0 // Falscher Parameter
A NixSave // Status nicht speichern
BEC
L SSDW
+ 10 // Status
ITD
T AR1Start // Startwert mit Offset 0
SLD 3
T AR1Zeiger // /Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
FUNCTION "FIFOSearch" : Void
TITLE = Fifo-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : FIFO
NAME : FifoIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-960629
//Version: KyungBang00 / 14.04.2009
//
//Datenblock in Fifo suchen
//SSDB: FIFO-DB
//SSDW: FIFO-1.DW
//SEARCHDATEN: Pointer, wo zu suchende Daten stehen (P#DB1.DBX0.0, P#M220.0)
//RE_POS: Position an welcher sich Datensatz befindet
//RE_VAL: Rückmeldungen:
// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung
// Bit1: SFC20-Aufruf mit Fehler
// Bit2: Fifo ist leer
// Bit3: Frei
// Bit4: Frei
// Bit5: Bringzeiger ist ausserhalb
// Bit6: Holzeiger ist ausserhalb
// Bit7: Versatz Bring-/Holzeiger
//
VAR_INPUT
SSDB : Int; // Schnittstellen-DB
SSDW : Int; // Schnittstellen-1.DW
SEARCHDATEN : Pointer; // SuchDaten-Schnittstelle
Laenge : Int; // Anzahl der DWs zum Vergleichen im Datensatz
END_VAR
VAR_OUTPUT
RE_POS : Int; // Position des Eintrags, der gesuchten Daten
RE_VAL : Byte; // Rückmeldungen
END_VAR
VAR_TEMP
Quelle : Any; // Zeiger, wo Rein-Daten sind
Ziel : Any; // Zeiger, FIFO-Stelle
Kopf : Byte; // Fifo-Kennung (FF)
Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden
Anzahl : Int; // Anzahl der Datensätze (eingetragene)
Status : Word; // Status des Fifo
Err : Byte; // Fehlerbits
MinHolzeiger : Int; // Minimum Holzeiger
MaxHolzeiger : Int; // Maximum Holzeiger
DBFifo : Word; // FIFO-DB
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
Fifo_Ende : Word; // Ende des Fifo
AR2_Speicher : DWord; // Adress-Register 2 zwischenspeichern
DBSuchdaten : Word; // Solldaten-DB, falls angegeben
SuchDaten_Startpunkt : Word; // SuchDaten-Startpunkt: Adresse
SuchZeiger : Word; // Suchzeiger
Schleife : Word; // Loopzähler
NixSave : Bool; // Status nicht speichern
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
AR1Start : DInt; // Startwert mit Offset 0
sRE_POS : Int; // Position des Eintrags, der gesuchten Daten
END_VAR
BEGIN
NETWORK
TITLE = Schnittstellen-DB sinnvoll ?
TAR2;
T #AR2_Speicher;//AR2 zwischenspeichern
L #SSDB;
T #DBFifo;
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL "TEST_DB_TO_ATTR_DB"
( DB_Number := #DBFifo ,
RetVal := #SFC_RET_VAL ,
DB_Length := #SFC_DB_LENGTH ,
Write_Prot := #SFC_WRITE_PROT
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
= #NixSave;//Status nicht speichern
O #SFC_WRITE_PROT;
SPB Err0;//kein Fifobereich
NETWORK
TITLE = Fifokopfdaten holen
//Quelle-Pointer erzeugen:
L 16#1004;//Kennung 10 + Word=04
T #sRE_POS;//Any-Kennung, Datentyp
L 16#0006;//6 Dw´s holen
T %LW2;//Wiederholungen
L #SSDB;
T %LW4;//DB_Nummer
L #SSDW;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD6;//Kennung, Adresse
CALL BLKMOV//1.-6.DW FIFO holen
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #SFC_RET_VAL ,
DSTBLK := P#L20.0 WORD 6
);
L #Status;
L 2#0000_0000_1110_0000;
UW;
T #Err;
SPP Err;//Kapitalfehler vorhanden
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
SPB Err1;
NETWORK
TITLE = Zeigerüberprüfung
L #Kopf;//Fifo-Kopf
L 16#FF;//= Fifokennung ?
<>I;//Nein !
= #NixSave;//Status nicht speichern
SPB Err0;//kein Fifobereich
L 1;
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Fifobereich
L 128;
>I;
SPB Err0;//kein Fifobereich
L 1;
L #FifoLaenge;//Max.Anzahl von Datenblöcken
>I;
SPB Err0;//kein Fifobereich
L #SSDW;
+ 40;//Speichern ab 20.DW
T #MinHolzeiger;//Minimum Holzeiger
L #FifoLaenge;//Länge FIFO (in Word)
+ -1;
L #Datensatzlaenge;//Datenblocklänge
*I;
L 2;//DB byteorientiert
*I;
+ 40;//Speichern ab 20.DW
L #SSDW;
+I;
T #MaxHolzeiger;//Maximum Holzeiger
L #Datensatzlaenge;//Datenblocklänge
L 2;//DB byteorientiert
*I;
L #MaxHolzeiger;//Maximum Holzeiger
+I;//Zeiger Endekennung
T #Fifo_Ende;
ITD;
T #AR1Start;//Startwert mit Offset 0
SLD 3;
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #DBFifo];
L #Fifo_Ende;
L #SFC_DB_LENGTH;
>I;//Fifo-DB ist zu kurz!
SPB Err0;//kein Fifo-Bereich
L DBW[ #AR1Zeiger];
L 16#FFEE;//Fifo-Endekennung ?
<>I;//Nein !
SPB Err0;//kein Fifobereich
L #MinHolzeiger;//Minimum Holzeiger
L #Holzeiger;//Holzeiger
<=I;//Ok ?
SPB W300;//Ja!
L 0;//Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #Bringzeiger;//Bringzeiger Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #Anzahl;//Anzahl Datensätze
L 0;//Grundstellung ?
<>I;//Nein !
SPB Err6;//Holzeiger ist ausserhalb
L #MinHolzeiger;//Minimum Holzeiger
T #Bringzeiger;//Bringzeiger
T #Holzeiger;//Holzeiger
SPA Err2;//Fifo ist leer
W300: L #MaxHolzeiger;//Maximum Holzeiger
<=I;//Ok ?
SPB W301;//Ja!
SPA Err6;//Holzeiger ist ausserhalb
W301: L #Bringzeiger;//Bringzeiger
L #Holzeiger;//Holzeiger
==I;//Identisch !
U(;
L #FifoLaenge;
L #Anzahl;//Anzahl der gespeicherten Datensätze
<>I;//Fifo noch nicht voll !
);
U(;
L 0;
<>I;//Datensätze aber noch vorhanden !
);
SPB Err7;//Versatz Bring-/Holzeiger
L #Bringzeiger;//Bringzeiger
L #Holzeiger;//Holzeiger
<>I;//Ungleich !
U(;
L #FifoLaenge;
L #Anzahl;//Anzahl der gespeicherten Datensätze
==I;//Aber Fifo ist voll !
O(;
L 0;
==I;//Aber keine Datensätze vorhanden !
);
);
SPB Err7;//Versatz Bring-/Holzeiger
L #Anzahl;//Anzahl der gespeicherten Datensätze
L 0;
==I;//Keine Datensätze vorhanden !
SPB Err2;//Fifo ist leer
NETWORK
TITLE = Fifodaten suchen
L 1;
T #sRE_POS;//RET-POS
L #Holzeiger;//Holzeiger
T #SuchZeiger;//Suchzeiger
W400: ITD;
T #AR1Start;//Startwert mit Offset 0
SLD 3;
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
//DATEN-Pointer übernehmen:
L P##SEARCHDATEN;
LAR2;
L W[ AR2, P#0.0];
T #DBSuchdaten;//Solldaten-DB
L #DBSuchdaten;//Solldaten-DB
L 0;//Angegeben ?
==I;//Nein
SPB W401;
// CALL TEST_DB
// DB_NUMBER :=#DBSuchdaten
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL "TEST_DB_TO_ATTR_DB"
( DB_Number := #DBSuchdaten ,
RetVal := #SFC_RET_VAL ,
DB_Length := #SFC_DB_LENGTH ,
Write_Prot := #SFC_WRITE_PROT
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;//Fehler vorhanden ?
<>I;//Ja !
SPB Err1;//SFC20-Aufruf mit Fehler
L D[ AR2, P#2.0];//Kennung, Adresse
L 16#00FF_FFFF;//Ohne Kennung
UW;
SRW 3;//Ohne Bit
T #SuchDaten_Startpunkt;
L #Datensatzlaenge;//Datenblocklänge
L 2;//DB byteorientiert
*I;
L #SuchDaten_Startpunkt;
+I;
L #SFC_DB_LENGTH;
>I;//Indaten-DB ist zu kurz
SPB Err1;//SFC20-Aufruf mit Fehler
W401: L D[ AR2, P#2.0];//Kennung, Adresse
LAR2;
L #Laenge;//Anzahl der DWs zum Vergleichen im Datensatz
L400: T #Schleife;
L #DBSuchdaten;//Solldaten-DB
L 0;//Angegeben ?
==I;//Nein
SPB W402;
AUF DB[ #DBSuchdaten];
W402: L W[ AR2, P#0.0];//Mit Solldaten überprüfen
AUF DB[ #DBFifo];
L DBW[ #AR1Zeiger];//Fifo-Daten lesen
<>I;//nicht identisch !
SPB W403;
L #AR1Start;//Startwert mit Offset 0
+ DINT#2;
T #AR1Start;//Startwert mit nächstem Offset
SLD 3;
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
+AR2 P#2.0;
L #Schleife;
LOOP L400;
SPA Ende;//Datensatz ist in Fifo enthalten
W403: L #sRE_POS;//RET-POS
+ 1;
T #sRE_POS;//RET-POS
L #Anzahl;//Anzahl der Daten im Fifo
>I;//Alle Datensätze sind durchsucht
SPB Err2;
L #Datensatzlaenge;//Datenblocklänge
L 2;//DB byteorientiert
*I;
L #SuchZeiger;//Suchzeiger
+I;
T #SuchZeiger;//Suchzeiger
L #MaxHolzeiger;//Maximum Holzeiger
<=I;//Ende erreicht? Nein!
SPB W404;
L #MinHolzeiger;//Minimum Holzeiger
T #SuchZeiger;
W404: L #SuchZeiger;//Suchzeiger
SPA W400;
NETWORK
TITLE = Fehlerausgabe / RET_VAL
Ende: SET;//VKE = 1 ohne Fehler !!!
SPA Ok;
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
T #Err;
SPA Err;
Err1: S %L32.1;//SFC20-Aufruf mit Fehler
SPA Err;
Err2: S %L32.2;//Fifo ist leer
SPA Err;
Err6: S %L32.6;//Holzeiger außerhalb
SPA Err;
Err7: S %L32.7;//Versatz Bring-/Holzeiger
Err: L 0;
T #sRE_POS;//RET-POS = 0
CLR;//VKE = 0 bei Fehler !!!
Ok: L #Err;
T #RE_VAL;
L #Status;
OW;
T #Status;
SAVE;//VKE in BIE-Bit speichern
NETWORK
TITLE = Fifokopfdaten speichern
L #AR2_Speicher;//AR2 zurückspeichern
LAR2;
U %L32.0;//Falscher Parameter
U #NixSave;//Status nicht speichern
BEB;
L #SSDW;
+ 10;//Status
ITD;
T #AR1Start;//Startwert mit Offset 0
SLD 3;
T #AR1Zeiger;///Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
AUF DB[ #DBFifo];
L #Err;
T DBW[ #AR1Zeiger];
NETWORK
TITLE =
L #sRE_POS;
T #RE_POS;
END_FUNCTION
OPN DB[DBFifo]
L Err
T DBW [AR1Zeiger]
--- NW 7: ---
L sRE_POS
T RE_POS
File diff suppressed because it is too large Load Diff
@@ -1,204 +1,248 @@
=== FC 82: FifoReset [STL] ===
INTERFACE:
Input:
SSDB : Int // Schnittstellen-DB
SSDW : Int // Schnittstellen-1.DW
PARA : Word // Aufrufparameter (Durchlaufspeicher?)
Output:
RE_VAL : Byte // Rückmeldung
InOut:
Temp:
Quelle : Any // Zeiger, wo Rein-Daten sind
Kopf : Byte // Fifo-Kennung (FF)
Datensatzlaenge : Byte // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int // Zeiger, woher nächste Daten geholt werden
Anzahl : Int // Anzahl der Datensätze (eingetragene)
Status : Word // Status des Fifo
DBFifo : Word // FIFO-DB
SFC_RET_VAL : Int // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word // Rückmeldung SFC-Aufruf
Fifo_Ende : Word // Ende des Fifo
Schleife : Word // Loopzähler
SFC_WRITE_PROT : Bool // Rückmeldung SFC-Aufruf
Constant:
Return:
Ret_Val : Void
FUNCTION "FifoReset" : Void
TITLE = Fifo-Modul
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : FIFO
NAME : FifoIn
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-1254
//Version: ILS2100 / 06.11.2009
//
//Fifo resetten
//SSDB: FIFO-DB
//SSDW: FIFO-1.DW
//PARA: Aufrufparameter 00XX:
// XX: 00 = Normaler FIFO (alles löschen)
// D0 = Durchlaufspeicher (alles mit Nullen füllen)
// D1 = Durchlaufspeicher (alles mit FFFF füllen)
// Rückmeldungen:
// Bit0: Kein Fifobereich / falscher Kopfinhalt / Endekennung
// Bit1: SFC20-Aufruf mit Fehler
// Bit2: Frei
// Bit3: Frei
// Bit4: Frei
// Bit5: Frei
// Bit6: Frei
// Bit7: Frei
//
VAR_INPUT
SSDB : Int; // Schnittstellen-DB
SSDW : Int; // Schnittstellen-1.DW
PARA : Word; // Aufrufparameter (Durchlaufspeicher?)
END_VAR
--- NW 1: Schnittstellen-DB sinnvoll ? ---
L SSDB
T DBFifo
VAR_OUTPUT
RE_VAL : Byte; // Rückmeldung
END_VAR
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
CALL FC "TEST_DB_TO_ATTR_DB" (DB_Number:=DBFifo, RetVal:=SFC_RET_VAL, DB_Length:=SFC_DB_LENGTH, Write_Prot:=SFC_WRITE_PROT)
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
O SFC_WRITE_PROT
JC Err0 // kein Fifobereich
VAR_TEMP
Quelle : Any; // Zeiger, wo Rein-Daten sind
Kopf : Byte; // Fifo-Kennung (FF)
Datensatzlaenge : Byte; // Datensatzlänge in Word (1 - 128)
FifoLaenge : Int; // Länge des Fifo (maximale Anzahl der Datensätze)
Bringzeiger : Int; // Zeiger, wohin nächster Eintrag gespeichert wird
Holzeiger : Int; // Zeiger, woher nächste Daten geholt werden
Anzahl : Int; // Anzahl der Datensätze (eingetragene)
Status : Word; // Status des Fifo
DBFifo : Word; // FIFO-DB
SFC_RET_VAL : Int; // Rückmeldung SFC-Aufruf
SFC_DB_LENGTH : Word; // Rückmeldung SFC-Aufruf
Fifo_Ende : Word; // Ende des Fifo
Schleife : Word; // Loopzähler
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
END_VAR
--- NW 2: Quelle-Pointer erzeugen: ---
L 16#1004 // Kennung 10 + Word=04
T LW0 // Any-Kennung, Datentyp
L 16#0006 // 6 Dw´s holen
T LW2 // Wiederholungen
L SSDB
T LW4 // DB_Nummer
L SSDW // Adresse
SLD 3
L 16#8400_0000 // Kennung: Daten
OD
T LD6 // Kennung, Adresse
BEGIN
NETWORK
TITLE = Schnittstellen-DB sinnvoll ?
L #SSDB;
T #DBFifo;
CALL SYS "BLKMOV" (SRCBLK:=Quelle, RET_VAL:=SFC_RET_VAL, DSTBLK:=P#L10.0 WORD 6) // 1.-6.DW FIFO holen
// CALL TEST_DB
// DB_NUMBER :=#DBFifo
// RET_VAL :=#SFC_RET_VAL
// DB_LENGTH :=#SFC_DB_LENGTH
// WRITE_PROT :=#SFC_WRITE_PROT
L SFC_RET_VAL
L 2#0000_0000_0000_0000
<>I
JC Err1
CALL "TEST_DB_TO_ATTR_DB"
( DB_Number := #DBFifo ,
RetVal := #SFC_RET_VAL ,
DB_Length := #SFC_DB_LENGTH ,
Write_Prot := #SFC_WRITE_PROT
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
O #SFC_WRITE_PROT;
SPB Err0;//kein Fifobereich
NETWORK
TITLE = Fifokopfdaten holen
//Quelle-Pointer erzeugen:
L 16#1004;//Kennung 10 + Word=04
T %LW0;//Any-Kennung, Datentyp
L 16#0006;//6 Dw´s holen
T %LW2;//Wiederholungen
L #SSDB;
T %LW4;//DB_Nummer
L #SSDW;//Adresse
SLD 3;
L 16#8400_0000;//Kennung: Daten
OD;
T %LD6;//Kennung, Adresse
CALL BLKMOV//1.-6.DW FIFO holen
{blk_type := 'Variant'}
( SRCBLK := #Quelle ,
RET_VAL := #SFC_RET_VAL ,
DSTBLK := P#L10.0 WORD 6
);
L #SFC_RET_VAL;
L 2#0000_0000_0000_0000;
<>I;
SPB Err1;
NETWORK
TITLE = Zeigerüberprüfung
L #Kopf;//Fifo-Kopf
L 16#FF;//= Fifokennung ?
<>I;//Nein !
SPB Err0;//kein Fifobereich
L 1;
L #Datensatzlaenge;//Datenblocklänge
>I;
SPB Err0;//kein Fifobereich
L 128;
>I;
SPB Err0;//kein Fifobereich
L 1;
L #FifoLaenge;//Max.Anzahl von Datenblöcken
>I;
SPB Err0;//kein Fifobereich
L #FifoLaenge;//Länge FIFO (in Word)
L #Datensatzlaenge;//Datenblocklänge
*I;
L 2;//DB byteorientiert
*I;
+ 40;//Speichern ab 20.DW
L #SSDW;
+I;
T #Fifo_Ende;
SLW 3;//Pointer erzeugen
LAR1;
AUF DB[ #DBFifo];
L #Fifo_Ende;
L #SFC_DB_LENGTH;
>I;//Fifo-DB ist zu kurz!
SPB Err0;//kein Fifo-Bereich
L DBW[ AR1, P#0.0];
L 16#FFEE;//Fifo-Endekennung ?
<>I;//Nein !
SPB Err0;//kein Fifobereich
NETWORK
TITLE = Fifo-Daten löschen
L #SSDW;
+ 4;//Ab 2.Dw
SLW 3;//Pointer erzeugen
LAR1;
AUF DB[ #DBFifo];
L #Datensatzlaenge;
L #FifoLaenge;
*I;
+ 18;//18 Datenwörter (wortorientiert)
L400: T #Schleife;
L 0;
T DBW[ AR1, P#0.0];
+AR1 P#2.0;
L #Schleife;
LOOP L400;
--- NW 3: Zeigerüberprüfung ---
L Kopf // Fifo-Kopf
L 16#FF // = Fifokennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
NETWORK
TITLE = Durchlaufspeicher ?
L #PARA;//Aufrufparameter
SRW 4;
L 16#000D;//Durchlaufspeicher ?
<>I;//Nein !
SPB N006;
L 1
L Datensatzlaenge // Datenblocklänge
>I
JC Err0 // kein Fifobereich
L #SSDW;
+ 4;//Speichern ab 4.DW
SLW 3;//Pointer erzeugen
LAR1;
L 128
>I
JC Err0 // kein Fifobereich
AUF DB[ #DBFifo];
L 1
L FifoLaenge // Max.Anzahl von Datenblöcken
>I
JC Err0 // kein Fifobereich
L #SSDW;
+ 40;//1.Speicherzelle
T DBW[ AR1, P#0.0];//Bringzeiger
T DBW[ AR1, P#2.0];//Holzeiger
L FifoLaenge // Länge FIFO (in Word)
L Datensatzlaenge // Datenblocklänge
*I
L 2 // DB byteorientiert
*I
+ 40 // Speichern ab 20.DW
L SSDW
+I
T Fifo_Ende
SLW 3 // Pointer erzeugen
LAR1
L #FifoLaenge;//Fifo ist voll
T DBW[ AR1, P#4.0];//Anzahl
OPN DB[DBFifo]
L #PARA;//Aufrufparameter
L 16#00D1;//Durchlaufspeicher mit FFFF füllen
<>I;//Nein !
SPB N006;
L Fifo_Ende
L SFC_DB_LENGTH
>I // Fifo-DB ist zu kurz!
JC Err0 // kein Fifo-Bereich
L #FifoLaenge;//Fifo ist voll
T DBW[ AR1, P#8.0];//1.Zusatz-Dw (Anzahl der Daten)
L DBW [AR1,]
L 16#FFEE // Fifo-Endekennung ?
<>I // Nein !
JC Err0 // kein Fifobereich
L 2#0000_0000_0000_0011;//Daten vorhanden/kommen raus
T DBW[ AR1, P#14.0];//4.Zusatz-Dw (Status)
L #SSDW;
+ 40;//Ab 20.Dw
SLW 3;//Pointer erzeugen
LAR1;
--- NW 4: Fifo-Daten löschen ---
L SSDW
+ 4 // Ab 2.Dw
SLW 3 // Pointer erzeugen
LAR1
AUF DB[ #DBFifo];
OPN DB[DBFifo]
L #Datensatzlaenge;
L #FifoLaenge;
*I;
L500: T #Schleife;
L Datensatzlaenge
L FifoLaenge
*I
+ 18 // 18 Datenwörter (wortorientiert)
L400: T Schleife
L 16#FFFF;
T DBW[ AR1, P#0.0];
L 0
T DBW [AR1,]
+AR1 P#2.0;
ADDAR1 P#2.0
L #Schleife;
LOOP L500;
L Schleife
LOOP L400
NETWORK
TITLE = Fehlerausgabe / RET_VAL
N006: SET;//VKE = 1 ohne Fehler !!!
L 2#0000_0000_0000_0000;
SPA Ok;
Err0: L 2#0000_0000_0000_0001;//Kein Fifobereich
SPA Err;
Err1: L 2#0000_0000_0000_0010;//SFC20-Aufruf mit Fehler
Err: CLR;//VKE = 0 bei Fehler !!!
Ok: T #RE_VAL;
SAVE;//VKE in BIE-Bit speichern
--- NW 5: Durchlaufspeicher ? ---
L PARA // Aufrufparameter
SRW 4
L 16#000D // Durchlaufspeicher ?
<>I // Nein !
JC N006
L SSDW
+ 4 // Speichern ab 4.DW
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L SSDW
+ 40 // 1.Speicherzelle
T DBW [AR1,] // Bringzeiger
T DBW [AR1,] // Holzeiger
L FifoLaenge // Fifo ist voll
T DBW [AR1,] // Anzahl
L PARA // Aufrufparameter
L 16#00D1 // Durchlaufspeicher mit FFFF füllen
<>I // Nein !
JC N006
L FifoLaenge // Fifo ist voll
T DBW [AR1,] // 1.Zusatz-Dw (Anzahl der Daten)
L 2#0000_0000_0000_0011 // Daten vorhanden/kommen raus
T DBW [AR1,] // 4.Zusatz-Dw (Status)
L SSDW
+ 40 // Ab 20.Dw
SLW 3 // Pointer erzeugen
LAR1
OPN DB[DBFifo]
L Datensatzlaenge
L FifoLaenge
*I
L500: T Schleife
L 16#FFFF
T DBW [AR1,]
ADDAR1 P#2.0
L Schleife
LOOP L500
--- NW 6: Fehlerausgabe / RET_VAL ---
N006: SET // VKE = 1 ohne Fehler !!!
L 2#0000_0000_0000_0000
JU Ok
Err0: L 2#0000_0000_0000_0001 // Kein Fifobereich
JU Err
Err1: L 2#0000_0000_0000_0010 // SFC20-Aufruf mit Fehler
Err: CLR // VKE = 0 bei Fehler !!!
Ok: T RE_VAL
SAVE // VKE in BIE-Bit speichern
END_FUNCTION
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,135 +1,146 @@
=== FB 181: MAusfahrPrio_ABP [STL] ===
INTERFACE:
Input:
BG_Haupt_Schleuse : Bool // Trolley ist in Schleuse auf Hauptstrecke
Haupt_Schleuse_geöffnet : Bool // Schleuse hat geöffnet
BG_ABP_Schleuse : Bool // Trolley ist in Schleuse von ABP-Einfahrt
ABP_Schleuse_geöffnet : Bool // Schleuse hat geöffnet
Aktive_ABP : Int
Output:
InOut:
Static:
OUT.Haupt_Schleuse_starten : Bool
Out.ABP_Schleuse_starten : Bool
Dyn : Struct
Anzahl_Haupt : Int
Wartezeit : Int
Temp:
Check_ok : Bool
Partner : Int
Constant:
FUNCTION_BLOCK "MAusfahrPrio_ABP"
TITLE = Prio beim Ausfahren aus ABP
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
BG_Haupt_Schleuse : Bool; // Trolley ist in Schleuse auf Hauptstrecke
Haupt_Schleuse_geöffnet : Bool; // Schleuse hat geöffnet
BG_ABP_Schleuse : Bool; // Trolley ist in Schleuse von ABP-Einfahrt
ABP_Schleuse_geöffnet : Bool; // Schleuse hat geöffnet
Aktive_ABP : Int;
END_VAR
--- NW 1: Haupt-Schleuse ist gestartet ---
A "Haupt_Schleuse_geöffnet"
A "OUT.Haupt_Schleuse_starten"
R "OUT.Haupt_Schleuse_starten"
JCN En01 // Negierter Sprung
VAR
"OUT.Haupt_Schleuse_starten" : Bool;
"Out.ABP_Schleuse_starten" : Bool;
Dyn : Struct
Anzahl_Haupt : Int;
Wartezeit : Int;
END_STRUCT;
END_VAR
L Dyn.Anzahl_Haupt
+ 1
T Dyn.Anzahl_Haupt
L 8
<=I
JC En01
T Dyn.Anzahl_Haupt // Maximum übergeben
En01: NOP 0
VAR_TEMP
Check_ok : Bool;
Partner : Int;
END_VAR
--- NW 2: ABP-Schleuse ist gestartet ---
A "ABP_Schleuse_geöffnet"
A "Out.ABP_Schleuse_starten"
R "Out.ABP_Schleuse_starten"
JCN En02 // Negierter Sprung
BEGIN
NETWORK
TITLE = Haupt-Schleuse ist gestartet
U #Haupt_Schleuse_geöffnet;
U #"OUT.Haupt_Schleuse_starten";
R #"OUT.Haupt_Schleuse_starten";
SPBN En01;//Negierter Sprung
L 0
T Dyn.Anzahl_Haupt
L #Dyn.Anzahl_Haupt;
+ 1;
T #Dyn.Anzahl_Haupt;
En02: NOP 0
L 8;
<=I;
SPB En01;
T #Dyn.Anzahl_Haupt ;//Maximum übergeben
--- NW 3: Wartezeit, wenn beide Schleusen geschlossen ---
AN "Haupt_Schleuse_geöffnet"
AN "ABP_Schleuse_geöffnet"
JC Geschlossen
En01: NOP 0;
L 0
T Dyn.Wartezeit
NETWORK
TITLE = ABP-Schleuse ist gestartet
U #ABP_Schleuse_geöffnet;
U #"Out.ABP_Schleuse_starten";
R #"Out.ABP_Schleuse_starten";
SPBN En02 ;//Negierter Sprung
SET
R Check_ok
L 0;
T #Dyn.Anzahl_Haupt;
JU En03
En02: NOP 0;
Geschlossen: AN "1s-Impuls"
JC En03
NETWORK
TITLE = Wartezeit, wenn beide Schleusen geschlossen
UN #Haupt_Schleuse_geöffnet;
UN #ABP_Schleuse_geöffnet;
SPB Geschlossen;
L Dyn.Wartezeit
+ 1
T Dyn.Wartezeit
L 0;
T #Dyn.Wartezeit;
L 5
>=I
S Check_ok
JCN En03 // Negierter Sprung
SET;
R #Check_ok;
T Dyn.Wartezeit // Zeit einfrieren
SPA En03;
En03: NOP 0
Geschlossen: UN "1s-Impuls";
SPB En03;
L #Dyn.Wartezeit;
+ 1;
T #Dyn.Wartezeit;
--- NW 4: Check, wer dran ist ---
// Trolley nicht mehr in Schleuse:
AN BG_Haupt_Schleuse
R "OUT.Haupt_Schleuse_starten"
L 5;
>=I;
S #Check_ok;
SPBN En03;//Negierter Sprung
AN BG_ABP_Schleuse
R "Out.ABP_Schleuse_starten"
T #Dyn.Wartezeit;//Zeit einfrieren
// Schon entschieden:
A "OUT.Haupt_Schleuse_starten"
A BG_Haupt_Schleuse
O
A "Out.ABP_Schleuse_starten"
A BG_ABP_Schleuse
O "Haupt_Schleuse_geöffnet"
O "ABP_Schleuse_geöffnet"
BEC
En03: NOP 0;
// Relevante Partner:
L Aktive_ABP
+ -1 // sich selbst abziehen
T Partner
NETWORK
TITLE = Check, wer dran ist
L 0
<=I // Kein weiterer Partner mehr!
A BG_ABP_Schleuse
S "Out.ABP_Schleuse_starten"
BEC
//Trolley nicht mehr in Schleuse:
UN #BG_Haupt_Schleuse;
R #"OUT.Haupt_Schleuse_starten";
// Check, wer dran ist:
L Dyn.Anzahl_Haupt // Gefahrene Trolleys
L Partner // Andere Partner, die fahren sollten
<I // noch nicht erreicht
A BG_Haupt_Schleuse
S "OUT.Haupt_Schleuse_starten"
BEC
UN #BG_ABP_Schleuse;
R #"Out.ABP_Schleuse_starten";
// Wartezeit vorbei?:
AN Check_ok
BEC
//Schon entschieden:
U #"OUT.Haupt_Schleuse_starten";
U #BG_Haupt_Schleuse;
O;
U #"Out.ABP_Schleuse_starten";
U #BG_ABP_Schleuse;
O #Haupt_Schleuse_geöffnet;
O #ABP_Schleuse_geöffnet;
BEB;
A BG_ABP_Schleuse
S "Out.ABP_Schleuse_starten"
BEC
//Relevante Partner:
L #Aktive_ABP;
+ -1 ;//sich selbst abziehen
T #Partner;
A BG_Haupt_Schleuse
S "OUT.Haupt_Schleuse_starten"
L 0;
<=I ;//Kein weiterer Partner mehr!
U #BG_ABP_Schleuse;
S #"Out.ABP_Schleuse_starten";
BEB;
BEU
//Check, wer dran ist:
L #Dyn.Anzahl_Haupt;//Gefahrene Trolleys
L #Partner;//Andere Partner, die fahren sollten
<I;//noch nicht erreicht
U #BG_Haupt_Schleuse;
S #"OUT.Haupt_Schleuse_starten";
BEB;
--- NW 5: Ende ---
BE
//Wartezeit vorbei?:
UN #Check_ok;
BEB;
U #BG_ABP_Schleuse;
S #"Out.ABP_Schleuse_starten";
BEB;
U #BG_Haupt_Schleuse;
S #"OUT.Haupt_Schleuse_starten";
BEA;
NETWORK
TITLE = Ende
BE;
END_FUNCTION_BLOCK
@@ -1,153 +1,163 @@
=== FB 94: MBlinken [STL] ===
INTERFACE:
Input:
Impulsdauer : Bool // Impulsdauer
Error_1 : Bool
Error_2 : Bool
Error_3 : Bool
Error_4 : Bool
Error_5 : Bool
Error_6 : Bool
Error_7 : Bool
Error_8 : Bool
Error_9 : Bool
Error_10 : Bool
Output:
hAnzeige : Bool // Anzeige
InOut:
Static:
Flanke_Ausschalttakt : Bool
Kein_Blinken : Bool
Ausschalttakte : Int // Betriebsbereit ist ausgeschaltet
Temp:
Constant:
FUNCTION_BLOCK "MBlinken"
TITLE = Anzeige blinken lassen
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
Impulsdauer : Bool; // Impulsdauer
Error_1 : Bool;
Error_2 : Bool;
Error_3 : Bool;
Error_4 : Bool;
Error_5 : Bool;
Error_6 : Bool;
Error_7 : Bool;
Error_8 : Bool;
Error_9 : Bool;
Error_10 : Bool;
END_VAR
--- NW 1: Anzeige bei Error 1-10 1-10 mal blinken lassen ---
// Anzeige ausschalten:
AN Error_1
AN Error_2
AN Error_3
AN Error_4
AN Error_5
AN Error_6
AN Error_7
AN Error_8
AN Error_9
AN Error_10
R hAnzeige
R Flanke_Ausschalttakt
R Kein_Blinken
JC NoAn
VAR_OUTPUT
hAnzeige : Bool; // Anzeige
END_VAR
// Anzeige aktivieren
A Impulsdauer
AN Kein_Blinken
= hAnzeige
A Impulsdauer
Fall Flanke_Ausschalttakt
JCN mHu
L Ausschalttakte
+ 1
T Ausschalttakte
VAR
Flanke_Ausschalttakt : Bool;
Kein_Blinken : Bool;
Ausschalttakte : Int; // Betriebsbereit ist ausgeschaltet
END_VAR
mHu: L Ausschalttakte
L 2
>=I
A Kein_Blinken
R Kein_Blinken
JC NoAn
BEGIN
NETWORK
TITLE = Anzeige bei Error 1-10 1-10 mal blinken lassen
A Kein_Blinken
JC En01
//Anzeige ausschalten:
UN #Error_1;
UN #Error_2;
UN #Error_3;
UN #Error_4;
UN #Error_5;
UN #Error_6;
UN #Error_7;
UN #Error_8;
UN #Error_9;
UN #Error_10;
R #hAnzeige;
R #Flanke_Ausschalttakt;
R #Kein_Blinken;
SPB NoAn;
CAC
L 1
>=I
A Error_1
S Kein_Blinken
JC NoAn
//Anzeige aktivieren
U #Impulsdauer;
UN #Kein_Blinken;
= #hAnzeige;
CAC
L 2
>=I
A Error_2
S Kein_Blinken
JC NoAn
U #Impulsdauer;
FN #Flanke_Ausschalttakt;
SPBN mHu;
CAC
L 3
>=I
A Error_3
S Kein_Blinken
JC NoAn
CAC
L 4
>=I
A Error_4
S Kein_Blinken
JC NoAn
CAC
L 5
>=I
A Error_5
S Kein_Blinken
JC NoAn
CAC
L 6
>=I
A Error_6
S Kein_Blinken
JC NoAn
CAC
L 7
>=I
A Error_7
S Kein_Blinken
JC NoAn
CAC
L 8
>=I
A Error_8
S Kein_Blinken
JC NoAn
CAC
L 9
>=I
A Error_9
S Kein_Blinken
JC NoAn
CAC
L 10
>=I
A Error_10
S Kein_Blinken
JC NoAn
CAC
L 10
>I
S Kein_Blinken
JC NoAn
JU En01
NoAn: L 0
T Ausschalttakte
En01: NOP 0
L #Ausschalttakte;
+ 1;
T #Ausschalttakte;
--- NW 2: Ende ---
BE
mHu: L #Ausschalttakte;
L 2;
>=I;
U #Kein_Blinken;
R #Kein_Blinken;
SPB NoAn;
U #Kein_Blinken;
SPB En01;
TAK;
L 1;
>=I;
U #Error_1;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 2;
>=I;
U #Error_2;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 3;
>=I;
U #Error_3;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 4;
>=I;
U #Error_4;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 5;
>=I;
U #Error_5;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 6;
>=I;
U #Error_6;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 7;
>=I;
U #Error_7;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 8;
>=I;
U #Error_8;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 9;
>=I;
U #Error_9;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 10;
>=I;
U #Error_10;
S #Kein_Blinken;
SPB NoAn;
TAK;
L 10;
>I;
S #Kein_Blinken;
SPB NoAn;
SPA En01;
NoAn: L 0;
T #Ausschalttakte;
En01: NOP 0;
NETWORK
TITLE = Ende
BE;
END_FUNCTION_BLOCK
File diff suppressed because it is too large Load Diff
@@ -1,100 +1,137 @@
=== FB 183: MHMÜbergang_ohne_Schleuse_AMR [STL] ===
INTERFACE:
Input:
ErrQuit : Bool
B_Anfang : Bool
B_Am_Übergang : Bool
B_Stau_Antrieb_plus : Bool
Antrieb_aktiv : Bool
Antrieb_plus_aktiv : Bool
Output:
InOut:
Antrieb_vor : Bool
Antrieb_start : Bool
Antrieb_stop : Bool
Antrieb_plus_vor : Bool
Antrieb_plus_start : Bool
Static:
Am_Übergang : "MSensoren"
Stau_Antrieb_plus : "MSensoren"
Stau_B_Anfang : "MSensoren"
Temp:
Antrieb : Bool
Antrieb_gestoppt : Bool
Constant:
FUNCTION_BLOCK "MHMÜbergang_ohne_Schleuse_AMR"
TITLE = Übergang ohne Schleuse zu anderem Antrieb
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
//COPYRIGHT by Ingenieurbüro A.Emmert
//Ortsstr.33, D-869925 Fuchstal (Germany)
//Tel.: 0049(0)8243-960629
//
//Version: HM-Omniflow 2100 / 11.2025
//
VAR_INPUT
ErrQuit : Bool;
B_Anfang : Bool;
B_Am_Übergang : Bool;
B_Stau_Antrieb_plus : Bool;
Antrieb_aktiv : Bool;
Antrieb_plus_aktiv : Bool;
END_VAR
--- NW 1: Antrieb ansteuern ---
SET
R Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
VAR_IN_OUT
Antrieb_vor : Bool;
Antrieb_start : Bool;
Antrieb_stop : Bool;
Antrieb_plus_vor : Bool;
Antrieb_plus_start : Bool;
END_VAR
// Antrieb starten:
A B_Anfang
O ErrQuit
S Antrieb_start
VAR
Am_Übergang { S7_SetPoint := 'False'} : "MSensoren";
Stau_Antrieb_plus : "MSensoren";
Stau_B_Anfang : "MSensoren";
END_VAR
A B_Anfang
AN Stau_B_Anfang.Stat.B_Akt
O ErrQuit
S Antrieb_vor
// Trolley am Übergang:
AN "Am_Übergang".Stat.B_Akt
JC Nix
// Antrieb stoppen:
A Stau_Antrieb_plus.Stat.B_Akt
S Antrieb_stop // Trolley stoppen
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
JC Nix
AN Stau_Antrieb_plus.Stat.B_Akt
S Antrieb_plus_vor // Antrieb plus einschalten
SET
S Antrieb_plus_start // Antrieb plus zeitlang starten
AN Antrieb_plus_aktiv
S Antrieb_stop // Trolley stoppen
S Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
JC Nix
// Antrieb einschalten:
SET
S Antrieb_vor // Trolley weiterfahren
Nix: NOP 0
VAR_TEMP
Antrieb : Bool;
Antrieb_gestoppt : Bool;
END_VAR
--- NW 2: Antrieb plus zusätzlich ansteuern ---
// Antrieb plus starten:
A B_Stau_Antrieb_plus // Sensor
O ErrQuit
S Antrieb_plus_start // Antrieb plus zeitlang starten
BEGIN
NETWORK
TITLE = Antrieb ansteuern
SET;
R #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird!
// Antrieb plus einschalten:
A B_Stau_Antrieb_plus
AN Stau_Antrieb_plus.Stat.B_Akt
CLR // Nicht mehr!
S Antrieb_plus_vor // Antrieb plus einschalten
//Antrieb starten:
U #B_Anfang;
O #ErrQuit;
S #Antrieb_start;
U #B_Anfang;
UN #Stau_B_Anfang.Stat.B_Akt;
O #ErrQuit;
S #Antrieb_vor;
--- NW 3: Stau B_Anfang ---
CALL FB "None" , (ESensor:=B_Anfang, T_Ein:=1, T_Aus:=100, tein_aktiv:=Antrieb_aktiv, taus_aktiv:=1)
//Trolley am Übergang:
UN #Am_Übergang.Stat.B_Akt;
SPB Nix;
//Antrieb stoppen:
U #Stau_Antrieb_plus.Stat.B_Akt;
S #Antrieb_stop;//Trolley stoppen
S #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird!
SPB Nix;
--- NW 4: Trolley ist am Übergang ---
A Antrieb_aktiv
A Antrieb_plus_aktiv
AN Antrieb_gestoppt // Falls bei Aufruf nicht gestoppt wird!
= Antrieb
UN #Stau_Antrieb_plus.Stat.B_Akt;
S #Antrieb_plus_vor ;//Antrieb plus einschalten
CALL FB "None" , (ESensor:="B_Am_Übergang", T_Ein:=1, T_Aus:=100, tein_aktiv:=1, taus_aktiv:=Antrieb)
SET;
S #Antrieb_plus_start;//Antrieb plus zeitlang starten
UN #Antrieb_plus_aktiv;
S #Antrieb_stop;//Trolley stoppen
S #Antrieb_gestoppt;//Falls bei Aufruf nicht gestoppt wird!
SPB Nix;
--- NW 5: Stau im Förderer plus ---
CALL FB "None" , (ESensor:=B_Stau_Antrieb_plus, T_Ein:=100, T_Aus:=50, tein_aktiv:=1, taus_aktiv:=1)
//Antrieb einschalten:
SET;
S #Antrieb_vor;//Trolley weiterfahren
Nix: NOP 0;
--- NW 6: Ende ---
BE
NETWORK
TITLE = Antrieb plus zusätzlich ansteuern
//Antrieb plus starten:
U #B_Stau_Antrieb_plus;//Sensor
O #ErrQuit;
S #Antrieb_plus_start;//Antrieb plus zeitlang starten
//Antrieb plus einschalten:
U #B_Stau_Antrieb_plus;
UN #Stau_Antrieb_plus.Stat.B_Akt;
CLR;//Nicht mehr!
S #Antrieb_plus_vor ;//Antrieb plus einschalten
NETWORK
TITLE = Stau B_Anfang
CALL #Stau_B_Anfang
( ESensor := #B_Anfang ,
T_Ein := 1 ,
T_Aus := 100 ,
tein_aktiv := #Antrieb_aktiv ,
taus_aktiv := 1
);
NETWORK
TITLE = Trolley ist am Übergang
U #Antrieb_aktiv;
U #Antrieb_plus_aktiv;
UN #Antrieb_gestoppt ;//Falls bei Aufruf nicht gestoppt wird!
= #Antrieb;
CALL #Am_Übergang
( ESensor := #B_Am_Übergang ,
T_Ein := 1 ,
T_Aus := 100 ,
tein_aktiv := 1 ,
taus_aktiv := #Antrieb
);
NETWORK
TITLE = Stau im Förderer plus
CALL #Stau_Antrieb_plus
( ESensor := #B_Stau_Antrieb_plus ,
T_Ein := 100 ,
T_Aus := 50 ,
tein_aktiv := 1 ,
taus_aktiv := 1
);
NETWORK
TITLE = Ende
BE;
END_FUNCTION_BLOCK
@@ -1,122 +1,147 @@
=== FB 100: MImpulsGeber [STL] ===
INTERFACE:
Input:
Ink_DB : Int // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler
B_Zaehlen : Bool // Sensor zum Zählen
Antrieb_aktiv : Bool // Antrieb ist aktiv
Quit : Bool
Zeit_Signal_zu_lang : Time := T#350ms
Zeit_Kein_Signal : Time := T#500ms
Output:
Signal : Bool // Falls kein InkDB
InOut:
Err_Kein_Signal : Bool // Kein_Signal bei laufenden Antrieb
Err_Signal_zu_lang : Bool // Signal bei laufenden Antrieb zu lang
Static:
Sensor_entprellen : Bool
Timer_1 : TON_TIME
Timer_2 : TON_TIME
Timer_3 : TON_TIME
Temp:
Constant:
FUNCTION_BLOCK "MImpulsGeber"
TITLE = Modul Zähler über Zahnrad-Sensor Wert in Zähler-DB eintragen
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Ink_DB { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; // DB-Nr des Inkremental-Gebers (Zählerbaugruppe) Neu-Sync-Zähler
B_Zaehlen : Bool; // Sensor zum Zählen
Antrieb_aktiv : Bool; // Antrieb ist aktiv
Quit : Bool;
Zeit_Signal_zu_lang : Time := T#350ms;
Zeit_Kein_Signal : Time := T#500ms;
END_VAR
--- NW 1: Initialisierung ---
SET
R Signal
VAR_OUTPUT
Signal : Bool; // Falls kein InkDB
END_VAR
VAR_IN_OUT
Err_Kein_Signal : Bool; // Kein_Signal bei laufenden Antrieb
Err_Signal_zu_lang : Bool; // Signal bei laufenden Antrieb zu lang
END_VAR
VAR
Sensor_entprellen : Bool;
Timer_1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
Timer_2 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
Timer_3 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
END_VAR
--- NW 2: Störungen ---
// Störung quittieren:
A Quit
R Err_Signal_zu_lang
R Err_Kein_Signal
BEGIN
NETWORK
TITLE = Initialisierung
SET;
R #Signal;
// Signal zu lang:
A B_Zaehlen // Sensor zum Zählen
A Antrieb_aktiv // Antrieb ist aktiv
AN Quit
= "M200.0"
NETWORK
TITLE = Störungen
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Signal_zu_lang, Q:=?, ET:=?)
//Störung quittieren:
U #Quit;
R #Err_Signal_zu_lang;
R #Err_Kein_Signal;
A Timer_2.Q
S Err_Signal_zu_lang
//Signal zu lang:
U #B_Zaehlen ;//Sensor zum Zählen
U #Antrieb_aktiv ;//Antrieb ist aktiv
UN #Quit;
= "M200.0";
// Kein Signal:
AN B_Zaehlen // Sensor zum Zählen
A Antrieb_aktiv // Antrieb ist aktiv
AN Quit
= "M200.0"
CALL #Timer_2
{time_type := 'Time'}
( IN := "M200.0" ,
PT := #Zeit_Signal_zu_lang
);
CALL SYS "TON" (IN:="M200.0", PT:=Zeit_Kein_Signal, Q:=?, ET:=?)
U #Timer_2.Q;
S #Err_Signal_zu_lang;
A Timer_3.Q
S Err_Kein_Signal
//Kein Signal:
UN #B_Zaehlen ;//Sensor zum Zählen
U #Antrieb_aktiv ;//Antrieb ist aktiv
UN #Quit;
= "M200.0";
CALL #Timer_3
{time_type := 'Time'}
( IN := "M200.0" ,
PT := #Zeit_Kein_Signal
);
--- NW 3: Zählen über Sensor ---
AN B_Zaehlen // Sensor zum Zählen
A Sensor_entprellen // Sperre Auswertung schon erfolgt
A Antrieb_aktiv // Antrieb ist aktiv
= "M200.0"
U #Timer_3.Q;
S #Err_Kein_Signal;
CALL SYS "TON" (IN:="M200.0", PT:=t#50ms, Q:=?, ET:=?)
NETWORK
TITLE = Zählen über Sensor
UN #B_Zaehlen ;//Sensor zum Zählen
U #Sensor_entprellen ;//Sperre Auswertung schon erfolgt
U #Antrieb_aktiv ;//Antrieb ist aktiv
= "M200.0";
A Timer_1.Q
R Sensor_entprellen // Sperre Auswertung schon erfolgt
CALL #Timer_1
{time_type := 'Time'}
( IN := "M200.0" ,
PT := t#50ms
);
AN B_Zaehlen // Sensor zum Zählen
O Sensor_entprellen
BEC
U #Timer_1.Q;
R #Sensor_entprellen ;//Sperre Auswertung schon erfolgt
SET
S Sensor_entprellen // Sperre Auswertung schon erfolgt
S Signal // Für Signal-Auswertung ohne InkDB
UN #B_Zaehlen ;//Sensor zum Zählen
O #Sensor_entprellen;
BEB;
SET;
S #Sensor_entprellen ;//Sperre Auswertung schon erfolgt
S #Signal ;//Für Signal-Auswertung ohne InkDB
--- NW 4: Übergabe an Inkrement-Baustein / max.Wert erreicht? ---
L Ink_DB
T "MW200"
NETWORK
TITLE = Übergabe an Inkrement-Baustein / max.Wert erreicht?
L #Ink_DB;
T "MW200";
L 0 // Sinnvolle Angabe?
<=I // Nein!
BEC // Also nur Signal-Auswertung !
L 0;//Sinnvolle Angabe?
<=I;//Nein!
BEB;//Also nur Signal-Auswertung !
OPN DB["MW200"] // Zähler-DB öffnen
AUF DB[ "MW200"] ;//Zähler-DB öffnen
L DBD80
+ DINT#1 // Aktueller Zählerwert +1
T DBD80
L %DBD80;
+ DINT#1 ;//Aktueller Zählerwert +1
T %DBD80;
L DBD80 // Aktueller Zählerwert
L DBD76 // Max. Wert erreicht ?
<=D // Nein !
R DBX74.5 // Ohne Flag-Lauf wurde beendet
R DBX74.4 // Flag-Lauf wurde beendet
BEC
L %DBD80 ;//Aktueller Zählerwert
L %DBD76 ;//Max. Wert erreicht ?
<=D ;//Nein !
R %DBX74.5 ;//Ohne Flag-Lauf wurde beendet
R %DBX74.4 ;//Flag-Lauf wurde beendet
BEB;
-D // Restwert als Startwert nehmen !
T DBD80 // Keine Inkrementalgeber verbaut, sondern nur Sensor
-D ;//Restwert als Startwert nehmen !
T %DBD80 ;//Keine Inkrementalgeber verbaut, sondern nur Sensor
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= DBX74.5 // Ohne Flag-Lauf wurde beendet
A 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.5 ;//Ohne Flag-Lauf wurde beendet
U %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.4 ;//Flag-Lauf wurde beendet
AN DBX74.3 // Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= DBX74.3
UN %DBX74.3 ;//Umschaltung Zähl-Lauf ohne-mit-ohne Flag
= %DBX74.3;
// Zähler auf 000 setzen ?:
AN DBX74.6 // Zähler Zero-Load
BEC
//Zähler auf 000 setzen ?:
UN %DBX74.6 ;//Zähler Zero-Load
BEB;
SET
R DBX74.6
SET;
R %DBX74.6;
L 0
T DBD80 // Zählerwert zum Setzen
L 0;
T %DBD80 ;//Zählerwert zum Setzen
NETWORK
TITLE = Ende
BE;
--- NW 5: Ende ---
BE
END_FUNCTION_BLOCK
@@ -1,87 +1,94 @@
=== FB 91: MSensoren [STL] ===
INTERFACE:
Input:
ESensor : Bool // Eingang des zu überwachenden Sensors
T_Ein : Int := 1 // Einschaltzeitverzögerung (*100ms)
T_Aus : Int := 5 // Ausschaltzeitverzögerung (*100ms)
tein_aktiv : Bool := TRUE // Einschaltzeit aktivieren
taus_aktiv : Bool := TRUE // Ausschaltzeit aktivieren
Output:
InOut:
Static:
Stat : "USensor_Ein_Aus" // Status des Endschalters
Temp:
Constant:
FUNCTION_BLOCK "MSensoren"
TITLE = Ein-/Ausschaltverzögerung für Entprellung der Sensoren
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : EAN
VERSION : 0.1
VAR_INPUT
ESensor { ExternalWritable := 'False'} : Bool; // Eingang des zu überwachenden Sensors
T_Ein { ExternalWritable := 'False'} : Int := 1; // Einschaltzeitverzögerung (*100ms)
T_Aus { ExternalWritable := 'False'} : Int := 5; // Ausschaltzeitverzögerung (*100ms)
tein_aktiv { ExternalWritable := 'False'} : Bool := TRUE; // Einschaltzeit aktivieren
taus_aktiv { ExternalWritable := 'False'} : Bool := TRUE; // Ausschaltzeit aktivieren
END_VAR
--- NW 1: Zeitwert löschen ---
A ESensor
A Stat.B_Akt
O
AN ESensor
AN Stat.B_Akt
JCN Nw02
VAR
Stat { ExternalWritable := 'False'} : "USensor_Ein_Aus"; // Status des Endschalters
END_VAR
tdel: L 0 // Zeitwert löschen
T Stat.T_Zelle
BEU
--- NW 2: Einschaltzeit abgelaufen ? ---
Nw02: L Stat.T_Ein_Akt // Gewollter Zeitwert
L 9999 // angegeben ?
<>I // Ja !
JC w020
L T_Ein // Sollwert übergeben
T Stat.T_Ein_Akt // Gewollter Zeitwert
w020: A Stat.B_Akt
JC Nw03
L Stat.T_Zelle // Aktueller Zeitwert
L Stat.T_Ein_Akt // Gewollter Zeitwert erreicht ?
>=I
S Stat.B_Akt // Sensor ist nach Einschaltzeit aktiv
JC tdel // Zeit löschen
JU Nw04
--- NW 3: Ausschaltzeit abgelaufen ? ---
Nw03: L Stat.T_Aus_Akt // Gewollter Zeitwert
L 9999 // angegeben ?
<>I // Ja !
JC w030
L T_Aus // Sollwert übergeben
T Stat.T_Aus_Akt // Gewollter Zeitwert
w030: AN Stat.B_Akt
JC Nw04
L Stat.T_Zelle // Aktueller Zeitwert
L Stat.T_Aus_Akt // Gewollter Zeitwert erreicht ?
>=I
R Stat.B_Akt // Sensor ist nach Ausschaltzeit nicht mehr aktiv
JC tdel // Zeit löschen
BEGIN
NETWORK
TITLE = Zeitwert löschen
U #ESensor;
U #Stat.B_Akt;
O;
UN #ESensor;
UN #Stat.B_Akt;
SPBN Nw02;
--- NW 4: Zeit läuft ---
Nw04: AN "100ms-Impuls" // nur als Impuls
O
AN Stat.B_Akt // Einschaltzeit läuft
AN tein_aktiv // aber Zeit einfrieren
O
A Stat.B_Akt // Ausschaltzeit läuft
AN taus_aktiv // aber Zeit einfrieren
BEC
tdel: L 0;//Zeitwert löschen
T #Stat.T_Zelle;
L Stat.T_Zelle
L "MW2"
+I
T Stat.T_Zelle
BEA;
NETWORK
TITLE = Einschaltzeit abgelaufen ?
Nw02: L #Stat.T_Ein_Akt;//Gewollter Zeitwert
L 9999;//angegeben ?
<>I;//Ja !
SPB w020;
L #T_Ein;//Sollwert übergeben
T #Stat.T_Ein_Akt;//Gewollter Zeitwert
--- NW 5: Ende ---
BE
w020: U #Stat.B_Akt;
SPB Nw03;
L #Stat.T_Zelle;//Aktueller Zeitwert
L #Stat.T_Ein_Akt;//Gewollter Zeitwert erreicht ?
>=I;
S #Stat.B_Akt;//Sensor ist nach Einschaltzeit aktiv
SPB tdel;//Zeit löschen
SPA Nw04;
NETWORK
TITLE = Ausschaltzeit abgelaufen ?
Nw03: L #Stat.T_Aus_Akt;//Gewollter Zeitwert
L 9999;//angegeben ?
<>I;//Ja !
SPB w030;
L #T_Aus;//Sollwert übergeben
T #Stat.T_Aus_Akt;//Gewollter Zeitwert
w030: UN #Stat.B_Akt;
SPB Nw04;
L #Stat.T_Zelle;//Aktueller Zeitwert
L #Stat.T_Aus_Akt;//Gewollter Zeitwert erreicht ?
>=I;
R #Stat.B_Akt;//Sensor ist nach Ausschaltzeit nicht mehr aktiv
SPB tdel;//Zeit löschen
NETWORK
TITLE = Zeit läuft
Nw04: UN "100ms-Impuls";//nur als Impuls
O;
UN #Stat.B_Akt;//Einschaltzeit läuft
UN #tein_aktiv;//aber Zeit einfrieren
O;
U #Stat.B_Akt;//Ausschaltzeit läuft
UN #taus_aktiv;//aber Zeit einfrieren
BEB;
L #Stat.T_Zelle;
L "MW2";
+I;
T #Stat.T_Zelle;
NETWORK
TITLE = Ende
BE;
END_FUNCTION_BLOCK
@@ -0,0 +1,149 @@
FUNCTION_BLOCK "MZylinder"
TITLE = Zylinderansteuerung
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : IBAE
FAMILY : Module
NAME : MZylinder
VERSION : 0.1
//SCL-Portierung des AWL-Bausteins FB92 "MZylinder" (verhaltensgleich).
//Schnittstelle und Instanzdaten (UDT "UZylinder") unveraendert.
VAR_INPUT
Automatik : Bool; // Automatikbetrieb ist aktiv
Handbetrieb : Bool; // Handbetrieb ist aktiv
T_Ast : Int := 5; // Zeit bis AST erreicht ist (*100ms)
T_Gst : Int := 5; // Zeit bis GST erreicht ist (*100ms)
END_VAR
VAR_OUTPUT
ZylAst : Bool; // Vorwaerts-Ausgang des Antriebs
ZylGst : Bool; // Rueckwaerts-Ausgang des Antriebs
END_VAR
VAR
Stat : "UZylinder";
END_VAR
VAR_TEMP
tZeitNullen : Bool; // AWL-Sprungziel "tdel": Zeitzelle nullen + Old_Ast nachfuehren
tFehler : Bool; // NW5: undefinierter Zustand / Befehl
tFlanke : Bool; // NW10: Flankenergebnis
END_VAR
BEGIN
REGION NW1: Zeitwert loeschen
// Endstellung erreicht oder Fahrtrichtung hat gewechselt -> Zeit nullen
#tZeitNullen := (#ZylAst AND (#Stat.B_AST OR NOT #Stat.Old_Ast))
OR (NOT #ZylAst AND (#Stat.B_GST OR #Stat.Old_Ast));
END_REGION
IF NOT #tZeitNullen THEN
REGION NW2: AST-Erreichtzeit abgelaufen ?
IF #Stat.T_AST_Akt = 9999 THEN
#Stat.T_AST_Akt := #T_Ast; // Sollwert uebergeben (9999 = kein Zeitwert angegeben)
END_IF;
IF #ZylAst THEN // Zylinder faehrt nach AST ?
#Stat.B_GST := FALSE;
IF #Stat.T_Zelle >= #Stat.T_AST_Akt THEN // Gewollter Zeitwert erreicht ?
#Stat.B_AST := TRUE; // Zylinder hat AST erreicht
#tZeitNullen := TRUE; // AWL: JC tdel
END_IF;
ELSIF NOT #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.B_AST := FALSE;
END_IF;
END_REGION
END_IF;
IF NOT #tZeitNullen THEN
REGION NW3: GST-Erreichtzeit abgelaufen ?
IF #Stat.T_GST_Akt = 9999 THEN
#Stat.T_GST_Akt := #T_Gst; // Sollwert uebergeben (9999 = kein Zeitwert angegeben)
END_IF;
// Zylinder faehrt nach GST ? (2-fache Ansteuerung: ZylGst / 1-fache: ZylAst aus)
IF ((#Stat.Typ5_2 OR #Stat.Typ5_3) AND #ZylGst)
OR (#Stat.Typ3_2 AND NOT #ZylAst) THEN
#Stat.B_AST := FALSE;
IF #Stat.T_Zelle >= #Stat.T_GST_Akt THEN // Gewollter Zeitwert erreicht ?
#Stat.B_GST := TRUE; // Zylinder hat GST erreicht
#tZeitNullen := TRUE; // AWL: JC tdel
END_IF;
ELSIF NOT #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.B_GST := FALSE;
END_IF;
END_REGION
END_IF;
IF NOT #tZeitNullen THEN
REGION NW4: Zeit laeuft
// Nicht zaehlen, wenn 2-fach angesteuerter Zylinder gar nicht angesteuert wird;
// Zaehlung nur mit dem 100ms-Impuls
IF "100ms-Impuls"
AND NOT ((#Stat.Typ5_2 OR #Stat.Typ5_3) AND NOT #ZylGst AND NOT #ZylAst) THEN
#Stat.T_Zelle := #Stat.T_Zelle + WORD_TO_INT("MW2"); // 100ms-Takte
END_IF;
END_REGION
ELSE
// AWL-Sprungziel "tdel" (aus NW1/NW2/NW3)
#Stat.T_Zelle := 0; // Zeitwert loeschen
#Stat.Old_Ast := #ZylAst; // Fuhr letzten Zyklus nach AST
END_IF;
REGION NW5: Undefinierte Zustaende / Befehle
#tFehler := (#Automatik AND #Handbetrieb) // Automatik + Hand aktiv
OR (NOT #Automatik AND NOT #Handbetrieb) // keine Betriebsart
OR (#Stat.Ast AND #Stat.Gst) // AST- + GST-fahren gleichzeitig aktiv
OR (NOT #Stat.Typ3_2 AND NOT #Stat.Typ5_2 AND NOT #Stat.Typ5_3) // undefinierter Ventil-Typ
OR (#Stat.Typ3_2 AND (#Stat.Typ5_2 OR #Stat.Typ5_3)) // mehrere Ventil-Typen
OR (#Stat.Typ5_2 AND #Stat.Typ5_3);
IF #tFehler THEN // Zylinderstellung bleibt eingefroren
IF #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.Ast := FALSE; // Bewegungsbits loeschen
#Stat.Gst := FALSE;
END_IF;
RETURN; // AWL: BEU
END_IF;
END_REGION
REGION NW6: Zylinder auf Arbeitsstellung fahren
#ZylAst := #Stat.Ast;
END_REGION
REGION NW7: Zylinder auf Grundstellung fahren
#ZylGst := (#Stat.Typ5_2 OR #Stat.Typ5_3) AND #Stat.Gst;
END_REGION
REGION NW8: Daten, die zurueckgesetzt werden
IF #Stat.Typ5_3 THEN // Zylinder haelt seine Stellung !
#Stat.Ast := FALSE; // Bewegungsbits loeschen
#Stat.Gst := FALSE;
END_IF;
IF #Stat.Typ3_2 THEN
#Stat.Gst := FALSE; // Es gibt kein GST fahren !
END_IF;
END_REGION
REGION NW9: Ausgaenge an OP uebergeben
#Stat.OP_Out_GST := #ZylGst;
#Stat.OP_Out_AST := #ZylAst;
END_REGION
REGION NW10: Statistik
// Positive Flanke ZylAst (AWL: FP Stat.FP_AST)
#tFlanke := #ZylAst AND NOT #Stat.FP_AST;
#Stat.FP_AST := #ZylAst;
IF #tFlanke THEN
#Stat.Statistik.AST_Schaltungen := #Stat.Statistik.AST_Schaltungen + 1;
END_IF;
// Positive Flanke ZylGst bei Typ5_3 (AWL: FP Stat.FP_AST2)
#tFlanke := #ZylGst AND #Stat.Typ5_3 AND NOT #Stat.FP_AST2;
#Stat.FP_AST2 := #ZylGst AND #Stat.Typ5_3;
IF #tFlanke THEN
#Stat.Statistik.AST2_Schaltungen := #Stat.Statistik.AST2_Schaltungen + 1;
END_IF;
END_REGION
END_FUNCTION_BLOCK
@@ -1,34 +1,39 @@
=== FC 1028: Set_Input [STL] ===
INTERFACE:
Input:
Enable : Bool // Baustein aktivieren
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
InByte : DInt // Eingangsbyte zum Steuern
InBit : Int // Eingangsbit zum Steuern
Output:
InOut:
Temp:
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
FUNCTION "Set_Input" : Void
TITLE = Eingangsbit zwangssteuern
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
Enable : Bool; // Baustein aktivieren
Status : Bool; // Angegebenen Ausgang auf diesen Status steuern
InByte : DInt; // Eingangsbyte zum Steuern
InBit : Int; // Eingangsbit zum Steuern
END_VAR
--- NW 1: Baustein aktiviert ? ---
AN Enable
BEC
VAR_TEMP
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
END_VAR
--- NW 2: Eingang stuern ---
L InByte // Ausgangsbyte zum Steuern
SLD 3
L InBit // Ausgangsbit zum Steuern
OW
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
BEGIN
NETWORK
TITLE = Baustein aktiviert ?
UN #Enable;
BEB;
A Status
= IX [AR1Zeiger] // Eingang steuern
NETWORK
TITLE = Eingang stuern
L #InByte;//Ausgangsbyte zum Steuern
SLD 3;
L #InBit;//Ausgangsbit zum Steuern
OW;
T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
U #Status;
= E[ #AR1Zeiger];//Eingang steuern
--- NW 3: Ende ---
BE
NETWORK
TITLE = Ende
BE;
END_FUNCTION
@@ -1,34 +1,39 @@
=== FC 127: Set_Output [STL] ===
INTERFACE:
Input:
Enable : Bool // Baustein aktivieren
Status : Bool // Angegebenen Ausgang auf diesen Status steuern
OutByte : DInt // Ausgangsbyte zum Steuern
OutBit : Int // Ausgangsbit zum Steuern
Output:
InOut:
Temp:
AR1Zeiger : DWord // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
Constant:
Return:
Ret_Val : Void
FUNCTION "Set_Output" : Void
TITLE = Ausgangsbit zwangsstuern
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
Enable : Bool; // Baustein aktivieren
Status : Bool; // Angegebenen Ausgang auf diesen Status steuern
OutByte : DInt; // Ausgangsbyte zum Steuern
OutBit : Int; // Ausgangsbit zum Steuern
END_VAR
--- NW 1: Baustein aktiviert ? ---
AN Enable
BEC
VAR_TEMP
AR1Zeiger : DWord; // Statt AR1 (ging nur bis DB-Länge <= 8191 Bytes)
END_VAR
--- NW 2: Ausgang steuern ---
L OutByte // Ausgangsbyte zum Steuern
SLD 3
L OutBit // Ausgangsbit zum Steuern
OW
T AR1Zeiger // Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
BEGIN
NETWORK
TITLE = Baustein aktiviert ?
UN #Enable;
BEB;
A Status
= QX [AR1Zeiger] // Ausgang steuern
NETWORK
TITLE = Ausgang steuern
L #OutByte;//Ausgangsbyte zum Steuern
SLD 3;
L #OutBit;//Ausgangsbit zum Steuern
OW;
T #AR1Zeiger;//Statt Dyn.Bereichsstop (ging nur bis DB-Länge <= 8191 Bytes)
U #Status;
= A[ #AR1Zeiger];//Ausgang steuern
--- NW 3: Ende ---
BE
NETWORK
TITLE = Ende
BE;
END_FUNCTION