Jump to content
PLC Forum


Sign in to follow this  
walterword

Tempo Di Esecuzione Micro

Recommended Posts

walterword

ciao a tutti

Volevo chiedere .. nei micro controllori pic o dspic esiste un registro che mi dice il tempo trascorso per eseguire il programma o comunque il tempo di esecuzione del programma caricato ?

Per rendere l'idea faccio riferimento ai plc s7-300/400 che restituiscono in OB 1 (main) l'ultimo tempo di esecuzione in ms .

Questo mi potrebbe servire per creare timers software di ritardo all'eccitazione , alla diseccitazione , timer con memoria ect .

C'e' una possibilità di poter fare questo con i micro pic?

In debug o tramite calcoli da tabelli si può ottenere la somma delle instruzioni , ok , ma non va bene cosi .

Il programma esegue delle condizioni if...then con chiamate e funzioni o routines che non posso prevedere in fase di progettazione.

ciao

Walter

p.s. se esiste un metodo posso evitare usare i timers hw del micro e fare strane procedure.per cortesia evitate il commento " I micro non sono plc " , questo lo so gia .

Edited by walterword

Share this post


Link to post
Share on other sites

walterword

forse tramite il watchdog timer ,o il program counter solo che quest'ultimo memorizza l'indirizzo dell'istruzione , non saprei procedere ....

Edited by walterword

Share this post


Link to post
Share on other sites
Livio Orsini

Walter, lavorare con i PLC è un'altra cosa rispetto ai micro. (Così ho evitato il commento " I micro non sono plc " :lol: ).

Se vuoi conoscere il tempo di ciclo....non puoi, anche perchè non ce l'hai costante, se lavori bene. Se proprio vuoi conoscere il tempo che impiega il micro per ripassare da una determinata locazione/istruzione, oppure quanto tempo impiega per eseguire una determinata funzione, devi cambiare lo stato di una porta.

Cerco di spiegarmi meglio con un esempio.

Immagina di voler sapere in quanto tempo esegue una funzione di PID. Il tempo sarà sicuramente leggermente variabile in funzione dello stato dell'errore. All'inizio della funzione alzi una porta che riabbassi al termine. Con l'oscilloscopio misuri il tempo in cui la porta è alta e conosci la durata della funzione.

Altro metodo può essere quello di far partire uno dei timer dei micro all'inizio della funzione e bloccarlo alla fine, poi lo leggi.

Se vai a vedere in MPLab c'è qualche cosa di simile nel simulatore. Gli dai l'indirizzo e ti dice ogni quanto tempo il micro passa da quell'indirizzo.

Share this post


Link to post
Share on other sites
walterword

si oppure usare una variabile ed incrementarla di quanto e' il tempo di ogni singola esecuzione , per esempio se ho dei controlli annidati di if-then metterla ovunque ed incrementarla di quanto e' il tempo dell'istruzione precedente e quella successiva ma nonha alcun senso .

Certo che non e' un pl c, pero metti di avere un dspic o un micro a 16 o 32 bit e fare della domotica o qualcosa di industriale ....

dovrai pur temporizzare ingressi , uscite , apro una prota a dopo un tempo preimpostato o fisso scatta un allarme , accendo una luce e dopo 3 secondi la successiva e dopo un 'altra ....

io non dico di trasformarlo in un plc dove uso in media dai 400 ai 500 timer nei miei impianti , ma diversamente come si puo pensare di usare un sistema embedded per domotica o atumazione ?

Questo e' quello che non ho mai capio .... e poi l'utilizzo dei bit in C , con strutture ed union per poterli gestire ....

Si parla di usare micro per questo tipo di applciazioni , non sto ipotizzando un pic16f84 o 877 ma micro un po piu potenti ....eppure ci sarà un modo no?

Voglio fare l'albero di natale con sequenze di accensione , ritardi ect cme lo faccio ?

Ciao

Walter

dimenticavo .... i micro che hanno interprete coDeSys o piu comunemente interpreti per linguaggi plc , micro che poi fanno aprte di un plc, alla fine eseguono le loro istruzioni per poter dare timers parametrizzabile

Questo benedetto micro cosa fa per gestire i timers del plc ?

E' qui che mi impunto .....

Share this post


Link to post
Share on other sites
walterword

la soluzione potrebbe essre questa ....

leggere il real time clock all'inziio del programma ed alla fine , fare la differenza ed ottenere il tempo di scansione , salvarlo e poi azzerarlo

