Attributes no_assign, no_assign_warning
Inserire il pragma {attribute 'no assign'} come prima riga della parte di dichiarazione di un blocco funzione. A causa di ciò, gli di compilazione nella vista vengono generati se un'istanza del blocco funzione è assegnata a un'altra istanza dello stesso blocco funzione. Ad esempio, è possibile evitare tali assegnazioni se il blocco funzione contiene puntatori. Ciò potrebbe provocare problemi poiché vengono copiati quando sono assegnati i valori.
Il pragma 'no_assign_warning'
ha le stesse funzioni di pragma 'no assign' ma emette gli avvisi rilevati come categoria nella vista .
In questo esempio, l'assegnazione del valore delle istanze del blocco funzione provoca problemi quando si esegue 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 : LogRecord := LogFile;
END_VAR
In questo caso, LogRecord
gestisce un elenco di puntatori. Vengono eseguite diverse azioni per essi se si applica fb_exit
. Quando si assegnano istanze del blocco funzione, fb_exit
viene eseguito due volte, provocando un errore. Impedire questa situazione aggiungendo l'attributo no_assign
alla dichiarazione del blocco funzione TestFB
:
{attribute 'no_assign'}
FUNCTION_BLOCK TestFB
VAR_INPUT
...
Quando viene utilizzato pragma {attribute 'no assign'}, vengono segnalati i seguenti errori di compilazione:
C0328: Assignment not allowed for type TestFB
C0328: Assignment not allowed for type LogRecord
Se il pragma no assign_warning viene utilizzato per il blocco funzione TestFB
, vengono emessi anche i messaggi C0328
, ma come categoria nella vista .