<html><head></head><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:16px"><div id="yui_3_16_0_ym19_1_1483107967020_3876">I PLC sono microcontrollori e come tali non utilizzano thread.</div><div id="yui_3_16_0_ym19_1_1483107967020_3876"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3877">Il ciclo viene gestito in pratica con una programmazione asincrona, semplicemente ripetuto in maniera banale:</div><div id="yui_3_16_0_ym19_1_1483107967020_3878">1) Controllo tutti gli ingressi</div><div id="yui_3_16_0_ym19_1_1483107967020_3899">2) Eseguo le operazioni di elaborazione (AND OR e controllo delle temporizzazioni)</div><div id="yui_3_16_0_ym19_1_1483107967020_3899">4) Attivo le uscite interessate</div><div id="yui_3_16_0_ym19_1_1483107967020_3899"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899">Per gestire le temporizzazioni in maniera semplice basta fare un confronto con il tempo, ad esempio nel seguente codice eseguo operazioni varie</div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">a due intervalli di tempo prestabiliti:</div><div id="yui_3_16_0_ym19_1_1483107967020_3899"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899">mio_intervallo_1 = 1 # 1 secondo</div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">mio_intervallo_2 = 1 # 0.5 second1<br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">orario_partenza_evento_1 = time.time()</div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">orario_partenza_evento_2 = time.time()<br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">while(True)</div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">    if (time.time() - orario_partenza_evento_1 > mio_intervallo_1):</div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">        eseguo_quello_che_voglio_1() <br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">        orario_partenza_evento_1 = time.time()       </div><div dir="ltr" id="yui_3_16_0_ym19_1_1483107967020_4836">    if (time.time() - orario_partenza_evento_2 > mio_intervallo_2):</div><div dir="ltr" id="yui_3_16_0_ym19_1_1483107967020_4837">        eseguo_quello_che_voglio_2() </div><div dir="ltr" id="yui_3_16_0_ym19_1_1483107967020_4837">        orario_partenza_evento_2 = time.time()   <br></div><div dir="ltr" id="yui_3_16_0_ym19_1_1483107967020_4837"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">Tutti i vari controlli </div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">Chiaramente più la complessità del programma cresce, più tempo ci vorrà tra una scansione e l'altra, se tu vuoi effettuare esattamente N controlli al secondo puoi introdurre uno sleep alla fine di ogni ciclo e rallentare l'esecuzione del programma.</div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">Per completezza c'è da dire che esistono anche gli interrupt, ma in questo caso non ne vedo la necessità.</div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr"><br></div><div id="yui_3_16_0_ym19_1_1483107967020_3899" dir="ltr">Piergiorgio Pancino</div> <div class="qtdSeparateBR" id="yui_3_16_0_ym19_1_1483107967020_6630"><br><br></div><div class="yahoo_quoted" id="yui_3_16_0_ym19_1_1483107967020_6676" style="display: block;"> <div style="font-family: HelveticaNeue-Light, Helvetica Neue Light, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;" id="yui_3_16_0_ym19_1_1483107967020_6675"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;" id="yui_3_16_0_ym19_1_1483107967020_6674"> <div dir="ltr"><font size="2" face="Arial"> Il Giovedì 29 Dicembre 2016 19:29, Attilio Menegon <attilio.menegon@tecnoemmesnc.it> ha scritto:<br></font></div>  <br><br> <div class="y_msg_container" id="yui_3_16_0_ym19_1_1483107967020_6673"><div id="yiv7258571022"><style><!--
#yiv7258571022  
 _filtered #yiv7258571022 {font-family:"Cambria Math";panose-1:2 4 5 3 5 4 6 3 2 4;}
 _filtered #yiv7258571022 {font-family:Calibri;panose-1:2 15 5 2 2 2 4 3 2 4;}
 _filtered #yiv7258571022 {font-family:Tahoma;panose-1:2 11 6 4 3 5 4 4 2 4;}
#yiv7258571022  
#yiv7258571022 p.yiv7258571022MsoNormal, #yiv7258571022 li.yiv7258571022MsoNormal, #yiv7258571022 div.yiv7258571022MsoNormal
        {margin:0cm;margin-bottom:.0001pt;font-size:11.0pt;font-family:"Calibri", "sans-serif";}
#yiv7258571022 a:link, #yiv7258571022 span.yiv7258571022MsoHyperlink
        {color:blue;text-decoration:underline;}
#yiv7258571022 a:visited, #yiv7258571022 span.yiv7258571022MsoHyperlinkFollowed
        {color:purple;text-decoration:underline;}
