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.

Pragmas und Attribute 1:

Regeln, die in den Projekteigenschaften deaktiviert sind, können Sie auch nicht über ein Pragma oder Attribut aktivieren.

Pragmas und Attribute 2:

Regel SA0004 kann nicht über ein Pragma oder Attribut deaktiviert werden.

Pragmas und Attribute 3:

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

 

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:

Syntax:

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:

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:

Syntax:

{attribute 'naming' := '<off|on|omit>'}

Beispiel:

Angenommen wird, dass folgende Namenskonventionen definiert sind:

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 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