Quello salvato viene usato nel codice per getire i timers .

Se il micro non ce l'ha si puo usare un real time clock in I2C ed aggiungere i tempi per leggerlo due volte , tipo in C# il datetime.Now ....

Pero on so se il real time clock mi restituisce anche i millisecondi

Se fosse cosi avrei risolto molti dubbi , e se il micro e' piu veloce di 1 mS , cosa difficile , con un delay lo porto a girare almeno al minimo della precisione del real time clock .

Cosi potrebbe funzionare ....

Share this post


Link to post
Share on other sites
Livio Orsini
dovrai pur temporizzare ingressi ,

Io faccio come si fa nei Sistemi Operativi Real Time: ci si basa sul clock di sistema. Ad esempio con i pic della classe dei 16F87x mi baso sull'interrupt del timer1 settato a 10 ms. Per me il tic di sistema è 10 ms; tutti i temporizzatori avranno la risoluzione massima a 10 ms, così come le routines a tempo.

Con i DSPic scendo ad 1 ms. In 1 ms ne esegui di istruzioni.

Tutti gli RTOS hanno architetture simili: c' un real time clock, ad ogni task assegno una priorità ed un tempo massimo di esecuzione, trascorso tale tempo il task se è ancora running, viene sospeso in automatico (non è un wotch fog). Anche lo RTOS siemens funziona nel medesimo modo, solo che tu non lo vedi, tu vedi solo un job che l'applicativo utente, ma tutto il resto bus dicampo, comunicazioni, inerruzzioni a tempo, etc., so gestiti dallo RTOS.

C'era una bella serie siemens che in pratica era un 486 con I/O dello S7300 e su cui potevi anche far girare Windows, come task del PLC, che ti permetteva di unire un PLC ad un PC industriale. ora non ricordo più la sigla, credo fosse M370; avevo anche fatto ilcorso Siemens di 5 giorni e si usava anche li il classico RTOS, solo che in quel caso lo vedevi, non era trasparente come sui 300 o sui 400.

Share this post


Link to post
Share on other sites
walterword

ok usi il tick del timer a 10 ms ....

Ma il tick lo usi nel software ovunque oppure ti porta in una routine di interrupt del timer ?

Nell'ultimo caso , se fosse cosi, devi gestire tutti i timer nella routine di interrupt ?

Oppure setti un bit nella routine di interrupt , ricavi il fronte di salita e lo usi nei timer oer incrementare i rispettivi accumulatori ?

Non riesco a capire

Edited by walterword

Share this post


Link to post
Share on other sites
walterword

secondo me per attiare consensi ed interessi da chi inizia da zero piuttosto da chi gia programma da anni bisegnerebbe dare un senso di funzionalità in ambito quotidiano allo sviluppo di progetti su micro.

Dare la possibilità di crearsi il proprio sistema embedded che possa dare le minime soddisfazioni gia da subito , accendere luci , registrare eventi , temporizzare ect .

Non dico che vorrei programmare un micro come un plc , sarei ben un imbecille , ma poter considera un'alternativa ai plc con i micro .

Creare un sistema embedded che con pochi componenti montati anche su millefori possa gia disporre di comunicazioni ethernet , tcp , server , gestire i/o per le luci , l'irrigazione in giardino , l'impianto di allarme , il controllo di accensione luci se la luminosità lo permetta , il conteggio di ore consumate per una lampadina , domotica ok

Poi anche nel campo industriale , bello il circuito che gestisce un encoder o che visualizza su dysplay una temperatura ma poi?

L'interesse nel produrre qualcosa di utile , seppur banale , crea un seguito o un gruppo .

Tutto questo senza togliere nulla ai target del progetto che vorresti fare , ci mancherebbe

Sono opinioni personali per quanto vedo in altri ambienti internazionali .

Io i plc li programmo gia in C o ST o Scl .

Pero' mi piacerebbe poter disporre di un sistema embedded creato a mio piacimento che possa permettermi di programmare in c non dico come un plc , ma in modo che le cose pesanti siano in qualche maniera dietro le quinte , per questo insisto nel voler capire come gestire bit in C e come poter ottenere un tempo di ciclo per incrementare gli accumulatori dei timers sw .

E' una cosa che in tutti i plc , in linguaggio ST o C/c++ esiste ...si dichiara un'istanza del timer ton o tof , si valorizza il preset e si attende il done , punto , se si vuole si resetta

