Vai al contenuto

Come utilizzare il FB Average

Home Forum Programmazione IEC 61131 (LogicLab) Come utilizzare il FB Average

Stai visualizzando 6 post - dal 1 a 6 (di 6 totali)
  • Autore
    Post
  • #52155
    Stefano
    Partecipante

    Ho un sistema che acquisisce una tempera tramite PT100 (collegata direttamente al modulo acquisizione analogico serie slimline), l’uscita poi va su un blocco Average con coefficiente di 100.

    Il sistema si stabilizza sui 230°C e viene mantenuto da un riscaldatore pilotato in PWM con un periodo di 2 secondi. Mi sono accorto che mentre il riscaldatore è fisicamente acceso la temperatura salta su di mezzo grado, appena si spegne torna giù di mezzo grado. Quindi continua a variare così con un periodo di 2 secondi.

    Ho provato ad aumentare progressivamente il coefficiente fino ad arrivare a 300 ma vedo che la situazione non cambia di molto. Posso provare ad aumentarlo ancora ma non vorrei che poi la risposta fosse troppo lenta. Diciamo che non ho ancora ben chiaro come funzioni il coefficiente in questione.

    #52158
    Sergio Bertana
    Amministratore del forum

    Il FB Average esegue una integrazione del valore in ingresso utilizzando il coefficente impostato, il comportamento è molto simile a quello ottenuto analogicamente da una rete RC.

    Per comprenderne bene il funzionamento ti consiglio di realizzare un semplice progetto con acquisizione analogica e visualizzare sia il valore in ingresso che in uscita al FB tramite la funzione oscilloscopio di LogicLab. In questo modo puoi vedere graficamente la risposta in uscita al variare del segnale in ingresso.

    Ma venendo alla tua domanda è molto strano quello che succede, hai verificato in debug come è l’andamento del valore di temperatura in uscita al FB SysGetAnInp?

    Se il valore è corretto, dovresti vedere il valore di temperatura con le cifre decimali (e magari anche la cifra delle unità) che continuano a variare e se così è e se la acquisizione con la SysGetAnInp è effettuata in task Back puoi mettere coefficente anche di 1000 e più. Dovresti vedere in uscita alla FB le cifre decimali quasi stabili.

    #58911
    Rubox
    Partecipante

    C’è un modo per “azzerare” il valore medio del FB Average?

    Lancio un’acquisizione di un’ora di un ingresso e lo passo ad Average. Quando lancio un’altra acquisizione dello stesso ingresso vorrei poter ripartire con un valore medio nuovo.

    #58916
    Sergio Bertana
    Amministratore del forum

    Settando il valore di Coefficent a “0” l’uscita Average assume valore di Value.

    Dopodichè settando il valore di Coefficent corretto si riprende ad eseguire la media.

    #70008
    Stefano
    Partecipante

    Questo è il mio codice di acquisizione di una temperatura:

    PROGRAM MyProgram
    VAR
        ALR_SENS_HEATER : BOOL; (* Sensor alarm *)
        AN_TEMP_HEATER : REAL; (* Temperature (°C) *)
        ANA_IN_2 : SysGetAnInp; (* Analog inout acquisition *)
        AV_IN_2 : Average; (* Temperature average *)
    END_VAR
    
        ANA_IN_2(Address:=3, Channel:=1, Mode:=AD_PT100_DIFFER);
    
        IF ANA_IN_2.Fault THEN
            ALR_SENS_HEATER:=TRUE; //Sensor alarm
        ELSIF ANA_IN_2.Done THEN
            AV_IN_2(Value:=ANA_IN_2.Value,Coefficient:=125.0);
            AN_TEMP_HEATER:=AV_IN_2.Average; //Temperature (°C)
        END_IF;
    
    // [End of file]

    Oggi c’è stato un problema elettrico sulla PT100. Probabilmente il blocco di acquisizione analogica ha restituito qualche valore spropositatamente alto. L’errore ha comunque attivato l’uscita Fault, la cosa è gestita quindi l’operatore veniva informato del problema. La manutenzione ha sistemato il problema elettrico senza riavviare l’impianto. La segnalazione d’errore era rientrata, quindi l’operatore non vedeva guasti, ma dopo più di un ora la temperatura indicata era di 180°C, con trend in calo, contro la temperatura reale della sonda attorno ai 22 °C. Questo mi fa pensare che il blocco Average fosse semplicemente “sporco”.

    La mia idea sarebbe di appoggiare “Coefficient” ad una variabile che viene settata a zero quando il blocco SysGetAnInp è in “Fault” e riportata al valore corretto alla fine del codice eseguito quando il blocco segnala “Done”. Così mi assicuro che alla prima lettura venga “ripulito” il blocco Average.

    In una situazione simile, quindi ripristino della sonda da guasto, potrebbe essere necessario anche una sorta di reset del blocco SysGetAnInp ? O magari un reset fisico dell’hardware PCB126C110?

    #70025
    Sergio Bertana
    Amministratore del forum

    Il FB Average per calcolare il valore mediato sul valore di ingresso utilizza al suo interno una variabile di appoggio che simula il comportamento di una grossa capacità. Sicuramente nel momento in cui il valore di ingresso ha raggiunto valori molto alti per un certo tempo ha “caricato” la “capacità” interna del FB che poi alla ricomparsa del valore corretto impiegherà un certo tempo per “scaricarsi”.

    Il modulo di acquisizione analogica su errore acquisizione (Esempio rottura  sonda) oltre a generare errore, ritorna come valore REAL lo stato NaN acronimo di Not a Number. Non sò che versione hai tu del FB Average (Tasto destro sul FB puoi visualizzarne le proprietà), dalla versione Sfr054d160 è stato introdotto il controllo sul valore di ingresso se NaN o INF viene azzerato il valore della “capacità”. Da quello che dici sembrerebbe che tu stai utilizzando una versione precedente.

    Comunque come dici giustamente tu se si azzera il valore di Coefficent il FB copia immediatamene il valore in ingresso sulla “capacità” interna e quindi in uscita. Quindi è corretto su Fault acquisizione azzerare Coefficent, ma affinchè abbia effetto devi anche eseguire il FB, nel tuo programma su errore non viene più eseguito. Ecco come potresti modificarlo.

        IF ANA_IN_2.Fault THEN
            ALR_SENS_HEATER:=TRUE; //Sensor alarm
            AV_IN_2.Coefficient:=0.0;
        ELSIF ANA_IN_2.Done THEN
            AV_IN_2(Value:=ANA_IN_2.Value);
            AV_IN_2.Coefficient:=125.0;
            AN_TEMP_HEATER:=AV_IN_2.Average; //Temperature (°C)
        END_IF;

    Non occorre invece fare alcuna operazione sul modulo analogico che provvede a ripristinare il funzionamento alla soluzione del guasto.

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