2 Datenbausteine miteinander vergleichen

SPS-Fuchs

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

schonmal vorab, mein Name ist NICHT Programm!:ROFLMAO:
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.
 
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???
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Fuchs,

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

MfG
Daniel
 

Anhänge

  • DB vergleichen.txt
    1,2 KB · Aufrufe: 535
Hallo SPS-Fuchs,

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

MfG
Daniel

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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

godi

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
 
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.
 
Zuletzt bearbeitet:
Irgendwer (ein Programmteil etwa) ändert doch an einem der DB rum.
Warum kann da nicht einfach ein "Geändert"-Bit gesetzt werden ?
 
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
 
direktvergleich...

dann mach halt ein direktvergleich, sparst dir dann ein paar befehle (scheifenzähler erhöhen und sprung!) sollte also doppelt so schnell sein!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 

Anhänge

  • DB vergleichen Zyklus.txt
    1,9 KB · Aufrufe: 131
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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?
 
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.
 
Zurück
Oben