TIA Zwei identische STRUCT von optimierten DB vergleichen

Cosman

Level-2
Beiträge
35
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

wir sind auf der Suche nach einer Möglichkeit 2 identische STRUCT (derselbe UDT) von optimierten DB (S7-1500) die Werte miteinander zu vergleichen.
Bis jetzt hatten wir bei "normalen" DB (mit Offsets, also nicht vollsymbolisch) eine eigene Funktion in der die beiden STRUCT als ANY übergeben, zerlegt und per Schleife durchgearbeitet werden. Sobald ein Unterelement nicht denselben Wert hatte wurde der FC-Output "EQUAL" FALSE.

Vielleicht hat jemand eine Idee für einen Ansatz?

Gruß
Cosman
 
Hi Cosman

wenn du denselben UDT hast, dann kannst du dir einen FC schreiben.

FUNCTION CMP_UDT4711 : BOOL
INPUT
in1 : UDT4711
in2 : UDT4711
BEGIN
CMP_UDT4711 := FALSE;
if in1.mem1 <> in2.mem1 then
return;
end_if;
if in1.mem2 <> in2.mem2 then
return;
end_if;
...
CMP_UDT4711 := TRUE;
END

uns so weiter und so fort. In KOP geht das sogar ein bischen schöner, da man dort eine RET-Spule hat, auf die man FALSE schreiben darf.

Ich gebe ja zu, dass das nicht gerade anspruchsvoll ist, aber es kostet weder Speicher noch Performance. Der Vorteil dieser Lösung ist es, dass dies auch bei Strings innerhalb der Struktur richtig ist. Die von dir beschriebene Lösung mittels ANY macht bei Strings einen großen Fehler. Da vor den Nutzdaten eines Strings ja erst mal zwei Byte für die Deklarationslänge und die aktuelle Länge sind. Passiert nun bei der ANY Lösung folgender Fehler. Die aktuellen Strings sind gleich, aber in den unbenutzen Bytes findet sich noch Müll aus vorangegangenen Zyklen. Damit bekommst du Unterschiede wo gar keine sind.

Eine allgemeine Lösung zwei Variablen gleicher aber unbekannter Struktur zu vergleichen gibt es zur Zeit nicht.

'n schönen Tach auch
HB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo HelleBarde,

vielen Dank für deine ausführliche Antwort.

Leider habe ich vergessen zu schreiben, dass es bei jedem Aufruf der Funktion unterschiedliche UDT sind. Nur beim Vergleichen sind es dann immer dieselben Zwei. Natürlich funktioniert die Variante die UDT-Unterelemente einzeln zu vergleichen, ist aber in unserem Fall sehr aufwendig und auch fehleranfällig, da was vergessen werden kann. Es sind unteranderem Rezepturen mit vielen Einträgen und teilweise mit komplexen STRUCT’s.
Vielleicht bringt Siemens ja mal eine Lösung ala „FOR EACH“ wie man es von anders woher gewohnt ist.

In den betroffenen UDT gibt es keine STRING’s. Du hast aber recht, das kann ins Auge gehen. Vielen Dank für den Hinweis.
 
Zurück
Oben