Perche non poterlo fare , magari in libreria , anche per i microcontrollori ?

Non parlo di 16F84 o picclolezze simili ovviamente

ciao

Walter

Share this post


Link to post
Share on other sites
Livio Orsini
Ma il tick lo usi nel software ovunque oppure ti porta in una routine di interrupt del timer ?

Dipende se il temporizzatore deve essere preciso o meno.

Nel caso dei temporizzatori molto precisi le operazioni di incremento-decremento avvengono nellìinterrupt.

Nel caso di temporizzatori che non richiedano una grande precisione c'è una funzione apposita che li aggiorna.

Pero' mi piacerebbe poter disporre di un sistema embedded creato a mio piacimento che possa permettermi di programmare in c non dico come un plc ,.....

Vent'anni fa, con i miei collaboratori, avevamo fatto un qualche cosa di simile dedicato all'automazione e regolazione. Lo avevamo chiamato "bricks" (mattoni). L'idea non era nuovissima, però non ce ne erano tanti in circolazione. Questo programma girava su una scheda opzionale per convertitori ed inverter, basata sul micro 80386SX. Il programma lo scrivevi come se fossero righe di "C", ma con funzioni specifiche, alcune di alto di levello. Poi, con un semplice comando, veniva assemblato e scaricato nella scheda.

Share this post


Link to post
Share on other sites
walterword

a me basterebbe poter disporre di quello che ho elencato sopra e programmare tranquillametne in C-30 , non ho problemi

Se il programma nel micro inizia a farsi corposo non posso accettare tutti quei delay time bloccanti epr sincronizzare I2C o SPI o seriali o lcd

I delay time non li voglio nemmeno vedere a meno che non si debba fare accensioni di albero di natale , ne piazi quanti ne vuoi ed accendi a spegni le lucette , ma per ora i presepi non sono un'attività che mi itneressa.

Il micro deve eseguire a tutta birra tutto il programma e per le sincronzizazioni di bit ack o altro devo implementare temporizzazioni anche asincrone non precise ma tipo quelle dei plc.

Avevo scritto nel 2007 alcune funzioni per il mio simulatore disegnali da campo che aveva lcd , ad694 , uscite encoder open collector e line drive , fronti si salita , ingressi filtrati e timer piu o meno come dico io ma non trovo piu il progetto , maledizione .

Ho cercato in iu di 90 cd e dvd , ho trovato di tutto , cose inutili e fuffa ma non quello che avevo scritto , ho perso anche i progetti di proteus .

Appena avro' tempo cerchero in giro se c'e' qualcosa .

ciao

Walter

Edited by walterword

Share this post


Link to post
Share on other sites
Livio Orsini
Se il programma nel micro inizia a farsi corposo non posso accettare tutti quei delay time....

Se il programma è fatto bene non si usano le macro delay, ovvero si usano magari durante le inizializzazioni, ma le inizializzazioni sono eseguite solo al momento dello start up o del reset.

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
walterword

certo l'init() prima del ciclo while(true) -...........

Pero' rimane come poter creare dei timer ...ho visto che ci sono dei RTC con risoluzione al millisecondo ...

Quindi cosa mi consigli di fare per risolvere questo problema ?

Imposto un timer a 10ms , quando scade il tempo mi richiama nella routine di interrupt , dentro la routine setto un bit che lo uso nel programma per incrementare gli accumulatori dei timer software.

Poi questo bit quando lo resetto ? a fine progrmma no perche potrei avere l'interrupt a meta programma e non incrementare i timer prima che fosse richiamata la routine ... oppure lo resetto al prossimo interrupt e lo toglo .

trigger=not trigger

Cosi facendo l'incremento il tempo da sommare agli accumulatori sarebbe 10x2=20 ms .... cosa ne dici?

ciao

Walter

Edited by walterword

Share this post


Link to post
Share on other sites
Livio Orsini

Per i timer precisi io uso decrementare contatori nell'interrupt del timer. A contatore = 0 ricarico e setto il flag del timer corrispondente, però ne uso massimo 2-3 per programma. per timer meno precisi come, ad esempio, per il debouncing degli ingressi, ritardi, etc. alzo il flag del clock di sistema, quando entro nella sub dei temporizzatori, dove vado decrementare i contatori, lo abbasso.

Share this post


Link to post
Share on other sites
walterword

