Skip to main content

Variable: VAR_GENERIC CONSTANT

Variable constante genérica

Visión general

El VAR_GENERIC la extensión proporciona soporte para constantes genéricas en tiempo de compilación en bloques de funciones. Esto permite la creación de bloques de funciones flexibles y reutilizables que se pueden adaptar a diferentes configuraciones (por ejemplo, tamaños de búfer o rangos fijos) sin confiando en la asignación dinámica de memoria.

Esta función es especialmente útil para los bloques de funciones que administran matrices u otras estructuras de memoria. Además, permite crear diseños optimizados para el rendimiento, que no admiten errores de escritura y que se resuelven completamente en el momento de

Una constante genérica es una variable en VAR_GENERIC CONSTANT alcance de un bloque de funciones. La variable se define solo cuando se declara la instancia del bloque de funciones.

Se permite el uso de constantes genéricas en los métodos. Esto puede resultar particularmente útil en VAR_IN_OUT o VAR_IN_OUT CONSTANT alcance.

Sintaxis de la declaración de tipo

Declaración

Sintaxis de la declaración de tipo de un bloque funcional con constantes genéricas

FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
    <generic constant name> : <integer data type> := <initial value> ; //Initial value will be overwritten
END_VAR

<function block name>

Nombre del bloque de funciones

VAR_GENERIC CONSTANT

END_VAR

Alcance de las constantes genéricas

Puede declarar cualquier número de constantes genéricas en VAR_GENERIC CONSTANT alcance.

<generic constant name>

Nombre de variable de las constantes genéricas

: <integer data type>

Construye el tipo de la constante genérica.

Se permite un tipo de datos entero o el subámbito de un tipo de datos entero.

Ejemplo:

maxlen1 : INT := 4;

maxlen2 : INT(5..10) := 5;

:= <initial value>

Opcional

Inicialización

Importante

El valor inicial solo es necesario para las comprobaciones de compilación. En tiempo de ejecución, el valor se sobrescribe

Ejemplo:

FUNCTION BLOCK FB
VAR_GENERIC CONSTANT
    size : INT;
END_VAR
VAR
    buffer : ARRAY[0..size] OF BYTE;
END_VAR

Instanciación

Un módulo de función con constantes genéricas se puede instancia explícitamente como una expresión o implícitamente mediante una transferencia de parámetros literal.

Se aplica lo siguiente:

  • La parte del paso del parámetro que afecta al VAR_GENERIC CONSTANT el alcance se incluye entre corchetes angulares.

  • Los bloques de funciones genéricas se deben instancia con parámetros para todas variables genéricas. La transferencia de parámetros debe estar completa. No se permite una especificación parcial, lo que generará un error.

  • Todos los parámetros se especifican explícitamente o todos se especifican implícitamente. No se permite una combinación de especificaciones explícitas e implícitas

    • Implícito

      Cuando se pasan parámetros para varias variables genéricas, los valores deseados se deben unir como literales y separados por comas en el orden en que se declararon en VAR_GENERIC CONSTANT alcance.

      <5,10>
    • Explícito con nombre

      Cuando se pasan parámetros para varias variables genéricas, todos los parámetros deseados se deben unir como una expresión entre corchetes y separados por comas en gratis pedido. Como de costumbre, una expresión se incluye entre paréntesis

      La expresión asigna un literal, una variable o una expresión a la constante genérica nombrada mediante el operador de asignación :=. Es importante incluir esta transferencia explícita de parámetros entre paréntesis

      <(Array2Size := 10), (Array1Size := 5)>

      La ventaja es que la transferencia de parámetros es fácilmente legible y, por lo tanto, rastreable y fácil de mantener después de los cambios.

  • Si se han declarado más variables, se les deben pasar parámetros adicionales. Uso del operador de asignación :=, están encadenados y entre paréntesis.

ejemplo 91. Ejemplo

Bloque de funciones FB con constantes genéricas

FUNCTION_BLOCK FB
VAR_GENERIC CONSTANT
    Array1Size : INT := 0;
    Array2Size : INT := 0;
