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

这篇具有很好参考价值的文章主要介绍了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

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

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

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

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

(二)帧结构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   

 C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

举例发包:

0232 0000 0009 01 10 9C490001020000

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

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

与标准modbusRTU的区别

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

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

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

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

modbus协议地址和常用功能码

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

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

 Modbus协议定义的寄存器地址是5位十进制地址,即:
线圈(DO)地址:00000~09999
触点(DI)地址:10000~19999
输入寄存器(AI)地址:30000~39999
输出寄存器(AO)地址:40000~49999
由于上述各类地址是唯一对应的,因此有些资料就以其第一个数字区分各类地址,即:0x代表线圈(DO)类地址,1x代表触点(DI)类地址、 3x代表输入寄存器(AI)类地址、4x代表输出寄存器(AO)类地址。
在实际编程中,由于前缀的区分作用,所以只需说明后4位数,而且需转换为4位十六进制地址。

modbus地址说明

MODBUS 协议的地址类型为 0x、1x、3x、4x、5x、6x,还有 3x_bit、4x_bit 等
等,下面将分别说明这些地址类型在 MODBUS 协议中支持的功能码。

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

Modbus Slave工具介绍

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

Modbus Slave下载链接

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

测试截图 

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

qModMaster配合ModbusSlave的使用

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

寄存器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 地址间的对应关系。 

Modbus调试工具

工具包(包含modbus助手和 modbusTCP调试工具)

下载地址

https://download.csdn.net/download/qq8864/88226165

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,modbus

 

C++ ModBUS TCP客户端工具 qModMaster 介绍及使用,运动控制,tcp/ip,网络协议,网络,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博客

modbus协议地址和常用功能码,modbus详解

关于-MODBUS-各地址的说明 - 百度文库

modbus 协议地址_csdnharrychinese的博客-CSDN博客

Modbus协议简要说明[超级实用] - 知乎文章来源地址https://www.toymoban.com/news/detail-643163.html

到了这里,关于C++ ModBUS TCP客户端工具 qModMaster 介绍及使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何链接多个modbus_tcp设备,并将设备数据写入同一个modbusSlave,以便外部客户端获取所有链接设备的数据。

    在modbus通信中,一个modbus服务器一次只能链接一个客户机,那么,外部客户端要获取多个设备的modbus数据,就需要使用链接一个专用的mosbus服务器,一下就是详细解决方法。 第一步:创建modbus客户端,链接一个modbus设备,然后再链接一个共有的modbus服务器,modbus客户端可以连

    2024年04月25日
    浏览(33)
  • S7-1200中通过MODBUS TCP客户端在一次请求中实现从服务器读写一个或多个保持性寄存器的具体方法

    TIA博途V17中增加了MODBUS TCP客户端功能码 23,可以在一次请求作业下实现从服务器读取和写入一个或多个保持性寄存器,这样省去了轮询的编程工作量,提高了工作效率,如下图所示, 使用该指令的前提条件: • TIA Portal V17 及以上版本 • CPU 固件 V4.2 及以上版本 具体操作方

    2024年02月12日
    浏览(26)
  • 【C++】TCP通信服务端与客户端代码实现及详解

    上述代码使用Winsock库实现了简单的TCP服务器,它监听指定端口并与客户端进行通信。下面对代码进行详细分析: #pragma comment(lib, \\\"ws2_32.lib\\\") 是一个特殊的 编译器指令 ,用于告诉编译器在链接阶段将 ws2_32.lib 库文件添加到最终的可执行文件中。无需在编译命令行或IDE中显式指

    2024年02月03日
    浏览(28)
  • UE5 C++的TCP服务器与客户端

     客户端.h 需要在Build.cs中加入模块:\\\"Networking\\\",\\\"Sockets\\\",\\\"Json\\\",\\\"JsonUtilities\\\"  客户端.cpp

    2024年01月18日
    浏览(53)
  • C++网络通信实例(TCP/IP协议,包括服务端与客户端通信)

    创作不易 觉得有帮助请点赞关注收藏 TCP/IP是当下网络协议栈中的主流协议 TCP属于传输层的协议  可靠传输 包括经典的三次握手等等 IP协议是网络层协议 尽全力传输但不可靠 学过计算机网络的同学们对这个应该比较熟悉 以下是使用C++进行网络通信的实例  服务端 主要使用

    2024年02月14日
    浏览(40)
  • C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

    流式套接字编程针对TCP协议通信,即是面向对象的通信,分为服务端和客户端两部分。 1)加载套接字库( 使用函数WSAStartup() ),创建套接字( 使用socket() ) 2)绑定套接字到一个IP地址和一个端口上( 使用函数bind() ) 3)将套接字设置为监听模式等待连接请求( 使用函数

    2024年02月03日
    浏览(37)
  • Modbus协议及基于Python的ModbusTCP客户端实现

    Modbus 协议是由 Modicon 公司(现在的施耐德电气 Schneider Electric )于1979年为使用可编程逻辑控制器(PLC)通信而推出,主要建立在物理串口、以太网 TCP/IP 层之上,目前已经成为工业领域通信协议的业界标准,广泛应用在工业电子设备之间的互联。 Modbus技术文档 Modbus 是OSI模型

    2024年02月07日
    浏览(30)
  • 【C++ Boost】一个最基本的异步boost async tcp 服务/客户端代码的深刻解析,一文解决所有接口的用法以及一些容易出错的点

    1.官网链接 https://www.boost.org/doc/libs/1_80_0/doc/html/boost_asio.html 本文代码是以官方实例代码做的一些优化 2.平台选择      Boost 最令人惊艳的地方有两个:一是支持跨平台,即windows和linux下的接口代码都是一样的;二是支持异步操作,即可以让read和write操作不阻塞。      因此

    2024年02月06日
    浏览(46)
  • TCP通信—客户端与客户端的双向通信

    1.实现客户端与客户端之间的TCP双向通信; 2.服务器记录客户端实名连接,并显示客户端数据记录; 3.客户端退出,服务器和另一客户端显示相应提示; 1.定义数组保存客户端文件描述符; 2.主程序负责接收客户端1的数据发送给客户端2; 3.开展一个线程负责接收到客户端2的

    2024年02月15日
    浏览(27)
  • TCP、UDP客户端

    TCP客户端 #include mystdio.h #define CLI_PORT 6666 #define CLI_IP \\\"192.168.124.210\\\" int main(int argc, const char *argv[])//argv[1] IP  argv[2] 端口号 {     if(argc 3)     {         printf(\\\"请在命令传参端口号和IP地址n\\\");         return -1;     }     //创建流式套接字文件     int cfd = socket(AF_INET,SOCK

    2024年04月25日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包