Modbus协议
Modbus协议主要建立在物理串口、以太网TCP/IP层之上,目前已经成为工业领域通信协议的业界标准。
Modbus Poll和Modbus Slave是两款非常流行的Modbus设备仿真软件,支持Modbus RTU/ASCII和Modbus TCP/IP协议 ,经常用于测试和调试Modbus设备,观察Modbus通信过程中的各种报文。
当用于支持Modbus RTU/ASCII协议时,ModbusPoll作为一个主站设备, ModbusSlave作为一个从站设备,从站设备接收主站设备的命令并返回数据。
而当用于支持Modbus TCP/IP时,ModbusSlave作为一个服务器, ModbusPoll作为一个客户端,服务器接收客户端的命令并返回数据。客户端需要填写指定连接的远程服务器IP地址和端口号。
Modbus的通讯端口号是固定的:502
Python中提供了支持Modbus协议的第三方库——modbus_tk
当实现客户端功能时,需要配置如下参数:
slave:Modbus从站ID地址 。
function_code:寄存器的功能码
starting_address:寄存器起始地址,从0开始。
quantity_of_x:寄存器连续个数。
output_value:写命令时的数值。
Scan Rate:读取数据的周期,程序中体现为执行 execute()方法的周期。
1 import modbus_tk.modbus_tcp as mt 2 import modbus_tk.defines as md 3 #创建TCPMASTER对象 4 master = mt.TcpMaster('127.0.0.1',502) 5 #设置超时时间 6 master.set_timeout(5.5) 7 8 #写入保持寄存地址1-10,值对应时 9 values = (100,200,300,400,500,600,700,800,900,1000,1100) 10 master.execute(slave=1,function_code=md.WRITE_MULTIPLE_REGISTERS,starting_address=0,quantity_of_x=20,output_value=value) 11 12 #写入单个寄存器 13 master.execute(slave=1,function_code=md.WRITE_SINGLE_REGISTER,starting_address=0,output_value=888) 14 # 读取线圈 15 data = master.execute(slave=1,function_code=md.READ_COILS,starting_address=0,quantity_of_x=20) 16 17 #写入一个线圈 18 master.execute(slave=1,function_code=md.WRITE_SINGLE_COIL,starting_address=0,output_value= True) 19 #写入多个线圈 20 values = (True,False,True,False,True,False,True,False,True,False) 21 master.execute(slave=1,function_code=md.WRITE_MULTIPLE_COILS,starting_address=0,output_value= values)
#supported modbus 功能代码
READ_COILS = 1 读线圈
READ_DISCRETE_INPUTS = 2 读离散输入
READ_HOLDING_REGISTERS = 3 【读乘法寄存器】
READ_INPUT_REGISTERS = 4 读输入寄存器
WRITE_SINGLE_COIL = 5 写单一线圈
WRITE_SINGLE_REGISTER = 6 写单一寄存器
WRITE_MULTIPLE_COILS = 15 写多个线圈 【强制多点线圈】
WRITE_MULTIPLE_REGISTERS = 16 写多寄存器 【写乘法寄存器】
#supported block types 支持的块类型
COILS = 1 线圈
DISCRETE_INPUTS = 2 离散输入(数字量输入)
HOLDING_REGISTERS = 3 乘法寄存器
ANALOG_INPUTS = 4 模拟量输入
#modbus 异常代码
ILLEGAL_FUNCTION = 1 功能代码不合法
ILLEGAL_DATA_ADDRESS = 2 数据地址不合法
ILLEGAL_DATA_VALUE = 3 数据值不合法
SLAVE_DEVICE_FAILURE = 4 slave设备失败
COMMAND_ACKNOWLEDGE = 5 命令已收到
SLAVE_DEVICE_BUSY = 6 slave设备忙
MEMORY_PARITY_ERROR = 8 内存奇偶误差
无需时刻保持敏感,迟钝有时即为美德。尤其与人交往时,即便看透了对方的某种行为或者想法的动机,也需装出一副迟钝的样子。