Vai al contenuto

Visualizzazione ora:minuti:secondi con scalatura a macro

Home Forum Terminali operatore (Weintek) Visualizzazione ora:minuti:secondi con scalatura a macro

Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Autore
    Post
  • #76091
    Anonimo
    Inattivo

    Ho alcuni contaore su un PLC SlimLine basati su variabili UDINT che si incrementano ad ogni secondo vorrei visualizzarli sul pannello operatore.

    Ho provato ad utilizzare un Numeric Object con la scalatura a macro subroutine per ottenere una visualizzazione del valore nel formato hhhh:mm:ss ma dopo diversi tentativi ho gettato la spugna.

    Qualcuno ha suggerimenti in merito?

    #76093
    Sergio Bertana
    Amministratore del forum

    L’utilizzo della macro per la scalatura valori è stato già trattato in questo topic, una idea su come potresti agire per ottenere quello che desideri è riportata in questo screenshot.

    Numeric Object
    Per la visualizzazione devi definire nelle proprietà dell’oggetto il tipo Customized impostando il numero di cifre totali (Nell’esempio 8) ed il formato di visualizzazione (Nell’esempio ****:**:**).  Nello scaling definire il metodo Macro subroutine definendo la macro di scalatura che andrai a scrivere (Nell’esempio TimeScale).

    Macro TimeScale
    La macro riceve in ingresso il valore UDINT (unsigned int 32 bits) dal PLC e lo elabora ritornando un valore opportunamente scalato in modo da avere sui 2 digit più bassi i secondi, poi a seguire 2 digits di minuti ed infine le ore. Riporto il listato della macro.

    sub unsigned int TimeScale(unsigned int Value)
    unsigned int VSecs=0, VMins=0, VHour=0, VResult=0
    
    VSecs=Value%60
    VMins=(Value/60)%60
    VHour=Value/3600
    VResult=(VHour*10000)+(VMins*100)+VSecs
    return VResult
    end sub
    #76133
    Anonimo
    Inattivo

    La soluzione a macro è perfetta per la visualizzazione ma non ho trovato un modo per poter gestire l’impostazione del valore.

    Nella mia applicazione su di un PLC SlimLine devo impostare una serie di soglie orarie nel formato hh:mm e vorrei utilizzare variabili UINT di appoggio per i valori visto che nel caso peggiore 23:59 il valore è comunque nel range accettato da variabili UINT.

    #76135
    Sergio Bertana
    Amministratore del forum

    La soluzione più semplice è definire nell’oggetto numerico visualizzazione/impostazione tempi la visualizzazione a 2 interi e 2 decimali di una variabile 16-bit Unsigned (Screenshot). In questo modo devi accettare che il separatore hh.mm sia il punto decimale che è anche presente nella tastiera virtuale di impostazione valore.

    Naturalmente non potrai impostare i limiti sulla impostazione per impedire di impostare orari inesatti, l’operatore potrà impostare infatti qualsiasi valore tra 0.00 e 23.99. Siccome la variabile viene sia scritta che letta dal PLC basterà realizzare una routine di controllo valori nel programma PLC e correggere gli eventuali errori di impostazione. Ecco un esempio di programma PLC.

    PROGRAM TimeCheck
    VAR
        Hour : USINT; (* Hour *)
        Minutes : USINT; (* Minutes *)
        CheckStrobe : TON; (* Check strobe *)
        SetTime AT %MW100.2048 : UINT; (* %MW 41024] Set time from HMI *)
    END_VAR
    
    // *****************************************************************************
    // PROGRAM "Timecheck"
    // *****************************************************************************
    
        // -------------------------------------------------------------------------
        // TIME CHECK
        // -------------------------------------------------------------------------
        // Time check strobe.
    
        CheckStrobe(IN:=NOT(CheckStrobe.Q), PT:=T#1s);
        IF NOT(CheckStrobe.Q) THEN RETURN; END_IF;
    
        // Time check.
    
        Hour:=TO_USINT(SetTime/100); //Minutes
        Minutes:=TO_USINT(SetTime-(Hour*100)); //Minutes
    
        IF (Minutes > 59) THEN
            Minutes:=59; //Minutes
            SetTime:=(Hour*100)+Minutes; //Set time from HMI
        END_IF;
    
    // [End of file]

    Per evitare il controllo ad ogni loop di programma ho gestito un timer che comanda il controllo ad ogni secondo. Il limite sull’ora è già controllato dal pannello operatore che non accetta valori superiori a 23.99, quindi il programma controlla solo i minuti e se sono fuori range li reimposta al valore massimo 59.

    #77832
    Sergio Bertana
    Amministratore del forum

    Siccome in molti mi chiedono la macro complementare alla visualizzazione ora per poter impostare HHMMSS da terminale (Nella impostazione non si possono separare i campi con : ma vanno definiti di seguito e sempre a 2 cifre), ecco le 2 macro.

    sub unsigned int TimeRead(unsigned int Value)
    unsigned int VSecs=0, VMins=0, VHour=0, VResult=0
    
    VSecs=Value%60
    VMins=(Value/60)%60
    VHour=Value/3600
    VResult=(VHour*10000)+(VMins*100)+VSecs
    return VResult
    end sub
    sub unsigned int TimeWrite(unsigned int Value)
    unsigned int VSecs=0, VMins=0, VHour=0, VResult=0
    
    VSecs=Value%100
    VMins=(Value/100)%100
    VHour=Value/10000
    VResult=(VHour*3600)+(VMins*60)+VSecs
    return VResult
    end sub

    Nel programma in LogicLab occorre gestire una variabile UDINT a cui indirizzare l’oggetto di visualizzazione numerica nel mio esempio la variabile HMIVars.ClockTime. Come si vede viene trasferito nella variabile solo il valore di ora della SysDateTime, Data/Ora di sistema.

    Su variazione del valore della variabile HMIVars.ClockTime (Sicuramente si è impostato un nuovo valore da terminale) viene aggiornato il valore di SysDateTime, Data/Ora di sistema. Questo programma và eseguito in task Back.

        IF (HMIVars.ClockTime <> ClockTime) THEN
            SysDateTime:=(SysDateTime-MOD(SysDateTime, 86400))+HMIVars.ClockTime;
        END_IF;
    
        ClockTime:=MOD(SysDateTime, 86400); //Clock time
        HMIVars.ClockTime:=ClockTime; //Clock time
Stai visualizzando 5 post - dal 1 a 5 (di 5 totali)
  • Devi essere connesso per rispondere a questo topic.