Modbus协议学习方法

  在刚开始接触modbus协议的时候,很容易被里面的各种功能码搞晕,同时在编写程序的时候也容易搞不清楚每一位数据代表的含义。如果在学习的过程中有实际的发送和接收数据的例子话,那么理解modbus协议就会更容易一些。
  下面我将自己借助软件学习的方法分享给大家,文章中所用到的软件下载地址 https://download.csdn.net/download/qq_20222919/87960214。

  这里要用到三个软件:虚拟串口、Modbus主机、Modbus从机。

  • 虚拟串口主要用来在电脑上虚拟出来2个串口,并将这两个串口连接起来。这样不需要在电脑上接USB转串口的硬件设备,依然可以使用串口来收发数据。
    在这里插入图片描述

  • Modbus Poll 这个是模拟Modbus主机的软件,通过这个软件可以读取火或者设置从机中寄存器的值。
    在这里插入图片描述

  • Modbus Slave 这个是模拟Modbus从机的软件,在这个软件中可以设置寄存器的地址和值,配合主机来使用。
    在这里插入图片描述

  接下来开始这三个软件的使用,首先安装虚拟串口软件,安装完成后打开虚拟串口软件。
在这里插入图片描述

  打开后可以看到界面的左上方显示了两个物理端口COM1和COM2,这两个串口是我电脑上存在的串口。
在这里插入图片描述

  如果要用这两个串口的话,就需要在外部将单片机的串口和电脑上的USB串口连接起来才能用。但是为了方便一点,不想在外部接线。只想在电脑上模拟串口,那么此时就需要新建一对虚拟串口。
在这里插入图片描述
  直接在虚拟串口的软件右边点击Add pair按钮,添加2个串口COM3和COM4
在这里插入图片描述
  这是在虚拟串口软件的左边就会显示出来添加后的两个虚拟串口,同时在电脑的设备管理器中也能看到添加后的两个串口。添加的这两个串口COM3和COM4是直接连接在一起的,也就是是COM3的发送端连接的是COM4的接收端,COM4的发送端连接的是COM3的接收端。

  可以直接使用串口助手进行测试,打开两个串口助手,一个选择COM3一个选择COM4.
在这里插入图片描述
  用这两个串口助手互相发数据。
在这里插入图片描述
  可以看到这两个虚拟串口可以互相收发数据,下面我们就使用这两个虚拟串口来进行Modbus数据的收发。

  关掉这两个串口助手,打开Modbus Slave 软件。
在这里插入图片描述
  在工具栏上选择连接—连接
在这里插入图片描述
  这里选择的连接方式为串口连接,然后选择COM3,设置波特率和奇偶校验方式。设置好之后点确定按钮。
  接下来在菜单栏选择设置—从站设置
在这里插入图片描述

  这里设置从机地址为1,寄存器起始地址为100,寄存器数量为10个,寄存器的类型为线圈状态。

在这里插入图片描述

  然后修改寄存器的状态值,直接在0或1上双击鼠标左键,就会弹出一个界面可以修改状态值为On或者Off。
在这里插入图片描述

  此时从机就配置好了,接下来配置主机,打开Modbus Poll软件,在工具栏中选择连接—连接。
在这里插入图片描述
  这里也选择串口连接,串口选择COM4,其他的设置需要和从机一样,然后点确定按钮。

在这里插入图片描述
  接下来在工具栏中选择设置–读写定义。

在这里插入图片描述
  设置要读取的从机地址,这个地址要和刚才配置的从机地址一样。选择要使用的功能码,然后设置要读取的寄存器起始地址和要读取的寄存器数量。设置完成之后点击确定按钮。
在这里插入图片描述
  此时就可以看到主机从从机读取到的线圈状态值。
在这里插入图片描述
  在从机寄存器上双击鼠标,改变线圈的状态,此时主机界面上读取到的线圈状态值也会发生改变。

在这里插入图片描述
  在Modbus Poll界面上单击放大镜的图标,打开数据监控。
在这里插入图片描述

  通过这个数据监控,就可以看到主机发送的数据和从机接收的数据。
在这里插入图片描述
  然后将这些数据和Modbus通信协议对照起来看。
