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