GiuseppeTeo Inserito: 8 febbraio 2017 Segnala Inserito: 8 febbraio 2017 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
DesmoGiec Inserita: 8 febbraio 2017 Segnala Inserita: 8 febbraio 2017 In che formato memorizzi le date?
GiuseppeTeo Inserita: 8 febbraio 2017 Autore Segnala Inserita: 8 febbraio 2017 Usavo il formato DTL perché mi serve sia la Data che l'orario.
DesmoGiec Inserita: 8 febbraio 2017 Segnala Inserita: 8 febbraio 2017 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!
batta Inserita: 8 febbraio 2017 Segnala Inserita: 8 febbraio 2017 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora