[Python] Registri modbus

Giovanni Porcari giovanni.porcari a softwell.it
Sab 26 Feb 2022 08:09:07 CET



> Il giorno 16 feb 2022, alle ore 06:53, Vinny Mautone <vinny74man a gmail.com> ha scritto:
> 
> 
> Ciao a tutti sto provando a leggere dei dati da un apparecchiatura con la quale comunico tramite il protocollo modbus, sto usando il modulo pymodbusTCP, ho alcuni dati come ad esempio la versione del firmware che occupano sei registri da 16 bit, riesco a leggerli e con la funzione di lettura del modulo ottengo una lista di 6 elementi da 16bit, solo che non riesco a scomporre e a recuperare l'informazione in modo leggibile, dal manuale leggo che il dato è formato da 11 byte in caratteri ascii, quindo ho capito che devo scomporre ogni elemento della lista nei due byte che lo compongono e poi riassemblare il tutto.
> 
> 
Dall’esempio postato successivamente provo a spiegartelo meglio:

>>> reg=[21070,12601,12340,12593,12593,13312]

Per prima cosa dobbiamo trasformare nel relativo esadecimale usando la funzione hex 

>>> [hex(c) for c in reg]
['0x524e', '0x3139', '0x3034', '0x3131', '0x3131', '0x3400']
B
Ora vogliamo ottenere un unica stringa che rappresenti il valore esadecimale
e per questo dobbiamo fare una join ma eliminando ‘0x’ all’inizio. 
Scriviamo quindi:

>>> ''.join([hex(c)[2:] for c in reg])
'524e31393034313131313400'


Ora trasformiamo in un array di byte:

>>> bytearray.fromhex(''.join([hex(c)[2:] for c in reg]))
bytearray(b'RN190411114\x00')

E infine con decode() otteniamo la rappresentazione:

>>> bytearray.fromhex(''.join([hex(c)[2:] for c in reg])).decode()
'RN190411114\x00'

Per eliminare il char(0) finale possiamo rimpiazzare con
stringa vuota:

>>> bytearray.fromhex(''.join([hex(c)[2:] for c in reg])).decode().replace(chr(0),'')
'RN190411114'

Ciao

G






-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20220226/771b2de1/attachment.html>


Maggiori informazioni sulla lista Python