Vai al contenuto
PLC Forum


Calcolo Del Giorno Progressivo


macro

Messaggi consigliati

Scusate l'ignoranza ma esiste una funzione per ricavare il numero del giorno progressivo dall'inizio dell'anno?

ho pensato ad una struttura che somma mese per mese l'offset al giorno corrente ma non so come fare con i bisestili...

grazie a tutti.

Link al commento
Condividi su altri siti


non credo esista una funzione del genere (almeno non gratis). Ad ogni modo il calcolo è semplice e come suggerimento ti direi di scrivere il programma proprio come tu faresti a calcolare il giorno x su un pezzo di carta. Il bisestile lo calcoli semplicemente aggiungendo un giorno ogni 4 anni a partire da un anno bisestile come il 2004 per esempio. Per esempio poni 2004 come offset degli anni per calcolarti i bisestili. Se sei nel 2008 eseguirai questa operazione : (2008-2004)/4 il risultato ti dà i giorni da aggiungere perchè bisestile. In questo caso aggiungi 1 attenzione che devi aggiungere 1 se il giorno da cercare è maggiore o uguale a 1 marzo dell'anno in corso se è bisestile (risultato dell'operazione senza resto) altrimenti l'aggiungi sempre.

Per i mesi fatti una tabella con i giorni dei singoli mesi e associali ad un numero da 1 a 12 (questi numeri puoi usarli come indice indiretto della tua tabella). Insomma vedi tu.

Io una volta ho dovuto fare queste operazioni perchè a me addirittura mi servivano i millisecondi passati da un determinato giorno (1-1-2000 00:00:00.000)!!!

Link al commento
Condividi su altri siti

A me interessa sapere se che numero ha l'attuale giorno dall'inizio dell'anno quindi:

se mese = gennaio

l 0

t offset

...

se mese = dicembre

l 324

t offset

l offset

l giorno

t progressivo

se annobisestile e mese>marzo

progressivo=progressivo+1

stanotte ci provo....

speravo in una funzione già fatta...

Link al commento
Condividi su altri siti

quindi il progressivo che dici tu è calcolato per ogni singolo anno non a partire da un anno in poi giusto??

allora per sapere se è bisestile basta che prendi l'anno e lo dividi per 4 se il resto è =0 allora è bisestile.

Con S7 c'è l'istruzione MOD che calcola il resto di una divisione fra interi

Link al commento
Condividi su altri siti

quello che mi interessa trovare è il progressivo da poter stampare. (es. oggi è il giorno 351)

ma con il bisestile non so cosa fare... ...

bè penso che proseguo con il mio blocco.... anche se nel 2100 l'applicazione nessuno mi verrà a cercare... :rolleyes:

Link al commento
Condividi su altri siti

Il Formato del tipo di dati DATE rappresenta in una variabile a 16 bit i giorni trascorsi dal 1° gennaio 1990, vedi anche sfc0/sfc1... forse puoi lavorarci un po sopra... :rolleyes:

Definizione di anno bisestile (fonte wikipedia)

Un anno è bisestile se il suo numero è divisibile per 4, tranne che se sia divisibile per 100 (ma è bisestile se è divisibile per 400).

Sono cioè bisestili tutti gli anni la cui numerazione termina con le due cifre 04, 08, 12... fino a 96; gli anni che terminano con 00 sono bisestili solo se il numero del secolo è divisibile per 4, cioè il 1600, il 2000, il 2400 eccetera. In sintesi sono bisestili: :blink:

gli anni divisibili in un multiplo intero di 4, purché non si tratti di anni secolari; :huh:

gli anni secolari divisibili per un multiplo intero di 400. :unsure:

In linguaggi di programmazione come C, Java, PHP, Perl, si può eseguire il test:

((anno % 4 == 0 && anno % 100 != 0) || anno % 400 == 0) <<<< forse questo chiarisce più delle parole sopra... ;)

Link al commento
Condividi su altri siti

Tradotto in AWL suona più o meno così:

      O(    
            
      U(    
      L     "Anno"
      L     L#4
      MOD                                         // Resto della divisione
      L     L#0
      ==D                                         // RLC=1 se anno è divisibile per 4 
      )     
      U(    
      L     "Anno"
      L     L#100
      MOD                                         // Resto della divisione
      L     L#0
      <>D                                         // RLC=1 se anno non è divisibile per 100
      )     
            
      )     
      O(    
            
      L     "Anno"
      L     L#400
      MOD                                         // Resto della divisione
      L     L#0
      ==D                                         // RLC=1 se anno è divisibile per 400
            
      )     
      =     "AnnoBisestile"

