Skip to main content

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:

  1. 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 tipo POINTER e REFERENCE. 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'")

  2. 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.

  3. 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.

  4. 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.

Esempio 308. Esempio

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.

Esempio 309. Esempio

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.

Esempio 310. Esempio

I blocchi funzione MainFB, SubFB, e SubSubFB sono derivati l'uno dall'altro. Dunque, SubFB EXTENDS MainFB e SubSubFB EXTENDS SubFB applicare.

Procedura. Ordine di chiamata dei metodi FB_Exit e FB_Init:
  1. fbSubSubFb.FB_Exit(...);

  2. fbSubFb.FB_Exit(...);

  3. fbMainFb.FB_Exit(...);

  4. fbMainFb.FB_Init(...);

  5. fbSubFb.FB_Init(...);

  6. fbSubSubFb.FB_Init(...);