Files

573 lines
14 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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