ok quelli di filtro ingressi ect , ma quelli dell'applicazione ?

Livio immagina una lavatrice di ultima generazione , credi che ci sia un plc dentro ?

No , eppure i vari programmi di lavaggio sono costrutiti su temporizzazioni , quindi timers

O no?

Share this post


Link to post
Share on other sites
Livio Orsini

Quanto pensi che sian precisi quei timers? Per un programma di alvatrice 10" in più o in meno non fa problemi.

Share this post


Link to post
Share on other sites
walterword

sono precisi come quelli dei plc , chi se ne frega , millisecondo piu o meno o 100 ms di errore.

Sto parlando di timers per automazione , che vorrei riuscire a capire come produrre ed utilizzare all'interno di applicazione che gira su micro .

I timer di precisione so benissimo che hanno compiti diversi

Io l'unico modo che ho trovato per generare timers in applicazioni micro , da usare per rampe , filtri , temporizzazioni ect , e' quello di incrementare accumulatori (uno diverso per ogni timer ) su un fronte di salita che viene dal togle all'interno di un timer di precisione e di incrementarli di un tempo pari al tempo di innesco x2 oppure leggere all'inizio dle programma ed alla fine il real time clock per avere il tempo di "scansione" .... non sto parlando di precisione ma di temporizzazione di automazione che non sempre E' automazione industriale ma anche automazione giardino o cancello o luci o allarmi di sicurezza .Forse mi sto spiegando male ....eppure e' da giorni che scrivo sempre le stesse cose ahahahahah

Nel progetto che non trovo piu usavo un interupt del timer per incrementare un valore che a seconda di quanto valeva mi dava delle onde quadre , tanto per dire per far lampeggiare i led al posto degli stupidi ed inutili delay bloccanti che fanno vedere in qualsiasi esempio .

ciao

Walter

Edited by walterword

Share this post


Link to post
Share on other sites
Livio Orsini

Mi sa che ti stai facendo problemi per nulla.

Per quelli precisi come richiamo di funzioni a tempo, generazione di rampe e poco altro basta un timer uno, solitamente uso l'interrupt di T1.

Per quelli meno precisi come tempi di ritardo, il medesimo timer abilita la function di gestione di tutti i temporizzatori. Il tutto con una durata della routine di servizio dell'interrupt di 40 us - 100us.

Nel progetto che non trovo piu usavo un interupt del timer per incrementare un valore che a seconda di quanto valeva mi dava delle onde quadre..

Questo è banale.

Gurada questo codice fatto per un 16F88 con quarzo a soli 8Mhz. Mi serviva per provare i tempi di alcune conversioni.

Ogni 10 ms fa una conversione AD e ogni 100 ms legge una temperatura da un dispositivo one wire bus e la memorizza su una EEPROM esterna.


#int_timer1

void Timer10ms()

    {

		    set_timer1(0xB1DF);   // Caricato 15535 ==>

				  // 20.000 * 4 * 125nsec = 10msec

				  // 65535 - 20000 = 45535(0xB1DF)

		    On_reset();

		    rd_ad ();

		    if ( time_data >0)

			   {

				  time_data--;

			   }

			  else

			    {

				   time_data = 10;  // richiamo ogni 100 ms

				   ipunt = &itemp_buffer[0];

				   tem_conv(ipunt);

				   ibuff_Tx[15]=*ipunt;

				   memo_ee_ext();

			    }

   }

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
walterword

ok ho ritrovato il mio progetto adesso inizio a mettere giu un po di cose

Ciao

walter

Share this post


Link to post
Share on other sites
Nikiki
sono precisi come quelli dei plc , chi se ne frega , millisecondo piu o meno o 100 ms di errore.

Sto parlando di timers per automazione , che vorrei riuscire a capire come produrre ed utilizzare all'interno di applicazione che gira su micro .

Io di solito faccio così: definisco quale deve essere la precisione dei timer, ad esempio 100 ms, e configuro il timer per generare l'interrupt dopo tale tempo. Nella routine di interrupt oltre a ripristinare il registro del timer per contare i 100 ms successivi, setto un flag che mi indica l'avvenuto interrupt (chiamiamolo flag_100ms), e non faccio altro perchè le routine di interrupt devono essere più brevi possibile. In questo modo creo una base de tempi di 100 ms affidabile e precisa.

