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
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>)+ );
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:
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
puntatoreindirettamente 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.