没有合适的资源?快使用搜索试试~ 我知道了~
Modbus通信协议剖析及应用
需积分: 6 10 下载量 115 浏览量
2022-10-19
14:48:28
上传
评论
收藏 15.89MB PDF 举报
温馨提示
试读
15页
Modbus通信协议剖析及应用电子版
资源详情
资源评论
资源推荐
公众号:dotNet 工控上位机 第 5 章 Modbus 通信协议剖析及应用 版权所有,侵权必究
1
第 5 章 Modbus 通信协议剖析及应用
1.1 Modbus 基
础知识概念
Modbus 通信协议由 Modicon 公司(现在的施耐德电气 Schneider Electric)于 1979 年为可编程
逻辑控制(即 PLC)通信而发表。目前,Modbus 已经成为工业领域通信协议的业界标准,并且现在
是工业电子设备之间常用的连接方式。Modbus 作为目前工业领域应用最广泛的协议,与其他通信
协议相比,有以下特点:
1. Modbus 协议标准开放、公开发表且无版权要求
2. Modbus 协议支持多种电气接口,包括 RS232、RS485、TCP/IP 等,还可以在各种介质上传输,
如双绞线、光纤、红外、无线等
3. Modbus 协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,
方便形成工业控制网络
Modbus 协议是一种应用层报文传输协议,包括 ASCII、RTU、TCP 三种报文类型,协议本身并没
有定义物理层,只是定义了控制器能够认识和使用的消息结构。
Modbus 协议使用串口传输时可以选择 RTU 或 ASCII 模式,并规定了消息、数据结构、命令和应
答方式并需要对数据进行校验。ASCII 模式采用 LRC 校验,RTU 模式采用 16 位 CRC 校验。通过以太
网传输时使用 TCP,这种模式不使用校验,
因为 TCP 协议是一个面向连接的可靠协议。
Modbus 协议规定了 4 个存储区,如下表所示:
区号
名称
读写
范围
0 区 输出线圈 可读可写 00001-09999
1
区
输入线圈
只读
10001-19999
3 区 输入寄存器 只读 30001-39999
4
区
保持寄存器
可读可写
40001-49999
Modbus 协议同时规定了二十几种功能码,但是常用的只有 8 种,用于针对上述存储区的读写,
如下表所示:
功能码
功能说明
01H
读取输出线圈
02H
读取输入线圈
03H
读取保持寄存器
04H
读取输入寄存器
05H
预置单线圈
06H
预置单寄存器
0FH
预置多线圈
10H
预置多寄存器
公众号:dotNet 工控上位机 第 5 章 Modbus 通信协议剖析及应用 版权所有,侵权必究
工欲善其事,必先利其器,Modbus 学习配合相关的调试软件,可以达到事半功倍的效果,Modbus
学习必备的三大神器分别是 ModbusPoll、ModbusSlave 及 VSPD,ModbusPoll 软件主要用于仿真
Modbus 主站或 Modbus 客户端,ModbusSlave 软件主要用于仿真 Modbus 从站或 Modbus 服务器,
而 VSPD 全称 Configure Virtual Serial Port Driver,是用来给电脑创建虚拟串口使用的。
1.2 ModbusRTU/ASCII 协议分析
ModbusRTU 与 ModbusASCII 在报文数据发送格式上几乎一样,但也存在一些区别,具体体现在:
1) ModbusASCII 有开始字符(:)和结束字符(CR LF),可以作为一帧数据开始和结束的标志,而
ModbusRTU 没有这样的标志,需要用时间间隔来判断一帧报文的开始和结束,协议规定的时间
为 3.5 个字符周期,就是说一帧报文开始前,必须有大于 3.5 个字符周期的空闲时间,一帧报
文结束后,也必须要有 3.5 个字符周期的空闲时间否则就会出现粘包的情况。
注意:针对 3.5 个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。
在串口通信中,1 个字符包括 1 位起始位、8 位数据位(一般情况)、1 位校验位(或者没有)、1 位
停止位(一般情况下),因此 1 个字符包括 11 个位,那么 3.5 个字符就是 38.5 个位,波特率表示的
含义是每 秒传输 的 二 进制位的 个位, 因 此 如果是 9600 波 特 率 , 3.5 个 字 符周期
=1000/9600*38.5=4.01ms。
2) 两者校验方式不同,ModbusRTU 是 CRC 循环冗余校验,ModbusASCII 是 LCR 纵向冗余校验。
3) 在 Modbus 标准中,RTU 是必须要求的,而 ASCII 是可选项,即作为一个 Modbus 通信设备可以
只支持 RTU,也可以同时支持 RTU 和 ASCII,但不能只支持 ASCII。
下面针对具体报文进行分析,Modbus 协议在串行链路上的报文格式如下所示:
从站地址
功能码
数据
CRC/LRC
1 byte
1 byte
N bytes
2 bytes
有了以上理论基础之后,下面针对各个功能码进行详细分析:
1.2.1 读取输出线圈
发送报文格式如下:
从站地址 功能码 起始(高) 起始(低) 数量(高) 数量(低) 校验
0x01
0x01
0x00
0x13
0x00
0x1B
XXXX
发送报文含义:读取 1 号从站输出线圈,起始地址为 0x13=19,对应地址为 00020,线圈数量为 0x1B=27,
即读取 1 号从站输出线圈,地址从 00020-00046,共 27 个线圈的状态值。
注意:协议中的起始地址指的是索引,后面的地址指的是具体地址,对于任意一个存储区,索引都
是从 0 开始的,但是对应的具体地址,与存储区是相关的,比如输出线圈,0 对应 00001;输入线
公众号:dotNet 工控上位机 第 5 章 Modbus 通信协议剖析及应用 版权所有,侵权必究
3
圈,0 对应 10001;输入寄存器,0 对应 30001;保持寄存器,0 对应 40001。
返回报文格式如下:
从站地址
功能码
字节计数
字节
1
字节
2
字节
3
字节
4
校验
0x01
0x01
0x04
0xCD
0x6B
0xB2
0x05
XXXX
返回报文含义:返回 1 号从站输出线圈 00020-00046,共 27 个线圈的状态值,返回字节数为 4 个,
分别为 CD 6B B2 05。
CD=1100 1101 对应 00020-00027 6B=0110 1011 对应 00028-00035
B2=1011 0010 对应 00036-00043 05=0000 0101 对应 00044-00046
1.2.2 读取输入线圈
发送报文格式如下:
从站地址 功能码 起始(高) 起始(低) 数量(高) 数量(低) 校验
0x01 0x02 0x00 0xC4 0x00 0x1D XXXX
发送报文含义:读取 1 号从站输入线圈,起始地址为 0xC4=196,对应地址为 10197,线圈数量为
0x1D=29,即读取 1 号从站输入线圈,地址从 10197-10225,共 29 个线圈的状态值。
返回报文格式如下:
从站地址
功能码
字节计数
字节
1
字节
2
字节
3
字节
4
校验
0x01
0x02
0x04
0xCD
0x6B
0xB2
0x05
XXXX
返回报文含义:返回 1 号从站输入线圈 10197-10225,共 29 个线圈的状态值,返回字节数为 4 个,
分别为 CD 6B B2 05。
CD=1100 1101 对应 10197-10204 6B=0110 1011 对应 10205-10212
B2=1011 0010 对应 10213-10220 05=0000 0101 对应 10221-10225
1.2.3 读取保持寄存器
发送报文格式如下:
从站地址
功能码
起始(高)
起始(低)
数量(高)
数量(低)
校验
0x01 0x03 0x00 0x6B 0x00 0x02 XXXX
发送报文含义:读取 1 号从站保持寄存器,起始地址为 0x6B=107,对应地址为 40108,寄存器数量
为 0x02=2,即读取 1 号从站保持寄存器,地址从 40108-40109,共 2 个寄存器的数值。
返回报文格式如下:
剩余14页未读,继续阅读
shi_xiaobin
- 粉丝: 253
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0