Nel main vado a testare con una IF lo stato del flag_100ms e quando lo trovo a 1 prima di tutto lo resetto e poi incremento una variabile che in pratica contiene i decimi di secondo, a sua volta testata con una IF in modo tale che quando raggiunge il valore di 10 setto un flag (chiamaiamolo flag_1s) ... puoi andare avanti così per contare i minuti, le ore, i giorni, gli anni, ecc.... :smile:

per rendere il codice più leggibile puoi creare una funzione per ogni fase e dal main richiamare in sequenza le funzioni.

A questo punto puoi creare N temporizzatori a tuo piacimento, per i tempi lunghi devi memorizzare le variabili dei tempi al momento dello start e periodicamente (scegli tu l'intervallo) testare il tempo trascorso con quello impostato per il timer, per i tempi corti (secondi) potrebbe essere sufficiente settare la variabile del timer con il tempo impostato e decrementarla fino a testare lo zero. Potresti prevedere anche dei flag per mettere in pausa un timer ecc... ci sono tanti modi per contare il tempo, l'importante è creare una base precisa.

Share this post


Link to post
Share on other sites
walterword

ciao nikki

si infatti faccio anche io cosi , sto rivedeno un progetto che avevo fatto nel 2007 dove c'e' un simulatore di encoder con uscite open collector (testato con S2-200) , forme d'onda e timer

Io ho scritto una fuzione timer on ed una off che accettano come parametri lo start e l'accumulatore e restituiscono il done

ciao

walter

Share this post


Link to post
Share on other sites
Livio Orsini
Nella routine di interrupt oltre a ripristinare il registro del timer per contare i 100 ms......

Questo va bene quando qualche decina di us di jitter non hanno importanza; in pratica è quanto scrivo nel mio #13.

Quando, al contrario, anche un poco di jitter o di imprecisione può essere significativo allora devi necesariamente lanciare il tutto direttamente da interrupt.

Nel codice di esempio che ho riportato è proprio uno di questi casi, dovendo valutarel'evolvere di alcune variabili ad ogni decimo di secondo preciso.

Share this post


Link to post
Share on other sites
Nikiki

è chiaro, è tutto relativo alla precisione, a volte quando voglio essere sicurissimo sui tempi ricorro ancora all'assembly :smile:

Share this post


Link to post
Share on other sites
Livio Orsini
a volte quando voglio essere sicurissimo sui tempi ricorro ancora all'assembly
:thumb_yello:

Share this post


Link to post
Share on other sites
walterword

ok comunque i miei discorsi si riferivano a precisioni con errori molto abbondanti .

E' chiaro che per cose particolari bisogna prendere strade diverse.

Livio , ho trovato un ariticolo su cd di FE 2003 relativo ad un progetto plc .

E' fatto molto bene e scritto da due italiani .

Si tratta di un plc con 8 ingressi e relative uscite digitali conformi alle regole in vigore con relativo software di programmazione .

Il micro e' un atmel ed il firmware e' tutto scritto in assembly

Certo e' una cosa un po spartana ma potrebbe essere un trampolino di lancio qualora si voglia fare un progetto su come costruire un plc fin dalle cose piu semplici .

ciao

Walter

Share this post


Link to post
Share on other sites
Livio Orsini

Walter, io di sistemi PLC prodotti industrialmente, ne ho progettati almeno 2, completi di tutti gli I/O

Il primo risale al 1978 e usava un micro controllore ad 1 bit, prodotto dalla motorola appositamente per risolvere equazioni booleane. Il progetto è stato anche pubblicato su di un paio di riviste e prodotto per parecchi anni da piccole aziende. L'ultima richiesta di consulenza (ovviamente gratuita) l'ho ricevuta dopo il 1990 perchè non riuscivano a reperire più della emtà dei componenti che erano divenuti obsoleti.

Il problema non è progettare il PLC Hw e/o Sw, ma trovare persone che sian disposte a collaborare allo sviluppo del sistema.

Ci han provato anche in USA quelli del forum Automation Control, con una platea molto più vasta di quella di PLCForum (che ha una platea vasta ma distribuita dagli idraulici ai riapratori di lavatrici).

Ebbene anche quell'iniziativa è praticamente abortita per i soliti motivi: interessa solo pochissimi. Non c'è praticamente più nessuno che pensa di usare un PLC che non sia prodotto da grandi case. Anche le piccole aziende di PLC hanno solo piccoli mercati di nicchia.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...