Strukturinhalte vergleichen unter TwinCAT

grosser_marco

Level-1
Beiträge
45
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen,

hat irgendjemand eine gute Idee, wie man die Inhalte zweier identischer Strukturen vergleichen kann. Wobei ich mit Struktur nicht nur einfache Arrays meine.
Also z.B. definiere ich einen Strukturtyp wie folgt:
TYPE Struktur
STRUCT
Variable1: Andere_Struktur; (*sozusagen eine Struktur in der Struktur*)
Variable2: INT;
Variable3: INT;
Variable4: BOOL;
Variable5: BOOL;
Variable6: Andere_Struktur;
END_STRUCT
END_TYPE

Von diesem Strukturtyp leite ich zwei Objekte ab:
Struktur1: Struktur;
Struktur2: Struktur;

Und jetzt will ich die INHALTE der beiden Strukturen (Struktur1 und Struktur2) auf Gleich oder Ungleich überprüfen.

Mit einfachem Vergleich Struktur1 EQ Struktur2 oder Struktur1 NE Struktur2 geht es jedenfalls nicht, da meckert TwinCAT beim Übersetzen.
Man könnte auch jedes Element der ersten mit dem entsprechenden Element der zweiten Struktur vergleichen, aber das wäre bei größeren Strukturen enorm aufwendig.

Ich habe schon überlegt, Zeiger auf die Strukturanfänge zu definieren, und die Strukturen über eine Laufveriable dann byteweise zu vergleichen, aber ich finde keinen programmtechnischen Ansatz dafür.

Hat irgendjemand eine Idee oder so was schon mal gemacht?

Viele Grüße
grosser_marco
 
Schreib dir ne Funktion in ST

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

Die Funktion rufst du mit den Adressen und Größe der Strukturen auf und erhälst als Rückgabewert ein True wenn sie gleich sind.
Wenn du nicht weißt wie man die Function aufruft mache ich dir noch ein Beispiel. Dafür brauche ich aber dann die Sprache in der du die Funktion aufrufst

Gruß vom Prof
 
Strukturen vergleichen unter TwinCAT

Danke euch beiden!
Der selbst geschriebene Baustein funktioniert, das hab ich getestet.
Ich wusste noch gar nicht, daß es dafür auch eine Standardfunktion in der Lib gibt. Nochmal danke für eure Hilfe! Nichtmal die Hotline von Beckhoff konnte mir da helfen, die waren der Meinung daß der Vergleich mit EQ oder NE gehen müsste...:-(
Könntet ihr mir noch ein Buch (evtl. kostenloses eBook) zur Programmierung unter IEC 1131 empfehlen, damit ich mich besser mit den Sprachstrukturen vertraut machen kann?
Danke
grosser_marco
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe mir die Beschreibung vom dem Buch mal angesehen ist ein IEC Buch und scheint recht ausführlich zu sein aber geht bestimmt nicht auf CoDeSys bzw. TwinCat ein. Es wird mit dem Buch OpenOCS und Step7 mitgeliefert. Gerade von Step7 ist aber bekannt, dass die IEC nicht voll umgesetzt wurde.
 
Zurück
Oben