Vai al contenuto

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

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #57239
    sacost
    Partecipante

    Volevo 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;
    #57250
    Sergio Bertana
    Amministratore del forum

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

    #57277
    sacost
    Partecipante

    Provo 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);
    #57280
    Sergio Bertana
    Amministratore del forum

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

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Devi essere connesso per rispondere a questo topic.