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

news2024/10/7 8:31:41

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:功能码 10
    QModbusRequest 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.coloradmin.cn/o/851443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

互联网时代下如何搞好网络口碑?

移动互联网时代到来&#xff0c;网络口碑对于任何一家企业都不可忽视&#xff0c;没有口碑的企业广告满天飞但是成交的客户寥寥无几&#xff0c;口碑好的企业没有广告但是仍然能保持业绩增长&#xff0c;这是一个不争的事实。 有人会说&#xff0c;业绩好的是人家产品好所以口碑…

选读SQL经典实例笔记20_Oracle语法示例

1. 计算一年有多少天 1.1. sql select Days in 2005: ||to_char(add_months(trunc(sysdate,y),12)-1,DDD)as reportfrom dualunion allselect Days in 2004: ||to_char(add_months(trunc(to_date(01-SEP-2004),y),12)-1,DDD)from dual REPORT ----------------- Days in 200…

Java中的SimpleDateFormat方法分析

Java中的SimpleDateFormat方法分析 先进行专栏介绍SimpleDateFormat方法分析 常用方法构造方法格式化&#xff08;从Date到String&#xff09;举例分析 解析(从String到Date)举例分析 设置方法&#xff1a;注意 代码示例代码结果 综合案例效果 先进行专栏介绍 本专栏是自己学J…

服装行业多模态算法个性化产品定制方案 | 京东云技术团队

一、项目背景 AI赋能服装设计师&#xff0c;设计好看、好穿、好卖的服装 传统服装行业痛点 • 设计师无法准确捕捉市场趋势&#xff0c;抓住中国潮流 • 上新周期长&#xff0c;高库存滞销风险大 • 基本款居多&#xff0c;难以满足消费者个性化需求 解决方案 • GPT数据…

封装统一Api接口

第一步 第二步 第三步 因为是新的页面&#xff0c;所以需要在路由上面写 第四步 操作商品的所有接口 第五步 浏览器结果

14.3.6 【Linux】LVM 相关指令汇整与 LVM 的关闭

至于文件系统阶段 &#xff08;filesystem 的格式化处理&#xff09; 部分&#xff0c;还需要以 xfsgrowfs 来修订文件系统实际的大小才行。至于虽然 LVM 可以弹性的管理你的磁盘容量&#xff0c;但是要注意&#xff0c;如果你想要使用 LVM 管理您的硬盘时&#xff0c;那么在安…

性能分析5部曲:瓶颈分析与问题定位,如何快速解决瓶颈?

一、引言 很多做性能测试的同学都问过我这样一个问题&#xff1a;鱼哥(Carl_奕然)&#xff0c;你说性能测试的重点是什么? 我的回答很简单&#xff1a;瓶颈分析与问题定位。 在性能项目的整个周期&#xff0c;不管是脚本设计&#xff0c;脚本编写还是脚本执行&#xff0c;都…

深入探索 Spring MVC:构建优雅的Web应用

文章目录 前言一、什么是 Spring MVC1.1 什么是 MVC1.2 什么是 Spring MVC 二、Spring MVC 项目的创建2.1 项目的创建2.2 第一个 Spring MVC 程序 —— Hello World 三、RequestMapping 注解3.1 常用属性3.2 方法级别和类级别注解3.3 GetMapping、PostMapping、PutMapping、Del…

贝叶斯深度学习的温和介绍

一、说明 欢迎来到令人兴奋的概率编程世界&#xff01;本文是对这个领域的温和介绍&#xff0c;你只需要对深度学习和贝叶斯统计有一个基本的了解。如果像我一样&#xff0c;你听说过贝叶斯深度学习&#xff0c;并且你猜它涉及贝叶斯统计&#xff0c;但你不知道它是如何使用的&…

SaaS化大型微服务架构智慧工地云平台源码

智慧工地云平台建设是采用先进的移动互联、物联网、云计算、大数据等新一代信息技术&#xff0c;主要由信息采集层、网络接入层、网络传输层、信息储存与处理层组成&#xff0c;主要包括云管理平台、综合管理系统、质量管理系统、安全管理系统等模块。施工管理人员可通过PC端&a…

【2.1】Java微服务: Nacos的使用

目录 Nacos介绍 Nacos安装 下载和安装 修改端口 启动 服务注册与发现 导入Nacos管理依赖 导入服务依赖 配置Nacos的服务地址 启动服务&#xff0c;查看已注册的服务 服务分级存储模型 分级存储模型介绍 具体结构 配置实例集群 同集群优先的负载均衡策略 服务权重配置…

spring-boot webservice的例子

webservice发布服务 源码下载地址 spring-boot-webservice例子资源-CSDN文库 webservice cilent调用 源码下载地址 spring-boot-clintwebservice调用服务的例子资源-CSDN文库

CSS的引入方式有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 内联样式&#xff08;Inline Styles&#xff09;⭐ 内部样式表&#xff08;Internal Stylesheet&#xff09;⭐ 外部样式表&#xff08;External Stylesheet&#xff09;⭐ 导入样式表&#xff08;Import Stylesheet&#xff09;⭐ 写在最…

Netty:ChannelHandler的两个生命周期监听事件方法:handlerAdded 和 handlerRemoved

说明 io.netty.channel.ChannelHandler有两个生命周期监听事件方法&#xff1a; handlerAdded(ChannelHandlerContext ctx)&#xff1a;当ChannelHandler被添加到实际的上下文、并且已经准备就绪等待处理事件的时候被调用。 handlerRemoved(ChannelHandlerContext ctx)&#…

光猫棒是什么?

名称&#xff1a; 光猫棒 问题描述&#xff1a; 光猫棒是什么? 回答&#xff1a; 1.PON STICK光模块也被称之为猫棒&#xff0c;可以充分满足电信级FTTB、FTTH、FTTO设备要求&#xff0c;可以热插拔到MikroTik软路由或者交换机的SFP插槽工作&#xff0c;整机就可作为ONT甚…

35岁是人生的分水岭,前后精力大不一样!

目录 【前言】 一、35岁&#xff0c;除了步入国内职场世俗意义上的尴尬期&#xff0c;也是体能下滑的断崖期 二、肥胖、疼痛、体能下滑&#xff0c;35岁的身体焦虑 三、35岁不是体能衰老的分界线 四、35岁不是年龄焦虑的节点&#xff0c;运动让人更能掌控身体 【写在最后…

笔记本电脑如何把sd卡数据恢复

在使用笔记本电脑过程中&#xff0c;如果不小心将SD卡里面的重要数据弄丢怎么办呢&#xff1f;别着急&#xff0c;本文将向您介绍SD卡数据丢失常见原因和恢复方法。 ▌一、SD卡数据丢失常见原因 - 意外删除&#xff1a;误操作或不小心将文件或文件夹删除。 - 误格式化&#…

【leetcode】394. 字符串解码

题目链接&#xff1a;力扣 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没…

SLL VPN

1. SSL工作过程是什么&#xff1f; 第一阶段&#xff1a;客户端首先发送client hello消息到服务端&#xff0c;服务端收到client hello信息后&#xff0c;再发送 server hello消息到客户端。 第二阶段&#xff1a; 第三阶段&#xff1a; 第四阶…

Spring Boot Admin 环境搭建与基本使用

Spring Boot Admin 环境搭建与基本使用 一、Spring Boot Admin是什么二、提供了那些功能三、 使用Spring Boot Admin3.1搭建Spring Boot Admin服务pom文件yml配置文件启动类启动admin服务效果 3.2 common-apipom文件feignhystrix 3.3服务消费者pom文件yml配置文件启动类control…