Attributes no_assign, no_assign_warning

Panoramica

Inserire il pragma {attribute 'no assign'} come prima riga della parte di dichiarazione di un blocco funzione. A causa di ciò, gli errori di compilazione nella vista Messaggi 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.

NOTA: Utilizzare {attribute 'no assign'} nei blocchi funzione con puntatori interni per evitare di assegnare un'istanza del blocco funzione a un'altra istanza dello stesso blocco funzione.

Il pragma 'no_assign_warning' ha le stesse funzioni di pragma 'no assign' ma emette gli avvisi rilevati come categoria avvertimenti nella vista Messaggi.

Assegnazione di istanze del blocco funzione contenenti puntatori

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 avvertimento nella vista Messaggi.