一、工具下载
MODBUS调试工具(ModbusPoll-v7.0): 点击下载
MODBUS调试工具(Modscan32):点击下载
MODBUS协议规范:计算方法
二、通信协议
1、数据格式
1.1 数据格式:起始位1位,数据位8位,停止位1位,无/偶校验(默认无校验)
1.2 通信速率:9600 /19200 Bit/s (默认9600)
2、通信方式
2.1 通信协议: MODBUS-RTU
2.2 命令码 : 03 / 06 /16
2.3 通讯地址: 1~64 拔码设置
2.4 内部寄存器地址说明
寄存器
|
地址
|
读写
|
数据范围
|
说明
|
风速
|
40100 (0x63)
|
只读
|
0-9999
|
实际风速 x100倍
|
风量低位
|
40101 (0x64)
|
只读
|
0-65535
|
风量低16位
|
风量高位
|
40102 (0x65)
|
只读
|
0-65535
|
风量高16位
|
管道面积
|
40103 (0x66)
|
读/写
|
0-9999
|
实际面积 x1000倍 单位:平方米
|
更新速率
|
40104 (0x67)
|
读/写
|
1-20
|
取样时间
x10倍 单位:秒
|
线性修正
|
40105 (0x68)
|
读/写
|
1-999
|
实际斜率 x100倍 y=K*x
|
信号切除
|
40106 (0x69)
|
读/写
|
0-999
|
切除信号
x100倍
|
2.5 MODBUS-RTU协议:
03功能码:读取寄存器数据
主机查询帧结构:
地址码
|
功能码
|
寄存器地址
|
寄存器数量
|
CRC低
|
CRC高
|
1字节
|
1字节
|
2字节
|
2字节
|
1字节
|
1字节
|
从机应答帧结构:
地址码
|
功能码
|
数据长度
|
数据1……..数据n
|
CRC低
|
CRC高
|
1字节
|
1字节
|
1字节
|
2字节 ……2字节
|
1字节
|
1字节
|
例如:读取当前风速值
发送:
地址
|
功能码
|
寄存器地址
|
数据长度
|
CRC
|
01
|
03
|
00 63
|
00 01
|
74 14
|
返回:
地址
|
功能码
|
数据长度
|
数据
|
CRC
|
01
|
03
|
02
|
041A
|
3B 4F
|
*风速值=0x041 /100=1050/100=10.5 m/s
06:写单个寄存器数值
主机设置帧结构
地址码
|
功能码
|
寄存器地址
|
寄存器值
|
CRC低
|
CRC高
|
1字节
|
1字节
|
2字节
|
2字节
|
1字节
|
1字节
|
从机应答帧结构:
地址码
|
功能码
|
寄存器地址
|
寄存器值
|
CRC低
|
CRC高
|
1字节
|
1字节
|
2字节
|
2字节
|
1字节
|
1字节
|
应答帧主机设置数据包一样,表示设置成功
例如:设置管道面积 0.123平方米
主机设置帧:01 06 00 66 00 7B 29 f6
从机返回帧:01 06 00 66 00 7B 29 f6
从寄存器表查看,管道面积地址为40106 (针对PLC等表示方法),十进制为0x66
需要写入的数据为:0.123, 放大1000倍=123,十六进制0x007B
16:连续写多个寄存器数值
主机设置帧结构:
地址码
|
功能码
|
寄存器起始地址
|
寄存器数量
|
字节数
|
数据1....数据n
|
CRC低
|
CRC高
|
1字节
|
1字节
|
2字节
|
2字节
|
1字节
|
2字节....2字节
|
1字节
|
1字节
|
从机应答帧结构:
地址码
|
功能码
|
寄存器起始地址
|
寄存器数量
|
CRC低
|
CRC高
|
1字节
|
1字节
|
2字节
|
2字节
|
1字节
|
1字节
|
例如:
需要设置数据: 管道面积=0.123 刷新速度=1秒 线性修正=1(不修正),信号切除=0.15m/s
写入的数据应该为: 管道面积=123,刷新速度=10,线性修正=1000,信号切除=15
共需要写入的寄存器个数为:4
主机发送设置帧为:01
10 00 66 00 04 08 00 7b 00 0a 03 e8 00 0f ad 80
地址码
|
功能码
|
寄存器起始地址
|
寄存器数量
|
字节数
|
数据1....数据n
|
CRC低
|
CRC高
|
01
|
10
|
00 66
|
00 04
|
08
|
007b 000a 03e8
000f
|
ad
|
80
|
从机应答:01 10
00 66 00 04 21 D5
地址码
|
功能码
|
寄存器起始地址
|
寄存器数量
|
CRC低
|
CRC高
|
01
|
10
|
00 66
|
00 04
|
21
|
D5
|
2.6 错误检测
1.
命令码错误 错误代码:0x01
2.
寄存器地址错误 错误代码 0x02
3.
数据长度错误 错误代码:0x03
4.
数据校验错误 错误代码:0x04
发生数据错误时,返回
地址
|
命令+0x80
|
错误代码
|
CRC低
|
CRC高
|
1字节
|
1字节
|
1字节
|
1字节
|
1字节
|
2.7 CRC16计算
可下载Modbus_RTU协议,其中有CRC16计算的方法及源代码,可通用,查表或计算方式均可
查表法速度快,篇幅有限这里暂不引用举例,可自己查阅相关资料,
下面为直接计算法
unsigned int
crc16(unsigned char *addr,int num)
{
unsigned int crc=0xffff;
unsigned char i, p;
for(p=0;p
{ crc = crc^(*addr++);
for(i = 0;i<8;i++) {
if(crc & 0x0001) crc =
(crc>>1)^0xa001;
else crc >>= 1;
}
}
return(crc);
}
3.地址设置 :
三、常用问题及检查方法
设备无法连接到PLC或电脑
可能的原因:
1)电脑有多个COM口,选择的口不正确。
2)设备地址错误,或存在地址重复的设备。
3)波特率,校验方式,数据位,停止位错误。
4)主机轮询间隔和等待应答时间太短,一般100ms以上。
5)485总线有断开,或者A、B线接反。
6)设备数量过多或布线太长,加485增强器,同时增加120Ω终端电阻(在A,B加120欧姆电阻。主板上没有集成这个电阻
7)USB转485驱动未安装或者损坏。
8)设备损坏。
总之,最好的方式是用调试助手监测,发送的数据包