-> Hier kostenlos registrieren
Hallo,
ich habe einen nicht optimierten Datenbaustein mit einem UDT. Ich möchte nun alle Variablen des UDT durchlaufen und deren Typ oder zumindest die Länge der Variable ermitteln um daraufhin weitere Schritt zu unternehmen. (Soll auch für weitere Projekte dienen, in denen der UDT anders aufgebaut ist, daher ist eine feste Programmierung nicht möglich)
Zum Auslesen der Länge des gesamten UDT habe ich bereits einen Code im Internet gefunden, der mir weitergeholfen hat.
Mit Hilfe dieses Codes kann ich den Datenbaustein mit ein For-Schleife durchlaufen. Nur fehlt mir aktuell die Möglichkeit, den Datentyp der Variablen auszulesen.
Ich denke, das ist auch mit dem oben genannten Code möglich (in abgewandelter Form), nur habe ich mit Zeigern und Any noch nicht wirklich was zu tun gehabt.
Mein Gedanke:
Ich hoffe mir kann hierbei jemand helfen.
ich habe einen nicht optimierten Datenbaustein mit einem UDT. Ich möchte nun alle Variablen des UDT durchlaufen und deren Typ oder zumindest die Länge der Variable ermitteln um daraufhin weitere Schritt zu unternehmen. (Soll auch für weitere Projekte dienen, in denen der UDT anders aufgebaut ist, daher ist eine feste Programmierung nicht möglich)
Zum Auslesen der Länge des gesamten UDT habe ich bereits einen Code im Internet gefunden, der mir weitergeholfen hat.
Code:
#Error := 0; // Rücksetze Error-Variable
#TempAny := #DataStruct; // Hier werden die Daten aus der Eingangsvariable "DataStruct" (ANY-
// Pointer) der temporären Variable "TempAny" (ANY-Pointer mit Zugriff auf
// die Buffer-Variable vom Typ UDT "UDT_AnyPointer") übergeben. Somit ist das Lesen
// und Schreiben der Daten in den Buffer möglich, um den Zeiger zu bilden.
CASE CHAR_TO_INT(BYTE_TO_CHAR(#Buffer.DataType)) OF
1:
#BitCount := #Buffer.DataCount / 8; // Boolean
2:
#BitCount := #Buffer.DataCount; // BYTE
3:
#BitCount := #Buffer.DataCount; // CHAR
4:
#BitCount := #Buffer.DataCount * 2; // Word, multiply by 2
5:
#BitCount := #Buffer.DataCount * 2; // INT, multiply by 2
6:
#BitCount := #Buffer.DataCount * 4; // DWORD, multiply by 4
7:
#BitCount := #Buffer.DataCount * 4; // DINT, multiply by 4
8:
#BitCount := #Buffer.DataCount * 4; // REAL, multiply by 4
ELSE: // Andere Typen vom ANY-Pointer, werden nicht unterstützt!
#Error := W#16#8001; // Typ vom ANY-Pointer wird nicht unterstützt
END_CASE;
#Lng := #BitCount; // Länge ausgeben
#"0700_SizeOfStruct" := #Error;
Mit Hilfe dieses Codes kann ich den Datenbaustein mit ein For-Schleife durchlaufen. Nur fehlt mir aktuell die Möglichkeit, den Datentyp der Variablen auszulesen.
Ich denke, das ist auch mit dem oben genannten Code möglich (in abgewandelter Form), nur habe ich mit Zeigern und Any noch nicht wirklich was zu tun gehabt.
Mein Gedanke:
Code:
FOR #i := 0 TO DINT_TO_INT(#tdi_Laenge) DO
// Datentyp ermitteln
// ...
// ...
IF Datentyp = Bool THEN
#x_RetVal := PEEK_BOOL(area := 16#84, dbNumber := 9, byteOffset := #i, bitOffset:=0);
ELSIF Datentyp = Byte THEN
#b_RetVal := PEEK(area := 16#84, dbNumber := 9, byteOffset := #i);
END_IF;
// ggf. Zwischenzähler, damit Schleife bei Typen mit mehreren Byte nicht zweimal, sondern erst wieder mit der nächsten Variable prüft
END_FOR;
Ich hoffe mir kann hierbei jemand helfen.