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字节,组成如下:

(二)帧结构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 ![](https://file.jishuzhan.net/article/1690339496064716801/c8b16f573c2046d1ae6d8578cc3d94be.png) 举例发包: ```bash 0232 0000 0009 01 10 9C490001020000 ``` 协议头 0232 0000 0009 01 PDU: 10 9C49 0001 02 0000 ![](https://file.jishuzhan.net/article/1690339496064716801/a86d6b2089ed4e39a6d82bc0e13cc4b7.png) # 与标准modbusRTU的区别 标准modbusRTU模式,协议格式是: ![](https://file.jishuzhan.net/article/1690339496064716801/ea81eba0e31e4e83ad927b10498c9c3b.png) 从中可以看到跟modbusTCP的区别。modbusTCP比起它少了两个字节的CRC校验码而已。modbusTCP协议中的MBAP的单元标识符,则相当于从站的地址。 ![8b605d6a-64e9-11ed-8abf-dac502259ad0.png](https://file.jishuzhan.net/article/1690339496064716801/b2ac3108db5144288fa6552a3d4e5c4f.png) 根据对象的不同,Modbus的功能码有: ![8b90595c-64e9-11ed-8abf-dac502259ad0.png](https://file.jishuzhan.net/article/1690339496064716801/5d391a8d0add4fc1a0296da6c804420b.png) ![8ba20a62-64e9-11ed-8abf-dac502259ad0.png](https://file.jishuzhan.net/article/1690339496064716801/477b1936db5d489087d877b6798534b8.png) # Modbus Slave工具介绍 Modbus Slave是一个模拟Modbus协议从机的上位机软件,主要用于模拟测试跟其他主机设备通信的过程。与之成套存在的另一个软件--Modbus Poll,则是模拟Modbus协议主机的上位机软件。该软件内部封装标准Modbus协议栈,通过图形化界面使得操作更为简便。目前软件支持01、02、03、04、05、06、15、16功能码,原始报文查看,数据记录等功能,是调试Modbus协议栈的好帮手。 # Modbus Slave下载链接 链接:[百度网盘 请输入提取码](https://pan.baidu.com/s/1WUQJUc2FRWhomi_BhL4gZw "百度网盘 请输入提取码") 提取码:lft0 # 测试截图 ![](https://file.jishuzhan.net/article/1690339496064716801/4b898b5b6b6e46c1a6a965657b178f22.png) ![](https://file.jishuzhan.net/article/1690339496064716801/97e75fcf18dd498db6d6c578bc2a83db.png) qModMaster配合ModbusSlave的使用 ![](https://file.jishuzhan.net/article/1690339496064716801/635eda72ee154bfb86b972f4d4100297.png) 寄存器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.引入模块 ```bash QT += serialbus serialport ``` 2.引入头文件 ```cpp #include #include ``` 3.建立连接 ```cpp 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.读取和写入 ```cpp //发送请求 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(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(sender()); if (!reply) return; reply->deleteLater(); // delete the reply } ``` # 其他资源 [【工具使用】Modbus Poll软件使用详解_知识噬元兽的博客-CSDN博客](https://blog.csdn.net/u012749085/article/details/125270869 "【工具使用】Modbus Poll软件使用详解_知识噬元兽的博客-CSDN博客") [Modbus RTU 协议详解_modbus rtu协议_shwill123的博客-CSDN博客](https://blog.csdn.net/zhangbaidi_WinCE/article/details/128246903 "Modbus RTU 协议详解_modbus rtu协议_shwill123的博客-CSDN博客") [【工具使用】Modbus Slave软件使用详解_知识噬元兽的博客-CSDN博客](https://blog.csdn.net/u012749085/article/details/125308525 "【工具使用】Modbus Slave软件使用详解_知识噬元兽的博客-CSDN博客") [Modbus test and simulation](https://www.modbustools.com/ "Modbus test and simulation") [图文详解ModbusTCP协议 - 接口/总线/驱动 - 电子发烧友网](https://www.elecfans.com/emb/jiekou/202211161928101.html "图文详解ModbusTCP协议 - 接口/总线/驱动 - 电子发烧友网") [Qt Modbus TCP 通讯读写操作_qt writemultipleregisters_wblong_cs的博客-CSDN博客](https://blog.csdn.net/mrbaolong/article/details/103103288 "Qt Modbus TCP 通讯读写操作_qt writemultipleregisters_wblong_cs的博客-CSDN博客") [QT使用libmodbus库(windows)_libmodbus qt_图灵小眼睛的博客-CSDN博客](https://blog.csdn.net/zzh_AI/article/details/106994121?spm=1001.2014.3001.5506 "QT使用libmodbus库(windows)_libmodbus qt_图灵小眼睛的博客-CSDN博客") [Modbus------基于libmodbus开发 - 知乎](https://zhuanlan.zhihu.com/p/365903204 "Modbus——基于libmodbus开发 - 知乎") [fuzz测试libmodbus \| AFL篇_afl fuzz_CollinXia的博客-CSDN博客](https://blog.csdn.net/qq_42768012/article/details/118567601 "fuzz测试libmodbus | AFL篇_afl fuzz_CollinXia的博客-CSDN博客") [libmodbus入坑记录 - 代码先锋网](https://codeleading.com/article/48232176312/ "libmodbus入坑记录 - 代码先锋网") [Modbus 通讯协议 (RTU传输模式)_modbus rtu_csdn_dx的博客-CSDN博客](https://blog.csdn.net/u011041241/article/details/109240555 "Modbus 通讯协议 (RTU传输模式)_modbus rtu_csdn_dx的博客-CSDN博客")

相关推荐
江苏思维驱动智能研究院有限公司3 分钟前
Sophos 网络安全:全球领先的自适应安全解决方案提供商
网络·安全·web安全
面朝大海,春不暖,花不开28 分钟前
Java网络编程:TCP/UDP套接字通信详解
java·网络·tcp/ip
byxdaz29 分钟前
PJSIP 中的 TCP 传输配置指南
tcp/ip
ChicagoTypewriter34 分钟前
计算机网络中的常用表项梳理
网络·计算机网络·智能路由器
DemonAvenger1 小时前
高性能 TCP 服务器的 Go 语言实现技巧:从原理到实践
网络协议·架构·go
Bruce_Liuxiaowei4 小时前
常见高危端口风险分析与防护指南
网络·网络安全·端口·信息搜集
tmacfrank4 小时前
Android 网络全栈攻略(四)—— TCPIP 协议族与 HTTPS 协议
android·网络·https
liulilittle4 小时前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
cui_win4 小时前
【内存】Linux 内核优化实战 - net.ipv4.tcp_tw_reuse
linux·网络·tcp/ip
2501_916013744 小时前
iOS 多线程导致接口乱序?抓包还原 + 请求调度优化实战
websocket·网络协议·tcp/ip·http·网络安全·https·udp