END_VAR
VAR_INPUT
    MyArray1 : ARRAY[0..Array1Size-1] OF REAL;
    MyArray2 : ARRAY[0..Array2Size-1] OF REAL;
END_VAR
VAR
    SomeOtherParameter : INT;
END_VAR


ejemplo 92. Ejemplo

Instanciación del bloque de funciones FB con un simple paso de parámetros.

PROGRAM PLC_PRG
VAR
    MyFB1 : FB<5,10> := (SomeOtherParameter:=20);
END_VAR

VAR
    liArray1Size: LINT;
END_VAR
liArray1Size := UPPER_BOUND(MyFB1.MyArray1,1) + 1;


ejemplo 93. Ejemplo

Instancia de bloque de funciones MyFB2 con paso de parámetros explícito

PROGRAM PLC_PRG
VAR
    MyFB1 : FB<5,10> := (SomeOtherParameter:=20);
    MyFB2 : FB<(Array2Size:=10), (Array1Size:=5)> := (SomeOtherParameter := 10);
END_VAR

VAR
    Array1Size, Array2Size : LINT;
END_VAR
Array1Size := UPPER_BOUND(MyFB1.MyArray1,1) + 1;
Array2Size := UPPER_BOUND(MyFB1.MyArray2,1) + 1;


Herencia con constantes genéricas

Las constantes genéricas también se pueden pasar a bloques de funciones básicas mediante herencia.

Uso de constantes en un bloque funcional

La constante se puede usar en un bloque de función como cualquier otra constante (por ejemplo, en matrices o en declaraciones de cadenas). Se puede usar en métodos, propiedades o acciones del bloque de funciones, pero no se puede acceder a ella de forma externa. Esto significa que se comporta como una variable privada

Comprobaciones previas a la compilación

Como el valor final de las constantes genéricas no está disponible en el bloque de funciones, las comprobaciones previas a la compilación son limitadas. Es posible definir un valor de inicialización

FUNCTION_BLOCK FB
VAR_GENERIC CONSTANT  
    size : INT := 1;
END_VAR
VAR 
   buffer : ARRAY[0..size] OF BYTE;
END_VAR

Este valor de inicialización (valor 1 en el ejemplo) se usa para las comprobaciones de precompilación dentro del bloque de funciones, pero no tiene ningún otro efecto.

Ejemplos

ejemplo 94. Example of using multiple generic constants
FUNCTION_BLOCK FB_Pou
VAR_GENERIC CONSTANT
    lnstring : DINT := 10;
    numstring : DINT := 100;
END_VAR
VAR
    arraystring : ARRAY[0..numstring-1] OF STRING(lnstring);
END_VAR
PROGRAM PLC_PRG
VAR
    fbPou : FB_Pou<100, 1000>;
END_VAR


ejemplo 95. Ejemplo: constante genérica de un tipo de subámbito

Se puede usar un tipo de subrango como parámetro genérico para especificar un rango de valores permitido que el compilador comprueba.

FUNCTION_BLOCK FB_SrString 
VAR_GENERIC CONSTANT
    maxlen2 : INT(5..10) := 5;    //subrange data type
END_VAR
VAR
    arrTest : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
;
PROGRAM SrMain
VAR CONSTANT
    cconst: INT(5..10) := 5;
END_VAR
VAR    
    fbMyString1 : FB_SrString<5>;
    fbMyString2 : FB_SrString<(2 * cconst)>;
    fbMyString3 : FB_SrcString<123>;
    // ERROR: An error is reported here because 123 is not within the value range 5..10.
    arrMyString : ARRAY [0..5] OF FB_SrString<6>;
END_VAR


ejemplo 96. Ejemplo: Bloque de función genérico con variable de matriz parametrizable

El siguiente código demuestra cómo definir un bloque de funciones que puede procesar matrices de longitud arbitraria. El bloque de funciones tiene una matriz con una longitud genérica pero constante. «Constante» significa que, aunque la longitud de la matriz de cada instancia del bloque funcional varía, es constante durante la vida útil del objeto.

