Attributes no_assign, no_assign_warning

Überblick

Fügen Sie das pragma {attribute 'no assign'} als erste Zeile der Deklaration des Funktionsbausteins ein. Das hat zur Folge, dass Kompilierungsfehler in der Ansicht MeldungenSoMMenu/index.htm ausgegeben werden, wenn eine Instanz des Funktionsbausteins einer anderen Instanz desselben Funktionsbausteins zugewiesen wird. Eine solche Zuweisung möchte man beispielsweise vermeiden, wenn der Funktionsbaustein Zeiger enthält. In einem solchen Fall könnten Probleme auftreten, da die Zeiger kopiert werden, wenn Werte zugewiesen werden.

HINWEIS: Verwenden Sie {attribute 'no assign'} in Funktionsbausteinen mit internen Zeigern, um die Zuweisung einer Instanz des Funktionsbausteins zu einer anderen Instanz desselben Funktionsbausteins zu vermeiden.

Das Pragma 'no_assign_warning' hat dieselben Funktion wie das pragma 'no assign', gibt jedoch Alarme der Kategorie Warnungen in der Ansicht MeldungenSoMMenu/index.htm aus.

Zuweisung von Funktionsbausteininstanzen mit Zeigern

In diesem Beispiel führt die Wertzuweisung der Funktionsbausteininstanzen zu Problemen, wenn fb_exit ausgeführt wird:

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 diesem Fall verwaltet LogRecord eine Liste mit Zeigern. Für sie werden verschiedene Aktionen ausgeführt, falls fb_exit zutrifft. Wenn Sie Funktionsbausteininstanzen zuweisen, wird fb_exit zweimal ausgeführt. Dies führt zu einem Problem. Vermeiden Sie dies, indem Sie das Attribut no_assign zur Deklaration des Funktionsbausteins TestFB hinzufügen:

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

Wenn das pragma {attribute 'no assign'} verwendet wird, werden folgende Kompilierungsfehler ausgegeben:

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

Wenn das pragma no assign_warning für den Funktionsbaustein TestFB eingesetzt wird, werden ebenfalls die C0328-Meldungen ausgegeben, jedoch in der Kategorie Warnung der Ansicht MeldungenSoMMenu/index.htm.