You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.2 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import sys
sys.path.append('../../../')
sys.path.append('../')
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu, hooks
import serial
import struct
from .ByteOrder import *
from .SetMessage import *
# PORT = 'COM3'
#PORT = '/dev/ptyp5'
class RTUSlave():
def __init__(self, port = 'COM4', baudrate = 9600, bytesize = 8, parity = 'N', stopbits = 1, xonxoff = 0):
try:
self.server = modbus_rtu.RtuServer(serial.Serial(port = port, baudrate = baudrate, bytesize = bytesize, parity = parity, stopbits = stopbits, xonxoff = xonxoff))
except Exception as e:
return
# hooks.install_hook('modbus.Server.before_handle_request', afterRecv)
# hooks.install_hook("modbus.Server.after_handle_request", afterSend)
# self.server.set_timeout(5.0)
# self.server.set_verbose(True)
def start(self):
self.server.start()
# 创建从站
# 添加存储区
# supported block types
# COILS = 1
# DISCRETE_INPUTS = 2
# HOLDING_REGISTERS = 3
# ANALOG_INPUTS = 4
def addSlave(self, slaveId):
try:
self.server.add_slave(slaveId)
slave = self.server.get_slave(slaveId)
slave.add_block('0', cst.COILS, 0, 9999) # 从0开始创建10000个地址
slave.add_block('1', cst.DISCRETE_INPUTS, 10000,19999)
slave.add_block('3', cst.ANALOG_INPUTS, 30000, 39999)
slave.add_block('4', cst.HOLDING_REGISTERS, 40000, 49999)
except Exception as e:
return
def setValue(self, slaveId, name, address, value, order = 'ABCD'):
try:
slave = self.server.get_slave(slaveId)
if '.' not in str(value) and order == 'int':
# 整数值处理
intValue = int(value)
slave.set_values(name, address, intValue)
else:
# 浮点数处理或者order != 'int'时的浮点数转换)
if '.' not in str(value):
floatValue = int(value)
else:
floatValue = float(value)
if order == 'ABCD': # 大端模式
valueByte = floatToABCD(floatValue)
elif order == 'DCBA': # 小端模式
valueByte = floatToDCBA(floatValue)
elif order == 'BADC':
valueByte = floatToBADC(floatValue)
elif order == 'CDAB':
valueByte = floatToCDAB(floatValue)
else:
valueByte = floatToABCD(floatValue)
slave.set_values(name, address, valueByte)
except Exception as e:
print(f"RTU Slave setValue error: {e}")
return 'error'
def readValue(self, slaveId, name, address, order = 'int'):
try:
try:
slave = self.server.get_slave(slaveId)
except Exception as e:
# if type(e) == MissingKeyError:
self.addSlave(slaveId)
if order == 'int':
value = slave.get_values(name, address, 1)[0]
else:
value = slave.get_values(name, address, 2)
if order == 'ABCD': # 大端模式
value = ABCDToFloat(value)
elif order == 'DCBA': # 小端模式
value = DCBAToFloat(value)
elif order == 'BADC':
value = BADCToFloat(value)
elif order == 'CDAB':
value = CDABToFloat(value)
else:
value = ABCDToFloat(value)
return value
except Exception as e:
return 'error'
if __name__ == "__main__":
a = RTUSlave()
a.start()
a.addSlave(1)
a.setValue(1, '0', 0, 1)
a.readValue(1, '0', 0)
a.setValue(1, '1', 10000, 1)
a.readValue(1, '1', 10000)
a.setValue(1, '3', 30000, 2)
a.readValue(1, '3', 30000)
a.setValue(1, '3', 30002, 2.5121231)
a.readValue(1, '3', 30002, order ='ABCD')
a.setValue(1, '4', 40000, 3)
a.readValue(1, '4', 40000)
a.setValue(1, '4', 40002, 3.51231234564)
a.readValue(1, '4', 40002, order ='ABCD')
# a.server.stop()