Skip to main content

Attribut: no_assign, no_assign_warning

Das Pragma 'no_assign' bewirkt, dass Compilerfehler ausgegeben werden, wenn eine Instanz des Funktionsbausteins einer anderen Instanz desselben Bausteins zugewiesen wird. Solche Zuweisungen sollen oft vermieden werden, wenn der Funktionsbaustein Pointer enthält und Pointer zu Problemen führen, weil sie bei der Wertzuweisung mit kopiert werden.

Das Pragma 'no_assign_warning' bewirkt das Gleiche wie das Pragma 'no_assign' mit dem Unterschied, dass anstelle eines Compilerfehlers eine Compilerwarnung ausgegeben wird.

Syntax:

{attribute 'no_assign'}

Einfügeort: Erste Zeile im Deklarationsteil eines Funktionsbausteins.

Beispiel 281. Beispiel

Zuweisung von Funktionsbausteininstanzen, die Pointer enthalten

In diesem Beispiel wird die Wertzuweisung der Funktionsbaustein-Instanzen zu Problemen bei der Ausführung von fb_exit führen:

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 diesem Fall verwaltet LogRecord eine Liste von Pointern, für die im Fall von fb_exit verschiedene Aktionen ausgeführt werden. Durch die Zuweisung entstehen Probleme, weil fb_exit zweimal ausgeführt werden wird. Sie sollten dies verhindern, indem Sie das Attribut 'no_assign' in der Deklaraton des Funktionsbausteins TestFB hinzufügen:

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

Dann werden die folgenden Compilerfehler ausgegeben:

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

Wenn anstelle des Pragmas no_assign das Pragma no_assign_warning für den Funktionsbaustein TestFB verwendet wird, werden ebenfalls die Meldungen C0328 ausgegeben, jedoch nicht als Compilerfehler, sondern als Compilerwarnung.