Skip to main content

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

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:

  1. Variables locales

    1. Variables locales de un método

    2. Variables locales en el bloque de funciones, programa o función, y en cualquier bloque de funciones base

    3. Métodos locales de la POU

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

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

    2. Variables 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 globales

    3. Variables globales en bibliotecas referidas cuando ni la biblioteca ni la lista de variables requieren acceso calificado

  3. POU o nombres de tipos

    1. POU o nombres de tipos de la aplicación (es decir, nombres de listas de variables globales, bloques de funciones, etc.)

    2. POU o escriba nombres de una aplicación principal

    3. POU o escriba nombres de una biblioteca

  4. Bibliotecas

    1. Espacios de nombres de bibliotecas referidas localmente y bibliotecas publicadas por bibliotecas

  5. Variables globales en el POU vista, a menos que el qualified_only atributo se establece en la lista de variables donde se declaran

    1. Variables globales en el POU vista, a menos que el qualified_only atributo se establece en la lista de variables donde se declaran

    2. POU o escriba los nombres de la POU vista (es decir, nombres de listas de variables globales, bloques de funciones, etc.)

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

  1. Variables locales

    1. Variables locales de un método

    2. Variables locales en el bloque de funciones, programa o función, y en cualquier bloque de funciones base

    3. Métodos locales de la POU

  2. Variables globales

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

    2. Variables globales en bibliotecas referidas cuando ni la biblioteca ni la lista de variables requieren acceso calificado

  3. Bibliotecas

    1. POU o nombres de tipos de la biblioteca local (es decir, nombres de listas de variables globales, bloques de funciones, etc.)

    2. POU o escriba nombres de una biblioteca referida

    3. 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 Editar → Examinar → Ir a definición 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.