Un metodo è un elemento di linguaggio simile a una funzione utilizzabile nel contesto di un blocco funzione. Il metodo può essere considerato come una funzione che contiene un'istanza del relativo blocco funzione. Come la funzione, il metodo ha un valore di restituzione e la propria parte di dichiarazione per le variabili temporanee e i parametri.
Nell'ottica della programmazione a oggetti, inoltre, è possibile utilizzare le interfacce per organizzare i metodi disponibili nel progetto.
Per assegnare un metodo a un blocco funzione o a un'interfaccia, selezionare il blocco funzione o il nodo dell'interfaccia corrispondente nella , fare clic sul pulsante verde con il segno più ed eseguire il comando . In alternativa, fare clic con il pulsante destro del mouse sul blocco funzione o sul nodo dell'interfaccia ed eseguire il comando dal menu contestuale.
Nella finestra di dialogo , immettere il , il desiderato, il e (vedere sotto). Se il metodo non dispone di implementazione e quest'ultima è fornita dal blocco funzione derivato, selezionare l'opzione . Per scegliere il tipo di dati restituito, fare clic sul pulsante per aprire la finestra di dialogo dell'.
: Per motivi di compatibilità, gli specificatori dell'accesso sono facoltativi. Lo specificatore è disponibile come equivalente se non si imposta alcuno specificatore.
In alternativa, scegliere una delle opzioni dell'elenco di selezione:
: l'accesso al metodo è limitato al blocco funzione.
: l'accesso al metodo è limitato al blocco funzione e alla sua derivazione.
: l'accesso al metodo è limitato allo spazio dei nomi presente (la libreria).
Fare clic su per confermare. Si apre la vista dell'editor del metodo.
EcoStruxure Machine Expert facilita la programmazione orientata agli oggetti tramite eredità nei blocchi funzione: quando si esegue su un blocco funzione che eredita da un altro blocco funzione, gli elementi , , e usati nel blocco funzione di base vengono elencati per la selezione:
Gli elementi , , e con = , e definiti nel blocco funzione di base sono disponibili per la selezione. È possibile adattare la definizione per l'oggetto ereditato. Nell'oggetto ereditato, lo stesso viene assegnato agli elementi di origine.
Gli elementi , , e con = non sono disponibili per la selezione in quanto l'accesso è limitato al blocco funzione di base.
Sintassi:
METHOD <specificatore di accesso> <nome metodo>: <tipo dati restituito>VAR_INPUT ... END_VAR
Per una descrizione di come dichiarare i metodi di gestione dell'interfaccia, vedere il capitolo Interfaccia.
Le chiamate dei metodi sono anche denominate chiamate delle funzioni virtuali. Per ulteriori informazioni, vedere il capitolo Chiamata di un metodo.
Nella chiamata di un metodo, tenere presente quanto segue:
I dati di un metodo sono temporanei e sono validi solo durante la sua esecuzione (variabili stack). Perciò, le variabili e i blocchi funzione dichiarati in un metodo sono reinizializzati a ogni chiamata del metodo.
I metodi definiti in un'interfaccia possono avere solo variabili di ingresso, uscita e I/O, ma non il corpo (parte di implementazione).
I metodi come le funzioni possono avere uscite aggiuntive. Devono essere assegnati durante la chiamata del metodo.
Lo specificatore di accesso dichiarato definisce la modalità di chiamata del metodo:
: il metodo può essere chiamato nel proprio spazio dei nomi.
: il metodo può essere chiamato nella propria POU e derivati.
: il metodo può essere chiamato nella propria POU.
: non vi sono limitazioni alla chiamata del metodo.
Nell'implementazione di un metodo, tenere presente quanto segue:
Nel corpo di un metodo, è possibile accedere alle variabili delle istanze dei blocchi funzione.
Se necessario, utilizzare il puntatore THIS, che punta sempre all'istanza corrente.
In un metodo non è possibile accedere alle variabili VAR_TEMP del blocco funzione.
Un metodo può chiamarsi in modo ricorsivo.
Per chiamare un metodo, utilizzare la sintassi seguente:
<return value variable> := <POU name> . <method name> ( <method input name> := <variable name> (, <further method input name> := <variable name> )* );
Esempio di dichiarazione:
METHOD PUBLIC DoIt : BOOL
VAR_INPUT
iInput_1 : DWORD;
iInput_2 : DWORD;
sInput_3 : STRING(12);
END_VAR
Esempio di chiamata:
bFinishedMethod := fbInstance.DoIt(sInput_3 :='Hello World ', iInput_2 := 16#FFFF,iInput_1 := 16);
Esempio di dichiarazione:
METHOD PUBLIC DoIt : BOOL
VAR_INPUT
iInput_1 : DWORD;
iInput_2 : DWORD;
sInput_3 : STRING(12);
END_VAR
Esempio di chiamata:
bFinishedMethod := fbInstance.DoIt( 16, 16#FFFF,'Hello World ');
Nell'implementazione, un metodo può chiamare se stesso, direttamente mediante il puntatore THIS, oppure utilizzando una variabile locale per il blocco funzione assegnato.
THIS^. <method name> ( <parameter transfer of all input and output variables>)
Chiamata diretta dell'istanza del blocco funzione relativa con il puntatore THIS.
VAR fb_Temp : <function block name>; END_VAR
Chiamata mediante una variabile locale del metodo che istanzia temporaneamente il blocco funzione relativo.
Una chiamata ricorsiva determina un messaggio del compilatore. Il messaggio del compilatore non viene visualizzato se il metodo viene fornito con il pragma {attribute 'estimated-stackusage : '<estimated_stack_size_in_bytes>'}. Per un esempio di implementazione, vedere il capitolo Attribute estimated-stack-usage.
Specificare il nome del metodo è quindi insufficiente per le chiamate del metodo ricorsive. In questo caso viene visualizzato il seguente messaggio del compilatore:
Program name, function or function block instance expected instead of
| AVVISO | |
|---|---|
|
Metodo |
Descrizione |
|---|---|
|
|
Per impostazione predefinita, il metodo denominato |
|
|
Se un metodo denominato |
|
|
Se si desidera un metodo di uscita denominato |
Ogni Proprietà e proprietà dell'interfaccia è costituita da un metodo di accesso Set e/o Get.
Nel file di descrizione del dispositivo, è possibile definire che un determinato metodo debba sempre essere chiamato con il ciclo dei task da una determinata istanza del blocco funzione (o modulo della libreria). Se il metodo ha i seguenti parametri di ingresso, viene elaborato anche quando l'applicazione attiva non è in esecuzione.
Esempio
VAR_INPUT
pTaskInfo : POINTER TO DWORD;
pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO;
END_VAR
Il programmatore può verificare lo stato dell'applicazione con pApplicationInfo e definire il successivo comportamento.
IF pApplicationInfo^.state = RUNNING THEN <instructions> END_IF