SA0006: Schreibzugriff aus mehreren Tasks

Funktion

Ermittelt Variablen, auf die von mehr als einer Task geschrieben wird.

Begründung

Eine Variable, die in mehreren Tasks geschrieben wird, kann unter Umständen ihren Wert unerwartet ändern. Das kann zu verwirrenden Situationen führen. Stringvariablen und auf einigen 32-Bit-Systemen auch 64-Bit-Integer-Variablen können sogar einen inkonsistenten Zustand bekommen, wenn die Variable gleichzeitig in zwei Tasks geschrieben wird.

Ausnahme

In bestimmten Fällen kann es nötig sein, dass mehrere Tasks eine Variable schreiben. Stellen Sie dann sicher, beispielsweise durch die Verwendung von Semaphoren, dass der Zugriff nicht zu einem inkonsistenten Zustand führt.

Wichtigkeit

Hoch

PLCopen-Regel

CP10

SA0006: Schreibzugriff aus mehreren Tasks 1:

Sehen Sie auch die Regel SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten.

SA0006: Schreibzugriff aus mehreren Tasks 2:

Aufruf entspricht Schreibzugriff

Bitte beachten Sie, dass Aufrufe als Schreibzugriff interpretiert werden. Beispielsweise wird der Aufruf einer Methode für eine Funktionsbausteininstanz als Schreibzugriff auf die Funktionsbausteininstanz angesehen. Eine genauere Analyse der Zugriffe und Aufrufe ist z.B. aufgrund von virtuellen Aufrufen (Zeiger, Interface) nicht möglich.

Wenn Sie die Regel SA0006 für eine Variable (z.B. für eine Funktionsbausteininstanz) deaktivieren möchten, können Sie das folgende Attribut oberhalb der Variablendeklaration einfügen: {attribute 'analysis' := '-6'}

Beispiele:

Die beiden globalen Variablen nVar und bVar werden von zwei Tasks geschrieben.

Globale Variablenliste:

VAR_GLOBAL
    nVar  : INT;
    bVar  : BOOL;
END_VAR

Programm MAIN_Fast, aufgerufen von der Task PlcTaskFast:

nVar := nVar + 1;                // => SA0006 
bVar := (nVar > 10);             // => SA0006

Programm MAIN_Slow, aufgerufen von der Task PlcTaskSlow:

nVar := nVar + 2;                // => SA0006 
bVar := (nVar < -50);            // => SA0006