Hi all
nochmal Öl ins Feuer.
Harald hat verstanden: "Das Problem bekommt man nur in den Griff, wenn man im Programm nicht direkt die von der HMI beschriebenen HMI-Variablen verwendet, sondern Kopien"
und Larry schreibt doch das Gleiche: "nicht die Visu UND das SPS-Programm den gleichen Datenbereich verändern lassen"
Mein Vorschlag: Für die Informationsflussrichtung von Visu zu PLC: die Visu schreibt in den DB_A und das Programm liest normalerweise aus DB_B. An einer einzigen Stelle wird durch das Programm von DB_A nach DB_B kopiert. Für die Gegenrichtung verwende man DB_C und DB_D oder andere disjunkte Bereiche von DB_A und DB_B.
Und wenn jetzt mehr als 460 Bytes (oder so) übertragen werden müssen, dann kommt der Trick mit der Sequenznummer zum Einsatz, mit dem sichergestellt wird, dass der Datensatz im DB_A konsistent ist. Im DB_A werden zwei zusätzlich Variablen angelegt. Ich nenne sie jetzt mal SeqA und SeqB. Die Visu schreibt nicht nur einfach die Nutzdaten, sondern sie schreibt drei Mal.
Zuerst SeqA := x, dann die Nutzdaten, dann SeqB := x, danach x := x+1. Ja, das ist zusätzliche Arbeit.
Und auch das Programm muss mehrere Schritte machen. Zuerst kopiert man SeqB nach tmpB, dann kopiert man die Nutzdaten von DB_A in einen Puffer. Dann vergleicht man SeqA mit tmpB. Ist tmpB == SeqA, dann sind die Nutzdaten konsistent und man kann den Puffer nach DB_B kopieren, wenn nicht, dann vergiss die Daten für diesen Zyklus, DB_B bleibt unverändert.
Wieso klappt das? Nehmen wir mal an, dass HMI platzt in den Kopiervorgang. Dann hat das Programm SeqB gelesen und einen Teil der Nutzdaten. Die Visu schreibt aber zuerst SeqA, das ist aber das, was das Programm als letztes liest. Damit ist tmpB <> SeqA, die Unterbrechung ist erkannt.
Ja, ja, das ist alles recht kompliziert. Aber erst nötig, wenn beide Problem zuschlagen. Große Datenmengen und Nebenläufigkeit. Nochmal Larry: "Solange nur gelesen wird (zum Anzeigen) ist alles OK"
'n schön' Tach auch
HB