(salvo errori) ;)

Link al commento
Condividi su altri siti

Io farei come suggerisce rddiego tabella

0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334

come indice tabella usi il mese

al valore ottenuto dalla tabella aggiungi i giorni del mese

Per gli anni bisestili senza pensarci molto su io farei un'altra tabella

0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335

stesso algoritmo in base all'anno decidi quale tabella utilizzare.

Link al commento
Condividi su altri siti

grazie... avevo fatto senza contare il secolo. non penso che la mia applicazione arrivi a tanto....

Prego...

La pensavano così anche quelli che hanno "creato" il millennium bug :P

Se ti piace di più con i salti puoi fare così:

      L     "Anno"
      L     L#4
      MOD                                         // Resto della divisione
      SPN   ANB                                   // Se <>0 --> Anno Non Bisestile
            
      L     "Anno"
      L     L#100
      MOD                                         // Resto della divisione
      SPZ   ANB                                   // Se =0 --> Anno Non Bisestile
            
            
      L     "Anno"
      L     L#400
      MOD                                         // Resto della divisione
      SPZ   AB                                    // Se =0 --> Anno Bisestile
            
ANB:  SET   
      R     "AnnoBisestile"
      SPA   OK

AB:   SET   
      S     "AnnoBisestile"
            
OK:   NOP   0

Modificato: da JumpMan
Link al commento
Condividi su altri siti

non credo esista una funzione del genere (almeno non gratis)

E chi l'ha detto?

Bastava una breve ricerca e si trovava questo.

Fa la stessa cosa della funzione Siemens, ma non è protetta, è di libero utilizzo ed è commentata.

Basta po calcolare i giorni della data attuale dal 01-01-1990, i giorni dal 01-01 dell'anno corrente dal 01-01-1990 e fare una sottrazione.

Modificato: da batta
Link al commento
Condividi su altri siti

La funzione FC6, passandogli la data/ora in formato DATE_AND_TIME, restituisce la data in giorni dal 01-01-1990

Allora batta senza neanche guardare la tua funzione (mi fido ciecamente :) ) direi che basta richiamare 2 volte FC6, una volta con la data/ora corrente e una volta con la data 01/01/corrente_anno e poi sottrarre le 2 word che escono ed il gioco è fatto ! ;)

Azz... mi sa che ho detto la stessa cosa che hai detto tu, non avevo capito che intendevi fare 2 richiami di FB6... forse è ora di andare a dormire :rolleyes:

Ciao

Modificato: da JumpMan
Link al commento
Condividi su altri siti

x batta .ho scaricato il file linkato ora provo

Allora batta senza neanche guardare la tua funzione (mi fido ciecamente smile.gif ) direi che basta richiamare 2 volte FC6, una volta con la data/ora corrente e una volta con la data 01/01/corrente_anno e poi sottrarre le 2 word che escono ed il gioco è fatto

provo anche questa strada... a volte basterebbe far andare i 2 neuroni che mi rimangono più forte che un gatto di marmo....

Link al commento
Condividi su altri siti

La pensavano così anche quelli che hanno "creato" il millennium bug

la differenza è che loro hanno programmato le cose non più di 20 anni prima. Fra 90 anni non so se ci saranno ancora i vostri S7

Link al commento
Condividi su altri siti

  • 1 year later...

salve a tutti ho un aspiratore vortice modello mf-120 t con ,timer attualmente e alimentato tramite pulsante na prememdo un paio di secondi aspiratore si avvia regolarmente .siccome la scheda elettronica e temporizzata il motore si avvia dopo un paio di secondi io vorrei, alimentare aspiratore con relè passo passo interruttore con possibilita che lo posso comandare acc enzione e spegnimento tramite pulsante, non so se lo posso installare il relè perche e un. carico induttivo quanto iltimer stacca io vorrei che stacca anche la bobina del relè, :mi indicate como posso realizzare questo circuito in attsa di una risposta vi ringazio

Link al commento
Condividi su altri siti

  • 1 month later...

Nessuno ti risponde perchè manca qualche dato e poi è un argomento trattatissimo sul forum.

Quanto assorbe il tuo motore dell'aspiratore? Con questo dato puoi verificare subito su di un catalogo come quello di Finder se c'è un relè passo passo adatto al tuo scopo.

Se l'assorbimento del motore aspiratore è maggiore del massimo consentito dai contatti del relè devi interporre tra questo ed il motore un relè di potenza.

Link al commento
Condividi su altri siti

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