Skip to main content

Atributo: no_assign, no_assign_warning

el pragma 'no_assign' da como resultado que se muestren errores del compilador si una instancia del bloque de funciones se asigna a otra instancia del mismo bloque de funciones. Este tipo de asignaciones a menudo se deben evitar si el bloque de función contiene punteros y los punteros dan lugar a problemas, ya que también se copian durante la asignación de valores.

el pragma 'no_assign_warning' da como resultado lo mismo que para el pragma 'no_assign' con advertencias del compilador en lugar de errores del compilador.

Sintaxis:

{attribute 'no_assign'}

Insertar ubicación: Línea superior en la parte de declaración de un bloque de funciones.

ejemplo 281. Ejemplo

Asignación de instancias de bloques de funciones que contienen punteros.

En este ejemplo, la asignación de valores de las instancias del bloque de funciones dará lugar a problemas durante la ejecución de 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
END_VAR

En este caso LogRecord gestiona una lista de punteros, para los cuales se ejecutan diversas acciones en el caso de fb_exit. Los problemas surgen debido a la asignación, porque fb_exit se ejecutará dos veces. Debe evitar esto agregando el atributo 'no_assign' en la declaración del bloque de función TestFB:

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

A continuación, se muestran los siguientes errores del compilador:

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

Si el pragma no_assign_warning se usa en lugar del pragma no_assign para el bloque de funciones TestFB, entonces la C0328 El mensaje se emite como una advertencia del compilador, no como un error del compilador.