首页 > 其他分享 >Qt 使用第三方libmodbus库实现Modbus通讯

Qt 使用第三方libmodbus库实现Modbus通讯

时间:2024-03-09 15:46:18浏览次数:26  
标签:modbus libmodbus Qt mb Modbus registers bits

  之前发表的Modbus通讯程序使用了QT自带的Modbus库,由于QT自带库的数据响应使用的是信号和槽来实现的,所以在一些读写频率较高的场景下,会引发很多异常问题,此篇文章使用C语言写的第三方Modbus库来实现modbus通讯。
  经程序运行测试,调用该库进行modbus通讯完虐QT自带mosbus库。
一、配置modbus库

  libmodbus库下载链接:https://sourceforge.net/projects/libmodbus/

  将下载的库文件夹放入源文件根目录下(pro文件中要记得添加LIBS += -Ldll -lws2_32)

  [libmodbus文件夹和ws2_32.dll(依赖该动态库)放入根目录下 ]

二、使用modbus-c库

1.modbusRTU

 1 //1.初始化连接数据
 2 char  *pcom    = "COM1";  //COM口
 3 int    Address =  1;      //站号    
 4 modbus_t *mb;
 5       mb = modbus_new_rtu(pcom,9600,'N',8,1);
 6       modbus_set_slave(mb, Address);  //从机地址  
 7       modbus_connect(mb); //
 8 
 9 //2.设置通讯超时时间
10 struct timeval t;
11       t.tv_sec=0;
12       t.tv_usec=1000000;   //设置modbus超时时间为1000毫秒,注意:经测试,如果没有成功建立tcp连接,则该设置无效。
13       modbus_set_response_timeout(mb,t.tv_sec,t.tv_usec);
14 
15 
16 //3.读数据
17 uint16_t tab_reg[128]={0};
18 int regs=modbus_read_input_registers(mb, 0, 2, tab_reg); //从0开始读2个数
19       if(regs == -1){
20         //读取失败返回-1
21       }
22       else {  //读取成功返回0
23          tab_reg[0];  //input_registers的第1个数
24          tab_reg[1];  //input_registers的第2个数
25       }
26 
27 uint8_t bits[128]={0};
28 int rbits  = modbus_read_bits(mb, 0, 2, bits);
29 if(rbits  == -1){
30         //读取失败返回-1
31       }
32       else {  //读取成功返回0
33          bits[0];  //bits的第1个数
34          bits[1];  //bits的第2个数
35       }
36 //...剩下的两个读取同理
37 
38 
39 //4.写数据
40 uint8_t bitsw[128]={0};
41 bitsw[0]=1;bitsw[1]=1;
42 int wbits = modbus_write_bits(mb, 0, 2, bitsw); //写两个数进去
43 if(wbits  == -1){
44         //写入失败返回-1
45 }
46 else {  //写入成功返回0
47     //
48 }
49 
50 uint16_t registers[128];
51 registers[0] = 200;registers[1] = 203;
52 int wreg = modbus_write_registers(mb,0,2,registers);
53 if(wreg  == -1){
54         //写入失败返回-1
55 }
56 else {  //写入成功返回0
57     //
58 }
59 
60 
61 //5.调用完成后释放资源
62 modbus_close(mb);
63 modbus_free(mb);

2.modbusTCP

1 //与RTU不同的是将串口转为网口初始化
2 //mb = modbus_new_rtu(pcom,9600,'N',8,1); //串口用
3 mb = modbus_new_tcp("127.0.0.1",502);

 

标签:modbus,libmodbus,Qt,mb,Modbus,registers,bits
From: https://www.cnblogs.com/ybqjymy/p/18062787

相关文章

  • ModbusTCP协议报文详细分析
    ModbusTCP与ModbusUDP的报文格式是一样的,它们之间的区别其实就是TCP与UDP的区别,因此下面就针对ModbusTCP的协议进行分析,ModbusTCP与ModbusRtu(ModbusASCII)之间的区别如下图:从上图可以看出,ModbusTCP在Modbus串行通信的基础上,去除了校验(由于TCP本身就带有校验和)和设备地址(M......
  • Qt 基于QTcpSocket的ModbusTCP协议
    一、编写缘由1.发现问题最近项目上要把之前的modbusRTU改为TCP形式,因此之前的modbus通讯线程得重构,一开始当然是使用Qt自带的QModbusTcpClient类,很快就重构好线程,读取数据没有问题,但是只要一发送写数据请求,整个tcp连接就会断开,做了很多尝试,排除了从站的问题,即使直接连modbuss......
  • C++ Qt开发:QNetworkInterface网络接口组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkInterface组件实现查询详细的网络接口参数。在Qt网络编程中,QNetworkInterface是......
  • C++ Qt开发:QHostInfo主机地址查询组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QHostInfo组件实现对主机地址查询功能。在Qt网络编程中,QHostInfo是一个强大而灵活的组件......
  • C++ Qt开发:QFileSystemWatcher文件监视组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemWatcher组件实现对文件或目录的监视功能。QFileSystemWatcher是Qt框架中......
  • 植物大战僵尸,用QT注入代码,AT&T汇编语法
    遇到了硬茬子,找了半天资料才找到,因为这个QT是mingw编译的,好像编译器是gcc吧,我也不太懂,但是查了半天知道他的语法是AT&T,而我在学汇编的时候学的是8086,好像叫intel语法。所以开头就碰壁到崩溃。。但是又不想放弃换MFC框架。。也不想用QT5.0+的版本。因为毕竟以后还是高版本好用吗。......
  • Qt中关于setGeometry()函数的问题
    setGeometry是相对于父窗体来说的一种对子窗体进行位置设置的方法。当我用在不同的窗体的时候发现有不同的形式QMainWindow和QWidget都是相对父窗体来说的,可是QDialog用上这个设置位置的函数,却是相对于桌面而言的。但是按照道理,他们都是继承的QWidget,setGeometry这个函数的功能......
  • C++ Qt开发:QFileSystemModel文件管理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemModel组件实现文件管理器功能。QFileSystemModel是Qt框架中的一个关键类,用于......
  • Qt开发,报错:Error while building/deploying project untitled (kit: ....)
    1、问题描述 Qt开发,编译时,报错如下:1Cannotfindfile:F:\linux\...\Console.pro.213:49:47:进程"D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin\qmake.exe"退出,退出代码2。3Errorwhilebuilding/deployingprojectConsole(kit:DesktopQt5.14.2MSVC201764bit)4......
  • Qt - 坐标系及转换
    屏幕与窗口****屏幕坐标(绝对坐标)窗口坐标(相对坐标)****pos():描述:本控件到父控件的相对坐标窗口的屏幕坐标(上图黑线)描述:窗口左上角-屏幕原点QPoint=this->pos()centerWidet到pushbutton的距离(上图蓝线)描述:button的父控件-centerWidetui->button->pos()描述:button认一......