# Strukturinhalte vergleichen unter TwinCAT



## grosser_marco (22 Januar 2009)

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


----------



## Professor (22 Januar 2009)

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


----------



## trinitaucher (22 Januar 2009)

nimm sowas hier:

http://infosys.beckhoff.com/index.p...31/tcplclibsystem/html/tcplclibsys_memcmp.htm


----------



## grosser_marco (22 Januar 2009)

*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


----------



## Mathi1980 (23 Januar 2009)

Hallo 
für IEC61131-3 (CoDeSys)soll das hier nicht schlecht sein:
http://www.amazon.de/SPS-Programmie...ie=UTF8&s=books&qid=1231845604&sr=8-1....habe es mir auch Bestellt...


----------



## Professor (23 Januar 2009)

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.


----------



## Werner29 (23 Januar 2009)

Nein, Karl-Heinz John hat mit CoDeSys garantiert nichts am Hut...
Der ist Geschäftsführer bei der Konkurrenz. Für Fachbücher mit CoDeSys-Beispielen haben wir eine Liste auf unserer Homepage:

http://www.3s-software.com/index.shtml?de_lit


----------

