Pragmas und Attribute
Ein Pragma und verschiedene Attribute sind verfügbar, um beispielsweise einzelne Regeln oder Namenskonventionen für die Statische Analyse temporär auszuschalten, also um bestimmte Codezeilen oder Programmeinheiten aus der Prüfung auszuklammern.
Voraussetzung: Sie haben die Regeln oder Konventionen in den SPS-Projekteigenschaften aktiviert bzw. definiert. Sehen Sie hierzu:
Attribute werden im Deklarationsteil eines Programmierbausteins eingefügt, um bestimmte Regeln für ein gesamtes Programmierobjekt abzuschalten.
Pragmas werden im Implementierungsteil eines Programmierbausteins verwendet, um bestimmte Regeln für einzelne Codezeilen abzuschalten. Ausnahme ist die Regel SA0164, die auch im Deklarationsteil per Pragma abgeschaltet werden kann.
Regeln, die in den Projekteigenschaften deaktiviert sind, können Sie auch nicht über ein Pragma oder Attribut aktivieren. |
Regel SA0004 kann nicht über ein Pragma oder Attribut deaktiviert werden. |
Pragmas im Implementierungseditor Wenn Sie ein Pragma im Implementierungseditor verwenden möchten, ist dies aktuell im ST- sowie im FUP/KOP/AWL-Editor möglich. In FUP/KOP/AWL muss das gewünschte Pragma in eine Sprungmarke eingetragen werden. |
Sehen Sie im Folgenden eine Übersicht sowie eine detaillierte Beschreibung der verfügbaren Pragmas und Attribute.
Übersicht
- Pragma {analysis ...}
- zur Ausschaltung von Kodierregeln im Implementierungsteil
- für einzelne Codezeilen anwendbar
- Attribut {attribute 'no-analysis'}
- zum Ausschluss von Programmierobjekten (z.B. POU, GVL, DUT) von der Statischen Analyse (Kodierregeln, Namenskonventionen, unzulässige Symbole)
- nur für ganze Programmierobjekte anwendbar
- Attribut {attribute 'analysis' := '...'}
- zur Ausschaltung von Kodierregeln im Deklarationsteil
- für einzelne Deklarationen oder für ganze Programmierobjekte anwendbar
- Attribut {attribute 'naming' := '...'}
- zur Ausschaltung von Namenskonventionen im Deklarationsteil
- für einzelne Deklarationen oder für ganze Programmierobjekte anwendbar
- Attribut {attribute 'nameprefix' := '...'}
- zur Definition von Präfixen für Instanzen eines strukturierten Datentyps
- im Deklarationsteil eines strukturierten Datentyps anwendbar
- Attribut {attribute 'analysis:report-multiple-instance-calls'}
- zur Festlegung, dass eine Funktionsbaustein-Instanz nur einmal aufgerufen werden soll
- im Deklarationsteil eines Funktionsbausteins anwendbar
Detaillierte Beschreibung
Pragma {analysis ...}
Das Pragma {analysis -/+<Regelnummer>} können Sie im Implementierungsteil eines Programmierbausteins verwenden, um einzelne Kodierregeln für die nachfolgenden Codezeilen auszuschalten. Sie deaktivieren Codierregeln durch die Angabe der Regelnummern und einem vorangestellten Minuszeichen (“-”). Zur Aktivierung wird ein Pluszeichen (“+”) vorangestellt. Mit Hilfe einer Kommaseparierung können Sie im Pragma beliebig viele Regeln angeben.
Einfügeort:
- Deaktivierung von Regeln: Im Implementierungsteil vor der ersten Codezeile, ab der die Codeanalyse deaktiviert wird, mit {analysis - ...}.
- Aktivierung von Regeln: Nach der letzten Zeile der Deaktivierung mit {analysis + ...}.
- Für die Regel SA0164 kann das Pragma auch im Deklarationsteil vor einem Kommentar eingefügt werden.
Syntax:
- Deaktivierung von Regeln:
- eine Regel: {analysis -<Regelnummer>}
- mehrere Regeln: {analysis -<Regelnummer>, -<weitere Regelnummer>, -<weitere Regelnummer>}
- Aktivierung von Regeln:
- eine Regel: {analysis +<Regelnummer>}
- mehrere Regeln: {analysis +<Regelnummer>, +<weitere Regelnummer>, +<weitere Regelnummer>}
Beispiele:
Sie möchten Regel 24 (nur getypte Literale erlaubt) für eine Zeile deaktivieren (d.h. es ist in diesen Zeilen nicht nötig, "nTest := DINT#99" zu schreiben) und danach wieder aktivieren:
{analysis -24}
nTest := 99;
{analysis +24}
nVar := INT#2;
Angabe mehrerer Regeln:
{analysis -10, -24, -18}
Attribut {attribute 'no-analysis'}
Das Attribut {attribute 'no-analysis'} können Sie verwenden, um ein gesamtes Programmierobjekt von der Prüfung durch die Statische Analyse auszuschließen. Für dieses Programmierobjekt wird die Prüfung der Kodierregeln, der Namenskonventionen und der unzulässigen Symbole nicht durchgeführt.
Einfügeort:
oberhalb der Deklaration eines Programmierobjekts
Syntax:
{attribute 'no-analysis'}
Beispiele:
{attribute 'qualified_only'}
{attribute 'no-analysis'}
VAR_GLOBAL
…
END_VAR
{attribute 'no-analysis'}
PROGRAM MAIN
VAR
…
END_VAR
Attribut {attribute 'analysis' := '...'}
Das Attribut {attribute 'analysis' := '-<Regelnummer>'} können Sie verwenden, um bestimmte Regeln für einzelne Deklarationen oder für ein ganzes Programmierobjekt abzuschalten. Sie deaktivieren die Kodierregel durch die Angabe der Regelnnummer(n) und einem vorangestellten Minuszeichen. Sie können im Attribut beliebig viele Regeln angeben.
Einfügeort:
oberhalb der Deklaration eines Programmierobjekts oder in der Zeile oberhalb einer Variablendeklaration
Syntax:
- eine Regel: {attribute 'analysis' := '-<Regelnummer>'}
- mehrere Regeln: {attribute 'analysis' := '-<Regelnummer>, -<weitere Regelnummer>, -<weitere Regelnummer>'}
Beispiele:
Sie möchten Regel 33 (Nicht verwendete Variablen) für alle Variablen der Struktur ausschalten.
{attribute 'analysis' := '-33'}
TYPE ST_Sample :
STRUCT
bMember : BOOL;
nMember : INT;
END_STRUCT
END_TYPE
Sie möchten die Prüfung von Regel 28 (Überlappende Speicherbereiche) und von Regel 33 (Nicht verwendete Variablen) für die Variable nVar1 ausschalten.
PROGRAM MAIN
VAR
{attribute 'analysis' := '-28, -33'}
nVar1 AT%QB21 : INT;
nVar2 AT%QD5 : DWORD;
nVar3 AT%QB41 : INT;
nVar4 AT%QD10 : DWORD;
END_VAR
Sie möchten Regel 6 (Gleichzeitiger Zugriff) für eine globale Variable ausschalten, sodass keine Fehlermeldung generiert wird, wenn die Variable von mehr als einer Task geschrieben wird.
VAR_GLOBAL
{attribute 'analysis' := '-6'}
nVar : INT;
bVar : BOOL;
END_VAR
Attribut {attribute 'naming' := '...'}
Das Attribut {attribute 'naming' := '...'} können Sie im Deklarationsteil verwenden, um einzelne Deklarationszeilen von der Prüfung auf Einhaltung der aktuell gültigen Namenskonventionen auszuschließen.
Einfügeort:
- Deaktivierung: im Deklarationsteil oberhalb der betreffenden Zeilen
- Aktivierung: Nach der letzten Zeile der Deaktivierung
Syntax:
{attribute 'naming' := '<off|on|omit>'}
- off, on: die Prüfung wird für alle Zeilen zwischen der "off" und der "on" Anweisung ausgeschaltet
- omit: nur die nachfolgende Zeile wird von der Prüfung ausgenommen
Beispiel:
Angenommen wird, dass folgende Namenskonventionen definiert sind:
- Die Kennzeichner von INT-Variablen müssen mit einem Präfix "n" versehen sein (Namenskonvention NC0014), beispielsweise "nVar1".
- Funktionsbausteinnamen müssen mit "FB_" beginnen (Namenskonvention NC0103), beispielsweise "FB_Sample".
Für den unten dargestellte Code gibt die statische Analyse dann nur Meldungen zu folgenden Variablen aus: cVar, aVariable, bVariable.
PROGRAM MAIN
VAR
{attribute 'naming' := 'off'}
aVar : INT;
bVar : INT;
{attribute 'naming' := 'on'}
cVar : INT;
{attribute 'naming' := 'omit'}
dVar : INT;
fb1 : SampleFB;
fb2 : FB;
END_VAR
{attribute 'naming' := 'omit'}
FUNCTION_BLOCK SampleFB
…
{attribute 'naming' := 'off'}
FUNCTION_BLOCK FB
VAR
{attribute 'naming' := 'on'}
aVariable : INT;
bVariable : INT;
…
Attribut {attribute 'nameprefix' := '...'}
Das Attribut {attribute 'nameprefix' := '...'} definiert ein Präfix für Variablen eines strukturierten Datentyps. Dann gilt die Namenskonvention, dass Bezeichner von Instanzen dieses Typs dieses Präfix besitzen müssen.
Einfügeort:
oberhalb der Deklaration eines strukturierten Datentyps
Syntax:
{attribute ‘nameprefix’ := '<prefix>'}
Beispiel:
In der Kategorie Namenskonventionen der SPS-Projekteigenschaften sind die folgenden Namenskonventionen definiert:
- Variablen vom Typ einer Struktur (NC0032): st
- Strukturen (NC0151): ST_
Variablen des Typs "ST_Point" sollen hingegen nicht mit dem Präfix "st", sondern mit dem Präfix "pt" beginnen.
Im folgenden Beispiel wird die Statische Analyse eine Meldung für "a1" und "st1" vom Typ "ST_Point" ausgeben, weil die Variablennamen nicht mit "pt" beginnen. Für die Variablen vom Typ "ST_Test" wird hingegen der Präfix "st" erwartet.
TYPE ST_Test :
STRUCT
…
END_STRUCT
END_TYPE
{attribute 'nameprefix' := 'pt'}
TYPE ST_Point :
STRUCT
x : INT;
y : INT;
END_STRUCT
END_TYPE
PROGRAM MAIN
VAR
a1 : ST_Point; // => Invalid variable name 'a1'. Expect prefix 'pt'
st1 : ST_Point; // => Invalid variable name 'st1'. Expect prefix 'pt'
pt1 : ST_Point;
a2 : ST_Test; // => Invalid variable name 'a2'. Expect prefix 'st'
st2 : ST_Test;
pt2 : ST_Test; // => Invalid variable name 'st2'. Expect prefix 'st'
END_VAR
Attribut {attribute 'analysis:report-multiple-instance-calls'}
Das Attribut {attribute 'analysis:report-multiple-instance-calls'} kennzeichnet einen Funktionsbaustein für eine Prüfung auf Regel 105: Nur bei Funktionsbausteinen mit diesem Attribut wird geprüft, ob die Instanzen des Funktionsbausteins mehrfach aufgerufen werden. Wenn die Regel 105 in der Kategorie Regeln in den SPS-Projekteigenschaften deaktiviert ist, hat das Attribut keine Auswirkung.
Einfügeort:
oberhalb der Deklaration eines Funktionsbausteins
Syntax:
{attribute 'analysis:report-multiple-instance-calls'}
Beispiel:
Im folgenden Beispiel wird die Statische Analyse einen Fehler für fb2 ausgeben, weil die Instanz mehr als einmal aufgerufen wird.
Funktionsbaustein FB_Test1 ohne Attribut:
FUNCTION_BLOCK FB_Test1
…
Funktionsbaustein FB_Test2 mit Attribut:
{attribute 'analysis:report-multiple-instance-calls'}
FUNCTION_BLOCK FB_Test2
…
Programm MAIN:
PROGRAM MAIN
VAR
fb1 : FB_Test1;
fb2 : FB_Test2;
END_VAR
fb1();
fb1();
fb2(); // => SA0105: Instance 'fb2' called more than once
fb2(); // => SA0105: Instance 'fb2' called more than once