Elaborazione ciclica del programma

mercoledì 16 dicembre 2009 - 12.29

boc_babi Profilo | Junior Member

Ciao a tutti,

premetto che programmo abitualmente PLC e quindi ho la testa tendente a pensare PLC.

Tramite .NET non riesco a far eseguire delle istruzioni in continuazione.

Mi spiego meglio:
con il PLC esiste un MAIN che richiama vari blocchi di programma che vengono puntualmente eseguiti. Quando il blocco termina quello che deve fare ritorna al MAIN che cede il compito al blocco successivo e così via fino a ricominciare da capo.
Più o meno il loop completo del programma (scansione di tutti i blocchi) avviene in 7/8 mSec (dipende da vari fattori, ma questi sono tempi attendibili).
Quindi se in un blocco metto un contatore che si incrementa di un'unità, succede che questo contatore si incrementa una volta ogni 7/8 mSec.

Ora basta parlare di PLC !!!

Quello che vorrei capire e che non ho per niente chiaro è come riuscire a fare la stessa cosa con .NET (non suggeritemi un ciclo FOR, grazie)

Tengo a precisare che quello del contatore è solo un esempio e non è quello che effetivamente mi serve, ma voglio capire come lavora alla base il .NET.

Spero di essere stato chiaro.

Grazie, BOC

alexmed Profilo | Guru

Ciao
Se ho capito bene.
Immaginiamo che in un Form ci siano 2 controlli ListBox un controllo TextBox ed un Button
alla pressione del Button vogliamo inserire n elementi nelle ListBox

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Praticamente dal Button richiamo le 2 sub al quale passo il valore contenuto nella TexBox.

Fammi sapere

Ciao

alexmed

boc_babi Profilo | Junior Member

Ciao alexmed,

grazie per la risposta ma ho il dubbio che tu stia rispondendo ad un altro post e non al mio Non escludo nemmeno che magari la mia spiegazione sia stata poco esauriente

Quello che non capisco è come mettere delle istruzioni che continuino ad essere elaborate indipendentemente da eventi.

Grazie, BOC

AntCiar Profilo | Expert

Ciao.

potresti fare in questo modo:
dichiari un timer e imposti l'intervallo di conteggio.
Avvii il timer e nell'evento Tick del timer esegui tutte le tue chiamate.
In questo modo ogni N (espresso in millisecondi) verranno eseguite tutte le funzioni.

Ti consiglio come prima istruzione all'interno del Tick di inserire il comando di stop del timer e come ultima istruzione quello di avvio. Questo perchè potrebbe capitare che il tempo necessario ad eseguire tutte le operazioni sia superiore al tempo impostato nel timer facendo si che si scateni di nuovo l'evento metre sta ancora processando l'evento precedente.

Ciao ciao

Cristian Barca

alexmed Profilo | Guru

Chiedo scusa, ma come avevo premesso, ho preso lucciole per lanterne

Ciao

alexmed

boc_babi Profilo | Junior Member

Grazie della risposta Cristian,

a dire il vero quella che mi hai suggerito è la soluzione che attualmente stò utilizzando con i vari problemi che può causarmi l'imprecisione del timer (vedi post http://www.dotnethell.it/forum/messages.aspx?ThreadID=33328)

Vado a fondo della spiegazione:

ho a disposizione una scheda di acquisizione veloce con la quale leggo i valori di un trasduttore di pressione collegato ad un rubinetto del gas.
Con un'uscita analogica comando un motore che mi fa la taratura di questo rubinetto; avvito una vite fino a quando la pressione rientra in un range.
Per far questo devo continuare a leggere i valori del trasduttore e fermarmi prontamente con il motore di taratura.
Garantisco che se vado a leggere la pressione ogni X mSec, la taratura non è mai costante in quanto è possibile avere un ritardo anche di 55mSec causato dall'imprecisione del timer.
Vorrei continuare a leggere la pressione, slegandola da qualsiasi evento.

Grazie, BOC

AntCiar Profilo | Expert

Ciao

Prova al posto del timer ad utilizzare un while(true).
Con questo però non puoi impostare tempi.

ciao
Cristian Barca

luigidibiasi Profilo | Guru

>>Quello che non capisco è come mettere delle istruzioni che continuino ad essere elaborate >>indipendentemente da eventi.

Purtroppo tu puoi al più scrivere in un thread (a meno che tu non voglia programmare un driver per windows con cui puoi avere maggiore controllo del sistema) e quindi sei sempre vincolato al sistema operativo che decide quando elaborare il tuo codice.

>>Garantisco che se vado a leggere la pressione ogni X mSec, la taratura non è mai costante in quanto è >>possibile avere un ritardo anche di 55mSec causato dall'imprecisione del timer.
>>Vorrei continuare a leggere la pressione, slegandola da qualsiasi evento.

Per avere precisione assoluta (avere la certezza che quello che vuoi fare sia fatto nei tempi da te stabiliti) dovresti utilizzare un sistema operativo hard real-time (non windows nè .net) come ad esempio qnx.

Se sei vincolato a windows puoi dare un'occhiata qui :
http://msdn.microsoft.com/en-us/library/ms632592(VS.85).aspx

tieni presente che il timer del link non è il timer di .net (quello del namespaces windows.forms) però hanno una precisione maggiore






Luigi Di Biasi
http://blogs.dotnethell.it/luigidibiasi/
http://www.dibiasi.it/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5