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