# 2 Datenbausteine miteinander vergleichen



## SPS-Fuchs (18 September 2007)

Hallo Leute,

schonmal vorab, mein Name ist NICHT Programm!
Ich hab folgendes Problem:

Ich will mit einer S7-414 2 Datenbausteine ständig miteinander vergleichen.
Die Datenbausteine haben eine Länge von ca. 5kB. Da der Vergleich immer stattfindet, komme ich mit meiner programmierten Schleifenfunktion in Zykluszeitprobleme.

Gibt es eine Möglichkeit nur den "Kopf" der beiden Datenbausteine miteinander zu vergleichen.
Ich muss nur wissen ob die DB's ungleich sind. Welche Daten genau interessieren eigentlich nicht.
Bin für jede Hilfe dankbar.


----------



## Jochen Kühner (18 September 2007)

*zykluszeit...*

musst du denn in einem zyklus immer den kompletten baustein vergleichen, oder langt es auch wenn der vergleich z.b. 20 zyklen dauert und dann von vorne beginnt???


----------



## dalbi (19 September 2007)

Hallo SPS-Fuchs,

anbei eine AWL Quelle zum vergleichen von Datenbausteinen.
Unter PLC-Sim funktioniert es in einem Zyklus.

MfG
Daniel


----------



## godi (19 September 2007)

D. Albinus schrieb:


> Hallo SPS-Fuchs,
> 
> anbei eine AWL Quelle zum vergleichen von Datenbausteinen.
> Unter PLC-Sim funktioniert es in einem Zyklus.
> ...


 
Ich glaube nicht das SPS Fuchs es nicht gewußt hat wie man die einzelnen Werte vergleicht sondern er hat eher das Problem das es ziemlich viel Zeit braucht 5kb einzeln zu vergleichen und das jeden Zyklus!

Ich glaube er brächte da eher eine Art Quersumme die er miteinander Vergleichen kann.
Allerdings weiß er dann nicht ob nur die Summe gleich ist oder ob die einzelnen Werte auch gleich sind.

Für was brauchst du das eigentlich?
Genügt da nicht der Vorschlag von Jochen Kühner das du es auf mehrere Zyklen aufteilst?

godi


----------



## Kai (19 September 2007)

D. Albinus schrieb:


> anbei eine AWL Quelle zum vergleichen von Datenbausteinen.
> Unter PLC-Sim funktioniert es in einem Zyklus.


 
Deine AWL-Quelle stammt aus dieser FAQ von Siemens:

Programmbeispiel Vergleich zweier beliebiger Datenbausteine

Das Problem bei diesem Programmcode ist aber, das hier genauso mit einer Programmschleife gearbeitet wird, wie SPS-Fuchs es schon selber macht. Man bekommt also auch hier Probleme mit der Zykluszeit bei großen Datenmengen. Daher auch der Vorschlag, den Vergleich auf mehrere Programmzyklen zu verteilen.

Gruß Kai


----------



## SPS-Fuchs (20 September 2007)

godi schrieb:


> Ich glaube nicht das SPS Fuchs es nicht gewußt hat wie man die einzelnen Werte vergleicht sondern er hat eher das Problem das es ziemlich viel Zeit braucht 5kb einzeln zu vergleichen und das jeden Zyklus!
> 
> Ich glaube er brächte da eher eine Art Quersumme die er miteinander Vergleichen kann.
> Allerdings weiß er dann nicht ob nur die Summe gleich ist oder ob die einzelnen Werte auch gleich sind.
> ...



Genau das ist es. Ich will mir nicht die Zykluszeit unnötig verlängern, gibt es eine Möglichkeit anhand einer Quersumme oder Sonstiges einen DB zu vergleichen? 

zur Not könnte ich den Vergleich auch auf mehrere Zyklen verteilen. 

mfg SPS-Fuchs


----------



## Ralle (20 September 2007)

Ich würde den Vergleich über mehrere Zyklen verteilen. 
Dazu brauchst du 2 Variablen. 

1. Zeiger auf nächstes Datenpaket
2. Loopvariable

In einem Zyklus läßt du beispielsweise 100 Variablen vergleichen.

Die Loopvariable zählt von 100 runter, du vergleichst damit die

Datenwortnummer: Zeiger + 100 - Loop  (Loop zählt immer rückwärts, sonst vergeleiht er auch rückwärts, was aber auch geht)

Am Ende, wenn du nach 100  "Loops" die  Schleife verläßt, erhöhst du den Zeiger um 100 und speicherst ihn wieder ab. Außerdem mußt du vergleichen ob der Zeiger das Ende des DB erreicht hat, dann setzt du ihn wieder auf 0.
Prüf mal, ob die Loopvariable auf 99 oder 100 gesetzt werden muß, damit du 100 Durchläufe hast, ich weiß grad nicht, ob bei Null noch einmal der Code in der Schleife abgearbeitet wird.
Es ist sinnvoll, eine Loopgröße zu wählen, die genau mit der Datenbausteingröße aufgeht.

