Vai al contenuto

Conversione tra Epoch time e data/ora

Home Forum Terminali operatore (Weintek) Conversione tra Epoch time e data/ora

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

    Ho un sistema basato su terminale serie iE ed uno SlimLine. Nel terminale ho un input numerico dove imposto un timer in ore (che può essere anche 60 ore). L’oggetto input scala il valore in secondi ed è appoggiato ad una variabile sullo SlimLine mappata via Modbus.  Io dovrei visualizzare a video giorno e ora in cui scadrà questo timer.

    La cosa semplice sarebbe salvare la data/ora nel momento in cui parte il timer, convertirla in Epoch (sul sito Weintek c’è la macro già fatta), sommare i secondi a cui è stato impostato il timer e riconvertire in data ora. Non ho trovato però una macro pronta che possa convertire da Epoch a data. Esiste qualcosa di già fatto?

    In alternativa potrei fare l’operazione su SlimLine e andarmi già a leggere il dato, ma se si riuscissi a farlo da pannello senza toccare il programma del PLC sarebbe preferibile.

    #59084
    Sergio Bertana
    Amministratore del forum

    Ho provato a sentire anche Weintek ma non hanno una macro che converte da Epoch time a data ora. Credo che come hai detto tu la cosa più semplice sia fare transitare i dati sullo SlimLine e poi utilizzare i blocchi funzioni SysDateToETime, SysETimeToDate.

    Sperando possa essere utile ad altri visitatori del forum allego il dimostrativo fornito da Weintek per la conversione da Data/Ora in Epoch ed ecco la macro utilizzata.

    macro_command main()
    short yy, mm, dd, hh, min, ss
    unsigned short md[13] = {0,31,59,90,120,151,181,212,243,273,304,334}
    unsigned short md_leap[13] = {0,31,60,91,121,152,182,213,244,274,305,335}
    unsigned int epoch = 0
    unsigned int a,b,c,d,e,f
    
    GetData(yy, "Local HMI", LW, 100, 1)
    GetData(mm, "Local HMI", LW, 101, 1)
    GetData(dd, "Local HMI", LW, 102, 1)
    GetData(hh, "Local HMI", LW, 103, 1)
    GetData(min, "Local HMI", LW, 104, 1)
    GetData(ss, "Local HMI", LW, 105, 1)
    
    yy = yy - 1900
    mm = mm-1
    if yy%4==0 then
        dd = md_leap[mm] + dd - 1
    else
        dd = md[mm] + dd - 1
    end if
    
    a = (yy-70) * 31536000
    b = (yy-69) / 4 * 86400 
    c = (yy-1) /100 * 86400
    d = (yy + 299) / 400 * 86400
    
    epoch = ss + min*60 + hh*3600 + dd*86400 + a + b - c + d
    SetData(epoch, "Local HMI", LW, 0, 1)
    end macro_command
Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.