Modbus协议学习记录

2022/9/4 23:22:55

本文主要是介绍Modbus协议学习记录,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Modbus通信协议

目录
  • Modbus通信协议
    • 一丶Modbus基础
      • 1.基于串口通信的Modbus
        • RTU模式
        • ASCII模式
      • 2.基于TCP/IP通信的Modbus
    • 二丶ModbusRTU报文说明
      • 通用报文格式(数据已16进制形式表示)
      • 1.读取输出线圈(功能码01H)
        • 主站询问报文格式
        • 从站应答报文格式
      • 2.读取输入线圈(功能码02H)
        • 主站询问报文格式
        • 从站应答报文格式
      • 3.读取保持寄存器(功能码03H)
        • 主站询问报文格式
        • 从站应答报文格式
      • 4.读取输入寄存器(功能码04H)
        • 主站询问报文格式
        • 从站应答报文格式
      • 5.预置单个线圈(功能码05H)
        • 主站询问报文格式
        • 从站询问报文格式
      • 6.预置单个线圈(功能码0FH)
        • 主站询问报文格式
        • 从站询问报文格式
      • 7.预置单个线圈(功能码0FH)
        • 主站询问报文格式
        • 从站询问报文格式
      • 8.预置单个线圈(功能码06H)
        • 主站询问报文格式
        • 从站询问报文格式
      • 9.预置单个线圈(功能码10H)
        • 主站询问报文格式
        • 从站询问报文格式

一丶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.预置单个线圈(功能码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

8.预置单个线圈(功能码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后原文返回

9.预置单个线圈(功能码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



这篇关于Modbus协议学习记录的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程