Vai al contenuto

Controllo forni per trattamenti termici

Home Forum Terminali operatore (Weintek) Controllo forni per trattamenti termici

  • Questo topic ha 6 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 7 anni fa da Stefano.
Stai visualizzando 7 post - dal 1 a 7 (di 7 totali)
  • Autore
    Post
  • #35937
    Stefano
    Partecipante

    Cerco qualche suggerimento per controllo che mi è stato commissionato. Vorrei capire se è realizzabile solo con un pannello operatore (pensavo ad un MT6050iP) e qualche eventuale “trucco” utilizzabile.

    Ho due forni con installato un controllore di temperatura PID interfacciabile via MODBUS RTU su 485. Via modbus posso leggere la temperatura instanea e settare i vari parametri tipo setpoint, PID, potenza massima. Devo automatizzare dei programmi di riscaldamento parametrizzabili. I programmi sostanzialmente sono di due tipi:

    Primo:
    1) Riscalda fino a temperatura A con potenza massima X
    2) giunto a temperatura mantieni per C minuti
    3) Riscalda fino a temperatura D con potenza massima Y
    4) giunto a temperatura D mantieni per E minuti
    5) Riscalda fino a temperatura F con potenza massima Z
    6) Giunto a temperatura F mantieni per G minuti
    7) Fine

    Secondo (che non è altro se non una perte del primo):
    1) Riscalda fino a temperatura A con potenza massima X
    2) giunto a temperatura mantieni per C minuti
    3) Fine

    La mia idea ere di usare un unico pannello e connettere i due controllori di temperatura su un bus 485. Poi gestire i parametri con le ricette e il passaggio tra gli step con macro e scheduler. I due forni devono poter funzionare indipendemente e con start manuale o preprogrammato ad una determinata ora.

    #39359
    Sergio Bertana
    Amministratore del forum

    Si certo è possibile puoi gestire una macro ciclica a tempo che ti esegue tutte le operazioni magari utilizzando una macchina a stati con l’operatore Select Case.

    Select Case [variable]

      Case [value]
        [Statements]
      break

    end Select

    Per realizzare il tuo ciclo mi sembra la soluzione migliore. Naturalmente avrai due macro distinte, ma perfettamente uguali che faranno riferimento a variabili modbus lette dai due regolatori PID. Per leggere i registri utilizzi l’operando GetData per scriverli l’operando SetData.

    #40009
    Stefano
    Partecipante

    Riprendo questo vecchio post. Il progetto sta funzionando egregiamente da un bel po’ su un MT6070iP (EB8000). Tutta via gli operatori mi hanno appena segnalato un paio di anomalie. La prima anomalia è relativa al seguente pezzetto di macro:

    sub CalcTimer(unsigned int time)
        unsigned int minutes, seconds
        minutes = time / 600
        seconds = (time % 600) / 10
        SetData(minutes, "Local HMI", "F2_MINREM", 1)
        SetData(seconds, "Local HMI", "F2_SECREM", 1)
    end sub

    Viene passato alla sub un valore in decimi di secondo e questa procedura lo scrive in due registri che rappresentano minuti e secondi. La mia svista è stata utilizzare “unsigned int” per “minutes” e “seconds”, quindi “SetData” scrive due registri adiacenti e non uno che avevo previsto. Questo mi va a sporcare registri usati per altre cose, solo in visualizzazione fortunatamente. La mia idea è semplicemente di dichiarare unsigned short minutes, seconds ma vorrei capire se ci sono possibili problemi di troncamento. Ossia la macro eseguirebbe il calcolo in una variabile a 32 bit per poi troncarla a 16 (che mi andrebbe bene), oppure troncherebbe la variabile 32 bit per eseguire l calcolo in quella a 16?

    Altra questione molto strana è relativa a questo pezzo di codice:

    unsigned int tick, prevtick, interval, elapsed, remaining
    GetData(prevtick, "Local HMI", LW, 9030, 1)
    interval = record[hold] * 600<
    elapsed = 0

    while elapsed <= interval
        GetData(tick, "Local HMI", LW, 9030, 1)
        elapsed = tick - prevtick

        if elapsed > interval then<
            remaining = 0
        else
            remaining = interval - elapsed
        end if

    CalcTimer(remaining)
    DELAY(250)
    wend

    L’operatore preme un tasto che attiva la macro che contiene questo codice. La macro fa trascorrere un certo tempo e aggiorna due registri che visualizzano un countdown. Questo pezzo di codice funziona perfettamente. Se però lascio il pannello acceso per più di un mese, quando l’operatore fa attivare la macro accade che il ciclo while esce immediatamente (sicuramente un ciclo viene fatto perchè viene visualizzato il il valore corretto iniziale del countdown). Interval si inizializza a 30 minuti solitamete (30 * 600). Questo accade finchè non spengo e riaccendo il pannello. A quel punto tutto torna a funzionare correttamente. Non riesco a capire cosa possa influire. Ci sono bug noti sul pannello nella gestione di LW-9030 (32bit system time unit : 0.1 second) ?

    #40010
    Sergio Bertana
    Amministratore del forum

    Primo punto
    Sarebbe corretto usare delle short ma attenzione tutte le operazioni si svolgerebbero poi a 16bit.

    Secondo punto
    Per una verifica accurata ci vorrebbe tutta la macro, ma come suggerimento verifica potrebbe essere che LW9030 fa overflow sul conteggio ritornando a 0.

    #40012
    Stefano
    Partecipante

    1 – Potrei eseguire i calcoli su variabili a 32 e poi troncarle a 16. C’è un comando specifico per il troncamento o posso semplicemente assegnare il valore di una variabile a 32bit in una a 16?

    2 – Posso anche postare il resto della macro ma non vengono toccati valori relativi a tempistiche o  LW9030, viene eseguito tutto nel loop che ho postato. Chiedo se sono noti bug nel firmware perchè la cosa è abbastanza anomala. Nel manuale LW9030 è indicato come system time a 32 bit in decimi di secondo. Dovrebbe quindi raggiungere lo zero dopo 4294967295 decimi di secondo, 13 anni circa, non dopo un paio di mesi.  Inoltre, anche LW9030 facesse overflow sul conteggio ritornando a 0, il comportamento indicherebbe che dopo l’overflow LW9030 rimane a zero senza incrementare più, perchè se anche interrompo la macro e la rieseguo rimane lo stesso problema fintantochè non spengo e riaccendo il pannello.

    #40013
    Sergio Bertana
    Amministratore del forum

    Per il punto 1 è possibile eseguire tutti i calcoli a 32bit, al termine è possibile passare il risultato in variabile a 16 bit che tronca il resto.
    Per il punto2 appena trovo un attimo verifico il comportamento della LW9030.

    #40075
    Stefano
    Partecipante

    Ho contattato la Weintek che, dopo mesi di verifiche, mi ha confermato esserci un bug nel firmware relativo alla LW9030.

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