287 lines
7.1 KiB
Plaintext
287 lines
7.1 KiB
Plaintext
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
|
||
|
||
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; // 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
|
||
|
||
|
||
BEGIN
|
||
NETWORK
|
||
TITLE = Schnittstellen-DB sinnvoll ?
|
||
L #SSDB;
|
||
T #DBDatenliste;
|
||
|
||
CALL "TEST_DB_TO_ATTR_DB"
|
||
( DB_Number := #DBDatenliste ,
|
||
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 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;
|
||
|
||
|
||
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)
|
||
|
||
AUF 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)
|
||
|
||
AUF 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;
|
||
|
||
AUF 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;
|
||
|
||
|
||
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
|
||
|
||
Err: CLR;//VKE = 0 bei Fehler !!!
|
||
Ok: T #RE_VAL;
|
||
|
||
SAVE;//VKE in BIE-Bit speichern
|
||
|
||
END_FUNCTION
|
||
|