573 lines
14 KiB
Plaintext
573 lines
14 KiB
Plaintext
FUNCTION "FifoIn" : 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
|
||
//
|
||
//Datenblock in Fifo eintragen
|
||
//SSDB: FIFO-DB
|
||
//SSDW: FIFO-1.DW
|
||
//PARA: Aufrufparameter XXYZ:
|
||
// XX: 00 = Als nächsten Eintrag speichern
|
||
// 01 = Als 1.Eintrag speichern
|
||
// 02 = Nur Zusatzdaten speichern
|
||
// FF = Testsendung (nur RE_VAL!)
|
||
// YZ: 00 = Keine Zusatzdaten zum Speichern
|
||
// Y: 1 - 4 = Beginn, ab welchem Zusatzwort speichern
|
||
// Z: 1 - 4 = Ende, bis zu welchem Zusatzwort speichern
|
||
//INDATEN: Pointer, wo einzutragende 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 voll
|
||
// Bit3: Falscher Parameter bei Aufruf
|
||
// Bit4: Speicherzelle ist belegt
|
||
// Bit5: Bringzeiger ist ausserhalb
|
||
// Bit6: Holzeiger ist ausserhalb
|
||
// Bit7: Versatz Bring-/Holzeiger
|
||
//
|
||
// 1. - 4.Zusatzdaten: Mw240-246
|
||
//
|
||
//Weitere Übergaben an FC+1:
|
||
// MW248: Länge des Fifo
|
||
// MW250: Bring-Zeiger
|
||
// MW252: Hol-Zeiger
|
||
// MW254: Anzahl der Datensätze (eingetragene)
|
||
//
|
||
VAR_INPUT
|
||
SSDB : Int; // Schnittstellen-DB
|
||
SSDW : Int; // Schnittstellen-1.DW
|
||
PARA : Word; // Aufrufparameter (Auftrag / Anzahl Zusatzdaten)
|
||
INDATEN : Pointer; // InDaten-Schnittstelle
|
||
END_VAR
|
||
|
||
VAR_OUTPUT
|
||
RE_VAL : Byte; // Rückmeldung
|
||
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
|
||
Para1 : Byte; // 1.Aufrufparameter
|
||
Para2 : Byte; // 2.Aufrufparameter
|
||
Para21 : Byte; // 2.Aufrufparameter 1.Stelle
|
||
Para22 : Byte; // 2.Aufrufparameter 2.Stelle
|
||
MinBringzeiger : Int; // Minimum Bringzeiger
|
||
MaxBringzeiger : Int; // Maximum Bringzeiger
|
||
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
|
||
Offset : Byte; // Offset 1. zu speicherndes Zusatzwort
|
||
SFC_WRITE_PROT : Bool; // Rückmeldung SFC-Aufruf
|
||
NixSave : Bool; // Status nicht speichern
|
||
BieSpeicher : Bool; // Bie-Bit zwischenspeichern
|
||
END_VAR
|
||
|
||
|
||
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
|
||
);
|
||
|
||
L #SFC_RET_VAL;
|
||
L 2#0000_0000_0000_0000;
|
||
<>I;
|
||
O #SFC_WRITE_PROT;
|
||
= #NixSave;//Status nicht speichern
|
||
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#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 #MinBringzeiger;//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 #MaxBringzeiger;//Maximum Bringzeiger
|
||
|
||
L #Datensatzlaenge;//Datenblocklänge
|
||
L 2;//DB byteorientiert
|
||
*I;
|
||
L #MaxBringzeiger;//Maximum Bringzeiger
|
||
+I;//Zeiger Endekennung
|
||
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
|
||
|
||
L #MinBringzeiger;//Minimum Bringzeiger
|
||
L #Bringzeiger;//Bringzeiger
|
||
<=I;//Ok ?
|
||
SPB W300;//Ja!
|
||
|
||
L 0;//Grundstellung ?
|
||
<>I;//Nein !
|
||
SPB Err5;//Bringzeiger ist ausserhalb
|
||
|
||
L #Holzeiger;//Holzeiger Grundstellung ?
|
||
<>I;//Nein !
|
||
SPB Err5;//Bringzeiger ist ausserhalb
|
||
|
||
L #Anzahl;//Anzahl Datensätze
|
||
L 0;//Grundstellung ?
|
||
<>I;//Nein !
|
||
SPB Err5;//Bringzeiger ist ausserhalb
|
||
|
||
L #MinBringzeiger;//Minimum Bringzeiger
|
||
T #Bringzeiger;//Bringzeiger
|
||
T #Holzeiger;//Holzeiger
|
||
|
||
W300: L #MaxBringzeiger;//Maximum Bringzeiger
|
||
<=I;//Ok ?
|
||
SPB W301;//Ja!
|
||
SPA Err5;//Bringzeiger 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
|
||
|
||
NETWORK
|
||
TITLE = Nur Zusatzdaten / als 1.Datensatz speichern ?
|
||
L #PARA;
|
||
T %LW33;//Aufrufparameter zwischenspeichern
|
||
|
||
L 16#02;//Nur Zusatzdaten speichern ?
|
||
L #Para1;//1.Aufrufparameter
|
||
<>I;//Nein !
|
||
SPB W400;
|
||
|
||
L #Para2;//2.Aufrufparameter
|
||
L 16#00;//=0 ?
|
||
==I;//Ja !
|
||
SPB Err3;//Falscher Aufrufparameter
|
||
|
||
SPA Nw06;//Zusatzdaten speichern
|
||
|
||
W400: L 16#01;//Als 1.Datensatz speichern ?
|
||
<>I;//Nein !
|
||
SPB Nw05;
|
||
|
||
L #MinBringzeiger;//Minimum Bringzeiger
|
||
T #Bringzeiger;//Bringzeiger
|
||
T #Holzeiger;//Holzeiger
|
||
L 0;
|
||
T #Anzahl;//Anzahl Datensätze
|
||
|
||
SPA Nw06;//Zusatz-Daten speichern?
|
||
|
||
NETWORK
|
||
TITLE = Hat Fifo Platz / Datenbereich leer ?
|
||
Nw05: L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||
L #FifoLaenge;//Max. Anzahl von Datenblöcken
|
||
<I;
|
||
SPB W500;
|
||
|
||
==I;//Identisch !
|
||
SPB Err2;//Fifo ist voll
|
||
|
||
SPA Err7;//Versatz Bring-/Holzeiger
|
||
|
||
W500: L #Bringzeiger;//Bringzeiger
|
||
SLW 3;//Pointer erzeugen
|
||
LAR1;
|
||
|
||
AUF DB[ #DBFifo];
|
||
|
||
L #Datensatzlaenge;
|
||
L500: T #Schleife;
|
||
|
||
L DBW[ AR1, P#0.0];
|
||
L 0;
|
||
<>I;
|
||
SPB Err4;//Speicherzelle ist belegt
|
||
|
||
+AR1 P#2.0;
|
||
|
||
L #Schleife;
|
||
LOOP L500;
|
||
|
||
NETWORK
|
||
TITLE = Zusatzdaten schreiben
|
||
Nw06: L 16#00;//=0 ?
|
||
L #Para2;//2.Aufrufparameter
|
||
==I;//Ja !
|
||
SPB Nw07;
|
||
|
||
L 16#00F0;
|
||
UW;
|
||
SRW 4;
|
||
T #Para21;//1.Stelle isolieren
|
||
|
||
L #Para2;//2.Aufrufparameter
|
||
L 16#000F;
|
||
UW;
|
||
T #Para22;//2.Stelle isolieren
|
||
|
||
L #Para21;
|
||
L #Para22;
|
||
>I;//1.Stelle > 2.Stelle !
|
||
SPB Err3;//Falscher Aufrufparameter
|
||
|
||
L 16#04;
|
||
>I;//2.Stelle > 4 !
|
||
SPB Err3;//Falscher Aufrufparameter
|
||
|
||
L #Para21;
|
||
L 16#00;
|
||
==I;//1.Stelle = 0 !
|
||
SPB Err3;//Falscher Aufrufparameter
|
||
|
||
//Quelle-Pointer erzeugen:
|
||
L 16#1004;//Kennung 10 + Word=04
|
||
T %LW0;//Any-Kennung, Datentyp
|
||
T %LW10;//Any-Kennung, Datentyp
|
||
L #Para22;//bis
|
||
L #Para21;//von
|
||
-I;
|
||
+ 1;
|
||
T %LW2;//Wiederholungen
|
||
T %LW12;//Wiederholungen
|
||
L 0;
|
||
T %LW4;//DB_Nummer
|
||
|
||
L #Para21;//Beginn ab X.Zusatzwort
|
||
+ -1;
|
||
L 2;//byteorientiert
|
||
*I;
|
||
T #Offset;//Offset 1. zu speicherndes Zusatzwort
|
||
|
||
L 16#00F0;//Adresse (ab MW240)
|
||
L #Offset;//falls nicht ab 1.Zusatzwort
|
||
+I;
|
||
SLD 3;
|
||
L 16#8300_0000;//Kennung: Merker
|
||
OD;
|
||
T %LD6;//Kennung, Adresse
|
||
|
||
//Ziel-Pointer erzeugen:
|
||
//Kennung + Datenbytes s.o.
|
||
L #SSDB;
|
||
T %LW14;//DB_Nummer
|
||
L #SSDW;
|
||
+ 12;//ab 6.Dw speichern
|
||
L #Offset;//falls nicht ab 1.Zusatzwort
|
||
+I;
|
||
SLD 3;
|
||
L 16#8400_0000;//Kennung: Daten
|
||
OD;
|
||
T %LD16;//Kennung, Adresse
|
||
|
||
CALL BLKMOV//Zusatz-Daten speichern
|
||
{blk_type := 'Variant'}
|
||
( SRCBLK := #Quelle ,
|
||
RET_VAL := #SFC_RET_VAL ,
|
||
DSTBLK := #Ziel
|
||
);
|
||
|
||
L #SFC_RET_VAL;
|
||
L 2#0000_0000_0000_0000;
|
||
<>I;
|
||
SPB Err1;
|
||
|
||
NETWORK
|
||
TITLE = Fifodaten schreiben
|
||
Nw07: L 16#FF;//Testsendung ?
|
||
L #Para1;//1.Aufrufparameter
|
||
==I;//Ja !
|
||
SPB Nw08;//Zeiger testweise verändern
|
||
|
||
L 16#02;//Nur Zusatzdaten speichern ?
|
||
==I;//Ja !
|
||
SPB Ende;//Fertig !
|
||
|
||
//Quelle-Pointer erzeugen:
|
||
|
||
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##INDATEN;
|
||
LAR1;
|
||
|
||
L W[ AR1, P#0.0];
|
||
T %LW4;//DB_Nummer
|
||
L D[ AR1, P#2.0];
|
||
T %LD6;//Kennung, Adresse
|
||
|
||
//Ziel-Pointer erzeugen:
|
||
//Kennung + Datenbytes s.o.
|
||
|
||
L #SSDB;
|
||
T %LW14;//DB_Nummer
|
||
L #Bringzeiger;//Adresse
|
||
SLD 3;
|
||
L 16#8400_0000;//Kennung: Daten
|
||
OD;
|
||
T %LD16;//Kennung, Adresse
|
||
|
||
CALL BLKMOV//FIFO-Daten speichern
|
||
{blk_type := 'Variant'}
|
||
( SRCBLK := #Quelle ,
|
||
RET_VAL := #SFC_RET_VAL ,
|
||
DSTBLK := #Ziel
|
||
);
|
||
|
||
L #SFC_RET_VAL;
|
||
L 2#0000_0000_0000_0000;
|
||
<>I;
|
||
SPB Err1;
|
||
|
||
NETWORK
|
||
TITLE = Bringzeiger, Anzahl erhöhen
|
||
Nw08: L #Datensatzlaenge;//Datenblocklänge
|
||
L 2;//1 word = 2 bytes
|
||
*I;
|
||
L #Bringzeiger;//Bringzeiger
|
||
+I;
|
||
T #Bringzeiger;//Bringzeiger
|
||
L #MaxBringzeiger;//Maximum Bringzeiger
|
||
<=I;//Erreicht ?
|
||
SPB W800;//Nein !
|
||
|
||
L #MinBringzeiger;//Minimum Bringzeiger
|
||
T #Bringzeiger;//Bringzeiger
|
||
|
||
W800: L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||
+ 1;
|
||
T #Anzahl;//Anzahl der gespeicherten Datensätze
|
||
|
||
NETWORK
|
||
TITLE = Versatz Bring-/Holzeiger
|
||
L #Bringzeiger;//Bringzeiger
|
||
L #Holzeiger;//Holzeiger
|
||
==I;//Identisch !
|
||
U(;
|
||
L #FifoLaenge;
|
||
L #Anzahl;//Anzahl der gespeicherten Datensätze
|
||
<>I;//Fifo noch nicht voll !
|
||
);
|
||
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 !
|
||
);
|
||
SPB Err7;//Versatz Bring-/Holzeiger
|
||
|
||
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 voll
|
||
SPA Err;
|
||
Err3: S %L32.3;//Falscher Parameter
|
||
SPA Err;
|
||
Err4: S %L32.4;//Speicherzelle ist belegt
|
||
SPA Err;
|
||
Err5: S %L32.5;//Bringzeiger außerhalb
|
||
SPA 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
|
||
U BIE;
|
||
= #BieSpeicher;
|
||
NETWORK
|
||
TITLE = Fifokopfdaten speichern
|
||
U %L32.0;//Falscher Parameter
|
||
U #NixSave;//Status nicht speichern
|
||
BEB;
|
||
|
||
L #Anzahl;//Anzahl der Datensätze (eingetragene)
|
||
+ -1;//da vorher zum Test erhöht wurde
|
||
T "MW254";//Übergabe an FC+1 (für FIFO-FÖBE)
|
||
|
||
L 16#FF;//Testsendung ?
|
||
L #Para1;//1.Aufrufparameter
|
||
==I;//Ja !
|
||
BEB;//Weil Zeiger testweise geändert!
|
||
|
||
//Ziel-Pointer erzeugen:
|
||
|
||
L 16#1004;//Kennung 10 + Word=04
|
||
T %LW10;//Any-Kennung, Datentyp
|
||
L 16#0004;//4Dw´s speichern
|
||
T %LW12;//Wiederholungen
|
||
L #SSDB;
|
||
T %LW14;//DB_Nummer
|
||
L #SSDW;//Adresse
|
||
L 4;
|
||
+I;
|
||
SLD 3;
|
||
L 16#8400_0000;//Kennung: Daten
|
||
OD;
|
||
T %LD16;//Kennung, Adresse
|
||
|
||
CALL BLKMOV//Ab Bringzeiger sichern!
|
||
{blk_type := 'Variant'}
|
||
( SRCBLK := P#L24.0 WORD 4 ,
|
||
RET_VAL := #SFC_RET_VAL ,
|
||
DSTBLK := #Ziel
|
||
);
|
||
|
||
U #BieSpeicher;
|
||
SAVE;//VKE in BIE-Bit speichern
|
||
|
||
L #FifoLaenge;//Länge des Fifo (maximale Anzahl der Datensätze)
|
||
T "MW248";//Übergabe an FC+1 (für Durchlaufspeicher)
|
||
L #Bringzeiger;//Zeiger, wohin nächster Eintrag gespeichert wird
|
||
T "MW250";//Übergabe an FC+1 (für Durchlaufspeicher)
|
||
L #Holzeiger;//Zeiger, woher nächste Daten geholt werden
|
||
T "MW252";//Übergabe an FC+1 (für Durchlaufspeicher)
|
||
L #Anzahl;//Anzahl der Datensätze (eingetragene)
|
||
T "MW254";//Übergabe an FC+1 (für Durchlaufspeicher)
|
||
|
||
END_FUNCTION
|
||
|