C++ ModBUS TCP客户端工具 qModMaster 介绍及使用

qModMaster工具介绍

QModMaster是一个基于Qt的Modbus主站(Master)模拟器,用于模拟和测试Modbus TCP和RTU通信。它提供了一个直观的图形界面,使用户能够轻松设置和发送Modbus请求,并查看和分析响应数据。

以下是QModMaster工具的一些主要特点和功能:

  1.  支持Modbus TCP和RTU:QModMaster可以用作Modbus TCP和RTU通信的主站模拟器。您可以根据需要选择适合您的通信方式。
  2.  直观的图形界面:QModMaster提供了一个用户友好的图形界面,使您可以轻松设置和发送Modbus请求,并查看响应数据。您可以选择读取和写入不同类型的寄存器数据,如线圈、输入寄存器、保持寄存器等。
  3.  灵活的数据显示:QModMaster以表格的形式显示读取的数据,使您可以清晰地查看和分析Modbus响应。您可以选择以十进制或十六进制格式显示数据,并可以根据需要进行排序和筛选。
  4.   实时监控:QModMaster还提供实时监控功能,可以持续读取和显示设备的寄存器数据。您可以设置刷新频率,并随时监视设备的状态和数据变化。
  5.   导入和导出功能:QModMaster支持导入和导出Modbus配置和数据,方便您在不同环境之间共享和备份配置。

QModMaster是一个开源项目,可以在GitHub上找到其源代码和相关文档。您可以根据您的需求和应用场景,使用QModMaster来模拟和测试Modbus通信,并进行调试和验证。

主站(Master),是一个控制设备,负责发起和管理 Modbus TCP 通信。它可以向从站发送读取或写入请求,并接收从站返回的响应。主站通常是一个上位机或监控系统,负责控制和监视整个系统。

从站(Slave):从站是被动设备,响应主站的请求并提供数据。它可以是传感器、PLC 或其他设备。从站接收主站的读取或写入请求,并返回相应的数据或执行相应的操作。每一个slave设备都有一个唯一的地址。

在串行和MB+网络中,只有被指定为主节点的节点可以启动一个命令(在以太网上,任何一个设备都能发送一个Modbus命令,但是通常也只有一个主节点设备启动指令)。

Modbus TCP中,主站通常是tcp的client端,从站是tcp的server端,开启默认端口502。这个很容易混淆,这里在强调下。

qModMaster源码地址

QModMaster download | SourceForge.net

https://codeload.github.com/Thuzerland/qModbusMaster/zip/refs/heads/master

GitHub - Thuzerland/qModbusMaster: Fork of QModMaster (https://sourceforge.net/p/qmodmaster/code/ci/default/tree/)

qModMaster工具地址 

https://nchc.dl.sourceforge.net/project/qmodmaster/qModMaster-Win64-exe-0.5.3-beta.zip

modbusTCP协议格式

ModbusTCP的数据帧可分为两部分:MBAP+PDU

报文主要分为两部分,协议头(MBAP Header)和PDU。PDU 又包含功能码(Function code)和数据(Data)两部分。 

(一)报文头MBAP:MBAP为报文头,长度为7字节,组成如下:

8b3c8714-64e9-11ed-8abf-dac502259ad0.png

8b4d16ec-64e9-11ed-8abf-dac502259ad0.png

(二)帧结构PDU:PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

以下报文示例:

[TCP]>Tx > 18:37:13:318 - 00  02  00  00  00  06  01  03  00  00  00  03  
[TCP]>Rx > 18:37:13:330 - 00  02  00  00  00  09  01  03  06  00  02  00  03  00  04   

 

举例发包:

0232 0000 0009 01 10 9C490001020000

协议头  0232 0000 0009 01
PDU: 10 9C49 0001 02 0000

与标准modbusRTU的区别

标准modbusRTU模式,协议格式是:

 从中可以看到跟modbusTCP的区别。modbusTCP比起它少了两个字节的CRC校验码而已。modbusTCP协议中的MBAP的单元标识符,则相当于从站的地址。

8b605d6a-64e9-11ed-8abf-dac502259ad0.png

根据对象的不同,Modbus的功能码有:

8b90595c-64e9-11ed-8abf-dac502259ad0.png

8ba20a62-64e9-11ed-8abf-dac502259ad0.png

Modbus Slave工具介绍

Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。与之成套存在的另一个软件--Modbus Poll,则是模拟Modbus协议主机的上位机软件。该软件内部封装标准Modbus协议栈,通过图形化界面使得操作更为简便。目前软件支持01、02、03、04、05、06、15、16功能码,原始报文查看,数据记录等功能,是调试Modbus协议栈的好帮手。

Modbus Slave下载链接

链接:百度网盘 请输入提取码 
提取码:lft0

测试截图 

qModMaster配合ModbusSlave的使用

寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。PLC地址一般采用10进制描述,共有5位,其中第一位代码寄存器类型。第一位数字和寄存器类型的对应关系如表1所示。PLC地址例如40001、30002等。      

寄存器modbus协议地址指通信时使用的寄存器地址,在实际编程中,由于寄存器PLC地址前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。例如PLC地址40001对应寻址地址0x0000,40002对应寻址地址0x0001,寄存器寻址地址一般使用16进制描述。再如,PLC寄存器地址40003对应协议地址0002,PLC寄存器地址30003对应协议地址0002。

在实际编程中,由于前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。支持 Modbus 协议的设备或软件,使用时用户直接设置或看到的应 当是 Modbus 数据地址。Modbus 地址所访问的数据,是通过各种 “功能”读写而来。 功能码是 Modbus 地址的底层。 如果 Modbus 通 信的一方提供的所谓 Modbus 协议只有功能码,则需要注意了解此 功能号与 Modbus 地址间的对应关系。 

QT的modbus读写

方式有很多,由于协议简单也可以自己组包写。也有现成的库,如可以参考qModMaster源码,它使用了libmodbus库,推荐使用libmodbus库。这里介绍另外一种的使用,Qt Modbus 模块 读写。

1.引入模块

QT       += serialbus serialport

2.引入头文件

#include <QModbusTcpClient>
#include <QModbusReply>

3.建立连接

    QModbusClient *modbusDevice=new QModbusTcpClient();modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter,1502);modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "127.0.0.1");modbusDevice->setTimeout(2000);modbusDevice->setNumberOfRetries(3);modbusDevice->connectDevice();

