Vai al contenuto
PLC Forum


Calcolare i secondi trascorsi tra 2 date


Messaggi consigliati

Inserito:

Buon giorno a tutti vorrei sapere se qualcuno di voi ha già avuto la necessita di calcolare la differenza tra 2 date e ricavare il risultato in secondi.

Io ho trovato una funzione di sistema che però permette solamente di fare la differenza tra date per periodi di tempo brevi al massimo 30gg.

 

Avrei invece bisogno di calcolare questo valore per anche periodi superiori a 10 anni.

 

Grazie

 


Inserita:

Usavo il formato DTL perché mi serve sia la Data che l'orario.

Inserita:

dtl?

Sei sotto 300 o 1200/1500?

Comunque, se non ti interessa il calcolo preciso al secondo (parlando di 10 anni ci sono bistestili in mezzo), puoi sempre calcolare la differenza byte per byte degli 8 byte del dt.

 

b0 è l'anno (90=1990, 00 = 2000 etc)

b1 il mese

b2 il giorno

fatta la differenza tra le 2 date, moltiplicherai gli anni-mesi-giorni per i rispettivi secondi e appoggi in una dint con i secondi totali.

Non ho mai dovuto calcolare differenze tra date, questa potrebbe essere una soluzione veloce anche se non precisa al secondo.

Poi magari qualcun'altro ha creato una soluzione, vediamo se qualcuno ti può aiutare!

Inserita:

Come già detto da DesmoGiec, dovresti specificare con cosa stai lavorando.
Sei nella sezione S7-300, ma parli di DTL, che è un formato delle CPU 1200/1500.

 

Con un 300, potresti scomporre le date da confrontare da DATE_AND_TIME in DATE (giorni dal 01/01/1990) e TIME_OF_DAY (ms dalla mezzanotte).

Fai la differenza tra i due valori DATE e moltiplichi per 86400 (i secondi di un giorno).

Fai la differenza tra i due valori TIME_OF_DAY ed hai la differenza in ms. Dividi per 1000 e sommi ai secondi precedentemente calcolati.

Esempio:

   CALL  "DT_DATE"
       IN     :=#DataInizio.DataOra
       RET_VAL:=#DataInizio.Data

      CALL  "DT_TOD"
       IN     :=#DataInizio.DataOra
       RET_VAL:=#DataInizio.Ora

      CALL  "DT_DATE"
       IN     :=#DataFine.DataOra
       RET_VAL:=#DataFine.Data

      CALL  "DT_TOD"
       IN     :=#DataFine.DataOra
       RET_VAL:=#DataFine.Ora

      L     #DataFine.Data
      L     #DataInizio.Data
      -I    
      ITD   
      L     L#86400
      *D    
      T     #tmpSec

      L     #DataFine.Ora
      L     #DataInizio.Ora
      -D    
      L     L#1000
      /D    
      L     #tmpSec
      +D    
      T     #Sec

 

Con un 1200 potresti seguire lo stesso concetto, da sviluppare però in KOP o in SCL, utilizzando al posto delle funzioni DT_DATE e DT_TOD l'istruzione T_CONV.
Con un 1500, che gestisce anche il formato LTIME (64 bit), potresti fare tutto in un colpo solo, usando T_DIFF.

 

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...