Reglas de sombreado
En CODESYS, generalmente se le permite usar el mismo identificador para diferentes elementos. Por ejemplo, una POU y una variable pueden tener el mismo nombre. Sin embargo, debe evitar esta práctica para evitar confusiones.
Ejemplo negativo: en el siguiente fragmento de código, una instancia de bloque de función local tiene el mismo nombre que una función:
En un caso como este, no está claro si la instancia o la función se llama en el programa.
FUNCTION YYY : INT ; END_FUNCTION FUNCTION_BLOCK XXX ; END_FUNCTION_BLOCK PROGRAM PLC_PRG VAR YYY : XXX; END_VAR YYY(); END_PROGRAM
Comportamiento del compilador al sombrear
El compilador no informa ningún error o advertencia si se usa el mismo identificador para diferentes elementos. En cambio, el compilador busca el código en un orden específico para la declaración del identificador. Si se encuentra una declaración, el compilador no busca ninguna otra declaración en ningún otro lugar. Si existen otras declaraciones, entonces están "sombreadas" para el compilador. La siguiente sección describe las reglas de sombreado (es decir, el orden de búsqueda que usa el compilador cuando busca la declaración de identificadores). La sección "Acceso ambiguo y acceso calificado" proporciona formas de evitar el acceso ambiguo y evitar las reglas de sombreado.
Cómo prevenir el sombreado
Para asegurarse de que los nombres sean siempre únicos, debe seguir las convenciones de nomenclatura, como ciertos prefijos para las variables.
Para más información, ver: Identificador Designación
Las convenciones de nomenclatura se pueden verificar automáticamente utilizando el análisis de código estático de CODESYS. El análisis de código estático también podría detectar el uso duplicado del nombre YYY
y repórtalo como un error.
También a través del uso consistente del atributo qualified_only
para enumeraciones y listas de variables globales y mediante el uso de bibliotecas calificadas se pueden evitar situaciones no únicas.
Para asegurarse de que una POU del mismo nombre en el Dispositivos vista no se llama cuando una POU en el POU view se llama, el operador __POOL
debe anteponerse cuando se llama el nombre de la POU.
Ejemplo: svar_pou := __POOL.POU();
Orden de búsqueda en la aplicación
Cuando el compilador encuentra un único identificador en el código de una aplicación, busca la declaración correspondiente en el siguiente orden:
Variables locales
Variables locales de un método
Variables locales en el bloque de funciones, programa o función, y en cualquier bloque de funciones base
Métodos locales de la POU
Variables globales en la aplicación, si el
qualified_only
el atributo no está establecido en la lista de variables donde se declaran las variables globalesVariables globales en la aplicación, si el
qualified_only
el atributo no está establecido en la lista de variables donde se declaran las variables globalesVariables globales en una aplicación principal, si el
qualified_only
el atributo no está establecido en la lista de variables donde se declaran las variables globalesVariables globales en bibliotecas referidas cuando ni la biblioteca ni la lista de variables requieren acceso calificado
POU o nombres de tipos
POU o nombres de tipos de la aplicación (es decir, nombres de listas de variables globales, bloques de funciones, etc.)
POU o escriba nombres de una aplicación principal
POU o escriba nombres de una biblioteca
Bibliotecas
Espacios de nombres de bibliotecas referidas localmente y bibliotecas publicadas por bibliotecas
Variables globales en el POU vista, a menos que el
qualified_only
atributo se establece en la lista de variables donde se declaranVariables globales en el POU vista, a menos que el
qualified_only
atributo se establece en la lista de variables donde se declaranPOU o escriba los nombres de la POU vista (es decir, nombres de listas de variables globales, bloques de funciones, etc.)
bibliotecas de POU
Sugerencia
Bibliotecas que se insertan en el Administrador de Bibliotecas del POU vista se reflejan en el Administrador de bibliotecas en todas las aplicaciones del proyecto con la resolución de marcador de posición adecuada. Estas bibliotecas luego forman un espacio de nombres común con las bibliotecas en la aplicación. Por lo tanto, las bibliotecas de la aplicación no ocultan las bibliotecas del grupo.
Orden de búsqueda en la biblioteca
Cuando el compilador encuentra un único identificador en el código de una biblioteca, busca la declaración correspondiente en el siguiente orden:
Variables locales
Variables locales de un método
Variables locales en el bloque de funciones, programa o función, y en cualquier bloque de funciones base
Métodos locales de la POU
Variables globales
Variables globales en la biblioteca local, si el
qualified_only
el atributo no está establecido en la lista de variables donde se declaran las variables globalesVariables globales en bibliotecas referidas cuando ni la biblioteca ni la lista de variables requieren acceso calificado
Bibliotecas
POU o nombres de tipos de la biblioteca local (es decir, nombres de listas de variables globales, bloques de funciones, etc.)
POU o escriba nombres de una biblioteca referida
Espacios de nombres de bibliotecas referidas localmente y bibliotecas publicadas por bibliotecas referidas localmente
Acceso ambiguo y acceso calificado
A pesar de estas órdenes de búsqueda, aún puede ocurrir un acceso ambiguo. Por ejemplo, este es el caso cuando existe una variable con el mismo nombre en dos listas de variables globales que no requieren acceso calificado. Tal caso es reportado por el compilador como un error (por ejemplo: Uso ambiguo del nombre XXX
).
Este tipo de uso ambiguo se puede hacer único mediante un acceso calificado, por ejemplo, accediendo a través del nombre de la lista de variables globales (ejemplo: GVL.XXX
).
El acceso calificado también se puede usar siempre para evitar las reglas de emulación.
El nombre de la lista de variables globales se puede utilizar para acceder de forma exclusiva a una variable de la lista.
El nombre de una biblioteca se puede utilizar para acceder de forma exclusiva a los elementos de la biblioteca.
El
THIS
El puntero se puede usar para acceder de forma única a las variables en un bloque de funciones, incluso si existe una variable local con el mismo nombre en un método del bloque de funciones.
Para encontrar la ubicación de la declaración de un identificador en cualquier momento, use el
mando. Esto puede ser especialmente útil si el compilador produce un mensaje de error aparentemente oscuro.Búsqueda en rutas de instancias
Los órdenes de búsqueda descritos anteriormente no se aplican a los identificadores que existen como componentes en una ruta de instancia ni a los identificadores que se utilizan como entradas en las llamadas.
Para el acceso del siguiente tipo yy.component
, depende de la entidad descrita por yy
donde la declaración de component
se busca.
Si yy
denota una variable con un tipo de datos estructurados (es decir, tipo STRUCT
o UNION
), entonces component
se busca en el siguiente orden:
Variables locales del bloque de funciones
Variables locales del bloque de función base
Métodos del bloque de función
Métodos del bloque de función base
Si yy
denota una lista de variables globales o un programa, entonces component
se busca solo en esta lista.
Si yy
denota un espacio de nombres de una biblioteca, entonces component
se busca en esta biblioteca exactamente como se describe en la sección anterior "Orden de búsqueda en la biblioteca".
Solo en la segunda instancia, el compilador decide si se otorga acceso al elemento encontrado (es decir, si la variable solo es accesible localmente o si un método es privado). Si no se permite el acceso, se emite un error.