100 lines
3.2 KiB
Python

from pymodbus.client.sync import ModbusSerialClient
from pymodbus.pdu import ExceptionResponse
import RS485Ext
import struct
import time
def registersToIeeeFloat(i):
return struct.unpack('f', bytes(
[((x & 0xff00) >> 8) if y else (x & 0x00ff)
for x in i[::-1]
for y in [False, True]
]
)
)[0]
def registersToIeeeFloatReverse(i):
return struct.unpack('f', bytes(
[((x & 0xff00) >> 8) if y else (x & 0x00ff)
for x in i
for y in [False, True]
]
)
)[0]
class ModbusException(Exception):
def __init__(self, resp):
self.msg = str(result)
def __str__(self):
return self.msg
ser=RS485Ext.RS485Ext(port='/dev/ttyAMA0', baudrate=1200, stopbits=1)
client = ModbusSerialClient(method='rtu')
client.socket = ser
client.connect()
delay = 0.05
try:
# BG-Tech, Voltage
result = client.read_holding_registers(address=0x2000, count=2, unit=1)
if type(result) == ExceptionResponse:
raise ModbusException(result)
print("Voltage: {:.2f}".format(registersToIeeeFloat(result.registers)))
time.sleep(delay)
# BG-Tech, Frequency
result = client.read_holding_registers(address=0x2020, count=2, unit=1)
if type(result) == ExceptionResponse:
raise ModbusException(result)
print("Frequency: {:.2f}".format(registersToIeeeFloat(result.registers)))
time.sleep(delay)
# BG-Tech, Current
result = client.read_holding_registers(address=0x2060, count=2, unit=1)
if type(result) == ExceptionResponse:
raise ModbusException(result)
print("Current: {:.2f}".format(registersToIeeeFloat(result.registers)))
time.sleep(delay)
# Hottis Thermometer, Resistance Channel 1
result = client.read_holding_registers(address=0x0004, count=2, unit=3)
if type(result) == ExceptionResponse:
raise ModbusException(result)
print("Resistance Channel 1: {:.2f}".format(registersToIeeeFloatReverse(result.registers)))
time.sleep(delay)
# Hottis Thermometer, Temperature Channel 1
result = client.read_holding_registers(address=0x000c, count=2, unit=3)
if type(result) == ExceptionResponse:
raise ModbusException(result)
print("Temperature Channel 1: {:.2f}".format(registersToIeeeFloatReverse(result.registers)))
time.sleep(delay)
# Hottis Thermometer, Resistance Channel 2
result = client.read_holding_registers(address=0x0014, count=2, unit=3)
if type(result) == ExceptionResponse:
raise ModbusException(result)
print("Resistance Channel 2: {:.2f}".format(registersToIeeeFloatReverse(result.registers)))
time.sleep(delay)
# Hottis Thermometer, Temperature Channel 2
result = client.read_holding_registers(address=0x001c, count=2, unit=3)
if type(result) == ExceptionResponse:
raise ModbusException(result)
print("Temperature Channel 2: {:.2f}".format(registersToIeeeFloatReverse(result.registers)))
except ModbusException as e:
print("ERROR: %s" % e)
finally:
client.close()