Skip to main content

Attributo: no_assign, no_assign_warning

Il pragma 'no_assign' provoca la visualizzazione di errori del compilatore se un'istanza del blocco funzione è assegnata a un'altra istanza dello stesso blocco funzione. Tali assegnazioni devono essere spesso evitate se il blocco funzione contiene puntatori e i puntatori causano problemi, poiché vengono copiati anche durante l'assegnazione del valore.

Il pragma 'no_assign_warning' risulta lo stesso del pragma 'no_assign' con avvisi del compilatore invece di errori del compilatore.

Sintassi:

{attribute 'no_assign'}

Posizione di inserimento: riga superiore nella parte di dichiarazione di un blocco funzione.

Esempio 281. Esempio

Assegnazione di istanze di blocchi funzione contenenti puntatori.

In questo esempio l'assegnazione del valore delle istanze del blocco funzione causerà problemi durante l'esecuzione di fb_exit:

VAR_GLOBAL
    inst1 : TestFB;
    awsBufferLogFile : ARRAY [0..9] OF WSTRING(66);(* Area: 0, Offset: 0x1304 (4868)*)
    LogFile : SEDL.LogRecord := (sFileName := 'LogFile.log', pBuffer := ADR(awsBufferLogFile), udiMaxEntriesFile := UDINT#10000, udiMaxBuffered := UDINT#10, uiLineSize := UINT#64, wsSep := " ", xCircular := TRUE, siDateFormat := SINT#0, siTimeFormat := SINT#0);
END_VAR

PROGRAM PLC_PRG
VAR
    inst2 : TestFB := inst1;
    LogFileNew
END_VAR

In questo caso LogRecord gestisce un elenco di puntatori, per i quali vengono eseguite varie azioni in caso di fb_exit. I problemi derivano dall'incarico, perché fb_exit verrà eseguito due volte. Dovresti impedirlo aggiungendo l'attributo 'no_assign' nella dichiarazione del blocco funzione TestFB:

{attribute 'no_assign'}
FUNCTION_BLOCK TestFB
VAR_INPUT
...

Vengono quindi visualizzati i seguenti errori del compilatore:

C0328: Assignment not allowed for type TestFB
C0328: Assignment not allowed for type LogRecord

Se il pragma no_assign_warning viene utilizzato al posto del pragma no_assign per il blocco funzione TestFB, poi il C0328 il messaggio viene emesso come avviso del compilatore, non come errore del compilatore.