Metodo: FB_Init
, FB_Reinit
, FB_Exit
È possibile dichiarare i metodi in modo esplicito per influenzare l'inizializzazione delle variabili dei blocchi funzione, nonché il comportamento all'uscita dai blocchi funzione.
Suggerimento
Il tipo del valore restituito per i metodi impliciti è BOOL
. Il valore non viene valutato dal sistema, ma il tipo non deve essere modificato.
FB_Init
è sempre disponibile in modo implicito e viene utilizzato principalmente per l'inizializzazione. Per un'influenza specifica, puoi anche dichiarare i metodi in modo esplicito e fornire lì codice aggiuntivo con il codice di inizializzazione standard.
FB_Reinit
deve essere implementato in modo esplicito. Se questo metodo esiste, viene chiamato dopo l'istanza del blocco funzione interessato copiato. Ciò accade durante una modifica online dopo le modifiche alla dichiarazione del blocco funzione (modifica della firma) per reinizializzare il nuovo modulo di istanza. Per reinizializzare l'implementazione di base del blocco funzione, è necessario chiamare FB_Reinit
esplicitamente.
FB_Exit
deve essere implementato in modo esplicito. Se è presente un'implementazione, il metodo viene chiamato prima che il controller rimuova il codice dell'istanza del blocco funzione (chiamata implicita).
Di seguito vengono illustrati alcuni casi d'uso di questi metodi per diverse condizioni operative.
Caso operativo "Primo download".
Quando si scarica un'applicazione in un PLC con le impostazioni di fabbrica, la memoria di tutte le variabili deve essere spostata allo stato iniziale richiesto. In questo modo, alle aree dati delle istanze dei blocchi funzione vengono assegnati i valori richiesti. Con l'esplicita attuazione di FB_Init
per i blocchi funzione, è possibile reagire in modo specifico a questa situazione nel codice dell'applicazione. Valutando i parametri del metodo bInCopyCode
(FALSE
) e bInitRetains
(TRUE
), è possibile rilevare chiaramente questa condizione operativa.
Caso operativo "Cambio online".
Nell'ambito della modifica online è possibile influenzare l'inizializzazione di istanze di blocchi funzione tramite i metodi FB_Exit
, FB_Init
, e FB_Reinit
. Durante la modifica online, le modifiche apportate all'applicazione in modalità offline vengono applicate al PLC in esecuzione. Pertanto, le "vecchie" istanze del blocco funzione vengono sostituite dai tuoi "nuovi fratelli" il più possibile senza incidenti. Se non sono state apportate modifiche alla parte di dichiarazione di un blocco funzione nell'applicazione prima del login, ma solo nell'implementazione, le aree di dati non vengono sostituite. Vengono sostituiti solo i blocchi di codice. Poi i metodi FB_Exit
, FB_Init
, e FB_Reinit
non sono chiamati.
Suggerimento
Se sono state apportate modifiche alla dichiarazione di un blocco funzione che hanno portato all'operazione di copiatura sopra descritta, durante la modifica online viene visualizzato un messaggio sui "possibili effetti indesiderati". Nel Particolari della visualizzazione dei messaggi, viene visualizzato un elenco di tutte le istanze da copiare.
Nel codice del FB_Init
metodo, il parametro bInCopyCode
(TRUE
) possono essere valutati per rilevare se viene eseguita o meno una modifica online.
Le seguenti chiamate si verificano in successione durante un cambio online:
FB_Exit
old_inst.FB_Exit(bInCopyCode := TRUE);
Puoi chiamare
FB_Exit
quando si esce dalla "vecchia" istanza per attivare attività di pulizia specifiche prima dell'operazione di copia. In questo modo è possibile preparare i dati per la successiva operazione di copia e influenzare lo stato della nuova istanza. È possibile notificare ad altre parti dell'applicazione la modifica in sospeso della posizione nella memoria. Prestare particolare attenzione alle variabili di tipoPOINTER
eREFERENCE
. Questi potrebbero non fare più riferimento alle posizioni di memoria richieste dopo la modifica in linea. Variabili di interfaccia (INTERFACE
) vengono gestiti separatamente dal compilatore e vengono adattati di conseguenza durante la modifica online. Risorse esterne come socket, file o altri handle possono essere applicate dalla nuova istanza, in alcuni casi invariate. Spesso non devono essere trattati in modo speciale durante un cambio online. (Vedere "Caso operativo 'Riscarica'")FB_Init
new_inst.FB_Init(bInitRetains := FALSE, bInCopyCode := TRUE);
FB_Init
viene richiamato prima dell'operazione di copia e può essere utilizzato per eseguire operazioni specifiche per il cambio in linea. Ad esempio, è possibile inizializzare le variabili di conseguenza nella "nuova" posizione nella memoria o notificare ad altre parti dell'applicazione la nuova posizione di variabili specifiche nella memoria.Operazione di copia:
copy
copy(&old_inst, &new_inst);
I valori esistenti rimangono invariati. A tale scopo, vengono copiati dalla vecchia istanza nella nuova istanza.
FB_Reinit
new_inst.FB_Reinit();
Questo metodo viene chiamato dopo l'operazione di copia e dovrebbe impostare valori definiti per le variabili dell'istanza. Ad esempio, è possibile inizializzare le variabili di conseguenza nella "nuova" posizione nella memoria o notificare ad altre parti dell'applicazione la nuova posizione di variabili specifiche nella memoria. Progettare l'implementazione indipendentemente dalla modifica online. Il metodo può anche essere richiamato dall'applicazione in qualsiasi momento per ripristinare un'istanza di blocco funzione al suo stato originale.
Suggerimento
Con il {attribute 'no_copy'}
attributo, è possibile impedire che questo venga copiato durante la modifica online per una singola variabile del blocco funzione. Mantiene sempre il valore iniziale.
Per ulteriori informazioni, vedere: Riserva di memoria impostazioni per modifica online
Caso operativo "Nuovo download".
Quando si scarica un'applicazione, un'applicazione esistente può essere sostituita sul PLC. Pertanto, la fornitura di memoria per i presenti blocchi funzione deve essere regolata. Puoi usare il FB_Exit
metodo per implementare i passaggi necessari per questo. Ad esempio, puoi compensare risorse esterne (con socket e handle di file) in uno stato definito.
È possibile rilevare questa condizione di funzionamento verificando se il parametro è o meno bInCopyCode = FALSE
per il FB_Exit
metodo.
Caso operativo "Inizio dell'applicazione".
Le assegnazioni iniziali vengono elaborate prima del primo ciclo delle attività dell'applicazione.
T1 : TON := (PT:=t#500ms);
Questi tipi di assegnazioni vengono eseguiti solo dopo la chiamata FB_Init
. Per controllare gli effetti di queste assegnazioni, è possibile fornire un blocco funzione o un metodo di un blocco funzione con il {attribute ‘call_after_init‘}
attributo. È necessario aggiungere l'attributo sopra la parte di dichiarazione del corpo del blocco funzione e sopra la parte di dichiarazione del metodo corrispondente. Una POU che estende un'altra POU che utilizza il {attribute 'call_after_init'}
l'attributo deve avere anche l'attributo. Per maggiore chiarezza, si consiglia di sovrascrivere i metodi corrispondenti con lo stesso nome, la stessa firma e lo stesso attributo. Ciò richiede una chiamata SUPER^.MyInit
. Il nome del metodo può essere scelto senza restrizioni. (Eccezioni: FB_Init
, FB_Reinit
, e FB_Exit
). Il metodo viene chiamato dopo l'elaborazione delle assegnazioni iniziali e prima di avviare le attività dell'applicazione. Pertanto, il metodo può reagire all'input dell'utente.
Quando si usa FB_Init
o {attribute 'call_after_init'}
, ricorda che il rilevamento degli errori nel file FB_Init
metodo o in metodi decorati con il {attribute 'call_after_init'}
è noioso, perché l'impostazione dei punti di interruzione potrebbe non avere l'effetto previsto.
Importante
Se durante l'esecuzione viene raggiunto il codice di inizializzazione definito in modo esplicito, l'istanza del blocco funzione è già completamente inizializzata tramite il codice di inizializzazione implicito. Pertanto, non deve esserci a SUPER^.FB_Init
chiamata.
Importante
FB_Init
sostituisce il INI
operatore utilizzato in CoDeSys V2.3. I metodi non possono essere confrontati con la progettazione di un costruttore, ad esempio in C#, C++ o Java. Ciò ha conseguenze per i blocchi funzione che estendono altri blocchi funzione. (Vedi sotto: "Blocchi funzione derivati")
Interfaccia di metodo FB_Init
METHOD FB_Init : BOOL VAR_INPUT bInitRetains : BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold) bInCopyCode : BOOL; // TRUE: the instance will be copied to the copy code afterward (online change) END_VAR
È possibile dichiarare ingressi di blocchi funzione aggiuntivi in un FB_init
metodo. Quindi è necessario impostare questi ingressi nella dichiarazione dell'istanza del blocco funzione.
Metodo FB_Init
per il serialdevice
blocco funzione
METHOD PUBLIC FB_Init : BOOL VAR_INPUT nbInitRetains : BOOL; // initializing of retain variable bInCopyCode : BOOL; // instance is copied to copy code iCOMnum : INT; // additional input: number of the COM interface, that is to be observed END_VAR
Istanziazione del serialdevice
blocco funzione:
com1: serialdevice(iCOMnum:=1); com0: serialdevice(iCOMnum:=0);
Interfaccia di metodo FB_Reinit
METHOD FB_Reinit : BOOL
Interfaccia di metodo FB_Exit
C'è il parametro obbligatorio bInCopyCode
.
METHOD FB_Exit : BOOL VAR_INPUT bInCopyCode : BOOL; // TRUE: the exit method is called in order to leave the instance which will be copied afterwards (online change). END_VAR
Comportamento per blocchi funzione derivati
Se un blocco funzione è derivato da un altro blocco funzione, allora il FB_Init
il metodo del blocco funzione derivato deve definire gli stessi parametri del FB_Init
metodo del blocco funzione di base. Tuttavia, puoi aggiungere ulteriori parametri per impostare un'inizializzazione speciale per l'istanza.
I blocchi funzione MainFB
, SubFB
, e SubSubFB
sono derivati l'uno dall'altro. Dunque, SubFB EXTENDS MainFB
e SubSubFB EXTENDS SubFB
applicare.
FB_Exit
e FB_Init
:fbSubSubFb.FB_Exit(...);
fbSubFb.FB_Exit(...);
fbMainFb.FB_Exit(...);
fbMainFb.FB_Init(...);
fbSubFb.FB_Init(...);
fbSubSubFb.FB_Init(...);