Modbus协议学习记录
Modbus通信协议
仿真环境学习搭建三件套
- Modbus Poll 主站工具
- Modbus Sever 从站仿真工具
- Configure Virtual Serial Port Driver 虚拟串口工具
一丶Modbus基础
1.基于串口通信的Modbus
RTU模式
- 端口号(Prot)
- 波特率(Baud)
- 奇偶校验
- 停止位
- 数据位
- CRC(循环冗余校验)
ASCII模式
- 端口号(Prot)
- 波特率(Baud)
- 奇偶校验
- 停止位
- 数据位
- LRC(纵向冗余校验)
2.基于TCP/IP通信的Modbus
二丶ModbusRTU报文说明
通用报文格式(数据已16进制形式表示)
地址 | 功能吗 | 数据 | CRC校验 |
---|---|---|---|
1*byte | 1*byte | N*byte | 2*byte |
1.读取输出线圈(功能码01H)
主站询问报文格式
从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 线圈数量(高位) | 线圈数量(低位) | CRC校验 |
---|---|---|---|---|---|---|
0x11H | 0x01 | 0x0 | 0x13 | 0x00 | 0x1B | xxxx |
含义:读 11H (17)号从站输出线圈,起始地址=0013H=19,对应地址 00020;线圈数=001BH=27;结束地址 =00020+27-1=00046,
即读 11H (17)号从站输出线圈 00020--00046,共 27个线圈状态。
从站应答报文格式
从站地址 | 功能码 | 字节计数 | 线圈状态20-27 | 线圈状态28-35 | 线圈状态36-43 | 线圈状态44-46 | CRC校验 |
---|---|---|---|---|---|---|---|
0x11H | 0x01 | 0x4 | 0xCD | 0x6B | 0xB2 | 0x05 | xxxx |
含义:返回 11H (17)号从站输出线圈 00020—00046,共 27个线圈状态,分别为CD 6B B2 05
CD=1100 1101 对应00020-00027 6B=0110 1011 对应00028-00035
B2= 1011 0010 对应00036-00043 05=0000 0101 对应00044-00046
2.读取输入线圈(功能码02H)
主站询问报文格式
从站地址 | 功能码 | 起始地址(高位) | 起始地址(低位) | 线圈数量(高位) | 线圈数量(低位) | CRC校验 |
---|---|---|---|---|---|---|
0x11H | 0x02 | 0x0 | 0xC4 | 0x00 | 0x1D | xxxx |
含义:读 11H (17)号从站输入线圈,起始地址=00C4H=196,对应地址 10197;线圈数=001DH=29;结束地址 =10197+29-1=10225,
即读 11H (17)号从站输出线圈 10197—10225,共 29个线圈状态。
从站应答报文格式
从站地址 | 功能码 | 字节计数 | 线圈状态20-27 | 线圈状态28-35 | 线圈状态36-43 | 线圈状态44-46 | CRC校验 |
---|---|---|---|---|---|---|---|
0x11H | 0x02 | 0x4 | 0xCD | 0x6B | 0xB2 | 0x05 | xxxx |
含义:返回 11H (17)号从站输入线圈 10197—10225,共 29个线圈状态,分别为CD 6B B2 05
CD=1100 1101 对应10197-10204 6B=0110 1011 对应10205-10212
B2=1011 0010 对应10213-10220 05=0000 0101 对应10221-10225
3.读取保持寄存器(功能码03H)
主站询问报文格式
从站地址 | 功能码 | 起始寄存器(高位) | 起始寄存器(低位) | 寄存器数量(高位) | 寄存器数量(低位) | CRC |
---|---|---|---|---|---|---|
0x11 | 0x03 | 0x00 | 0x6B | 0x00 | 0x02 | XXXX |
含义:读 11H (17)号从站保持寄存器,起始地址=006BH=107,对应地址 40108;寄存器数=0002H=2;结束地址 = 40108+2-1=40109,
即读 11H (17)号从站保存寄存器40108—40109,共 2个寄存器的值。
从站应答报文格式
从站地址 | 功能码 | 字节计数 | 40108(高位) | 40108(低位) | 40109(高位) | 40109(低位) | CRC |
---|---|---|---|---|---|---|---|
0x11 | 0x03 | 0x04 | 0x02 | 0x2B | 0x01 | 0x06 | XXXX |
含义:返回 11H (17)号从站保存寄存器40108—40109 ,共 2个寄存器的值,分别为02 2B 01 06
因此40108寄存器对应值为022BH 40109寄存器对应值为0106H
4.读取输入寄存器(功能码04H)
主站询问报文格式
从站地址 | 功能码 | 起始寄存器(高位) | 起始寄存器(低位) | 寄存器数量(高位) | 寄存器数量(低位) | CRC |
---|---|---|---|---|---|---|
0x11 | 0x04 | 0x00 | 0x6B | 0x00 | 0x02 | XXXX |
含义:读 11H (17)号从站输入寄存器,起始地址=006BH=107,对应地址 30108;寄存器数=0002H=2;结束地址 = 30108+2-1=30109,
即读 11H (17)号从站输入寄存器30108—30109,共 2个寄存器的值。
从站应答报文格式
从站地址 | 功能码 | 字节计数 | 30108(高位) | 30108(低位) | 30109(高位) | 30109(低位) | CRC |
---|---|---|---|---|---|---|---|
0x11 | 0x04 | 0x04 | 0x02 | 0x2B | 0x01 | 0x06 | XXXX |
含义:返回 11H (17)号从站输入寄存器30108—30109 ,共 2个寄存器的值,分别为02 2B 01 06
因此30108寄存器对应值为022BH 30109寄存器对应值为0106H
5.预置单个线圈(功能码05H)
主站询问报文格式
从站地址 | 功能码 | 线圈地址(高位) | 线圈地址(低位) | 断通标志 | 断通标志 | CRC |
---|---|---|---|---|---|---|
0x11 | 0x05 | 0x00 | 0xAC | 0xFF | 0x00 | XXXX |
含义:强制 11H (17)号从站某个线圈的值,线圈地址=00ACH=172,对应地址 00173;断通标志为FF00H表示置位,断通标志为0000H表示复位,即置位 11H (17)号从站输出线圈00173。
从站询问报文格式
从站地址 | 功能码 | 线圈地址(高位) | 线圈地址(低位) | 断通标志 | 断通标志 | CRC |
---|---|---|---|---|---|---|
0x11 | 0x05 | 0x00 | 0xAC | 0xFF | 0x00 | XXXX |
含义:强制 11H (17)号从站输出线圈00173为1后原文返回
6.预置多个线圈(功能码0FH)
主站询问报文格式
从站地址 | 功能码 | 起始(高位) | 起始(低位) | 线圈数(高位) | 线圈数(低位) | 字节计数 | 字节1 | 字节2 | CRC |
---|---|---|---|---|---|---|---|---|---|
0x11 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | 0x02 | 0xCD | 0x00 | XXXX |
含义:预置 11H (17)号从站多个线圈的值,线圈起始地址=0013H=19,对应地址 00020;线圈数=0x000A=10,结束地址为00020+10-1=00029,写入值为0xCD00,即预置 11H (17)号从站线圈:
00020-00027=0xCD=1100 1101 00028-00029=0x00=0000 0000
从站询问报文格式
从站地址 | 功能码 | 起始(高位) | 起始(低位) | 线圈数(高位) | 线圈数(低位) | CRC |
---|---|---|---|---|---|---|
0x11 | 0x0F | 0x00 | 0x13 | 0x00 | 0x0A | XXXX |
含义:预置 11H (17)号从站线圈:00020-00027=0xCD=1100 1101 00028-00029=0x00=0000 0000
7.预置单个寄存器(功能码06H)
主站询问报文格式
从站地址 | 功能码 | 寄存器地址(高位) | 寄存器地址(低位) | 写入值(高位) | 写入值(低位) | CRC |
---|---|---|---|---|---|---|
0x11 | 0x06 | 0x00 | 0x87 | 0x03 | 0x9E | XXXX |
含义:预置 11H (17)号从站某个寄存器的值,寄存器地址=0087H=135,对应地址 40136;写入值为0x039E,即预置 11H (17)号从站保存寄存器40136值为0x039E。
从站询问报文格式
从站地址 | 功能码 | 寄存器地址(高位) | 寄存器地址(低位) | 写入值(高位) | 写入值(低位) | CRC |
---|---|---|---|---|---|---|
0x11 | 0x06 | 0x00 | 0x87 | 0x03 | 0x9E | XXXX |
含义:预置 11H (17)号从站保存寄存器40136值为0x039E后原文返回
8.预置多个寄存器(功能码10H)
主站询问报文格式
从站地址 | 功能码 | 起始(高位) | 起始(低位) | 数量(高位) | 数量(低位) | 字节计数 | 字节1 | 字节2 | 字节3 | 字节4 | CRC |
---|---|---|---|---|---|---|---|---|---|---|---|
0x11 | 0x10 | 0x00 | 0x87 | 0x00 | 0x02 | 0x04 | 0x01 | 0x05 | 0x0A | 0x10 | XXXX |
含义:预置 11H (17)号从站多个寄存器的值,寄存器起始地址=0087H=135,对应地址 40136;寄存器数=0x0002=2,结束地址为40136+2-1=40137,写入值为0x0105,0x0A10,即预置 11H (17)号从站寄存器:
40136=0x0105 40137=0x0A10
从站询问报文格式
从站地址 | 功能码 | 起始(高位) | 起始(低位) | 数量(高位) | 数量(低位) | CRC |
---|---|---|---|---|---|---|
0x11 | 0x10 | 0x00 | 0x87 | 0x00 | 0x02 | XXXX |
含义:预置 11H (17)号从站寄存器:40136=0x0105 40137=0x0A10