Beatrice_Ru Inserito: 31 marzo 2006 Segnala Share Inserito: 31 marzo 2006 Non riesco a monitorare l' intervallo attuale tra una scansione e un altra di una Task periodica.in un Sistema Logix (Controllogix o Compactlogix)Semplicemente se una Task periodica è configurata ad esempio a 10ms, e chiaro chequesta task verrà richiamata con un clock schedulato di 10ms, main realta essa può essere richiamata ad esempio a 10'050 microSecondi oppure a 9'970 microsecondi,questo io lo vedo nel monitor della task stessa.Usando una istruzione GSV (Get System Value), posso vedere il valore di rate impostato edaltri dati riguardanti la task in questione, ma intervallo di scansione è si presente comeelemento di richiamo, ma non viene mai aggiornato.Come posso fare per farsi che questo dato venga letto correttamente, visto che lo posso benissimovedere nel Monitor della Task, senza problemi.Grazie di cuore. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 1 aprile 2006 Segnala Share Inserita: 1 aprile 2006 Dipende a cosa ti serve questo dato. Se ti serve per capire se il tuo task è attivato a tempo costante e quanto dura c'è un solo metodo efficace e sicuro.Devi inserire all'interno del task, come prima istruzione, una scrittura diretta di un livello, per esempio 10v, a un'uscita analogica; l'ultima istruzione scriverà un altro l'ivello, per esempio 0v, nella medesima uscita. L'uso delle uscite analogiche perchè hanno ritardi insignificanti, al contrio le uscite digitali hanno ritardi significativi.Monitorando l'uscita con un oscilloscopio di buona qualità ottieni tutte le informazioni relative ai tempi di attivazione e durata del task.Io uso questa metodologia da anni, specie con dispositivi embedded, con risultati ottimi. Link al commento Condividi su altri siti More sharing options...
Beatrice_Ru Inserita: 1 aprile 2006 Autore Segnala Share Inserita: 1 aprile 2006 Grazie Signor Livio.Io voglio conoscere il tempo di ritardo esatto, rispetto il clock di schedulazione della task,per eseguire una operazione di Compensazione, all' iterno della Task stessa.in pratica devo leggere una frequenza da una scheda 1756-HSC, ma questa scheda èconfigurata come semplice Counter, e non come rate-measure o frequency-rate.Questo perchè mi serve come conteggio di posizione.Per ricavare la Frequenza eseguo una differenza di Conteggio tra due eventi (Vecchia lettura Counter - Nuova Lettura Counter) in una task a 100ms.Frequenza = Differenza * 10 [Hz]Nella mia applicazione vi sono 4 task con priorità diversa, e quindi a voltepuò succedere che la task in cui eseguo il calcolo della frequenza abbia unpiccolo ritardo di qualche decina di microsecondi.Questo comporta che a velocità di conteggio costante, possa rilevare delle variazioni che mi danno molto disturbo nella regolazione del processo.Ecco spiegata l'origine della mia esigenza.Per questo motivo devo riuscire a leggere quel famigerato Interval-rate,altrimenti la prossima volta penso di usare un counter che mi dia sia la frequenza che il Counting.comunque Grazie ancora per l'aiuto.E devo sottolineare che per scoprire questo problema ho utilizzato lo stesso metodo davoi descritto.Grazie. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 2 aprile 2006 Segnala Share Inserita: 2 aprile 2006 Prima cosa sul forum ci si da del tu e non si usano titoli accademici o "signore", siamo colleghi che si scambiano opinioni e consigli Se la tua regolazione ha problemi derivanti dai minimi ritardi fisiologici di latenza degli interrupts c'è qualche cosa a monte. O il processo da controllare è estremamente delicato, o l'algoritmo di controllo è troppo poco robusto.Su una base tempi di 100ms l'indecisione ed il jitter causato dalle latenze non dovrebbe superare frazioni di millisecondo, quindi errori <1%!Se il tempo di latenza/indecisione è >=1ms, allora hai da mettere a punto la schedulazine e l'attivazione di tuoi task.Per esperienza personale, non ho mai avuto problemi di regolazione derivanti da latenze sulla misura di frequenza, anche con base tempi di 10 ms.Poi tieni presente che, anche fosse possibile, compensare l'errore casuale di misura dovuto al tempo di altenza, è sempre una strada pericolosa e ricca di ostacoli. RIschi di causare più danni con la correzzione che con l'errore.Dopo quasi 40 anni che mi arrovello con problemi simili sono giunto alla convinzione che questo tipo di errori non si compensano; o li si emendano alla base e li si mettono in condizioni di nuon nuocere. Link al commento Condividi su altri siti More sharing options...
Beatrice_Ru Inserita: 2 aprile 2006 Autore Segnala Share Inserita: 2 aprile 2006 ti chiedo scusa Livio, per non averti dato del tu.Tornando al problema, qualche cosa ho fatto.Ho inserito un filtro passa basso per filtrarmi la frequenza, anche se non sono molto contenta.per piccoli ritardi di lettura. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 2 aprile 2006 Segnala Share Inserita: 2 aprile 2006 può succedere che la task in cui eseguo il calcolo della frequenza abbia unpiccolo ritardo di qualche decina di microsecondi.Scusa Beatrice; qualche decina di us == <50us, corretto? 100ms : 50us = 100 : x ==> .05% Un jitter pari a +/- 0.05% può causare un errore equivalente nella misura di frequenza. Però se la frequenza da misurare è talmente bassa che 1 impulso in più o in meno causa un errore più grande il problema non risiede nel jitter ma nella filosofia della misura. Anche se il jitter arrivasse a 100us l'errore sarebbe comunque entro lo 0.1%.Verifica o, se vuoi, spiega come esegui la misura, quale sono i limiti di frequenza, etc. Link al commento Condividi su altri siti More sharing options...
del_user_27683 Inserita: 3 aprile 2006 Segnala Share Inserita: 3 aprile 2006 Ho letto rapidamente il forum, spero quindi di aver capito il problema.Personalmente se voglio sapere con quale frequenza "gira" una qualsiasi routine, utiilizzo una GSW con class WALLCLOCKTIME e attributo "DateTime", dalla differenza con i microsecondi memorizzati lo scan precedente si ottengono i microsecondi impiegati. Se la differenza è negativa significa che è "scattato" il secondo e quindi occorre aggiungere 60.000.000 (l'orologio del plc conta 0-60.000.000 mcsec).Ciao. Link al commento Condividi su altri siti More sharing options...
del_user_27683 Inserita: 3 aprile 2006 Segnala Share Inserita: 3 aprile 2006 ... piccolo errore, il DINT che conta i microsecondi va ovviamente da 0 a 1.000.000 In alternativa si utilizzi una GSV con class PROGRAM, instance THIS e attribute LASTSCANTIME. Link al commento Condividi su altri siti More sharing options...
Beatrice_Ru Inserita: 3 aprile 2006 Autore Segnala Share Inserita: 3 aprile 2006 Grazie sei stato grande "mrcthj"Sembra che funzioni bene.Una cosa solamente, la differenza rilevata è in MicroSecondi ?a vedere dal test che ho fatto sembra di si.Ma hai notato anche tu che con il GSV : Class Name = TASKInstance Name = THISAttribute Name = MinInterval oppure MaxIntervalil Valore non viene letto, ma chi sa perchè ?Grazie ancora. Link al commento Condividi su altri siti More sharing options...
Beatrice_Ru Inserita: 3 aprile 2006 Autore Segnala Share Inserita: 3 aprile 2006 Scusa ma abbiamo preso un grande abbaglio tutte e due.Stiamo solo vedendo la Variazione della Elaborazione del Programma in questione.Vorrei invece vedere il ritardo della Task sulla Tabella di Schedulazione.Esempio Task Schedulata a 100ms1° Event T:= 0.00 ms2° Event T:= 100.001 ms IntervalTime = +100.001 ms3° Event T:= 200.003 ms IntervalTime = +100.002 ms4° Event T:= 299.997 ms IntervalTime = +99.997 ms Ci siamo fregati dall' entusiamo Ciao grazie ancora. Link al commento Condividi su altri siti More sharing options...
Henon Inserita: 3 aprile 2006 Segnala Share Inserita: 3 aprile 2006 Il Problema sta nel fatto che la tua Tag di Destinazione deve essere unArray di 2 Elemeti DINT ( DINT[2] ).Altrimenti l'istruzione GSV non funziona.Prova a vedere nel Manuale "Logix5000 Controller General Instructions" Capito 3 pagina 3-51Poi come hai fatto te va bene.Class Name = TASKInstance Name = THISAttribute Name = MinInterval oppure MaxIntervalTag => DINT[2] Ciao Beatrice Link al commento Condividi su altri siti More sharing options...
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