4.读取和写入

//发送请求
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters,30001,1);if (auto *reply = modbusDevice->sendReadRequest(readUnit, 1)){if (!reply->isFinished()){connect(reply, &QModbusReply::finished,this,&ThisClass::readReady);}else{delete reply;}}
//处理请求
void ThisClass::readReady()
{QModbusReply *reply = qobject_cast<QModbusReply *>(sender());if (!reply)return;if (reply->error() == QModbusDevice::NoError){const QModbusDataUnit unit = reply->result();
//        if(unit.startAddress()==30001){qint16 res=unit.value(0);
//        }}else{}reply->deleteLater(); // delete the reply
}//写入,举例向40009寄存器地址写入1 (0232 0000 0009 01 10 9C49 0001 02 0001)//写请求 9C490001020001 :数据部分QByteArray data=QByteArray::fromHex("9c490001020001");// QModbusRequest::WriteMultipleRegisters:功能码 10QModbusRequest request(QModbusRequest::WriteMultipleRegisters,data);
// 1 :设备地址if (auto *reply = modbusDevice->sendRawRequest(request,1)){if (!reply->isFinished()){connect(reply, &QModbusReply::finished,this,&ThisClass::writeReady);}else{delete reply;}}//响应处理void ThisClass::writeReady()
{QModbusReply *reply = qobject_cast<QModbusReply *>(sender());if (!reply)return;reply->deleteLater(); // delete the reply
}

其他资源

【工具使用】Modbus Poll软件使用详解_知识噬元兽的博客-CSDN博客

Modbus RTU 协议详解_modbus rtu协议_shwill123的博客-CSDN博客

【工具使用】Modbus Slave软件使用详解_知识噬元兽的博客-CSDN博客

Modbus test and simulation

图文详解ModbusTCP协议 - 接口/总线/驱动 - 电子发烧友网

Qt Modbus TCP 通讯读写操作_qt writemultipleregisters_wblong_cs的博客-CSDN博客

QT使用libmodbus库(windows)_libmodbus qt_图灵小眼睛的博客-CSDN博客

Modbus——基于libmodbus开发 - 知乎

fuzz测试libmodbus | AFL篇_afl fuzz_CollinXia的博客-CSDN博客

libmodbus入坑记录 - 代码先锋网

Modbus 通讯协议 (RTU传输模式)_modbus rtu_csdn_dx的博客-CSDN博客 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像处理技巧形态学滤波之腐蚀操作

1. 引言 欢迎回来&#xff0c;我的图像处理爱好者们&#xff01;今天&#xff0c;让我们深入研究图像处理领域中的形态学计算。这些非线性的图像处理技术允许我们操纵图像中对象的形状和结构。在本系列中&#xff0c;我们将依次介绍四种基本的形态学操作&#xff1a;腐蚀、膨胀…

Kafka 概述

Kafka 为什么需要消息队列&#xff08;MQ&#xff09;使用消息队列的好处&#xff08;1&#xff09;解耦&#xff08;2&#xff09;可恢复性&#xff08;3&#xff09;缓冲&#xff08;4&#xff09;灵活性 & 峰值处理能力&#xff08;5&#xff09;异步通信 消息队列的两…

Neo4j笔记-数据迁移(导出/导入)

这里先说明以下几点&#xff1a; Neo4j在4.0下版本默认的库名是&#xff1a;graph.db Neo4j在4.0上版本默认的库名是&#xff1a;neo4j.db 不管是Neo4j&#xff0c;还是Neo4j Desktop&#xff0c;都会在bin目录下有neo4j、neo4j-admin软件。在conf目录下&#xff0c;有neo4j.…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串&#xff0c;当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数&#xff0c;则返回的子字符串将…

【每日一题】1572. 矩阵对角线元素的和

【每日一题】1572. 矩阵对角线元素的和 1572. 矩阵对角线元素的和题目描述解题思路 1572. 矩阵对角线元素的和 题目描述 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&a…

pycharm的Terminal中如何设置打开anaconda3的虚拟环境

在pycharm的File -> Settings -> Tools -> Terminal下面&#xff0c;如下图所示 修改为红框中内容&#xff0c;然后关闭终端在重新打开终端&#xff0c;即可看到anaconda3的虚拟环境就已经会被更新

数学建模(一)前继概念

课程推荐&#xff1a;数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模&#xff1f; 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模&#xff1f; 数学建模是利用数学方法解决实际问题的一种实践。…

《Linux从练气到飞升》No.12 Linux进程概念

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

maven 删除下载失败的包

本文介绍了当Maven包报红时&#xff0c;使用删除相关文件的方法来解决该问题。文章详细说明了_remote.repositories、.lastUpdated和_maven.repositories文件的作用&#xff0c;以及如何使用命令行删除这些文件。这些方法可以帮助开发者解决Maven包报红的问题&#xff0c;确保项…

css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

1、背景 在开发中&#xff0c;经常遇到这个问题&#xff0c;即让某个元素的内容在水平和垂直方向上都居中&#xff0c;内容不仅限于文字&#xff0c;可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景&#xff0c;实现居中的方法存在很多&#xff0c;可以将这…

go语言从0基础到安全项目开发实战

一.环境搭建并helloworld 搭建环境比较简单 1.1安装SDK 到以下链接下 Go下载 - Go语言中文网 - Golang中文社区 下载windows版本64位zip包 https://studygolang.com/dl/golang/go1.20.7.windows-amd64.zip 1.2配置环境变量 不配置的话就只能在bin目录下才能运行go命令 …

[保研/考研机试] 猫狗收容所 C++实现

题目描述&#xff1a; 输入&#xff1a; 第一个是n&#xff0c;它代表操作序列的次数。接下来是n行&#xff0c;每行有两个值m和t&#xff0c;分别代表题目中操作的两个元素。 输出&#xff1a; 按顺序输出收养动物的序列&#xff0c;编号之间以空格间隔。 源代码&#xff…

RabbitMQ在CentOS下的安装

RabbitMQ的版本是3.8.2 1.环境配置&#xff1a;CentOs 7.6以上版本&#xff0c;我的版本是7.9&#xff0c;不要对yum换源&#xff0c;否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令&#xff0c;是…

ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题

由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能&#xff0c;所以就折腾了一下&#xff0c;折腾最耗费时间的却是键值问题&#xff0c;让一个20多年的老司机重新补充了知识 过程曲折就不说了&#xff0c;直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…

谷粒商城第十一天-完善商品分组(主要添上关联属性)

目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 一、总述 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口&#xff0c;还有就是加上关联的那一套逻辑&#xff0c;…

广州华锐互动:VR3D课程在线教育平台为职业院校提供沉浸式的虚拟现实学习体验

随着科技的飞速发展&#xff0c;虚拟现实(VR)和增强现实(AR)技术已经逐渐渗透到我们生活的各个领域。其中&#xff0c;VR3D课程在线教育平台作为一种新兴的教育方式&#xff0c;正在逐渐改变我们的学习方式和体验。本文将详细介绍VR3D课程在线教育平台的应用前景及特点。 VR3D课…

新一代构建工具 maven-mvnd

新一代构建工具 maven-mvnd mvnd的前世今生下载安装 mvndIDEA集成 mvnd的前世今生 maven 作为一代经典的构建工具&#xff0c;流行了很多年&#xff0c;知道现在依然是大部分Java项目的构建工具的首选&#xff1b;但随着项目复杂度提高&#xff0c;代码量及依赖库的增多使得ma…

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后&#xff0c;您将了解使用flask构建 restful API 是多么容易。在本文中&#xff0c;我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

AIGC技术揭秘:探索火热背后的原因与案例

文章目录 什么是AIGC技术&#xff1f;为何AIGC技术如此火热&#xff1f;1. 提高效率与创造力的完美结合2. 拓展应用领域&#xff0c;创造商业价值3. 推动技术创新和发展 AIGC技术案例解析1. 艺术创作&#xff1a;生成独特的艺术作品2. 内容创作&#xff1a;实时生成各类内容3. …