Utilizzo di un FB all’interno di un altro FB
Home › Forum › Programmazione IEC 61131 (LogicLab) › Utilizzo di un FB all’interno di un altro FB
- Questo topic ha 3 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 4 anni, 8 mesi fa da
Sergio Bertana.
-
AutorePost
-
Agosto 10, 2020 alle 10:33 am #57239
sacost
PartecipanteVolevo sapere se è possibile mediante linguaggio ST utilizzare un FB presente in una delle librerie standard all’interno di un FB che sto creando. Il Altre parole ho la seguente situazione: sto creando un mio FB dove all’interno voglio usare il timer eTP. Lo definisco tra le variabili con il nome FBeTP e poi provo ad utilizzarlo.
In debug (con il simulatore) mi accorgo che il FB eTP non viene utilizzato nel senso che qualsiasi valore assegno a DW il timer non parte. Sto sbagliando qualcosa o non è possibile usare un FB all’interno di un altro FB?
Riporto un esempio di codice che sto usando
FUNCTION_BLOCK Test_FB VAR FBeTP : eTP; OutValue : UDINT; END_VAR VAR_INPUT UP : BOOL; (* Pulsante ingresso UP *) DW : BOOL; (* Pulsante ingresso DOWN *) AZZERA : BOOL; END_VAR VAR_OUTPUT M_UP : BOOL; (* Uscita motore UP *) M_DW : BOOL; (* Uscita motore DOWN *) END_VAR IF (DW) THEN //controllo comando down FBeTP(IN:=IN_DW, PT:=7000); //provo ad utilizzare il FB eTP M_DW:=FBeTP.Q; //Pulse output OutValue := FBeTP.ET; //The counting time is copied to variable END_IF;
Agosto 10, 2020 alle 10:41 am #57250Sergio Bertana
Amministratore del forumCominciamo con il dire che è possibile l’utilizzo di funzioni o blocchi funzione all’interno di un FB, mentre è possibile l’utilizzo di funzioni ma non di blocchi funzioni all’interno di una funzione. Questo indipendentemente dal linguaggio che si utilizza. E’ possibile realizzare blocchi funzioni in qualsiasi linguaggio utilizzando all’interno funzioni o FB scritti in qualsiasi altro linguaggio.
Detto questo non mi è chiaro quello che vuoi fare nel tuo FB, intanto il FB FBeTP lo devi sempre eseguire e non eseguirlo condizionato da DW. Il FB per lavorare correttamente và sempre eseguito, dovrai operare sui sui I/O in funzione di quello che vuoi ottenere.
Poi consa intendi con IN:=IN_DW, non hai variabili che si chiamano IN_DW, per riferirti all’ingresso DW basta usarne il nome come hai fatto nell’IF.
Agosto 12, 2020 alle 10:24 am #57277sacost
PartecipanteProvo a rispondere alle domande:
“non mi è chiaro quello che vuoi fare nel tuo FB” l’idea di base era: se premo il pulsante DW allora attiva il timer per xxx secondi, altrimenti fai altro.
“il FB FBeTP lo devi sempre eseguire e non eseguirlo condizionato da DW” purtroppo era proprio quello che volevo fare dovrò cambiare la logica di funzionamento. In questi gg ho fatto un pò di prove ed avevo scoperto che proprio quello era il problema, nell’idea che mi sono fatto è che il sistema interpreta l’IF come se fosse una funzione e quindi da una funzione non è possibile utilizzare un Blocco Funzione, forse non corrisponde a verità ma mi può essere utile per ricordare :-).
“cosa intendi con IN:=IN_DW, non hai variabili che si chiamano IN_DW” errore di copia ed incolla (sorry) certamente era:
FBeTP(IN:=DW, PT:=7000);
Agosto 12, 2020 alle 10:30 am #57280Sergio Bertana
Amministratore del forumDa quello che dici mi sembra che ora hai spostato l’esecuzione del FBeTP e tutto ti funziona.
In generale Programma, Funzione o Blocco Funzione lo si decide quando si costruisce un nuovo oggetto e nello stesso momento si decide anche con quale dei 5 linguaggi realizzarlo.
La condizione IF ha esattamente lo stesso significato che assume in molti altri linguaggi di programmazione, tutto quello che è contenuto nel corpo dell’IF viene eseguito solo se la condizione è vera. Se la condizione non è vera tutto il contenuto del corpo viene ignorato e rimane nello stato in cui si trova.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.