Este tipo de construcción es beneficioso, por ejemplo, para un programador de bibliotecas que quiera implementar una POU de biblioteca genérica.

FUNCTION_BLOCK FB_MyString 
VAR_GENERIC CONSTANT
    maxlen : UDINT := 1;
END_VAR
VAR
    test : ARRAY[0..maxlen-1] OF BYTE;
END_VAR
PROGRAM PLC_PRG
VAR CONSTANT
    cconst: DINT := 1000;
END_VAR
VAR    
    fbMyString1 : FB_MyString<100>;
    fbMyString2 : FB_MyString<(2 * cconst)>;   
    arrMyString : ARRAY[0..5] OF FB_MyString<6>;    
END_VAR


Herencia

Un bloque funcional puede heredar de un bloque funcional base con una constante genérica (EXTENDS). El bloque de funciones heredado requiere su propia constante genérica. Luego, un valor específico se puede transferir externamente

Sintaxis:

FUNCTION_BLOCK <function block name> 
VAR_GENERIC CONSTANT        
    <generic constant name> : <integer data type> ; 
END_VAR 
EXTENDS <function block base> < <generic constant name> >

Un bloque de función con una constante genérica puede implementar una interfaz (IMPLEMENTS). La interfaz declara una propiedad (PROPERTY) con el que se puede acceder externamente al valor especificado. La interfaz en sí misma no debe declarar ninguna constante genérica o variable local. Las interfaces no tienen implementación

Sintaxis:

FUNCTION_BLOCK <function block name>
VAR_GENERIC CONSTANT
    <generic constant name> : <integer data type> ;
END_VAR
IMPLEMENTS <interface name>

Importante

Al codificar, asegúrese de que la declaración de las constantes genéricas se inserte primero, seguida de EXTENDS y IMPLEMENTS. Lleva un tiempo acostumbrarse a esto, pero la razón es que las constantes genéricas también se pueden usar con las clases base

ejemplo 97. Ejemplo

Definición del IString interfaz para un bloque de funciones genérico.

It is strongly recommended to define an interface for generic function blocks. The interface should allow the generic function block instance to be used without knowledge of the generic constants.

El Length la propiedad permite el acceso a la constante genérica.

INTERFACE IString 
METHOD Append : BOOL 
VAR_INPUT     
    strAppend : IString; 
END_VAR 

METHOD Assign : BOOL
VAR_INPUT     
    stringIn : STRING; 
END_VAR 

METHOD ToString : STRING
VAR_INPUT 
END_VAR 

PROPERTY Length : DINT

Declaración del bloque de funciones FB_MyString con la constante genérica maxlen

FUNCTION_BLOCK FB_MyString 
VAR_GENERIC CONSTANT        
    maxlen : UDINT; 
END_VAR 
IMPLEMENTS IString 

El bloque de funciones FB_LongString es una extensión del bloque de funciones especificado FB_MyString.

FUNCTION_BLOCK FB_LongString EXTENDS FB_MyString<1000>

Declaración del bloque de funciones FB_MySpecialString con la constante genérica maxlen2 como una extensión del bloque de funciones especificado FB_MyString. El bloque de funciones se amplía mediante el método METH_ToLatin.

FUNCTION_BLOCK FB_MySpecialString 
VAR_GENERIC CONSTANT        
    maxlen2 : UDINT:= 1; 
END_VAR 
EXTENDS FB_MyString<maxlen2>
METHOD METH_ToLatin : STRING
VAR_INPUT
END_VAR

Instanciación de los bloques de funciones con constantes específicas

PROGRAM PLC_PRG 
VAR CONSTANT     
    cconst: DINT := 1000; 
END_VAR
VAR     
    string1 : FB_MyString<100>;
    string2 : FB_MyString<(2 * cconst)>;
    derived1 : FB_LongString;
    derived2 : FB_MySpecialString<100>;
END_VAR 

Convocatorias

string1.METH_Assign ('Welt'); 
string2.METH_Assign ('Hallo '); 
string2.METH_Append(string1); 
derived2.METH_ToLatin('Hello World');