-> Hier kostenlos registrieren
Hallo zusammen!
Ich gebe es zu, ich habe von der nachfolgenden Thematik kaum eine Ahnung, aber ich möchte aus einem Array of UDT einen Datensatz, den ich über den Index (INT) referenziere kopieren.
Konkret gibt es einen DB:
AktuellerDS: UDT_DSTyp
Datenbank: Array [1..10] of UDT_DSTyp
Ich habe jetzt mit einem hier im Forum entdeckten Quelltext etwas experimentiert, scheitere aber an der Stelle dem SFC20 die Zieladresse zu übergeben.
Vielleicht kann mich mal jemand unterstützen, der sich damit auskennt.
Vielen Dank!
Ich gebe es zu, ich habe von der nachfolgenden Thematik kaum eine Ahnung, aber ich möchte aus einem Array of UDT einen Datensatz, den ich über den Index (INT) referenziere kopieren.
Konkret gibt es einen DB:
AktuellerDS: UDT_DSTyp
Datenbank: Array [1..10] of UDT_DSTyp
Ich habe jetzt mit einem hier im Forum entdeckten Quelltext etwas experimentiert, scheitere aber an der Stelle dem SFC20 die Zieladresse zu übergeben.
Vielleicht kann mich mal jemand unterstützen, der sich damit auskennt.
Vielen Dank!
Code:
FUNCTION FC 2005 : INT
TITLE = FC_COPY
AUTHOR : Guido
VERSION : 0.1
VAR_INPUT
SourceData : ANY ; //Datenbereich in dem die Parametersätze abgelegt sind
SourceIndex : INT ; //Index des zu bearbeitenden Parametersatzes
END_VAR
VAR_OUTPUT
DestinationData : ANY ; //Datenbereich in dem der Parametersatz kopiert werden soll
END_VAR
VAR_TEMP
AR1_TEMP : DWORD ;
AKT_DATENSATZ : DWORD ;
LAENGE_UDT : INT ; //Länge des Parametersatzes
DB_UDT : INT ; //Nummer des DB
STARTADRESSE : DWORD ; //Startadresse im DB = 1. Datensatz
END_VAR
BEGIN
NETWORK
TITLE =
//*** AR1 sichern
TAR1 #AR1_TEMP;
SET ;
SAVE ;
//*** Ergebnisse initialisieren
L B#16#0;
T #RET_VAL;
//*** AR2 auf Datenbereich im DB
L P##SourceData;
LAR2 ;
//*** ANY-Pointer zerlegen
//*** wir brauchen nur die DB-Nr und Länge des UDT
//*** sowie die Startadresse im DB (Bereichszeiger)
L B [AR2,P#0.0]; // Syntax-ID, bei S7 immer 10hex
L B [AR2,P#1.0]; // Datentyp
L W [AR2,P#2.0]; // Anzahl von "Datentyp" = Länge des UDT
T #LAENGE_UDT; // temporär ablegen
L W [AR2,P#4.0]; // Nummer des DB [INT]
T #DB_UDT; // temporär ablegen
L D [AR2,P#6.0]; // Bereichszeiger = Startadresse
T #STARTADRESSE; // Startadresse im DB = 1. Datensatz
//*** Prüfe, ob DATENBEREICH vom Typ=Byte
L B [AR2,P#1.0]; // Datentyp
L B#16#2; // 02hex == BYTE
==I ;
L 1; // Fehler 1: DATENBEREICH nicht vom Typ BYTE
SPBN ERR; // !!! Baustein bei Parameterfehler beenden !!!
//*** Source-DB öffnen und Adressregister AR2 auf Bereichszeiger
AUF DB [#DB_UDT]; // DB öffnen
L #STARTADRESSE; // Bereichszeiger == Startadresse 1. Datensatz
LAR2 ; // DATENBEREICH
//*** Offset des aktuellen Datensatzes zu AR2 addieren
L #SourceIndex; // Nummer des aktuellen Datensatzes (1..n) [INT]
L 1; // beim 1. Datensatz ist Offset=0
-I ; // Nummer des aktuellen Datensatzes (0..n-1) [INT]
// Länge des UDT in BIT umrechnen, ohne Akku 2 zu verändern
L #LAENGE_UDT; // Länge des UDT (Anzahl DWORD) [INT]
SLW 5; // Länge des UDT (Anzahl BIT), (SLW 5 == *32)
// Länge des UDT mit aktueller (Datensatznummer-1) multiplizieren
*I ;
// Offset [BIT] zu AR2 addieren
+AR2 ; // AR2 zeigt jetzt auf aktuellen Datensatz im DB
//*** AR2 für späteres Zurückkopieren zwischenspeichern
TAR2 #AKT_DATENSATZ;
//*** Den Datensatz kopieren
CALL "BLKMOV" (
SRCBLK := #AKT_DATENSATZ,
RET_VAL := #RET_VAL,
DSTBLK := MD 1000); //<- Hier sollte eigentlich #DestinationData stehen!
//***************************************************************************************************
// Ende
//***************************************************************************************************
//*** AR1-Register wiederherstellen
LAR1 #AR1_TEMP;
BEA ;
//*** Fehler
ERR: T #RET_VAL;
//*** AR1-Register wiederherstellen
LAR1 #AR1_TEMP;
BE ;
END_FUNCTION