Metodo

Panoramica

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.

NOTA: Quando si copia o si sposta un metodo o una proprietà da una POU a un'interfaccia, le implementazioni in essi contenute vengono automaticamente eliminate. Quando si esegue una copia o uno spostamento da un'interfaccia a una POE, viene richiesto di specificare il linguaggio di implementazione desiderato.

Inserimento di un metodo

Per assegnare un metodo a un blocco funzione o a un'interfaccia, selezionare il blocco funzione o il nodo dell'interfaccia corrispondente nella Struttura applicazioni, fare clic sul pulsante verde con il segno più ed eseguire il comando Metodo. In alternativa, fare clic con il pulsante destro del mouse sul blocco funzione o sul nodo dell'interfaccia ed eseguire il comando Aggiungi oggetto > Metodo dal menu contestuale.

Nella finestra di dialogo Aggiungi metodo, immettere il Nome, il Tipo restituito desiderato, il Linguaggio d'implementazione e Modificatore di accesso (vedere sotto). Se il metodo non dispone di implementazione e quest'ultima è fornita dal blocco funzione derivato, selezionare l'opzione Astratto. Per scegliere il tipo di dati restituito, fare clic sul pulsante ... per aprire la finestra di dialogo dell'Accesso facilitato.

Modificatore di accesso: Per motivi di compatibilità, gli specificatori dell'accesso sono facoltativi. Lo specificatore PUBLIC è disponibile come equivalente se non si imposta alcuno specificatore.

In alternativa, scegliere una delle opzioni dell'elenco di selezione:

  • PRIVATE: l'accesso al metodo è limitato al blocco funzione.

  • PROTECTED: l'accesso al metodo è limitato al blocco funzione e alla sua derivazione.

  • INTERNAL: l'accesso al metodo è limitato allo spazio dei nomi presente (la libreria).

Fare clic su Apri per confermare. Si apre la vista dell'editor del metodo.

Accesso facilitato quando si creano blocchi funzione con ereditarietà

EcoStruxure Machine Expert facilita la programmazione orientata agli oggetti tramite eredità nei blocchi funzione: quando si esegue Aggiungi oggetto su un blocco funzione che eredita da un altro blocco funzione, gli elementi Azione, Metodo, Proprietà e Transizione usati nel blocco funzione di base vengono elencati per la selezione:

  • Gli elementi Azione, Metodo, Proprietà e Transizione con Modificatore di accesso = PUBBLICO, PROTETTO e INTERNO definiti nel blocco funzione di base sono disponibili per la selezione. È possibile adattare la definizione per l'oggetto ereditato. Nell'oggetto ereditato, lo stesso Modificatore di accesso viene assegnato agli elementi di origine.

  • Gli elementi Azione, Metodo, Proprietà e Transizione con Modificatore di accesso = PRIVATO non sono disponibili per la selezione in quanto l'accesso è limitato al blocco funzione di base.

Dichiarazione di un metodo

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.

Chiamata di un metodo

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:

    • INTERNAL: il metodo può essere chiamato nel proprio spazio dei nomi.

    • PROTECTED: il metodo può essere chiamato nella propria POU e derivati.

    • PRIVATE: il metodo può essere chiamato nella propria POU.

    • PUBLIC: non vi sono limitazioni alla chiamata del metodo.

NOTA: Se per il metodo non è definito alcun valore restituito, viene restituito il valore della prima uscita. Se per il metodo non è disponibile alcuna uscita, viene generato un messaggio di errore del compilatore.

Implementazione di un 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.

Chiamata di un metodo

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);
NOTA: Quando si chiama il metodo, il valore di restituzione del metodo viene assegnato, ad esempio, alle variabili dichiarate localmente. Quando si omettono i nomi delle variabili di ingresso, accertarsi di seguire l'ordine di dichiarazione.

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 ');

Chiamata metodo ricorsiva

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
NOTA: Le chiamate ricorsive sono inerentemente difficili da implementare e correggere e possono provocare effetti collaterali indesiderati come problemi di memoria e timeout di watchdog.
AVVISO
PROBLEMI INDESIDERATI DELL'APPLICAZIONE
  • Implementare solo gli algoritmi ricorsivi dove necessario.
  • Verificare di conoscere perfettamente le tecniche di implementazione ricorsiva e di ben documentare il codice di supporto.
Il mancato rispetto di queste istruzioni può provocare danni alle apparecchiature.

Metodi speciali per un blocco funzione

Metodo

Descrizione

Init

Per impostazione predefinita, il metodo denominato FB_init è dichiarato in modo implicito ma può anche essere dichiarato esplicitamente. Esso contiene il codice di inizializzazione per il blocco funzione, come dichiarato nella parte di dichiarazione del blocco funzione. Consultare il metodo FB_init.

Reinit

Se un metodo denominato FB_reinit è dichiarato per un'istanza di un blocco funzione, verrà chiamato dopo che l'istanza è stata copiata (come durante la Modifica online) e reinizializzerà il modulo della nuova istanza. Consultare i metodi FB_init, FB_reinit.

Exit

Se si desidera un metodo di uscita denominato FB_exit è necessario dichiararlo esplicitamente. La dichiarazione implicita non è possibile. Il metodo Exit è richiamato per ogni istanza del blocco funzione prima di un nuovo download, un reset o durante una modifica online per tutte le istanze spostate o eliminate. Consultare il metodo FB_exit.

Ogni Proprietà e proprietà dell'interfaccia è costituita da un metodo di accesso Set e/o Get.

Chiamata del metodo anche quando l'applicazione è in stop

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