PS: Außerdem kann man DBD vergleichen, das sind 4 Byte. 
Also wären 50 Loops ganz gut, das macht 25 Durchläufe je 50 DBD (200 Byte) bei 5K Datenbaustein.


----------



## argv_user (20 September 2007)

Irgendwer (ein Programmteil etwa) ändert doch an einem der DB rum.
Warum kann da nicht einfach ein "Geändert"-Bit gesetzt werden ?


----------



## SPS-Fuchs (20 September 2007)

argv_user schrieb:


> Irgendwer (ein Programmteil etwa) ändert doch an einem der DB rum.
> Warum kann da nicht einfach ein "Geändert"-Bit gesetzt werden ?



So einfach ist das nicht mit einem "Geändert-Bit" da ich eine 192-zeilige Tabelle habe und jede Zeile ist änderbar.


----------



## Onkel Dagobert (20 September 2007)

Ralle schrieb:


> Ich würde den Vergleich über mehrere Zyklen verteilen...


Eine andere Möglichkeit sehe ich auch nicht. Man muss sich jedoch im Klaren sein dass dabei gewissermaßen eine Inkonsistenz entsteht! Je nach dem, was mit den Daten bei Änderung geschieht, könnte das von Bedeutung sein.

Warum muss überhaupt eine Änderung erkannt werden? Wieviel Zykluszeit geht eigentlich bei 5kB in einer Schleife drauf (viel zu viel ist schon klar)? Hat das mal jemand probiert?


Gruß, Onkel


----------



## Jochen Kühner (20 September 2007)

*direktvergleich...*

dann mach halt ein direktvergleich, sparst dir dann ein paar befehle (scheifenzähler erhöhen und sprung!) sollte also doppelt so schnell sein!


----------



## dalbi (20 September 2007)

Hallo SPS-Fuchs,

anbei der geänderte Baustein als AWL Quelle zum vergleichen von Datenbausteinen über mehrere Zyklen.
Die Anzahl der vergleichbaren Datenworte pro Zyklus ist einstellbar, somit kann man die Zykluszeit so gering wie möglich halten.

MfG
Daniel


----------



## godi (20 September 2007)

Hallo SPS - Fuchs!

Habe gerade mit einer uralt CPU 313 5kB versucht in jedem Zyklus zu vergleichen.
Also bei Programmierung so ähnlich wie D.Albinus vorschlag da komme ich auf ca 55ms.
Wenn du aber das über beide DB Register machst dann brauchst du nur einmal in einem Zyklus die beiden DB's aufmachen und nicht in jeder Schleife -> nochmal 10ms langsamer. Also da sind wir bei 45ms.
Naja da sollte das ja die 414 eh in 15ms schaffen oder?

Probiere da mal mit beide DB Register und teile mal mit wie lange deine SPS dazu benötigt.
Zu beide DB register:
AUF DB1    //erstes DB Register
AUF DI2    //zweites DB Register
//Schleife
L DBD [AR1,P#0.0] //ersten DB lesen
L DID [AR1,P#0.0] //zweiten DB lesen
.
.
.

godi


----------



## point_system (9 Dezember 2015)

Keine Lösung gefunden für diese Frage?

LG
Point


----------



## borromeus (9 Dezember 2015)

steht ja eh seit 8 Jahren da.
Wenn "man" es jeden Zyklus braucht, muss man es eben jeden Zyklus prüfen.

Wenn man es nicht an der schreibenden Stelle abfangen kann, was ja möglich ist wenn zB eine SCADA den Wert schreibt, bleibt nur die Schleife.

Was ist Dein Anwendungsfall?


----------



## point_system (9 Dezember 2015)

> Was ist Dein Anwendungsfall?



ich habe zwei Datenbausteine jeweils mit 100 CHAR (BYTES). Die beide möchte ich ständig vergleichen und falls nicht gleich, die Daten zu einem anderen CPU senden.

VG


----------



## borromeus (9 Dezember 2015)

Naja, dann mach eine Schleife von 0 is 24 und vergleiche doppelwortweise.

Ich meinte aber eher: wozu braucht man sowas?


----------



## point_system (9 Dezember 2015)

> wozu braucht man sowas?


um Trafik in dem Leitsystem zu vermeiden (in großen Netzwerken wie bei VW) wäre es sinnvoll nur bei der Änderung Telegramme zu versenden und nicht ständig.

VG


----------



## borromeus (10 Dezember 2015)

OK, da geht es aber eigentlich nicht um den Vergleich zweier Bausteine sondern darum, dass bei Änderung was übertragen wird.
Sowas findet sich in der PCS7 COMMxx Bibliothek und- das vermute ich- im Fernwirkbereich.


----------

