目录

一 测试环境配置:

二 MODBUS概述:

三 MODBUS测试步骤:

四 MODBUS协议分析:


一 测试环境配置:

本文用到的测试工具如下:

(1)Mthings:MThings是一款基于MODBUS协议簇,面向开发、测试、运维人员的辅助工具。支持模拟主机和模拟从机两种模式。

【下载地址】:https://gulink.blog.csdn.net/article/details/106459315

(2)VSPD虚拟串口工具:

【下载地址】:https://www.cr173.com/soft/21406.html

(3)一些基础的资料:

【1】《【通信原理】MODBUS协议最简单又是最直白的解释》

【2】《Modbus协议解析--小白一看就懂的协议》

【3】《5分钟入门MThings》

(4)Modbus移植到嵌入式芯片上,并实现与PC的测试联调参考我的另一篇文章

【通信原理】FreeModbus总线在嵌入式芯片LPC18XX上的移植

二 MODBUS概述:

Modbus是一种单主站的主/从通信模式。Modbus网络上只能有一个主站存在,主站在 Modbus网络上没有地址,从站的地址范围为 0 - 247,其中 0 为广播地址,从站的实际地址范围为 1 - 247。 Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。 
Modbus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种。

三 MODBUS测试步骤:

总体思路就是通过VSPD虚拟串口工具,虚拟化出两个PC本地串口,再将两个串口虚拟连接(告别硬件连接),这样得到一堆连接着的串口。再通过Mthings工具,将COM1仿真为MODBUS主机,将COM2仿真为MODBUS从机,这样完成MODBUS的主从通讯。

(1)【虚拟串口】:

通过VSPD虚拟串口工具,虚拟化出两个PC本地串口,再将两个串口虚拟连接(告别硬件连接):

(2)【连接配置】:

打开Mthings,列表中显示COM1与COM2,根据需要进行参数配置和设备操作(设置主/从),这边将COM1设为主机,COM2设为从机:

(3)【数据配置】:

选中操作的设备,左上角选择“数据”,进入配置态。这边新增两种数据:

一种命名为“电压”,一种命名为“电流”,其他的属性根据需要进行选择,我这边仅修改了一下字节序(数值大小退出配置模式才能设置):

设置完成之后,同步到主机,这样,主机中也有电压和电流的数据配置了(我这边为了后面测试MODBUS的0x10批量写功能,额外在主机的配置模式中,将批量写进行了勾选):

至此,主机与从机的MODBUS数据配置完毕,下面来进行测试。

(4)【功能测试】:

勾选右上角“报文”,这样就可以对收发报文进行分析。

【1】测试主机读数据功能:在从机COM2中修改电压电流值,并在主机数据模式下点选“读”或者点选“批量读”(两种方式通讯协议是不一样的),以测试主机的读功能:

通讯码如下所示:

【2】测试主机写数据功能:在主机COM1中修改指令中的值,并在主机数据模式下点选“写”或者点选“批量写”(两种方式通讯协议是不一样的),从机中会显示该值被改掉,以测试主机的写功能:


通讯码如下所示:

综上所示,完成了两个虚拟连接的串口间的模拟MODBUS数据收发。

四 MODBUS协议分析:

