Un método es un elemento del lenguaje, similar a una función, que puede utilizarse en el contexto de un bloque de funciones. Se puede considerar una función que contiene una instancia del bloque de funciones respectivo. Como tal, el método tiene un valor de retorno, y su parte de declaración propia para variables temporales y parámetros.
También, como medio de programación orientada a objetos, puede utilizar interfaces para organizar los métodos disponibles en un proyecto.
Para asignar un método a un bloque de funciones o a una interfaz, seleccione el nodo de interfaz o bloque de funciones correspondiente en el
, haga clic en el botón de signo más de color verde y ejecute el comando . Como alternativa, puede hacer clic con el botón derecho en el nodo de interfaz o bloque de funciones y ejecutar el comando en el menú contextual.En el cuadro de diálogo
, introduzca un , el deseado, el y el (véase a continuación). Si el método no tiene una implementación y la implementación la proporciona el bloque de función derivado, seleccione la opción . Para elegir el tipo de datos de retorno, haga clic en el botón para abrir el cuadro de diálogo .: por motivos de compatibilidad, los modificadores de acceso son opcionales. El modificador está presente como equivalente a no establecer ningún modificador.
Como alternativa, seleccione una de las opciones de la lista de selección:
: el acceso en el método se restringe al bloque de función.
: el acceso en el método se restringe al bloque de función y su derivación.
: el acceso en el método se restringe al espacio de nombres actual (la biblioteca).
Haga clic en
para confirmar. Se abrirá la vista del editor de métodos.EcoStruxure Machine Expert facilita la programación orientada a objetos utilizando la herencia dentro de los bloques de funciones. Al ejecutar sobre un bloque de funciones que hereda de otro, los elementos , , y utilizados en el bloque de funciones base se enumeran para seleccionarlos.
Los elementos
, , y con = , e definidos en el bloque de funciones base están disponibles para seleccionarlos. Puede adaptar la definición para el objeto heredado. En el objeto heredado, se asigna el mismo que a los elementos origen.Los elementos
, , y con = no se pueden seleccionar porque el acceso está restringido al bloque de funciones base.Sintaxis:
METHOD <modificador de acceso> <nombre del método>: <tipo de datos de retorno>VAR_INPUT ... END_VAR
Para obtener una descripción sobre cómo declarar métodos de manejo de interfaces, consulte el capítulo Interfaz.
Las llamadas a métodos también se conocen como llamadas a funciones virtuales. Para obtener información adicional, consulte el capítulo Invocación de métodos.
Para llamar a un método, tenga en cuenta lo siguiente:
Los datos de un método son temporales y solo son válidos durante la ejecución del método (variables de pila). Esto significa que las variables y los bloques de funciones declarados en un método se reinicializan en cada llamada al método.
Solo se permite que los métodos definidos en una interfaz tengan variables de entrada, salida y entrada/salida, pero no cuerpo (parte de la implementación).
Los métodos como las funciones pueden tener salidas adicionales. Se deben asignar durante la invocación al método.
El modificador de acceso declarado define cómo se puede llamar al método:
: el método puede llamarse en su propio espacio de nombres.
: el método puede llamarse en su propia POU y sus derivados.
: el método puede llamarse en su propia POU.
: no se aplica ninguna restricción para llamar al método.
Para implementar un método, tenga en cuenta lo siguiente:
En el cuerpo de un método, se permite el acceso a las variables de instancia del bloque de funciones.
Si es necesario, utilice el puntero THIS, que siempre apunta a la instancia actual.
No se puede acceder a las variables VAR_TEMP
del bloque de funciones en un método.
Un método puede llamarse a sí mismo recursivamente.
Para llamar a un método, use la siguiente sintaxis:
<return value variable> := <POU name> . <method name> ( <method input name> := <variable name> (, <further method input name> := <variable name> )* );
Ejemplo de declaración:
METHOD PUBLIC DoIt : BOOL
VAR_INPUT
iInput_1 : DWORD;
iInput_2 : DWORD;
sInput_3 : STRING(12);
END_VAR
Ejemplo de llamada:
bFinishedMethod := fbInstance.DoIt(sInput_3 :='Hello World ', iInput_2 := 16#FFFF,iInput_1 := 16);
Ejemplo de declaración:
METHOD PUBLIC DoIt : BOOL
VAR_INPUT
iInput_1 : DWORD;
iInput_2 : DWORD;
sInput_3 : STRING(12);
END_VAR
Ejemplo de llamada:
bFinishedMethod := fbInstance.DoIt( 16, 16#FFFF,'Hello World ');
En la implementación, un método puede llamarse a sí mismo, ya directamente usando el puntero THIS
, ya usando una variable local para el bloque de funciones asignado.
THIS^. <method name> ( <parameter transfer of all input and output variables>)
Llamada directa de la instancia de bloque de funciones pertinente con el puntero THIS
.
VAR fb_Temp : <function block name>; END_VAR
Llamada usando una variable local del método que instancia temporalmente el bloque de funciones pertinente.
Una llamada recursiva produce un mensaje de compilador. El mensaje de compilador no se emitirá si el método se proporciona con el pragma {attribute 'estimated-stackusage : '<estimated_stack_size_in_bytes>'}
. Consulte el capítulo Attribute estimated-stack-usage
si desea ver un ejemplo de implementación.
Así, especificar el nombre del método es insuficiente para las llamadas de método recursivas. En este caso, se emitirá el mensaje de compilador siguiente:
Program name, function or function block instance expected instead of
AVISO | |
---|---|
Método |
Descripción |
---|---|
|
Un método denominado |
|
Si se declara un método denominado |
|
Si se desea un método de salida denominado |
Las propiedades y las propiedades de interfaz constan cada una de un método de acceso Set
o Get
.
En el archivo de descripción del dispositivo, se puede definir que siempre se llame a un determinado método con una tarea cíclica por una determinada instancia de bloque de funciones (de un módulo de biblioteca). Si este método tiene los siguientes parámetros de entrada, también se procesa cuando la aplicación activa no se está ejecutando.
Ejemplo
VAR_INPUT
pTaskInfo : POINTER TO DWORD;
pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO;
END_VAR
El programador puede comprobar el estado de la aplicación mediante pApplicationInfo
y definir qué debe suceder.
IF pApplicationInfo^.state = RUNNING THEN <instructions> END_IF