#yiv7258571022 p.yiv7258571022MsoAcetate, #yiv7258571022 li.yiv7258571022MsoAcetate, #yiv7258571022 div.yiv7258571022MsoAcetate
        {margin:0cm;margin-bottom:.0001pt;font-size:8.0pt;font-family:"Tahoma", "sans-serif";}
#yiv7258571022 span.yiv7258571022StileMessaggioDiPostaElettronica17
        {font-family:"Calibri", "sans-serif";color:windowtext;}
#yiv7258571022 span.yiv7258571022TestofumettoCarattere
        {font-family:"Tahoma", "sans-serif";}
#yiv7258571022 .yiv7258571022MsoChpDefault
        {}
 _filtered #yiv7258571022 {margin:70.85pt 2.0cm 2.0cm 2.0cm;}
#yiv7258571022 div.yiv7258571022WordSection1
        {}
--></style><div id="yui_3_16_0_ym19_1_1483107967020_6672"><div class="yiv7258571022WordSection1" id="yui_3_16_0_ym19_1_1483107967020_6671"><div class="yiv7258571022MsoNormal">Buonasera a tutti,</div><div class="yiv7258571022MsoNormal">Chiedo un chiarimento su un concetto che mi sembra sfuggire.</div><div class="yiv7258571022MsoNormal">Volendo realizzare un programma in python che legga e scriva degli I/O tipo quelli del GPIO del Raspberry, volendo implementare delle logiche tipo PLC, mi chiedo come si gestiscano le temporizzazioni ed altre situazioni simili.</div><div class="yiv7258571022MsoNormal" id="yui_3_16_0_ym19_1_1483107967020_6670">Mi spiego meglio: il programma nel PLC cicla più volte al secondo dalle 10 alle 100 volte e nel esecuzione porta avanti il controllo di eventuali eventi temporizzati che avvengono in processi paralleli. L’esempio sono più funzioni / sottoprogrammi di tipo luci scale temporizzate che vengono inizializzati da uno o più ingressi (che vanno alti) e devono essere gestite in modo parallelo ed indipendente ed ogni istanza di funzione processa il suo temporizzatore in modo indipendente mentre il programma principale continua a girare in autonomia e quando la temporizzazione termina il sottoprogramma passa il risultato al programma principale che di conseguenza aggiorna lo stato delle uscite. In questo caso, io come programmatore mi devo solo incaricare di impostare in sequenza le istruzioni o lo schema a contatti,  poi il compilatore fa tutto da solo e mi restituisce l’eseguibile da scaricare nel PLC.</div><div class="yiv7258571022MsoNormal" id="yui_3_16_0_ym19_1_1483107967020_6677">Vorrei comprendere come implementare in modo corretto tali esecuzioni parallele in un programma Python che giri su PC.</div><div class="yiv7258571022MsoNormal">Attualmente ho visto solo dei piccoli esempi in cui la temporizzazione viene fata con la funzione sleep che blocca l’esecuzione del programma per il tempo richiesto e poi il programma riprende e cicla su se stesso, in questo modo non si possono però eseguire più temporizzazioni contemporaneamente. </div><div class="yiv7258571022MsoNormal" id="yui_3_16_0_ym19_1_1483107967020_6678">Viceversa penso sia corretto lanciare dei programmi paralleli ogni volta che viene istanziato una temporizzazione e che questi eseguano in modo indipendente la temporizzazione con la funzione SLEEP() e al suo termine restituiscano il risultato aggiornando una variabile del programma principale che continua nel frattempo a girare ad esempio al l’interno di un ciclo WHILE infinito.</div><div class="yiv7258571022MsoNormal" id="yui_3_16_0_ym19_1_1483107967020_6679">Quindi chiedo delle dritte su come instanziare questi sottoprogrammi, recuperarne il risultato e farsi restituire il programma.</div><div class="yiv7258571022MsoNormal">  </div><div class="yiv7258571022MsoNormal">Ringrazio fin da ora per la collaborazione</div><div class="yiv7258571022MsoNormal">  </div><div class="yiv7258571022MsoNormal"><span style="font-size:10.0pt;font-family:"Arial", "sans-serif";">Attilio Menegon</span></div></div></div></div><br>_______________________________________________<br>Python mailing list<br><a ymailto="mailto:Python@lists.python.it" href="mailto:Python@lists.python.it">Python@lists.python.it</a><br><a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/mailman/listinfo/python</a><br><br><br></div>  </div> </div>  </div></div></body></html>