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'): slave = self.server.get_slave(slaveId) if '.' in str(value): if order == 'ABCD': # 大端模式 valueByte = floatToABCD(value) elif order == 'DCBA': # 小端模式 valueByte = floatToDCBA(value) elif order == 'BADC': valueByte = floatToBADC(value) elif order == 'CDAB': valueByte = floatToCDAB(value) slave.set_values(name, address, valueByte) else: slave.set_values(name, address, value) def readValue(self, slaveId, name, address, order = 'int'): try: slave = self.server.get_slave(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) return value except Exception as e: print(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()