我是靠谱客的博主 超帅飞机,最近开发中收集的这篇文章主要介绍MODBUS_Rtu通讯(一):数据帧格式解读,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

RTU&&TCP单个写入
在这里插入图片描述
RTU&&TCP多个写入
在这里插入图片描述
RTU&&TCP数据读取
在这里插入图片描述
Modbus功能码:

功能码     名称               作用
 
1    读取线圈状态      取得一组逻辑线圈的当前状态(ON/OFF)
 
2    读取输入状态      取得一组开关输入的当前状态(ON/OFF)
 
3    读取保持寄存器    在一个或多个保持寄存器中取得当前的二进制值
 
4    读取输入寄存器    在一个或多个输入寄存器中取得当前的二进制值
 
5    强置单线圈        强置一个逻辑线圈的通断状态
 
6    预置单寄存器      把具体二进值装入一个保持寄存器
 
7    读取异常状态      取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定
 
8   回送诊断校验       把诊断校验报文送从机,以对通信处理进行评鉴
 
9   编程(只用于484)   使主机模拟编程器作用,修改PC从机逻辑
 
10  控询(只用于484)   可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送
 
11  读取事件计数        可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时
 
12  读取通信事件记录     可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误
 
13  编程(184/384 484 584) 可使主机模拟编程器功能修改PC从机逻辑
 
14  探询(184/384 484 584)可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送
 
15  强置多线圈  强置一串连续逻辑线圈的通断
 
16  预置多寄存器  把具体的二进制值装入一串连续的保持寄存器
 
17  报告从机标识 可使主机判断编址从机的类型及该从机运行指示灯的状态
 
18884和MICRO 84) 可使主机模拟编程功能,修改PC状态逻辑
 
19  重置通信链路   发生非可修改错误后,是从机复位于已知状态,可重置顺序字节
 
20  读取通用参数(584L)  显示扩展存储器文件中的数据信息
 
21  写入通用参数(584L) 把通用参数写入扩展存储文件,或修改之
 
2264  保留作扩展功能备用
 
6572 保留以备用户功能所用
 
73119 非法功能
 
120127 保留 留作内部作用
 
128255 保留  用于异常应答

MODBUS通讯之数据帧格式解读

一.背景
之前在一个工控项目上用代码分别实现了Modbus主站和Modbus从站(注:其实官方提供有现成的MODBUS从站库代码,并且支持大多数的嵌入式平台,如果项目比较急,把官方的库代码移植,剪裁一下就可以用了,但是我发现当你对MODBUS了解的比较熟悉之后,针对你自己特定的项目/产品完全可以自己实现更加精简,高效的代码),目前产品已经量产发布使用。现回过头来整理一下有关Modbus通讯的一些知识,打算把它写成一个系列博客,目前这是第一篇。Modbus协议包括Modbus-RTU、Modbus-ASCII、Modbus-TCP。其中MODBUS-RTU最常用,本文主要主要介绍的也是MODBUS-RTU。
————————————————
在这里插入图片描述

二.MODBUS数据帧组成
首先我们要知道一帧正常的MODBUS数据帧包含的内容有:地址域 + 功能码 + 数据 + 差错校验
在这里插入图片描述
三.下面逐一解释MODBUS数据帧各部分的具体含义:

(1)地址域:即主站要访问的从站地址,其范围0~247

(2)功能码:即主站想要对从站进行何种操作。
从大的方面看分为读(主站读取从站数据),写(主站向从站读取数据)
再往细分就是具体读取从站哪块区域的数据,以及具体将数据写到从站的哪块区域。操作从站不同的数据区对应有不同的功能码,在文末《MODBUS协议规范》文档中有详细介绍

(3)数据:如果主站的请求是读数据,那么该“数据”要包含的信息有: 从哪里开始读数据 + 读多少数据。 如果主站的请求是向从站写数据,那么该“数据”要包含的信息有:从哪里开始写数据 + 写多少个字节数据 + 要写的具体数据

(4)差错校验:为了保证数据传输的正确性,Modbus协议会在数据帧最后面加上两个字节的差错校验

四.举实例详细说明主站和从站之间的数据帧交互过程
(1) 主站 请求读 从站数据:

在这里插入图片描述
主站向从站发送的实际请求数据帧:03 04 00 08 00 01 B0 3B (假设从站地址为03)
其中:
03:为主站要访问的域名(即从站地址,范围0~247)。
04:表示功能码。
00 08:从从站08这个地址开始读取数据。
00 01:即将读取数据的长度。
b0 3b:两个字节的校验数据。

从站接收到主站的请求数据帧之后实际的响应数据帧为:03 04 02 00 0A 40 F7
其中:
03:为从站地址即域名(即从站地址,范围0~247)。
04:表示功能码。
02:被读取数据长度(包含一个字节高8位数据,一个字节低8八位数据)
00 0A:被读取的具体数据
40 F7两个字节的校验数据

(2) 主站 请求写 从站数据:
在这里插入图片描述
主站向从站发送的实际请求数据帧:03 10 00 01 00 02 04 00 0A 01 02 99 88 (假设从站地址为03)
其中
03:为主站要访问的域名(即从站地址,范围0~247)。
10:功能码。
00 01:往从站01这个地址开始写数据。
00 02:寄存器数量。
04:一共写4个字节数据。
04 00 01 02:具体数据。
99 88:两个字节的校验数据。

从站接收到主站的请求数据帧之后实际的响应数据帧为:03 10 00 01 00 02 11 EA
其中
03:为从站地址即域名(即从站地址,范围0~247)。
10:功能码。
00 01:往从站01这个地址开始写数据。(原样返回/响应)
00 02:寄存器数量。(原样返回/响应)
11 EA两个字节的校验数据

以上我们介绍了Modbus数据帧 主站发送 ,从站响应 这么一个“你来我往”的实际数据帧交互过程。
只能主站发起请求,从站不能,发起请求

最后

以上就是超帅飞机为你收集整理的MODBUS_Rtu通讯(一):数据帧格式解读的全部内容,希望文章能够帮你解决MODBUS_Rtu通讯(一):数据帧格式解读所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部