AWL Bausteine aus TIA-Portal Projekt in Workspace
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user