Skip to main content

Finestra di dialogo: Impostazioni progetto: Luce di analisi statica

Simbolo: _cds_icon_stat_analy_light.png

Funzione: La finestra di dialogo attiva i controlli che vengono eseguiti con la versione light di CODESYS Analisi statica ogni codice temporale viene generato.

Chiamata: Progetto → Impostazioni progetto comando, Luce di analisi statica categoria

Suggerimento

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

Per ulteriori informazioni, vedere: Analizza il codice in modo statico

Ulteriori controlli di compilazione

SA0033: variabili non utilizzate

Rileva le variabili dichiarate ma non utilizzate all'interno del codice del programma compilato

Per le variabili GVL: se in un progetto esistono più applicazioni, vengono interessati solo gli oggetti al di sotto dell'applicazione attualmente attiva. Se esiste una sola applicazione, gli oggetti nel file POUs anche la vista è influenzata.

SA0028: Aree di memoria sovrapposte

Rileva le righe di codice in cui due o più variabili riservano la stessa memoria

Ad esempio, ciò si verifica per le seguenti dichiarazioni: var1 AT %QB21: INT e var2 AT %QD5: DWORD. In questo caso, entrambe le variabili utilizzano il byte 21, il che significa che l'intervallo di memoria delle variabili si sovrappone.

SA0006: accesso in scrittura da più task

Rileva le variabili che vengono scritte da più di un'attività

SA0004: Accesso multiplo in scrittura sull'uscita

Rileva gli output scritti in più di una posizione

Nota: non viene emesso un errore quando una variabile di uscita (VAR_IN_OUT) è scritto in diversi rami di IF e CASE dichiarazioni.

Nota: un pragma non può disabilitare questa regola.

SA0027: Usi multipli di identificatori

Rileva più usi di un nome/identificatore per una variabile o un oggetto (POU) nell'ambito di un progetto

. Vengono rilevati i seguenti casi:
  • Il nome di una costante di enumerazione è lo stesso di un'altra enumerazione nell'applicazione o utilizzato in una libreria inclusa.

  • Il nome di una variabile è uguale al nome di un oggetto nell'applicazione o al nome di una libreria integrata.

  • Il nome di una variabile è uguale al nome di una costante di enumerazione in un'enumerazione nell'applicazione o al nome di una libreria integrata.

  • Il nome di un oggetto è uguale al nome di un altro oggetto nell'applicazione.

  • Il nome di una variabile è uguale al nome di un metodo.

  • Il nome di un oggetto è uguale al nome di un oggetto sovraordinato ("oggetto padre").

SA0167: Segnala istanze FunctionBlock temporanee

Il controllo rileva le istanze del blocco funzione dichiarate come variabili temporanee. Ciò influisce sulle istanze dichiarate in un metodo o in una funzione o come VAR_TEMP, e quindi vengono reinizializzati in ogni ciclo di elaborazione o per ogni chiamata POU.

SA0175: Operazione sospetta su stringa

Inattivo per impostazione predefinita

Rileva posizioni di codice sospette per la codifica UTF-8

Sono inclusi i seguenti costrutti:

  • Accesso all'indice a una stringa a byte singolo

    Esempio: str[2]

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

  • Indirizzo di accesso a una stringa a byte singolo

    Esempio: ADR(str)

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

  • Chiamare una funzione stringa della libreria standard tranne CONCAT e LEN

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

  • Valore letterale a byte singolo contenente caratteri non ASCII

    Esempio:

    str := '99€';

    str := 'Ä';

    Messaggio: Operazione sospetta sulla stringa: il valore letterale '<literal>' contiene caratteri non ASCII

A seconda dell'esito del controllo, si consiglia di non abilitare il Codifica UTF8 per STRING opzione di compilazione.

Per ulteriori informazioni, vedere: Opzioni di compilazione

Esempio 544. Esempi

SA0003: dichiarazioni vuote

;
(* Comment *);
iVar;

SA0006: Accesso simultaneo

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;

SA0004: Accesso multiplo in scrittura sull'uscita

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

SA0006: accesso in scrittura da più task

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;

SA0027: Uso multiplo del nome

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

SA0029: Notazione in codice diversa dalla dichiarazione

UN PLC_PRG POU e a fnc (funzione) POU esiste nell'albero dei dispositivi.

PROGRAM PLC_PRG
VAR
    iVar:INT;
    _123test_var_: INT;
END_VAR
ivar := iVar + 1; // notation different to that in the declaration part ->   SA0029
_123TEST_var_ := _123test_var_INT; // notation different to that in the declaration part ->   SA0029
Fnc(); // notation different to that in the devices tree ->   SA0029

SA0167: Segnala istanze FunctionBlock temporanee

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


Per ulteriori informazioni, vedere: Analizza il codice in modo statico