在这里插入图片描述
  通过对比就可以很清晰看出来发送和接收数据中每一位数据的含义。

  比如发送数据中的第二个01代表的是功能码,接下来两位数据0x0064就表示寄存器的起始地址100,后面的0x0003表示要读取3个线圈的值。最后的两位数为CRC校验值,这里可以不用管。
  接收数据的第二个01也是功能码,第三个01表示读取到了1个字节的数据,05表示读取到的线圈值为0x05,由于线圈是按位表示的这里将0x05换算为二进制 0101,也就是说读取到3个线圈的值分别是1、0、1。

  接下来在Modbus中将寄存器的起始地址设置为110,
在这里插入图片描述

  此时接收到数据就会返回一个错误码。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  这样通过Modbus文档和实际发送接收的数据进行对比,就可以很容易的理解文档中说的一些概念。

  如果想观察其他功能码的使用时,直接在Modbus主机和从机软件中设置就行。比如设置从机为保持寄存器,并修改寄存器的值。
在这里插入图片描述
  主机读取从101开始的一个寄存器地址。
在这里插入图片描述

  通过数据监控可以看出03为功能码,0x0065为寄存器起始地址101,0x0001为要读取的寄存器数量。
在这里插入图片描述
  返回的数据03为功能码,02为字节数,0x00C8为读取到的寄存器值200。
在这里插入图片描述

  接下来将主机功能码改为读取写多个寄存器值。
在这里插入图片描述
  从寄存器100开始连续写3个寄存器的值。在Modbus Poll界面上双击寄存器的值,在打开的界面中直接输入需要设置的值,然后点确定按钮。
在这里插入图片描述
  这时在从机的界面上就可以看到寄存器的值已经被修改过来了。
在这里插入图片描述
  将监控到的数据和Modbus文档对比去着去看
在这里插入图片描述

  这样一边看文档一边自己动手去收发数据,去理解功能码的含义和使用方法,学习Modbus协议的时候就会更容易一点。如果是学习Modbus TCP的话,也可以用这个这个软件去观察数据。在选择通信方式的时候,直接选择网络模式就可以了。
在这里插入图片描述
  前面6个数据为Modbus TCP通信时的MBAP报文头,数据的最后面取消了CRC校验。其他的数据和Modbus RTU一样,这里就不多做介绍了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何用低代码开发平台快速实现单据打印功能?

每家企业在日常工作中,业务流转时,都经常需要在线打印各种纸质文件,如凭证、采购单、出入库单据、销售合同等,不同企业都有个性化的排版要求,每一次需要在固定文档模板的基础上重新填充业务数据,过程中难免…

目前有哪些比较好用的工单系统?如何选择合适的工单管理系统?

目前有哪些比较好用的工单系统??推荐一个性价比高的“工单管理系统”?好用免费的工单管理软件系统有哪些? 作为一个工程项目管理人员,是离不开工单系统的。每当遇到工程量大的时期要去管理很多杂乱无章的工单可太难了…

搭建selenoid环境

1、拉取浏览器镜像 docker pull selenoid/vnc:chrome_103.02、拉取selenoid-ui容器镜像 docker pull aerokube/selenoid-ui:1.10.43、拉取selenoid容器镜像 docker pull aerokube/selenoid4、编写配置文件 vi /selenoid/config/browsers.json volumes可以做容器路径映射&…

TP composer 新创建一个vendor2,作为新库下载目录

站点目录新建一个vendor2文件夹: 在里面新建一个 composer.json 文件:(只写一个花括号就行) {} 然后这个vendor2目录里,使用宝塔终端执行: composer require zoujingli/ip2region 这样,vendor2目录里就会再多出 v…

java 设计模式--创建者模式

参考:Java常见设计模式总结 概念 概念理解一:将复杂对象的创建过程分解在不同的方法中,不同的创建过程组装成不同对象。对象的创建与产品本身分离开,使得对象的创建过程更加清晰。例如:旅游套餐售卖场景。 一个套餐大…

flutter Android 自定义输出路径 apk名称

默认 Flutter flutter build apk, 是默认的名字 默认的路径,直接修改输出路径 会造成 打包可以,直接运行 会提示找不到 apk 文件; 这里的解决思路是:打包完成后 拷贝目标路径的 APK 到自定义的路径,这样既可以正常打…

