python封装的modbus库有这几个:
modbus_tk :完整modbus协议栈的实现,支持modbus tcp/RTU{1.提供slave模拟器,即模拟modbus server:502), web-based hmi master支持}
pymodbus:使用twisted实现的modbus完整协议(支持异步通讯)
MinimalModbus :只支持modbus rtu
modbus报文模型:
ADU: 应用数据单元
PDU: 协议数据单元
信息帧格式:
信息帧允许的最大长度为256Byte,N的范围是(0 , 252);
从机地址范围(1 , 247),0为广播地址;
功能码范围(1 , 225),正常响应时,从机返回原功能码,非正常响应,从机返回 原功能码|0x80;
数据域需要指明从哪个寄存器读写多少数据,数据域长度可为0表示某类信息;
校验采用16位CRC校验(2Byte);
功能码:
案例1:读保持寄存器(功能码03)
主机发送:
地址 功能码 数据起始寄存器 寄存器数量 CRC校验
06 03 00 6B 00 01 XX XX
从机响应:
地址 响应功能码 数据长度 数据 CRC校验
06 03 06 02 2B 00 00 00 63 XX XX
案例2:修改内部寄存器(功能码06)
地址 功能码 数据起始寄存器 修改的新值 CRC校验
06 06 00 02 00 01 XX XX
MODBUS-RTU功能码
下面“线圈”“寄存器”其实分别直的就是“位变量”“16位变量”
01 (0x01) 读线圈
02 (0x02) 读离散量输入
03 (0x03) 读保持寄存器
04(0x04) 读输入寄存器
05 (0x05) 写单个线圈
06 (0x06) 写单个寄存器
15 (0x0F) 写多个线圈
16 (0x10) 写多个寄存器