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.
121 lines
3.7 KiB
Python
121 lines
3.7 KiB
Python
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)
|
|
else:
|
|
valueByte = floatToABCD(value)
|
|
slave.set_values(name, address, valueByte)
|
|
|
|
else:
|
|
slave.set_values(name, address, value)
|
|
|
|
|
|
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()
|