FUNCTION "m7b_udtCopyArray" : VOID
TITLE =kopiert einzelne UDT's von UDT-Arrays
//Kopiert UDT's aus Arrays, die Datenlänge des UDT wird automatisch ermittelt.
//Anpassungen der Datenlänge nach Änderungen an den UDT's entfällt somit.
//
//Achtung Array bzw. Speichergrenzen werden nicht überprüft.
//Gegebenenfalls, Indexangaben vorher auf Korrektheit prüfen bzw. limittieren!
//Bei inkorrekten Indexangaben geht CPU in STOP.
//
//Verwendung: Verwaltung von Datensätzen wie Rezepturen, Betriebsdaten,
//Positionsdaten usw. in der Steuerung.
//
//Kopiert wird von/zu: DB, statischen Lokaldaten im Instanz-DB
//(Multinnstanzfähig, ohne zus. Adresskorrektur, da Step7 bei Verwendung von
//Instanzdaten bei UDT's automatisch als Quelle [#84] DB und Nr. mit korrekter
//Adress angibt statt nur DI [#85])
//
//Nicht kopiert wrid von/zu lokalen Daten (TEMP), da vor- vorherige Lokaldaten
//benötigt werden (S7 aber nur vorherige Lokaldaten unterstützt)
//
//[IN]
//srcUdtArray : Anypointer auf den ersten UDT im Quell-Array
//srcIndex : Index des Quell-UDT im Array, beginnend bei 0
//destUdtArray: Anypointer auf den ersten UDT im Ziel-Array
//destIndex : Index des Ziel-UDT im Array, beginnend mit 0
//
//DATUM: 10/2007
//
//AENDERUNGSVERMERKE:
//--------------------------------------------------------------------------------
//DATUM NAME AENDERUNG
//--------------------------------------------------------------------------------
//20.03.2017 S.Maag Verwendung von AR2 entfernt und Abfrage auf
// Daten Speicherbereich #87 vorheriger Lokaldatenstack
// hinzugefügt, da Daten aus vorherigem Stack nicht
// kopiert werden können, da BLKMOVE neuen L-Stack anlegt
//--------------------------------------------------------------------------------
//
AUTHOR : 'S.Maag'
FAMILY : Maagic7
VERSION : 0.1
VAR_INPUT
srcUdtArray : ANY ;
srcIndex : INT ;
destUdtArray : ANY ;
destIndex : INT ;
END_VAR
VAR_OUTPUT
BLKMOV_RetVal : INT ; //Return Value der Blockmovefunktion
END_VAR
VAR_TEMP
pSRC : ANY ; //mit Indexdaten modifizierter Quellpointer für BlockMove-Funktion
pDEST : ANY ; //mit Indexdaten modifizierter Zielpointer für BlockMove-Funktion
dwPart1 : DWORD ;
wPart2 : WORD ;
dwPart3_Address : DWORD ;
dwBitAddress : DWORD ;
bMemory : BYTE ; //Speicherbereich
END_VAR
BEGIN
NETWORK
TITLE =
//ANY
//Byte 0: 10h für S7
//Byte 1: Datentyp
//Byte 2..3: Wiederholungsfaktor
//Byte 4..5: DB-Nr
//Byte 6: Speicherbereich
//Byte 7..9: Byte/Bit-Adresse
//
//Speicherbereiche
//#80 P : Perepherie
//#81 E : Eingänge
//#82 A : Ausgänge
//#83 M : Merker
//#84 DB : Datenbaustein
//#85 DI : Instanz-DB
//#86 L : Lokaldaten (L-Stack)
//#87 V : Verherige Lokaldaten
NETWORK
TITLE =ANY-Pointer Quelle für BlockMove bearbeiten
//Beim Wiederholungsfaktor wird automatisch von Byte ausgegeangen.
//Für UDT's stimmt dies auch immer. Falls der Baustein allgemein zum kopieren von
//Anypointerbasierten Daten verwendet werden soll, so muss dies beachtet bzw.
//angepasst werden.
//Den ANY-Pointer Quelle mit den Indexdaten modifizieren und als ANY-Pointer für
//die BlockMove-Funktion speichern
L P##srcUdtArray; // Pointer auf den Quellpointer
LAR1 ; // in Adressregister 1
L D [AR1,P#0.0]; // Part1
T #dwPart1;
L W [AR1,P#4.0]; // Part2
T #wPart2;
L D [AR1,P#6.0]; // Part3 (Address-Pointer)
T #dwPart3_Address;
SRD 24; // Shift 3 Byte = Speicherbereich
T #bMemory;
L B#16#87; // Daten vom vorherigen Lockaldaten Stack (geht nicht!)
==I ;
SPB ERR;
// Calculating the Address with Source ARRAY Index
L W [AR1,P#2.0]; // Wiederholungsfaktor
L #srcIndex;
*I ; // Offset aus Index für Quellbereich
SLD 3; // ins Pointerformat konvertieren
L #dwPart3_Address; // Ursprüngliche Quelladdresse
UD DW#16#FFFFFF; // oberes Byte fuer Speicherbereich ausblenden
+D ; // Quelladresspointer mit verrechnetem Index
T #dwBitAddress;
L P##pSRC; // Pointer auf AnyPointer Quelle für BlockMove
LAR1 ; // in Adressreguster 1
L #dwPart1; // Part 1 of ANY
T D [AR1,P#0.0]; // to pSRC [ANY]
L #wPart2; // Part 2
T W [AR1,P#4.0]; // DB-Nr.
L #dwPart3_Address; // Part 3 Address
UD DW#16#FF000000; // Speicherbereich maskieren
L #dwBitAddress; // mit Array-Index modifizierte Adresse
OD ; // Speicherbereich_Adresse zusammenführen
T D [AR1,P#6.0];
NETWORK
TITLE =ANY-Pointer Ziel für BlockMove bearbeiten
L P##destUdtArray; // Pointer auf den Quellpointer
LAR1 ; // in Adressregister 1
L D [AR1,P#0.0]; // Part1
T #dwPart1;
L W [AR1,P#4.0]; // Part2
T #wPart2;
L D [AR1,P#6.0]; // Part3 (Address-Pointer)
T #dwPart3_Address;
SRD 24; // Shift 3 Byte = Speicherbereich
T #bMemory;
L B#16#87; // Daten vom vorherigen Lockaldaten Stack (geht nicht!)
==I ;
SPB ERR;
// Calculating the Address with Destination ARRAY Index
L W [AR1,P#2.0]; // Wiederholungsfaktor
L #destIndex;
*I ; // Offset aus Index für Quellbereich
SLD 3; // ins Pointerformat konvertieren
L #dwPart3_Address; // Ursprüngliche Quelladdresse
UD DW#16#FFFFFF; // oberes Byte fuer Speicherbereich ausblenden
+D ; // Quelladresspointer mit verrechnetem Index
T #dwBitAddress;
L P##pDEST; // Pointer auf AnyPointer Quelle für BlockMove
LAR1 ; // in Adressreguster 1
L #dwPart1; // Part 1 of ANY
T D [AR1,P#0.0]; // to pDEST [ANY]
L #wPart2; // Part 2
T W [AR1,P#4.0]; // DB-Nr.
L #dwPart3_Address; // Part 3 Address
UD DW#16#FF000000; // Speicherbereich maskieren
L #dwBitAddress; // mit Array-Index modifizierte Adresse
OD ; // Speicherbereich_Adresse zusammenführen
T D [AR1,P#6.0];
NETWORK
TITLE =kopieren der Daten mittels BlockMove
CALL "BLKMOV" (
SRCBLK := #pSRC,
RET_VAL := #BLKMOV_RetVal,
DSTBLK := #pDEST);
NOP 0;
NETWORK
TITLE =
SET ;
SAVE ;
BEA ;
NETWORK
TITLE =
//Daten vom vorherigen Lokaldatenstack können nicht kopiert werden, da
//BLKMOVE neuen L-Stack öffnet und die Daten somit vom vor- vorherigen Stack
//wären
ERR: L W#16#8888; // Daten vom vorheriger Lockaldatenstack
T #BLKMOV_RetVal; // können nicht kopiert werden, da BLKMOVE neune Stack anlegt
SET ;
SAVE ;
BE ;
END_FUNCTION