Windows软件架构概念

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来聊聊Windows软件架构的概念。 Shaw和Garlan在他们划时代的著作中以如下方式讨论了软件的体系结构:从第一个程序被划分成模块开始,软件系统就有了体系结构。现在&#xff0c…

分布式系统消息通信技术:MOM与RPC

一、中间件 什么是中间件 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台…

剑指 Offer 55 - I. 二叉树的深度 / LeetCode 104. 二叉树的最大深度(二叉树后序遍历,回溯传递值)

题目: 链接:剑指 Offer 55 - I. 二叉树的深度;LeetCode 104. 二叉树的最大深度 难度:简单 输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条…

【框架源码】Spring源码解析之BeanDefinition加载流程解析

观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息,主要包括:Be…

智能文档图像处理技术应用与实践

写在前面智能文档处理面临的技术难题智能文档处理的研究领域● 文档图像分析与预处理● 手写板反光擦除● 版面分析与文档还原 写在最后 写在前面 VALSE 2023 无锡视觉与学习青年学者研讨会近期在无锡国际博览中心举办,由江南大学和无锡新吴区联合承办。本次会议旨…

企业级ChatGPT开发的三大核心内幕及案例实战(三)

企业级ChatGPT开发的三大核心内幕及案例实战(三) 2.3 Notion 问答对话AI案例演示及源码分析 Gavin老师:NLP_Matrix_Space 如图2-2所示,我们先看一下Notion 问答对话AI案例的效果。你问一个问题,它会进行回答,然后它会告诉你,信息来源在什么地方,要看具体的信息,可以…

生产者与消费者问题

本篇文章我们使用C探讨一下生产者与消费者问题. 1. 多线程的引入 我们学习了操作系统, 知道了进程和线程的概念, 但是如果不进行代码实战的话, 会很难理解它们. 特别是编程的初学者(比如我), 在了解了进程和线程后通常会感到疑惑: 多线程怎么用? 为啥我平时写代码没有使用到…

TCP协议的相关特性

目录 TCP特点概要 TCP协议段格式 TCP原理 确认应答 超时重传 连接管理(三次握手,四次挥手) 三次握手 四次挥手 流水线传输 滑动窗口 滑动窗口ACK丢失 滑动窗口数据报丢失 流量控制 拥塞控制 延迟应答 停止等待协议 回退N帧协议 面向字节流 缓冲区 粘包问题 TCP异常 &…

Nginx Rewrite的应用

目录 一、Nginx Rewrite 二、Rewrite的功能 1.Rewrite 跳转场景 2.Rewrite 跳转实现 3.Rewrite 实际场景 4.Rewrite 正则表达式 5.Rewrite 命令/语法格式 6.location 分类 7.location 优先级 8.Rewrite和location比较 9.根据以上了解,小案例来操…

python实现Canny算子边缘检测算法

边缘检测是一种将图片中关键信息表现出来的一种图片技术,它的结果并不是字面意思上的获取图片边缘,而是将图片有用的信息勾勒出来,类似素描的结果,但是已经去掉了很多信息。如下所示,一张原始的图片是这样的&#xff1…

自学黑客/网络安全工具软件大全100套

黑客工具软件大全100套 1 Nessus:最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上。它不止永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance–终端用户授权…

Redis7【④ Redis 发布 订阅】

Redis发布和订阅 本章了解即可,命令可以不用敲。 Redis 发布和订阅(Publish/Subscribe,简称 Pub/Sub)是一种消息传递模式,用于在 Redis 中实现消息的发布和订阅。 在 Redis 中,发布者(Publi…

高通9x07平台关于模块modem射频 RF MCFG生成MBN的总结

1.1: cefs(efs2.mbn)制作步骤:1.擦擦CEFS分区;2.导入HW_MBN,并激活;3.导入静态NV;4.生成CEFS; 1.2:激活hw_default mbn后,/policyman/目录下device_config.xml必需保留; 1.3&#xf…

Vision Transformer

论文名称: An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 一、Patch Embedding模块 class PatchEmbed(nn.Module): # 对应Patch Embedding模块def __init__(self, img_size224, patch_size16, in_c3, embed_dim768, norm_layerNone…