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 |
![]() | Sehen Sie auch die Regel SA0103: Gleichzeitiger Zugriff auf nicht-atomare Daten. |
![]() | 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_VARProgramm MAIN_Fast, aufgerufen von der Task PlcTaskFast:
nVar := nVar + 1; // => SA0006
bVar := (nVar > 10); // => SA0006Programm MAIN_Slow, aufgerufen von der Task PlcTaskSlow:
nVar := nVar + 2; // => SA0006
bVar := (nVar < -50); // => SA0006