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
| Nombre del bloque de funciones |
| Alcance de las constantes genéricas Puede declarar cualquier número de constantes genéricas en |
| Nombre de variable de las constantes genéricas |
| 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:
|
| Opcional Inicialización ImportanteEl 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_VARInstanciació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 CONSTANTel 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 CONSTANTalcance.<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.
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_VARInstanciació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_VARliArray1Size := UPPER_BOUND(MyFB1.MyArray1,1) + 1;
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_VARArray1Size := 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_VAREste 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
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_VARPROGRAM PLC_PRG
VAR
fbPou : FB_Pou<100, 1000>;
END_VARSe 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_VAREl 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_VARPROGRAM 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_VARHerencia
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
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 : DINTDeclaració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');