Dateninkonsistenz von globalen 32-Bit Variablen

Frage:
Wie kann man mit Hilfe von Semaphoren die Dateninkonsistenz von 32-Bit Variablen vermeiden?

Antwort:
In dem Augenblick, in dem z. B. in einem niederprioren Task einer globalen 32-Bit Variablen ein Wert zugewiesen wird, kann ein höherpriorer Task den Niederprioren unterbrechen. Greift die höherpriore Task auf diese globale Variable zu, dann ist das Ergebnis aufgrund des, in der niederprioren Task unterbrochenen Schreibzugriffs nicht korrekt (Dateninkonsistenz).
Nur bei Variablen mit Datentypen größer 16-Bit (z. B. DWORD, REAL, Strukturen,...) kann der Schreib- bzw. Lese-Zugriff durch einen höheren Task unterbrochen werden, wodurch das Problem der Dateninkonsistenz auftreten kann.

Das Problem der Dateninkonsistenz kann dadurch gelöst werden, indem der Lese- bzw. Schreibzugriff verhindert wird, solange in einem anderen Task diese globale Variable beschrieben wird. Die folgende SPS-Logik (in strukturiertem Text) zeigt exemplarisch diese Funktion:

Variable g_bSema ist als eine globale, boolesche Variable deklariert.
Variable g_dnVar ist als globale 32-Bit Variable deklariert.

Task 1 (niederpriorer Task):

   g_bSema:=TRUE;    (*Aktiviere Semaphore                       *)
 g_dnVar:=11111;   (*Schreibzugriff auf globale 32-Bit Variable*)
 g_bSema:=FALSE;   (*Deaktiviere Semaphore                     *)

Task 2 (höherpriore Task):

   (*Lesezugriff auf globale Variable ist nur erlaubt, wenn die*)
 (*Semaphore nicht aktiv ist, ansonsten bleibt der alte Wert *)
 (*erhalten.                                                 *)
 IF (g_bSema = FALSE) THEN
      dnVarLocal:=g_dnVar;
 END_IF

URL zur Verlinkung dieses AKB-Artikels: https://www.lenze.com/de-de/go/akb/200412064/0/
Contact form