上面的测试中,使用到了MODBUS RTU协议的0x03、0x06、0x10三种功能码(几种常用的功能码介绍:http://m.elecfans.com/article/631762.html),下面做一个简要的分析:

(1)读保持寄存器功能码0x03(区别于下面的写操作,单个读和批量读都是该功能码):

【0x03的PDU部分】:主机发---->起始地址+寄存器数量,从机回---->总字节数+数据;

批量读电压值10和电流值20报文
COM1-发送:01 03 00 00 00 02 c4 0b
COM2-接收:01 03 00 00 00 02 c4 0b
COM2-发送:01 03 04 0a 00 14 00 f6 eb
COM1-接收:01 03 04 0a 00 14 00 f6 eb

报文解析如下:

/*主机COM1发数据解析*/
01-地址
03-功能码,代表查询功能
00 00-代表查询的起始寄存器地址.说明从0x0000开始查询.
(这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据;)
00 02-代表查询了两个寄存器.结合前面的00 00,意思就是查询从0开始的2个寄存器值;
c4 0b-循环冗余校验,是modbus的校验公式,从首个字节开始到c4前面为止;
(注:这里新手可能不懂,这个校验就是保证数据传输过程没有错误的一种手段,不同的协议这种校验公式不一样,只需了解这个就足够了,具体怎么求的,可以直接在输出数据得到结果,地址如下:http://www.ip33.com/crc.html)

/*从机COM2回数据解析*/
01-地址
03-功能码
04-代表后面数据的字节数,因为上面说到,一个寄存器有4个字节,所以后面的字节数肯定是2*查询的寄存器个数;
0a 00-从机返回电压值数据10(这边是字节序为小端模式,若选择大端,这边显示00 0a)
14 00-从机返回电流值数据20
f6 eb-循环冗余校验

单个读数据大同小异,差别基本在于寄存器的个数,这边不再赘述,仅把报文在这边做一个展示:

单个读电压值10报文
COM1-发送:01 03 00 00 00 01 84 0a
COM2-接收:01 03 00 00 00 01 84 0a
COM2-发送:01 03 02 0a 00 be e4
COM1-接收:01 03 02 0a 00 be e4

单个读电流值20报文
COM1-发送:01 03 00 01 00 01 d5 ca
COM2-接收:01 03 00 01 00 01 d5 ca
COM2-发送:01 03 02 14 00 b7 44
COM1-接收:01 03 02 14 00 b7 44

(2)写保持寄存器功能码0x06(区别于上面的读操作,单个写的功能码是0x06、批量写是0x10):

【0x06的PDU部分】:主机发---->起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机回---->起始地址+数据内容(发现居然一样!)

单个写电压值10报文
COM1-发送:01 06 00 00 0a 00 8f 6a
COM2-接收:01 06 00 00 0a 00 8f 6a
COM2-发送:01 06 00 00 0a 00 8f 6a
COM1-接收:01 06 00 00 0a 00 8f 6a

单个写电流值20报文
COM1-发送:01 06 00 01 14 00 d7 0a
COM2-接收:01 06 00 01 14 00 d7 0a
COM2-发送:01 06 00 01 14 00 d7 0a
COM1-接收:01 06 00 01 14 00 d7 0a

针对“单个写电压值10报文”报文解析如下:

/*主机COM1发数据解析*/
01-主机要查的地址
06-功能码,代表修改单个寄存器功能,修改有些不同,有修改一个寄存器和修改多个寄存器;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
0a 00-代表修改的值为0a 00.结合前面的00 00,意思就是修改0号寄存器值为0a 00;
8f 6a-循环冗余校验,是modbus的校验公式,从首个字节开始到8f前面为止;

/*从机COM2回数据解析*/
01-从机返回的地址,说明这就是主机查的从机
06-功能码,代表修改单个寄存器功能;
00 00-代表修改的起始寄存器地址.说明是0x0000.
0a 00-代表修改的值为0a 00.结合前面的00 00,意思就是修改0号寄存器值为0a 00;
8f 6a-循环冗余校验,是modbus的校验公式,从首个字节开始到8f前面为止;

(3)批量写保持寄存器功能码0x10(区别于上面的读操作,单个写的功能码是0x06、批量写是0x10):

如果我要修改多个寄存器,难道用06发好几次,这样不会太傻了吗?所以,modbus RTU协议包含了修改连续多个寄存器的方法,就是功能码为0x10。

【0x10的PDU部分】:主机发---->起始地址+寄存器个数+总字节数+数据,从机回---->起始地址+寄存器数量

批量写电压值10和电流值20报文
COM1-发送:01 10 00 00 00 02 04 0a 00 14 00 ff 77
COM2-接收:01 10 00 00 00 02 04 0a 00 14 00 ff 77
COM2-发送:01 10 00 00 00 02 41 c8
COM1-接收:01 10 00 00 00 02 41 c8

报文解析如下:

/*主机COM1发数据解析*/
01-主机要查的地址
10-功能码,代表修改多个寄存器功能;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 02-代表修改的寄存器数量,这里开始于0x06的修改不同;
04 -表示修改的总字节数,由于修改了2个寄存器,所以数据要有4个字节;
0a 00-主机修改电压值数据为10(结合上面,就是从第0000寄存器开始修改一个寄存器值为0a 00,就是把0000寄存器改为0a 00)
14 00-主机修改电流值数据为20
ff 77-循环冗余校验,是modbus的校验公式,从首个字节开始到ff前面为止;

/*从机COM2回数据解析*/
01-从机返回的地址,说明这就是主机查的从机
10-功能码
00 00-代表修改的起始寄存器地址.说明是0x0000.
00 02-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机,你修改了哪几个寄存器就足够了;
41 C8-循环冗余校验;

【通信原理】PC上调试MODBUS基本功能(附报文解析)相关推荐

  1. 【微信】绕过限制,在PC上调试微信投票页、砍价页

    场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面做一下分析,一一绕过其限制,(当然不 ...

  2. 绕过限制,在PC上调试微信手机页面

    绕过限制,在PC上调试微信手机页面 场景 假设一个手机页面,开发者对其做了限制,导致只能在微信客户端中打开.而众所周知手机上非常不利于调试页面,所以需要能在电脑上打开并进行调试.这里针对常见的三种页面 ...

  3. 在索智SC3807VS EVB上调试开发以太网功能(使用V3s的内部EMAC+PHY)

    V3s是全志SoC的一员,可以用于做CDR.IPCAMERA.SportDV等编码类的产品.这次,我需要在V3s上使用Ethernet功能,从V3s datasheet可以确定V3s内部带有EMAC及 ...

  4. 开发ProxyServer的时候如何在一台PC上调试

    为了测试在真实的网络环境下你的ProxyServer性能如何,而你手头又只有一台电脑,怎么办? 打开你的ProxyServer(我用java写的,因此ProxyServer的进程是javaw.exe) ...

  5. 通信原理学习笔记2-3:复信号分析(解析信号与预包络)、IQ调制与复信号的传输

    实信号频谱的共轭对称性和冗余性 已经知道,傅里叶变换中的复指数ejωte^{j\omega t}ejωt带来了负频率,意义是旋转向量ejωte^{j\omega t}ejωt的旋转方向(顺/逆时针) ...

  6. 【通信原理】基带数字传输和码间干扰核心问题解析

    重要声明:为防止爬虫和盗版贩卖,文章中的核心代码和数据集可凭[CSDN订阅截图或公z号付费截图]私信免费领取,一律不认其他渠道付费截图! 基带vs频带 基带信号对于原点附近的频率(即 f = 0 f= ...

  7. 蓝牙聊天App设计3:Android Studio制作蓝牙聊天通讯软件(完结,蓝牙连接聊天,结合生活情景进行蓝牙通信的通俗讲解,以及代码功能实现,内容详细,讲解通俗易懂)

    前言:蓝牙聊天App设计全部有三篇文章(一.UI界面设计,二.蓝牙搜索配对连接实现,三.蓝牙连接聊天),这篇文章是:三.蓝牙连接聊天. 课程1:Android Studio小白安装教程,以及第一个An ...

  8. 使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息)

    标题:使用 x32dbg 分析 PC 上 QQ 撤销功能(好友消息和群消息) 作者:猫猫.有点乖 文章目录 0x00 前述 0x01 收集信息 0x02 初窥门径 0x03 略有小成 0x04 驾轻就 ...

  9. 使用chrome调试手机,平板,pc上各种浏览器上的页面

    使用chrome调试手机,平板,pc上多种浏览器的页面展示 作为web开发者,特别是现代web开发者,是否要调试手机,平板,电脑上的显示效果?chrome自带了这种很强大的神器 1.打开chrome( ...

最新文章

  1. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍
  2. linux java jar war_简单介绍Java 的JAR包、EAR包、WAR包区别
  3. C语言中的struct和union区别
  4. 一个老工程师的肺腑之言!!!
  5. python里turtle.circle什么意思_Python turtle.circle方法代碼示例
  6. 利用Teensy进行EM410x卡模拟以及暴力破解EM410X类门禁系统可行性猜想
  7. GNS3+JunOS
  8. 深入浅出net泛型编程[转载] - 天轰穿.net/vs2005/ajax入门 - 博客园
  9. Oracle的四分位数函数
  10. python xgboost建模过程_python - Dask中的XGBoost建模 - SO中文参考 - www.soinside.com
  11. 第二届Techo TVP 开发者峰会有感
  12. 让数据快速使用, “无代码”新贵Nextion BI高效解决企业“BI”难
  13. android平台开发板外接罗技C525摄像头不支持扫码有什么办法解决
  14. nlp-知识图谱简介
  15. 平均年薪20W,自动化测试工程师这么吃香?
  16. QGIS 加载XYZ Tiles
  17. Python实战:如何隐藏自己的爬虫身份
  18. 2018年第九届蓝桥杯 JavaB组省赛 刷题思路及答案
  19. Keyence激光打标机入门2
  20. 应用Abaqus有限元软件中的cohesive单元模拟压头侵入地层随机断裂过程

热门文章

  1. 这些活动发布平台你都知道吗?
  2. 讯飞离线语音合成接入
  3. 零信任架构和访问控制模型ABAC
  4. 中学学籍管理系统数据库课程设计,限于篇幅只能采取截图方式上传,原文件在我资源中有所展示。
  5. 初一数学计算机教案,人教版初中数学教案 初中数学教案范文精选
  6. 揭秘:广告拦截软件如何赚钱?
  7. Echarts中tooltip显示的数据与数据本身顺序相反
  8. 虚拟电脑服务器玩梦幻西游卡吗,vmware虚拟机 玩梦幻西游很卡有什么解决方法...
  9. jq 截取指定字符前_jq 截取字符串
  10. 《数字经济》远光软件毕伟:数字化协同创新