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 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