La versione 1.1 di EcoStruxure Machine Expert non supporta i controllori M258, LMC058 e LMC078.

Chiamata del metodo

Panoramica

La programmazione a oggetti con blocchi funzione, oltre che dalla possibilità di estensione con EXTENDS, è supportata anche dalla possibilità di utilizzare le interfacce e l'ereditarietà. Per far ciò è necessario che le chiamate ai metodi, chiamate anche chiamate di funzioni virtuali, siano risolte dinamicamente.

Le chiamate di funzioni virtuali richiedono più tempo delle normali chiamate di funzioni e vengono utilizzate quando:

osi esegue una chiamata tramite un puntatore a un blocco funzione (pfub^.method);

osi chiama un metodo di una variabile di interfaccia (interface1.method);

oun metodo chiama un altro metodo dello stesso blocco funzione;

osi esegue una chiamata tramite riferimento a un blocco funzione;

oa VAR_IN_OUT di un tipo di blocco funzione di base è possibile assegnare l'istanza di un tipo di blocco funzione derivato.

Le chiamate alle funzioni virtuali permettono che la stessa chiamata di un codice sorgente di un programma chiami metodi diversi durante il runtime.

Per ulteriori informazioni e una vista approfondita, vedere:

oMetodo per ulteriori informazioni sui metodi.

opuntatore THIS per l'uso del puntatore THIS.

opuntatore SUPER per l'uso del puntatore SUPER.

Chiamata di metodi

Secondo lo standard IEC 61131-3 , i metodi come le normali funzioni possono avere uscite aggiuntive. L'assegnazione nella chiamata al metodo deve avvenire secondo la seguente sintassi:

<metodo>(in1:=<valore> |, ulteriori assegnazioni di uscite, out1 => <variabile di uscita 1> | out2 => <variabile di uscita 2> | ...ulteriori variabili di uscita)

Di conseguenza, l'uscita del metodo viene scritta nelle variabili dichiarate localmente come se fosse fornita nella chiamata.

Esempio

Si ipotizzino i blocchi funzione fub1 e fub2 EXTEND il blocco funzione fubbase e IMPLEMENT interface1. Il metodo method1 è contenuto.

Utilizzo possibile delle interfacce e delle chiamate ai metodi:

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 is called, else fub1.method1 is called *)
instRef.method1();                (* If b is true, fub1.method1 is called, else fub2.method1 is called *)

Si ipotizzi che fubbase, dell'esempio precedente, contenga due metodi method1 e method2. fub1 ignora method2 ma non method1.

method1 viene chiamato come mostrato nel primo esempio.

pInst^.method1(); (* If b is true fubbase.method1 is called, else fub1.method1 is called *)

Per eseguire la chiamata tramite il puntatore THIS, vedere Puntatore THIS.