Skip to main content

chiamata al metodo

Per implementare una chiamata al metodo, i parametri effettivi (argomenti) vengono passati alle variabili di interfaccia. In alternativa, i nomi dei parametri possono essere omessi.

A seconda del modificatore di accesso dichiarato, un metodo può essere utilizzato solo all'interno del proprio spazio dei nomi (INTERNAL), solo all'interno del proprio blocco di programmazione e sue derivate (PROTECTED) o solo all'interno del proprio blocco di programmazione (PRIVATE) essere chiamato. in PUBLIC il metodo può essere chiamato ovunque.

All'interno dell'implementazione, un metodo può chiamare se stesso in modo ricorsivo, direttamente tramite il metodo QUESTO puntatore o tramite una variabile locale per il blocco funzione assegnato.

Chiamata al metodo come chiamata di funzione virtuale

L'ereditarietà può portare a chiamate di funzioni virtuali.

Le chiamate di funzioni virtuali consentono alla stessa chiamata nel codice sorgente del programma di richiamare metodi diversi in fase di esecuzione.

La chiamata al metodo è associata dinamicamente nei seguenti casi:

  • Si chiama un metodo utilizzando un puntatore a un modulo funzione.

    Esempio: pfub^.method

    In questa situazione, il puntatore può puntare a istanze del tipo di blocco funzione ea istanze di tutti i blocchi funzione derivati.

  • Chiamate il metodo di una variabile di interfaccia.

    Esempio: interface1.method

    L'interfaccia può fare riferimento a tutte le istanze dei blocchi funzione che implementano questa interfaccia.

  • Un metodo chiama un altro metodo dello stesso modulo funzione. In questo caso, il metodo può anche richiamare il metodo di un blocco funzione derivato con lo stesso nome.

  • Un metodo viene chiamato utilizzando un riferimento a un modulo funzione. In questa situazione, il riferimento può puntare a istanze del tipo di blocco funzione ea istanze di tutti i blocchi funzione derivati.

  • tu punti VAR_IN_OUT-Variabili di un tipo di blocco funzione di base a un'istanza di un tipo FB derivato.

    In questa situazione, la variabile può puntare a istanze del tipo del blocco funzione ea istanze di tutti i blocchi funzione derivati.

esempio

Esempio 31. metodi sovraccarichi

I blocchi funzione fub1 e fub2 espandere il blocco funzione fubbase e implementare l'interfaccia interface1. Ci sono i metodi method1 e method2.

PROGRAM PLC_PRG
VAR_INPUT
  b : BOOL;
END_VAR

VAR  pInst : POINTER TO fubbase;
  instBase : fubbase;
  inst1 : fub1;
  inst2 : fub2;
  instRef : REFERENCE to fubbase;
END_VAR

IF b THEN
  instRef REF= inst1;            (* reference to fub1 *)
  pInst := ADR(instBase);
ELSE
  instRef REF= inst2;            (* reference to fub2  *)
  pInst := ADR(inst1);
END_IF
pInst^.method1();            (* If b is TRUE, fubbase.method1 will be called, otherwise fub1.method1 is called *)
instRef.method1();        (* If b ist TRUE, fub1.method1 will be called, otherwise fub2.method1 is called*)

Supponendo che fubbase dell'esempio sopra due metodi method1 e method2 contiene, sovrascrive fub1 method2, ma no method1. La chiamata di method1 avviene come segue:

pInst^.method1();

quando b TRUE è, chiamate CODESYSfubbase.method1 su, altrimenti fub1.method1.



Uscite aggiuntive

Secondo la norma IEC 61131-3, i metodi, come le normali funzioni, possono avere uscite aggiuntive dichiarate. Quando si chiama il metodo, si assegnano variabili alle uscite aggiuntive.

Puoi trovare informazioni dettagliate su questo sotto l'argomento "Funzione".

Sintassi quando chiamato

<function block name>.<method name>(<first input name> := <value> (, <further input assignments>)+ , <first output name> => <first output variable name> (,<further output assignments>)+ );
Esempio 32. esempio

dichiarazione

METHOD PUBLIC DoIt : BOOL
VAR_INPUT
        iInput_1 : DWORD;
        iInput_2 : DWORD;
END_VAR
VAR_OUTPUT
        iOutput_1 : INT;
        sOutput_2 : STRING;
ENDVAR

chiamata

fbInstance.DoIt(iInput_1 := 1, iInput_2 := 2, iOutput_1 => iLocal_1, sOUtput_2 => sLocal_2);

Quando il metodo viene chiamato, i valori degli output del metodo vengono scritti nella variabile di output dichiarata localmente.



Chiamare un metodo anche se l'applicazione è nello stato STOP

È possibile definire nella descrizione del dispositivo che una determinata istanza di blocco funzione (di un blocco di libreria) richiami sempre un determinato metodo in un ciclo di attività. Se il metodo accetta i parametri di input dell'esempio seguente, funziona CODESYS il metodo si avvia anche quando l'applicazione attiva è attualmente nello stato STOP:

Esempio 33. esempio
VAR_INPUT
        pTaskInfo : POINTER TO DWORD;
        pApplicationInfo: POINTER TO _IMPLICIT_APPLICATION_INFO;
END_VAR

(*Now the status of the application can be queried via pApplicationInfo and the instructions can be implemented: *)

IF pApplicationInfo^.udState = 1 THEN <instructions> END_IF;


Chiama il metodo in modo ricorsivo

Suggerimento

Utilizzare le ricorsioni principalmente per manipolare i tipi di dati ricorsivi come gli elenchi collegati. In generale, è consigliabile prestare attenzione quando si utilizza la ricorsione. Una ricorsione inaspettatamente profonda può portare a un overflow dello stack e quindi all'arresto della macchina.

All'interno della sua implementazione, un metodo può chiamare se stesso:

  • Direttamente tramite il QUESTO puntatore

  • indirettamente utilizzando un'istanza di blocco funzione locale del blocco funzione di base

Di solito, viene emesso un avviso del compilatore per tale chiamata ricorsiva. Se il metodo viene fornito con pragma {attribute 'estimated-stack-usage' := '<estimated stack size in bytes>'}, l'avviso del compilatore viene soppresso. Per un esempio di implementazione, vedere il Attributo 'stimato-stack-utilizzo' capitolo.