Kommunikation / Synchronisation einer Variablen

Drutbluck

Well-known member
Beiträge
68
Punkte Reaktionen
6
Zuviel Werbung?
->Hier kostenlos registrieren
Folgendes einfaches Szenario:

2 SPSe kommunizieren miteinander und haben eine Variable, die sie austauschen und synchron halten. D.h. jede CPU sendet den eigenen Wert an die andere CPU und übernimmt Wertänderungen von der anderen CPU. Jede CPU kann auch selbst Wertänderungen veranlassen, die z.B. von einem HMI kommen.

Gibt es ein Standardverfahren, um das korrekt umzusetzen? Das Problem ist, wenn beide CPUs gleichzeitig eine Wertänderung initiieren, z.B. CPU1 setzt den Wert 1 (von zuvor 0), und CPU2 setzt den Wert 2. Dann sieht jede CPU die Änderung von der anderen CPU und die Werte werden einfach getauscht. Dieses Tauschen läuft für unbestimmte Zeit weiter.

Die meisten einfachen Lösungen, die mir einfallen, sind keine Lösungen oder widersprechen den Anforderungen.

Ich versuche, mit möglichst wenigen zusätzlichen Kommunikationsbits, Code usw. auszukommen.

Eine mögliche Lösung wäre, genau eine CPU als "vorrangig" zu deklarieren. Wenn sie eine Wertänderung sendet, müssen die anderen CPUs den Wert für eine gewisse Zeit dauerhaft übernehmen, gleichzeitig darf die vorrangige CPU für eine gewisse Zeit nichts übernehmen. Das ist mit den Anforderungen vereinbar, weil bei fast gleichzeitigen Änderungen von 2 Seiten keine Priorität vorgegeben ist.

Was ist, wenn eine CPU den Wert begrenzt, die andere nicht? Die andere CPU sieht keine Änderung und kann nur durch eine zusätzliche Information zur Übernahme veranlasst werden. Also ein Signal "übernehme Variable X sofort".

Vielleicht gibt es eine effiziente Lösung, die beides abdeckt?
 

mogel

Well-known member
Beiträge
67
Punkte Reaktionen
3
Moin,

schwierige Aufgabe. Es kann nur einer das sagen haben, zusammen kann man nur (im Chor) singen.

http://de.wikipedia.org/wiki/Race_Condition

Einzige Sinnvolle Lösung die mir einfällt ist: eine SPS hat das Sagen und verteilt den Wert an alle anderen. Alle anderen Stellen an den Master maximal die Anfrage auf Änderungen der Variable. Auf dem Master kannst Du die Synchronisierung besser beaufsichtigen.

hand, mogel
 

StructuredTrash

Well-known member
Beiträge
1.100
Punkte Reaktionen
291
Zuviel Werbung?
->Hier kostenlos registrieren
Oder mit einem Zugriffsrecht-Token, das die beiden CPU's sich zyklisch zuschieben. Hat CPU1 das Token, darf sie die Variable ändern, während CPU2 die Variable von CPU1 übernimmt. Sobald CPU2 das Token erhält, geht's in die andere Richtung. Änderungsanforderungen von anderer Seite an die wartende CPU müssen dann kurzzeitig gepuffert werden.
 

Boxy

Well-known member
Beiträge
1.422
Punkte Reaktionen
138
CPU 2 melde die Variable immer an CPU1 und diese ändert die Variable abhängig welcher Wert sich ändert (als Master) und gibt diese dann auch wieder an CPU2 zurück!
 
Oben