Files

287 lines
7.1 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 "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