Strukturen Vergleichen in denen Arrays vorkommen

SteffenD

Level-2
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen, ich bin gerade dabei mir ein Programm zu schreiben, bei dem zwei Strukturen verglichen werden. Hierfür habe ich eine Lösung hier aus dem Forum gefunden (http://www.sps-forum.de/beckhoff-co...trukturinhalte-vergleichen-unter-twincat.html)

Code:
FUNCTION CompareStruct : BOOL
 VAR_INPUT
 adrS1: POINTER TO BYTE; (* Bekommt mit dem ADR Operator die Adresse von der 1. Struktur*)
 adrS2: POINTER TO BYTE; (* Bekommt mit dem ADR Operator die Adresse von der 2. Struktur*)
 uiSize: UINT; (* Bekommt die mit SIZEOF ermittelte Größe einer der beiden Strukturen*)
 END_VAR
 VAR
 i: UINT;
 END_VAR


 CompareStruct := TRUE;
 FOR i:= 1 TO uiSize DO
 IF adrS1^ <> adrS2^ THEN
 CompareStruct:= FALSE;
 EXIT;
 END_IF
 adrS1:= adrS1 + 1;
 adrS2:= adrS2 + 1;
 END_FOR
Somit kann ich super Strukturen vergleichen.

Mein Problem ist das eine Struktur wie folgt aussieht:

Code:
TYPE St_Daten :
STRUCT

	SAR_Rezeptname:			ARRAY[1..20] OF STRING;
	LRAR_Pos_X_Achse:		ARRAY[1..20] OF LREAL;
	LRAR_Pos_Z_Achse:		ARRAY[1..20] OF LREAL;
	LRAR_Pos_Y_Achse:		ARRAY[1..20] OF LREAL;
	LRAR_Spanndruck:		ARRAY[1..20] OF LREAL;
	XAR_Gas_On:				ARRAY[1..20] OF BOOL;
	XAR_Lampe_On:			ARRAY[1..20] OF BOOL;

END_STRUCT
END_TYPE

die andere Struktur sieht wie folgt aus:

Code:
TYPE St_Positionen :
STRUCT

	SAR_Rezeptname:			STRING;
	LRAR_Pos_X_Achse:		LREAL;
	LRAR_Pos_Z_Achse:		LREAL;
	LRAR_Pos_Y_Achse:		LREAL;
	LRAR_Spanndruck:		              LREAL;
	XAR_Gas_On:		              BOOL;
	XAR_Lampe_On:			BOOL;

END_STRUCT
END_TYPE

Beinhaltet meine erste Struktur ("St_Daten ") keine Arrays kann ich diese super mit meiner zweiten Struktur ("St_Positionen") vergleichen.
Aber Sobald die Arrays in der ersten Struktur vorhanden sind, ist der vergleich nie gleich, weil ja in der ersten Struktur Arrays drin sind und die Werte dann im Vergleich zur zweiten Struktur unterschiedlich sind.

Meine Frage ist, kann ich bei meinem Vergleich irgendwie sagen er soll nur auf das z.B. 4.Array von Struktur eins("St_Daten") mit der zweiten Struktur ("St_Positionen") vergleichen??
 
Hallo Steffen,

so direkt nicht. Allerdings gibt es min. 2 Möglichkeiten.

1. Deine erste Struktur sieht eigtl. genau so au wie die zweite nur als Array. Wieso deklarierst du dann nicht die erste Sturktur so:
Code:
TYPE St_Daten :
STRUCT
	my_ST_Positionen:			ARRAY[1..20] OF ST_Positionen;
END_STRUCT
END_TYPE

Ok - macht natürlich wenig Sinn eine Struktur die nur aus einem Element (auch wenn es ein Array ist) besteht. Dann kannst du einfach deine bekannte Funktion nutzen und entsprechend vergleichen.

2. Falls du auf diese Art der Deklaration angewiesen bist kannst du einen Umweg über ein "Vergleichsobjekt" machen. Das geht so:

Code:
Index : INT := 1; (* 1-20 *)
my_Vergleichsobjekt.SAR_Rezeptname := my_ST_Daten.SAR_Rezeptname[Index];
my_Vergleichsobjekt.LRAR_Pos_X_Achse:= my_ST_Daten.LRAR_Pos_X_Achse[Index];
my_Vergleichsobjekt.LRAR_Pos_Y_Achse:= my_ST_Daten.LRAR_Pos_Y_Achse[Index];
my_Vergleichsobjekt.LRAR_Pos_Z_Achse:= my_ST_Daten.LRAR_Pos_Z_Achse[Index];
my_Vergleichsobjekt.LRAR_Spanndruck:= my_ST_Daten.LRAR_Spanndruck[Index];
my_Vergleichsobjekt.LRAR_Gas_On:= my_ST_Daten.LRAR_Gas_On[Index];
my_Vergleichsobjekt.LRAR_Lampe_On:= my_ST_Daten.LRAR_Lampe_On[Index];
Dann deine Vergleichsfkt mit der Kopie durchführen.


Version 1 hat gegenüber der Version 2 den Vorteil, dass du dir die Kopiererei sparst und falls noch ein Element in der Struktur dazu kommt der Code nicht angepasst werden muss.

Ich würde auf jedenfall Version 1 bevorzugen.

Grüße BJK
 
Guten morgen zusammen,

@excelite, super vielen Dank mit der Variante 1 funktioniert das super. Genau so habe ich mir es vorgestellt. So spart man sich Quellcode den man eintippen muss ;) und zudem kann ich dann in meiner Struktur noch Variablen hinzufügen ohne meine Vergleichfunktion umzuschreiben. Ich habe wohl wieder zu kompliziert gedacht um auf so eine einfache Lösung wie die Möglichkeit 1 von dir zu kommen.
Vielen Dank nochmals!!!!!!!!!!!!!:D :D
 
Zurück
Oben