Vai al contenuto
PLC Forum


Aggiornamento Variabile in un DB


100482

Messaggi consigliati

Ho creato un db con delle variabili per contare le ore di funzionamento di un palo pompe.

.DB.jpg.ac6bfb1f7d1bb7c3472cfb0fa1dcce4c.jpg

 

 

Sfruttando il Merker interno a 1Hz, conto le ore e le salvo nella DB a ritenzione.

ContatoreOre.jpg.8282429bd6db630a9a2e16329809e316.jpg

 

Ora vorrei impostare le ore effettive di vita della pompa, mettendole uguali al valore di un conta ore meccanico che ho in parallelo, ma la db non mi accetta questa correzione.

La variabile "ContaOreDB".MinutiP1 si aggiorna finché la variabile "ContaOreDB".ImpostaOreP1 è a uno, poi torna al valore originale!

La variabile "ContaOreDB".NuoviMinutiP1 si aggiorna invece senza problemi.

Anche se tolgo la spunta nella DB "a ritenzione" non funziona.

Qualcuno mi può aiutare?

ResetOre.jpg.66ab540810d836503ccb71730cb2c3bd.jpg

 

Link al commento
Condividi su altri siti


La Variabile "ContaOreDB".MinutiP1 viene continuamente scritta dal contatore, quindi è normale che quando non hai il bit "ContaOreDB".ImpostaOreP1 la tua variabile torna al valore del contatore.

 

58 minuti fa, 100482 ha scritto:

La variabile "ContaOreDB".NuoviMinutiP1 si aggiorna invece senza problemi.

La variabile "ContaOreDB".NuoviMinutiP1 invece non è scritta da nessuno, quindi non cambia valore ne con il bit a uno ne quando è zero.

 

La ritenzione non ha nessun effetto se non quello di non perdere i valori quando spegni la macchina.

Link al commento
Condividi su altri siti

Sono i counter che scrivono il loro valore corrente nelle variabili del DB. Tu non fai nessuna operazione per modificare il valore corrente dei counter.

 

Ma perché si deve sempre impazzire per contare ore e minuti, con counter che incrementano i minuti ogni 60 secondi, e counter che incrementano le ore ogni 60 minuti?
Perché non lasci perdere i counter, e non fai un semplicissimo incremento, ogni secondo (sul fronte di salite di "Clock_1Hz"), di una variabile DINT?
Contando 24 ore su 24, 7 giorni su 7, ne hai per quasi 70 anni. Anzi, visto che il 1200 gestisce anche UDINT, arrivi quasi a 140 anni.
Sull'eventuale pannello operatore fai la scalatura della variabile, e la visualizzi in ore con una cifra decimale.
Al massimo, se proprio vuoi visualizzare ore e minuti, dal contasecondi totale con le istruzioni di divisione e MOD (resto) in un attimo ricavi ore e minuti.
Ma è comunque tutto più semplice. Anche per l'azzeramento (ti basta azzerare una sola variabile) o per eventuali confronti (sempre un banale confronto con una sola variabile).

 

Link al commento
Condividi su altri siti

Ho provato a disabilitare la funzione con il contatore direttamente nel Main, cosi che il counter non può continuamente “bloccarmi” la variabile, ma niente.

Non è niente di mortale questo problema ma è elegante riuscire a farlo funzionare. 😁

Link al commento
Condividi su altri siti

2 ore fa, 100482 ha scritto:

cosi che il counter non può continuamente “bloccarmi” la variabile, ma niente.

L'unico modo perché il counter non scriva il suo valore corrente nella variabile collegata a CV, è non richiamare il counter.
Ma, in ogni caso, quando ritorni a richiamare il counter, riscrive il valore corrente. Dovresti modificare direttamente il valore corrente dei counter.
 

Però, come ti ho già detto (ma pare che non ascolti), ti stai solo complicando la vita inutilmente. Non ti piace l'idea di incrementare una sola variabile? Vuoi lo stesso contare secondi, minuti e ore?
Lascia comunque perdere i counter, e fai dei semplici incrementi alla variabile "Secondi". Quando la variabile "Secondi" supera 59, azzeri la variabile "Secondi" ed incrementi la variabile "Minuti". Uguale discorso per minuti e ore.
In questo modo, non hai più un oggetto "Counter" che ti scrive il suo valore corrente, ma delle variabili che puoi manipolare come meglio ti pare.

Comunque, pensaci: la soluzione dell'incremento di una sola variabile "Contasecondi", è la più facile. Poi, se vuoi, con DIV e MOD, in un attimo, dai secondi totali ti ricavi ore:minuti:secondi.

Link al commento
Condividi su altri siti

Cesare Nicola

 

12 ore fa, batta ha scritto:

Lascia comunque perdere i counter, e fai dei semplici incrementi

Magari si tratta di un esercizio in cui viene espressamente richiesto di usare i counter; se non è così allora concordo (e non potrebbe essere altrimenti). Mai usato un counter in vita mia. 🙂

Diciamo che l'esperienza è comunque servita per capire che se una istruzione ha una DB di istanza, "comanda" quella.

Link al commento
Condividi su altri siti

Va bene anche se uso l'incremento di una variabile.

 

Ho provato cosi:

Utilizzo la funzione ADD per incrementare i secondi.

nel Enable metto il Merker di Clock, poi sommo "1" (IN1) con il valore dei secondi attuali (IN2)  che è la stessa variabile dell'uscita (Out1)

Le variabili sono di tipo DInt mentre il Clock è Bool.

 

L'incremento é troppo veloce!

 

Ho dimenticato qualcosa?

 

Link al commento
Condividi su altri siti

ifachsoftware

Il Merker di clock devi metterlo sul fronte di salita , altrimenti ti incrementa ad ogni scansione , mentre a te interessa che vari con la base dei tempi interessata.

Poi se vuoi farla incrementare ogni secondo devi utilizzare il fronte di salita sul clock del mezzo secondo , perche se usi il clock del secondo ti incrementerebbe ogni 2 secondi.

Modificato: da ifachsoftware
Link al commento
Condividi su altri siti

1 ora fa, ifachsoftware ha scritto:

Poi se vuoi farla incrementare ogni secondo devi utilizzare il fronte di salita sul clock del mezzo secondo , perche se usi il clock del secondo ti incrementerebbe ogni 2 secondi.

No. Il clock 1 secondo è 500 ms on e 500 ms off. Quindi, il fronte di salita c'è una volta al secondo.

Link al commento
Condividi su altri siti

ifachsoftware
1 ora fa, batta ha scritto:

No. Il clock 1 secondo è 500 ms on e 500 ms off. Quindi, il fronte di salita c'è una volta al secondo.

Hai ragiorne , ricordavo 1s on ed uno off

Link al commento
Condividi su altri siti

Non è che va velocissimo, è che incrementa ad ogni scansione. Ogni volta che il programma cicla, controlla se il clock è == ON ( clock è on 500 ms ogni secondo) e se la condizione è vera, incrementa.
Ipotizzando che il tuo programmino cicli in circa 2 ms,  senza fronte la tua variabile viene incrementata 250 volte al secondo . 

Modificato: da step-80
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...