Topic: [RISOLTO]Comunicazione RS485-protocollo ModBus  (Letto 77 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Anakin73

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
[RISOLTO]Comunicazione RS485-protocollo ModBus
« il: Giugno 23, 2020, 13:01 »
Buongiorno a tutti.
Utilizzando la libreria pymodbus ho creato uno script che legge un dispositivo di Input a 16 ingressi e fino a qui tutto liscio. Volendo interrogare continuamente il dispositivo l'unica soluzione che ho trovato è aggiungere un ciclo while a:

com = {"port":"COM5","baudrate":9600,"parity":'N',"bytesize":8,"stopbits":1,"method":"rtu","timeout":1} #dizionario contenente le caratteristiche di comunicazione
dati = {"nodo":1,"funzione":2,"indirizzo":0,"punti":16,"valore":[],"endianness":"L"} #dizionario contente i dati Modbus da inviare
IN = ComandiModBus(com) # istanziamento dell'oggetto IN della classe ComandiModbus figlia della classe pymodbus.client.sync
while True: # ciclo while aggiunto
      listaBool = IN.read(dati) #carico sulla lista "listaBool" i valori letti

Il problema è che il ciclo while è bloccante e vorrei poter eseguire altre funzioni durante queste "chiamate".
Esiste un metodo per eseguire delle funzioni in background?
Ho provato i thread ma non riesco a farli funzionare con pyqt5 (finestra nella quale vorrei rappresentare lo stato degli ingressi del dispositivo di Input) in particolare appena creo l'oggetto QApplication(sys.argv) lo script crasha :(
Grazie
     
« Ultima modifica: Giugno 23, 2020, 19:45 da Anakin73 »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 258
  • Punti reputazione: 0
    • Mostra profilo
Re:Comunicazione RS485-protocollo ModBus
« Risposta #1 il: Giugno 23, 2020, 14:05 »
Purtroppo sono al di fuori delle mie conoscenze tanto le Qt, quanto pymodbus, volevo però segnalarTi che a giudicare da questo articolo, le pyQT5 possiedono oggetti potenzialmente interessanti, quali QRunnable o QThreadPool, li hai provati?

Riguardo al crash, un po' tutti i framework grafici sono a thread bloccante (quando li avvii fermano il resto), non è che sia questa l'origine del tuo problema? Hai attività esterne al loop grafico quando istanzi qt?

Offline Anakin73

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:Comunicazione RS485-protocollo ModBus
« Risposta #2 il: Giugno 23, 2020, 15:23 »
Grazie nuzzopippo.
Ora controllo i due oggetti che mi hai suggerito.
In merito all'ultima domanda la risposta è sì e pertanto convalida la tua tesi.
Vi tengo aggiornati.
Poi se arrivano altri suggerimenti... :)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.062
  • Punti reputazione: 9
    • Mostra profilo
Re:Comunicazione RS485-protocollo ModBus
« Risposta #3 il: Giugno 23, 2020, 17:54 »
Mah no... onestamente eviterei sempre soluzioni coi thread se non è proprio assolutamente indispensabile.
Nel tuo caso *di sicuro* puoi evitartelo. Tutto ciò che vuoi è ascoltare periodicamente una porta. Ora, un gui framework ha *già* un suo ciclo che fa periodicamente delle cose... si chiama "main loop" ed è una specie di ciclo "while True". Come hai già capito per conto tuo, se metti un "while True" dentro un "while True", blocchi tutto. Quindi non ti resta che saltare a bordo del main loop per programmare il tuo ascolto periodico.

Tecnicamente, con le Qt quello che vuoi usare è un QTimer: lo programmi per un certo intervallo in millisecondi, e nello slot relativo fai *un singolo* ascolto della tua porta. Puoi distanziare gli ascolti tra loro, quanto ti pare. Se invece lo metti a 0 millisecondi, allora l'azione di ascolto avverrà "più in fretta possibile", ovvero a ogni ciclo del main loop, non appena sono stati processati gli altri eventi in coda.


per Nunzio, che so che si sta divertendo con il mio libro su wxPython...  ;)
Anche in wxPython esistono i timer (wxTimer)... inoltre esiste anche wx.IDLE_EVENT per programmare eventi a-periodici da emettere "non appena il main loop non ha niente da fare"... è un po' diverso da un QTimer con intervallo 0, credo... non sono espertissimo di Qt... ma non credo che le Qt abbiano un analogo dell'idle event.

Offline Anakin73

  • python unicellularis
  • *
  • Post: 5
  • Punti reputazione: 0
    • Mostra profilo
Re:[RISOLTO]Comunicazione RS485-protocollo ModBus
« Risposta #4 il: Giugno 23, 2020, 19:44 »
RicPol ti devo una birra!!  :) :party:
Con Qtimer ho risolto e semplificato lo script!!
Grazie infinite!!

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 258
  • Punti reputazione: 0
    • Mostra profilo
Re:Comunicazione RS485-protocollo ModBus
« Risposta #5 il: Giugno 24, 2020, 09:23 »
...per Nunzio, che so che si sta divertendo con il mio libro su wxPython...  ;)
Anche in wxPython esistono i timer (wxTimer)... inoltre esiste anche wx.IDLE_EVENT per programmare eventi a-periodici ...

Già data una prima lettura quei capitoli @Ric, grazie. Da wx.Timer ero rimasto colpito favorevolmente ma dovrò fare un po' di test "pratici" su wx.IDLE_EVENT e wx.Yield, non che l'esposizione non sia chiara, tutt'altro, ma devo assimilarne "materialmente" la metodologia, già il fatto stesso che non mi sia venuto in mente di cercare un QTimer indica che un po' di lavoro devo farlo prima che il mio cervello utilizzi proggettualmente tali concetti.