Impostazioni progetto - Luce analisi statica

Panoramica

Analisi statica in EcoStruxure Machine Expert significa che prima di poter scaricare un progetto nel sistema di destinazione senza errori di compilazione, vengono ricercate nel codice sorgente possibili deviazioni da specifiche regole di codifica. A questo scopo, nelle impostazioni di progetto è possibile configurare un set di regole da rispettare. A ogni generazione del codice viene eseguita una verifica automatica in base alle regole definite.

NOTA: È possibile escludere righe di codice dall'analisi del codice statico contrassegnando il codice con il pragma {analysis ...} o il pragma {attribute 'analysis' := '...'}.

I risultati dell'analisi vengono visualizzati come errori nella vista Messaggi con il prefisso SA.

NOTA: L'analisi viene eseguita solo sul codice dell'applicazione del progetto. Le librerie non vengono prese in considerazione. Per le variabili GVL (Global Variable List), se vi sono più applicazioni nel progetto, vengono analizzati solo gli oggetti sotto l'oggetto attivo. Se vi è solo un'applicazione, vengono analizzati gli oggetti che fanno parte del set comune di POU.

Variabili non utilizzate (SA0033):

Per rilevare le variabili dichiarate ma non utilizzate nel codice di programma compilato.

Aree di memoria sovrapposte (SA0028):

Per rilevare l'allocazione di due o più variabili alla stessa posizione di memoria.

Ad esempio, questo si verifica se vi sono le seguenti dichiarazioni: var1 AT %QB21: INT e var2 AT %QD5: DWORD. In questo caso, entrambe le variabili utilizzano il byte 21 e quindi le aree di memoria delle variabili risultano sovrapposte.

Accesso contemporaneo (SA0006):

Per rilevare le variabili scritte da più di un task.

Esempio (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;

Accesso in scrittura multipla sull'uscita (SA0004):

Per rilevare le uscite che vengono scritte in più di una posizione.

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

Uso multiplo del nome (SA0027):

Per rilevare l'uso multiplo di un nome/identificatore di una variabile o di un oggetto (POU) nell'ambito di un progetto.

Possono presentarsi i seguenti casi:

  • Il nome di una costante di enumerazione è uguale a quello utilizzato in un'altra enumerazione dell'applicazione o in una libreria inclusa.

  • Il nome di una variabile è uguale a quello di un oggetto dell'applicazione o di una libreria inclusa.

  • Il nome di una variabile è uguale a quello di una costante di enumerazione dell'applicazione o di una libreria inclusa.

  • Il nome di un oggetto è uguale a quello di un oggetto dell'applicazione.

  • Il nome di una variabile è uguale a quello di un metodo.

  • Il nome di un oggetto è uguale a quello di un oggetto superordinato (oggetto principale).

Esempio (SA0027):

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

Standard.library è inclusa nel progetto e fornisce il blocco funzione TON che provoca l’uso multiplo di un nome.

Segnala istanze temporanee del blocco funzione (SA0167):

Questo test segnala le istanze dei blocchi funzione dichiarate come variabili temporanee. Questo vale per le istanze dichiarate in un metodo o in una funzione o come VAR_TEMP e che sono pertanto reinizializzate in ogni ciclo di elaborazione e per ogni chiamata di POU.

Esempio (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
NOTA: AFB è un blocco funzione.

Operazione sospetta sulla stringa (SA0175):

Per impostazione predefinita, il test è inattivo.

Eseguirlo per cercare nel codice i costrutti seguenti che possono causare problemi con la codifica UTF-8:

  • Accesso tramite indice a una stringa a byte singolo

    Esempio: str[2]

    Messaggio: Operazione sospetta sulla stringa: Accesso all’indice '<espressione>'

  • Accesso all’indirizzo a una stringa a byte singolo

    Esempio: ADR(str)

    Messaggio: Operazione sospetta sulla stringa: Possibile accesso all’indice '<espressione>'

  • Chiamata di una funzione stringa della libreria Standard tranne CONCAT e LEN

    Messaggio: Operazione sospetta sulla stringa: Possibile accesso all’indice '<espressione>'

  • Letterale a byte singolo contenente caratteri non ASCII

    Esempio:

    str := '99€';
    str := 'Ä';

    Messaggio: Operazione sospetta sulla stringa: Il letterale '<letterale>' contiene caratteri non ASCII

Valutare i risultati e stabilire attentamente se abilitare la codifica UTF-8 a livello di progetto (con il parametro Codifica UTF8 per STRING nella finestra di dialogo Impostazioni progetto > Opzioni del compilatore).