Projekteinstellungen – Einfache statische Analyse

Überblick

Statische Analyse in EcoStruxure Machine Expert bedeutet, dass der Quellcode erst auf Abweichungen hinsichtlich bestimmter Programmierrichtlinien durchsucht wird, bevor ein Projekt ohne Generierungsfehler in das Zielsystem heruntergeladen werden kann. Zu diesem Zweck kann in den Projekteinstellungen ein Satz zu beachtender Regeln konfiguriert werden. Bei einer Codegenerierung wird dann eine automatische Überprüfung anhand dieser definierten Regeln durchgeführt.

HINWEIS: Sie können Codezeilen aus der statischen Codeanalyse ausschließen, indem Sie den Code mit dem Pragma {analysis ...} oder dem Pragma {attribute 'analysis' := '...'} kennzeichnen.

Die Ergebnisse der Analyse werden als Fehler in der Ansicht Meldungen mit dem Präfix SA angezeigt.

HINWEIS: Es wird nur der Anwendungscode des Projekts analysiert. Bibliotheken werden nicht berücksichtigt. Für Variablen der GVL (Globale Variablenliste) gilt, dass wenn im Projekt mehrere Anwendungen vorhanden sind, nur die Objekte unter der aktiven Anwendung analysiert werden. Wenn nur eine Anwendung vorhanden ist, werden auch die Objekte im allgemeinen Pool der POUs analysiert.

Nicht verwendete Variablen (SA0033):

Zur Erkennung von Variablen, die deklariert, jedoch im kompilierten Programmcode nicht verwendet wurden.

Überlagernde Speicherbereiche (SA0028):

Zur Erkennung der Zuweisung von zwei oder mehr Variablen zum gleichen Speicherbereich.

Dies ist beispielsweise bei folgenden Deklarationen der Fall: var1 AT %QB21: INT und var2 AT %QD5: DWORD. In diesem Fall verwenden beide Variablen Byte 21, was dazu führt, dass sich die Speicherbereiche der Variablen überlagern.

Schreibzugriff von mehreren Tasks (SA0006):

Zur Erkennung von Variablen, die von mehr als einer Task geschrieben werden.

Beispiel (SA0006):

FUNCTION_BLOCK ADD_FB
g_iTemp1 := g_iTemp1 + INT#1;
PROGRAM PLC_PRG  //controlled by MainTask
g_iTemp1 := g_iTemp1 + INT#2;
g_xTemp2 := g_iTemp1 > INT#10;
PROGRAM PLC_PRG_1  //controlled by SubTask
g_iTemp1 := g_iTemp1 - INT#3;
g_xTemp2 := g_iTemp1 < INT#-10;

Mehrfacher Schreibzugriff auf (SA0004):

Zur Erkennung von Ausgängen, die auf mehr als eine Position geschrieben wurden.

Beispiel (SA0004):

VAR_GLOBAL
    g_xVar AT %QX0.0 : BOOL ; 
    g_iTest AT %QW0 : INT ;
END_VAR
PROGRAM PLC_PRG
IF iCondition < INT#0 THEN
    g_xVar := TRUE;
    g_iTest := INT#12;
END_IF
CASE iCondition OF
    INT#1:
        g_xVar := FALSE;
    INT#2:
        g_iTest := INT#11;
    ELSE
        g_xVar := TRUE;
        g_iTest := INT#9;
END_CASE

Mehrfache Verwendung von Bezeichnern (SA0027):

Zur Erkennung einer Mehrfachverwendung eines Namens/Bezeichners für eine Variable oder ein Objekt (POU) innerhalb des Anwendungsbereichs eines Projekts.

Die folgenden Fälle werden erkannt:

  • Der Name einer Aufzählungskonstante ist identisch mit dem in einer anderen Aufzählung in der Anwendung oder in einer enthaltenen Bibliothek.

  • Der Name einer Variablen ist identisch mit dem eines Objekts in der Anwendung oder in einer enthaltenen Bibliothek.

  • Der Name einer Variablen ist identisch mit dem einer Aufzählungskonstante in der Anwendung oder in einer enthaltenen Bibliothek.

  • Der Name eines Objekts ist identisch mit dem eines Objekts in der Anwendung.

  • Der Name einer Variablen ist identisch mit dem Namen einer Methode.

  • Der Name eines Objekts ist identisch mit dem eines übergeordneten Objekts.

Beispiel (SA0027):

PROGRAM PLC_PRG
VAR
ton : INT;     // error SA0027
END_VAR

Die Standardbibliothek ist im Projekt enthalten und stellt den Funktionsbaustein TON zur Verfügung, was zu einer Mehrfachnutzung eines Namens führt.

Temporäre Funktionsbausteininstanzen (SA0167):

Mit dem Test werden Funktionsbausteininstanzen erkannt, die als temporäre Variablen deklariert sind. Dies gilt für Instanzen, die in einer Methode, in einer Funktion oder als VAR_TEMP deklariert werden und daher in jedem Verarbeitungszyklus und für jeden POU-Aufruf neu initialisiert werden.

Beispiel (SA0167):

PROGRAM PLC_PRG
VAR
END_VAR
VAR_TEMP
    yafb: AFB;
END_VAR
FUNCTION Fun : INT
VAR_INPUT
END_VAR
VAR
    funafb: AFB;
END_VAR
METHOD METH : INT
VAR_INPUT
END_VAR
VAR
    methafb: AFB;
END_VAR
HINWEIS: AFB ist ein Funktionsbaustein.