Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Calcolo Velocità


Messaggi consigliati

Inserito:

Ciao a tutti, devo calcolare la velocità di un tappeto.

Ho un encoder montato sul tappeto e per calcolare la velocità vado a vedere con un interrupt a tempo ogni 2 ms la variazione di impulsi tra ora e i 2 ms prima, in questo modo mi calcolo la velocità in imp/ms (unità che a me va bene)

Con la velocità che calcolo devo, ogni 5 ms, eseguire delle operazioni.

La mia domanda è questa: so che il calcolo di velocitò per funzionare deve essere eseguito ( ""nella metà del tempo in cui vengono eseguite le operazioni per cui mi serve la velocità calcolata....") ci dovrebbe essere anche una formuletta...

Qualcuno di voi la sa?


Livio Orsini
Inserita:
La mia domanda è questa: so che il calcolo di velocitò per funzionare deve essere eseguito ( ""nella metà del tempo in cui vengono eseguite le operazioni per cui mi serve la velocità calcolata....") ci dovrebbe essere anche una formuletta...

La tua affermazione non è vera in assoluto, forse potrebbe essere valida per alcune operazioni...Prova a descrivere cosa intendi fare con la velocità misurata.

Inserita:

Descrivi anche come fai a fare un interupt da 2ms

e con che CPU lo ottieni

e se fai una media della velocità rilevata o la usi diretta

ciao

Luca

Inserita:

Allora ti pongo la domanda in modo diverso:

Ogni 2 ms mi calcolo la velocità del tappeto, in teoria se il tappeto va a velocità cosrtante ogni 2 ms dovrei leggermi-campionarmi sempre lo stesso valore.

Questo in teoria visto che in un lavoro che avevo sviluppato tempo fa mi ero accorto che questo valore (velocità calcolata) non era costante (avevo valori che a volte variavano di 10 imp/ms rispetto alla velocità reale).

Documentandomi poi ho saputo che per il calcolo della velocita esiste una formula che lega la frequenza degli impulsi che arrivano con il tempo che io vado a calcolarmi la velocità.

Spero di essere stato chiaro.

Inserita:

No luca non posso fare la media del mio valore, perchè ogni 4ms devo eseguire dei calcoli con la velocità calcolata, capisci anche tu che se devo fare una media la faccio su 2 valori.

Livio Orsini
Inserita: (modificato)

Ma non riesci proprio a spiegarti?

Facciamo alcune ipotesi.

1 - Vuoi misurare la velocità in impulsi al ms? Se stai campionando ogni 2 ms devi dividere per due la lettura.

2 - Se usi la velocità calcolata ogni 4 ms sarebbe più logico e pratico leggere il conteggio degli impulsi ogni 4 ms e non ogni 2ms

3 - La formula di cui parli serve per calcolare la velocità in termini ingegneristici (msec p.e.) e dipende dai parametri del tuo sistema, quali: impulsi/giro dell'encoder, diametro del rullo di misura, etc.

4 - Le variazioni di lettura, dell'entità che denunci, sono dovute, quasi certamente, al jitter di campionamento che con il tempo che hai impostato sarà sicuramente notevole.

Modificato: da Livio Orsini
Inserita:
Con la velocità che calcolo devo, ogni 5 ms, eseguire delle operazioni.

Se in base alla velocità calcolata devi eseguire delle operazioni ogni 5ms, perché calcoli la velocità ogni 2ms?

Non ti conviene calcolare direttamente la velocità ogni 5ms ed eseguire le operazioni del caso?

Oltretutto, con una misura fatta ogni 5ms anziché ogni 2ms, avresti anche variazioni minori della velocità calcolata e metteresti meno in difficoltà quella povera cpu.

Inserita:

Concordo con Livio e batta: non serve fare letture molto veloci se poi le correzioni sono più "lente".

Oppure c'è un altro motivo per cui devi fare le letture ogni 2 msec. ??

Inoltre, se dovessi calcolare dei valori medi, avresti un valore non "ritmico", perchè 5 non è multiplo di 2.

Quindi dovresti calcolare il primo valore su 2 letture, il secondo su 5, il terzo su 7, il quarto su 10, etc...

In caso di lettura con un tempo ciclo e elaborazione con un altro, è sempre meglio avere valori multipli uno dell'altro.

Gianmario Pedrani
Inserita:

E con quale cpu Siemes intendi creare un interup di 2 ms???' io ci metterei qualche scheda dedicata....

Inserita:

Allora,

Indipendentemente da ogni quanto eseguo il calcolo della velocità e l'esecuzione delle operazione, la mia domanda non era questa!

Io chiedevo semplicemente, perchè leggendo la velocità (che in pratica resta costante) ogni 2ms, ho per il 90% dei casi valori uguali tra loro (con un errore di 1 imp/ms) mentre per il 10 % dei casi leggo un valore cannato, che si diferisce di 10-15 imp/ms rispetto alla velocità reale.

Mi incuriosisce l'affermazione di livio:

4 - Le variazioni di lettura, dell'entità che denunci, sono dovute, quasi certamente, al jitter di campionamento che con il tempo che hai impostato sarà sicuramente notevole.

Cosa intendi per

al jitter di campionamento
.
Inserita:

Le nostre domande erano appunto per capire il tuo problema e darti qualche suggerimento

-coma fai ad essere sicuro che la leggi veramente ogni 2ms ?? e se ogni tanto la leggi dopo 2,1ms ???

-nei presunti 2ms , quanti impulsi leggi ??? perche se la differenza e' di ( come affermi ) 10-15 ma il conteggio e' di 2000 e' un fatto , se il conteggio e' di 20 e tutta un'altra cosa.

-ad esperienza personale , una velocita' veramente costante in un movimento , non esiste , c'e' sempre un po' di incostanza ( per questo e per il jitter si fanno le medie )

ciao

Luca

Inserita:
coma fai ad essere sicuro che la leggi veramente ogni 2ms ??

Un interrupt a tempo di 2 ms

-nei presunti 2ms , quanti impulsi leggi ???

20 imp ogni 2ms (10 imp/ms) capirai che un errore di 10 imp ogni 2 ms e quindi 5 imp/ms è rilevante.

-ad esperienza personale , una velocita' veramente costante in un movimento , non esiste , c'e' sempre un po' di incostanza ( per questo e per il jitter si fanno le medie )

Ti ho gia spiegato perche non posso eseguire la media.

Sono d'accordo che non esiste una velocità perfettamente costante, ma non posso pensare di avere una velocita reale di 10 imp/ms e trovarmi (nel 10% dei casi) un valore di 15-20 imp/ms perchè è il doppio della velocità reale, quidi l'errore stà da un'altra parte!

Inserita:
Un interrupt a tempo di 2 ms

forse il tuo problema sta proprio qui , forse per questo che insisto

come fai a fare cio ??? con che CPU pensi di fare cio ??? ( se il PLC e' siemens , non sono tante le cpu che ti permettono REALMENTE di fare una cosa simile )

quindi 5 imp/ms è rilevante.

molto rilevante , non è jitter , insisto che hai un interrupt non costante

quel 10% di errori e' costante o casuale ??? ( sbagli sempre una lettura su dieci ?? )

comunque se rilevo ogni 2 ms , e agisci ogni Xms , quando agisci puoi farti la media delle rilevazioni che hai fatto ,

non capisco perche' non puoi farlo

ciao

Luca

Inserita:
Indipendentemente da ogni quanto eseguo il calcolo della velocità e l'esecuzione delle operazione, la mia domanda non era questa!

Ehh, no, Eddy !! "Indipendentemente" lo pensi tu. E se invece il tuo problema nascesse proprio da lì ??

Come fai la verifica delle velocità lette ??

Salvi ogni 2 ms il valore letto su un DB e poi lo vai a vedere, oppure cosa ??

Quello che ti dice Luca bab non è da trascurare, ricorda che la Siemens non è famosissima per la velocità dei suoi prodotti, ottimi per molti versi, ma........ :rolleyes:

Secondo me è molto facile che il tuo tempo di interrupt sia al limite con le prestazioni della CPU che stai usando, e può essere che lei decida, non riuscendo a "stargli dietro", di saltare qualche lettura, così la volta dopo ti trovi il doppio di impulsi.

Comunque, non ho visto risposta alla domanda di batta e anche mia: che te ne fai di un campionamento a 2 ms.....??

Se leggi solo 10 o 15 impulsi, molto meglio leggere ogni 10 ms con 50 o 60 impulsi, no ??

O c'è un altro motivo ???

Inserita:

Perché, nonostante ripetute richieste, ti ostini a non rivelare che cpu stai usando?

Se ogni tanto leggi un numero di impulsi praticamente doppio, non ti viene in mente che, forse, un interrupt è stato saltato? Hai fatto un controllo in tal senso (vedi OB80)? Del resto, con interrupt a 2ms non c'è niente di più facile.

Alla domanda: "coma fai ad essere sicuro che la leggi veramente ogni 2ms ??"

Hai risposto: "Un interrupt a tempo di 2 ms"

Non ti viene in mente che la cpu farà tutto il possibile per rispettare questo tempo, ma non è detto che ci riesca con precisione assoluta?

Gli eventi devono rispettare delle priorità. Se richiami un interrupt mentre c'è in corso un evento con priorità più elevata, l'interrupt verrà messo in coda.

Forse avrai i tuoi buoni motivi, ma perché non ci vuoi dire come mai sei così ostinato su questi 2ms?

Non ti pare strano chiedere un consiglio e non voler fornire i dettagli?

Inserita:

A volte non si riesce a capire la reticenza a dare informazioni a chi cerca di aiutare.

Non e' che se ci fornisce tutte le informazioni poi sia obbligato ad ucciderci ??? :lol::lol:

Bye

Luca

Livio Orsini
Inserita: (modificato)

Eddyn°1 se non ti decidi a darci le informazioni richieste non otterrai più alcuna risposta! Almeno da me.

Non capisco perchè c'è gente che fa domande e non vuole dare i dati nenache sotto tortura. Di cosa hai paura? Che qualcuno ti copi l'idea o temi di star facendo un cavolata immane e temi le risate omeriche di tutto il forum? Se è così tranquillizzati: qui nessuno irride nessuno, per regolamento.

Modificato: da Livio Orsini
Inserita:

Semplicemente a me interessava l'aspetto puramente teorico... voi però volete sapere la mia applicazione...... allora se questo vi può aiture:

Tipo di applicazione:

Sto realizzando un asse elettrico, ho n° valvole (camme) che hanno un punto di attivazione e un punto di disattivazione in un giro macchina (360°), a seconda della velocità della macchina devo spostare dinamicamente i punti di attivazione e disattivazione della singola valvola (camma) conoscendo il tempo che impiega questa per attivarsi. Chi conosce le applicazioni legate all'asse elettrico sa di cosa stò parlando. Di conseguenza ogni 2 ms vado a calcolarmi la velocità e ogni 4 ms calcolo lo spostamento dinamico delle valvole

Tipo di PLC:

Di solito (90%) io lavoro con S7 300, e per questo tipo di problemi uso la scheda dedicata FM 352.

Ora devo realizzare questa macchina con A&B (compaxt logix) e la scheda dedicata non esiste.

Ho inserito la discussione nella sezione siemens, perchè il tipo di PLC in questo caso non conta, è la forza dell'abitudine che mi ha fatto inserire la discussione nella sezione Siemens.

Vi dico di sicuro che l'interrupt di 2 ms lo faccio senza problemi, e sono SICURO che il calcolo lo eseguo ogni 2ms.

Io vi ho dato i seguenti dati:

- sono sicuro che la campionatura viene eseguita ogni 2 ms

- sono sicuro dei miei calcoli

- Per 80% delle letture rilevo un valore esatto (alla velocità max 20 imp/ms) per il restante 10% dei casi leggo un valore che si discosta anche di 10 imp/ms

La mia domanda è:

Quali sono le possibili cause dell'errore? io ho pensato che il tempo di campionatura (2ms) può essere troppo corto-lungo rispetto alla frequenza con cui arrivano gli inpulsi dell'encoder (22000 imp/sec --> 22imp/sec)

Secondo voi esiste una legge che regola queste 2 variabili (tempo campionatura/frequenza imp)

Ciao.

Inserita:
Chi conosce le applicazioni legate all'asse elettrico sa di cosa stò parlando. Di conseguenza ogni 2 ms vado a calcolarmi la velocità e ogni 4 ms calcolo lo spostamento dinamico delle valvole

Ti assicuro che faccio la stessa identica cosa , senza dover calcolare la velocità ogni 2ms

anch'io uso la FM352 che fa' la stessa cosa , e quando ne faccio a meno , ho la mia parte di codice che per farmi le camme mi tiene contro dei ms di anticipo trasformandoli in gradi in base alla velocità attuale ( se lavori con valvole discrete avrai degli anticipi nell'ordine dei 20ms )

Non conoscendo la velocita' max della tua macchina ( continuano a mancare informazioni basilari ) ti posso pero' dire che non e' importante calcolarsela ogni 2ms , poiche' quello che ti puo' dar fastidio nei conti , e' un cambiamento di velocita' repentino , cosa che in 2ms e' irrilevante ( se non parliamo di velocita' di produzione mostruose )

io solitamente me la campiono ogni 50ms ( OB35 o equivalente ) poi me la lavoro in linea con il programma ( ogni OB1 ) magari richiamo il blocco piu' volte in OB1 con aggiornamento immediato delle uscite

e sono SICURO che il calcolo lo eseguo ogni 2ms.

se sei sicuro di cio' allora sbagli a contare , non c'e' altra strada

ma se la tua macchina ha un encoder , piu' che contare degli impulsi , io preferisco fare dei conti : differenza di posizione in un tempo noto = velocità

Comunque , per esperienza personale , ti posso dire che le precisioni che ottieni con una 352 , con solo il PLC non ce la fai ( almeno che tu non vada a meno di 100cmp ) , se e' cosi' importante la precisione massima , usa un programmatore di camme esterno

Con AB , la stessa scheda la trovi ma non AB

Vedi , qualche informazione in piu' , qualche suggerimento in piu'

Ciao

Luca

Livio Orsini
Inserita: (modificato)
..e sono SICURO che il calcolo lo eseguo ogni 2ms.

Come fai ad essere sicuro? Come lo hai verificato? Soprattutto sei sicuro che sia sempre uguale? Conosci il tempo di latenza, caso pessimo, per la tua CPU? (prestazione che ometti di citare!)

Con una frequenza di 22kHz, un tempo di campionamento di 2ms e una CPU, p.e., S7-315 10 impulsi di errore massimo sono normali! Basta che il campionamento avvenga in concomitanza con una latenza prolungata di interrupt, cosa abbastanza frequente, e hai un jitter >1ms.

Siemens ha molti difetti, però indica chiaramente in 5 ms il limite di utilizzo dell'interrupt a tempo. Ci sarà un perchè!

Per quanto rigurada la tua applicazione concordo in toto con quanto ha scritto Luca.

Posso aggiungere che, per esperienza diretta, campionando ogni 10 ms ed usando un algoritmo "furbo" non si hanno problemi di precisione di misura; inoltre il tempo è più che congruo per il controllo di valvole (ma non parlavi di un tappeto?).

Da ultimo, ma non ultimo. Il periodo di lettura, per una misura di velocità, deve essere congruo alla frequenza minima ed alla precisione massima da ottenere. Se per esempio ricerchi una precisione >=0,1% dovrai leggere almento 1000 impulsi; se la frequnza minima corrisponde a 100Hz devi campionare per almeno 10"

Modificato: da Livio Orsini
Inserita:

Devi stare attento perchè non sempre, l' interrupt-Time (2ms) è preciso.

Infatti questo dipende da quante task Periodiche hai attivato, e la loro Priorità.

Molte volte invece che avere un Clock di 2.00ms perfetti, potresti avere in concomitanza di

un altro evento un lieve ritardo ad esempio 2.06, questo leggero ritardo, potrebbe generarti

degli errori di calcolo.

Potresti nella tua Task interrogare il tempo Minimo e Massimo dell Evento Interrupt-Time

con un Istruzione GSV, ed in questo modo correggere eventuali errori ci conteggio.

GSV ( Class Name = TASK, Instance Name = THIS, Attribute Name = [MinInterval / MaxInterval])

il Risultato deve essere attribuito ad una Tag di tipo UINT (64bit) 2DINT perchè espresso in MiscroSecondi.

Infatti a suo tempo avevo avuto il medesimo problema che hai tu.

Penso che tutti ti abbiano dato dei ottimi consigli,

Inoltre devi pensare che in 2ms la velocità non può cambiare repentinamente,

se questo avviene, probabilmente c'è un errore di Sample (Cioè campionamento o conteggio).

Crea un controllo che eviti di accettare variazioni notevoli (Tipo salti di 2 Volte la Velocità Precedente).

Buona fortuna "Eddyn°1"

Inserita:

Concordo con quanto ti hanno già detto: campionare ogni 2ms per il calcolo della velocità non ha senso.

Anche nel caso il tuo interrupt a 2ms funzionasse sempre in modo preciso, ti troveresti comunque variazioni rilevanti sul calcolo di velocità.

Se la tua velocità è intorno ai 20 impulsi/ms, facendo le letture ogni 2ms leggerai valori intorno a 40 impulsi. Qualche volta però leggerai anche 39, oppure 41. Un errore del 2,5%!

Il tuo campionamento molto veloce quindi, che tu vorresti continuare a fare per essere più preciso possibile, è proprio quello che ti fa commettere errori.

Secondo me il calcolo della velocità lo potresti portare tranquillamente almeno a 20ms. Gli impulsi letti sarebbero circa 400, ed un impulso quindi corrisponde ad un errore dello 0,25%.

Se poi la tua macchina lavora a velocità costante, oppure se le variazioni sono abbastanza graduali, io penserei anche ad una media di un certo numero di letture.

In questo modo avresti un calcolo della velocità molto preciso e stabile, che ti permetterebbe quindi di comandare con precisione le tue camme. Solo durante i transitori avresti uno sfasamento dovuto al ritardo dell'aggiornamento della velocità calcolata.

Inserita:

ma per quale motivo calcoli la velocità ogni 2ms se poi usi il valore ogni 5ms?

tra l'altro 2ms sono tempi molto bassi... se in 2ms leggi pochi impulsi, l'errore può essere rilevante anche per un solo impulso letto erroneamente

comunque ora mi leggo tutto il thread

Inserita:

una considerazione forse stupida. Non ci sono schede (per tutti i plc credo) che oltre al conteggio scrivono anche la velocità in rpm dell'albero dell'encoder?. Ci sono per Siemens di certo (ci sono et200 appositi e forse anche schede da rack centrale (FM350/2 mi sembra) per A&B l'ho visto su un rs500, penso ci siano anche per i nuovi plc che non ho ancora usato.

Detto questo affermo che non conosco i tempi di refresh di tale valore e come faccia la scheda a calcolare la velocità.

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