makemsis Inserito: 13 ottobre 2009 Segnala Inserito: 13 ottobre 2009 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.
Commander Inserita: 13 ottobre 2009 Segnala Inserita: 13 ottobre 2009 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 1980anno = anno ( dataAttuale ); // 1980mese = mese ( dataAttuale ); // 02giorno = giorno ( dataAttuale ); // 12 // Estrazione Valori dal'ora, per esempio, 15:32.12ore = ora ( oraAttuale ); // 15minuti = minuti ( oraAttuale ); // 32secondi = 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 secondooffsetGiornata = ( 3600 * ore + 60 * minuti + secondi ) / 86400; // data giuliana completadataGiuliana = 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)
makemsis Inserita: 13 ottobre 2009 Autore Segnala Inserita: 13 ottobre 2009 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...
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