Я использую библиотеку python Minimal Modbus для чтения счетчика энергии (RS-485).Modbus, python и минимальный modbus
Я пытаюсь использовать функцию для чтения нескольких регистров сразу
read_registers (registeraddress, numberOfRegisters, functioncode = 3)
Вот код библиотеки Python:
def read_registers(self, registeraddress, numberOfRegisters, functioncode=3):
"""Read integers from 16-bit registers in the slave.
The slave registers can hold integer values in the range 0 to 65535 ("Unsigned INT16").
Args:
* registeraddress (int): The slave register start address (use decimal numbers, not hex).
* numberOfRegisters (int): The number of registers to read.
* functioncode (int): Modbus function code. Can be 3 or 4.
Any scaling of the register data, or converting it to negative number (two's complement)
must be done manually.
Returns:
The register data (a list of int).
Raises:
ValueError, TypeError, IOError
"""
_checkFunctioncode(functioncode, [3, 4])
_checkInt(numberOfRegisters, minvalue=1, description='number of registers')
return self._genericCommand(functioncode, registeraddress, \
numberOfRegisters=numberOfRegisters, payloadformat='registers')
Проблема, которую я получил, заключается в том, что регистры содержат данные как Long
, но эта функция возвращает их как список int
и глядя на значения, которые не кажутся правильными.
Это мой сценарий на данный момент:
##!/usr/bin/env python
import minimalmodbus
import time
import glob
import sys
import MySQLdb
instrument = minimalmodbus.Instrument('/dev/ttyUSB1', 7)
#Debug Options
#instrument.debug = True #debug modbus
read = False
def convert(value):
data=chr(value)
return data
def read_registers_ime():
data = instrument.read_registers(4096,20)
return data
while True:
try:
while read == False:
data = read_registers_ime()
print data
time.sleep(0.11)
read = True
break
except KeyboardInterrupt:
print "Stopped"
sys.exit()
except TypeError:
print "TypeError"
except IOError:
print "IOError"
В данный момент она возвращает следующее:
[3, 39192, 3, 44592, 3, 44592, 0, 423, 0, 0, 0, 0, 0, 0, 6, 19884, 6, 24584, 6, 19884]
Все, что я пробовал до сих пор, чтобы преобразовать данные обратно в исходный формат, не удался. Я бы очень признателен за помощь здесь.
Большое спасибо,
Bryan