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.
DCS/protocol/ModBus/tcpslave_example.py

105 lines
3.2 KiB
Python

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_tcp, hooks
import serial
import struct
from .ByteOrder import *
from .SetMessage import *
# PORT = 'COM3'
#PORT = '/dev/ptyp5'
class TCPSlave():
def __init__(self, address = '127.0.0.1', port = 502):
try:
self.server = modbus_tcp.TcpServer(address = address, port = port)
self.server.start()
except Exception as e:
pass
hooks.install_hook("modbus_tcp.TcpServer.after_recv", afterRecv)
hooks.install_hook("modbus_tcp.TcpServer.after_send", afterSend)
# 创建从站
# 添加存储区
# 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:
pass
def setValue(self, slaveId, name, address, value, order = 'ABCD'):
try:
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)
except Exception as e:
pass
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:
return 'error'
if __name__ == "__main__":
a = TCPSlave()
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')