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