Vai al contenuto
PLC Forum


Calcolo Data Giuliana Completa


Messaggi consigliati

Inserito:

Ho bisogno di convertire la data gregoriana nel formato Giuliano completo (ovvero che contenga, oltre all'anno, al mese e al giorno anche l'ora, il minuto e il secondo). Ho provato a scrivere due righe in SCL, ma il risultato finale non è quello desiderato perchè il PLC non gestice REAL con quel valore. (Es. 1234567.1234567).

Avete qualche dritta, qualche esempio o sapete dove si possono trovare delle librerie che svolgano questa funzione??

Grazie in anticipo.


Inserita:

Io ho costruito un FB in omron grazie a questo codice e funziona, non ho avuto problemi a gestire numeri reali con quel valore.

ciao

Conversione da data normale a data giuliana

Il seguente algoritmo é valido dal 4712 a.C. in poi, inoltre tiene conto della riforma gregoriana, tramite cui si passò direttamente dal 4 ottobre 1582 al 15 ottobre dello stesso anno. L'ora è da intendersi in formato 24h ed espresso in U.T..

inputs: dataAttuale, oraAttuale, reset(2415020.50);

// Estrazione Valori dalla data, per esempio, 12 febbraio 1980

anno = anno ( dataAttuale ); // 1980

mese = mese ( dataAttuale ); // 02

giorno = giorno ( dataAttuale ); // 12

// Estrazione Valori dal'ora, per esempio, 15:32.12

ore = ora ( oraAttuale ); // 15

minuti = minuti ( oraAttuale ); // 32

secondi = secondi ( oraAttuale ); // 12

if mese = 1 or mese = 2 then begin

anno = anno - 1;

mese = mese + 12;

end;

if dataAttuale < " 15 ottobre 1582 " then begin

a = 0;

b = 0;

end else begin

a = ParteIntera( anno / 100 );

b = 2 - a + ParteIntera( a / 4 );

end;

c = ParteIntera( 365.25 * anno );

d = ParteIntera( 30.6001 * ( mese + 1 ) );

// attualmente si riferisce all'inizio della giornata, in più viene sottratto

// un reset che permette di avere una migliore definizione della parte decimale

// (limiti rappresentativi dipendenti dalle strutture dati); il reset indicato

// si riferisce al 1 gennario 1900, ma è una scelta mia arbitraria

dataGiuliana = b + c + d + giorno + 1720994.50 - reset;

// ora la definizione del punto della gionata dipende dall'utilizzo, e se ne sceglie

// solamente una delle seguenti

// 1. definizione all'ora (non mi interessano i minuti e i secondi)

offsetGiornata = ore / 24;

// 2. definizione al minuto (non mi interessano i secondi)

offsetGiornata = ( 60 * ore + minuti ) / 1440;

// 3. definizione al secondo

offsetGiornata = ( 3600 * ore + 60 * minuti + secondi ) / 86400;

// data giuliana completa

dataGiuliana = dataGiuliana + offsetGiornata;

Accenni matematici:

ParteIntera(numero): restituisce la parte intera del numero (19.5 -> 19)

ParteDecimale(numero): restituisce la parte decimale del numero (19.5 -> 0.5)

Troncamento(numero,decimali): restituisce il numero con decimali pari a quelli voluti, senza arrotondare ( [0.12345,3] -> 0.123)

Modulo(dividendo,divisore): restiruisc il resto della divisione intera tra dividendo/divisore ( [24,23] -> 1)

Inserita:

Grazie mille della dritta, però avevo già trovato quell'esempipo di codice su wikipedia. Ma a quanto pare Siemens non gestisce operazioni a 64Bit, quindi sarebbe necessario suddividere l'operazione in due gruppi di 32bit (due REAL) e gestirli a dovere...solo che non ho idea di come si possa fare...

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...