在windows平台上使用Qt和libmodbus库实现modbus主机功能
来源:互联网 发布:淘宝整机烈士墙 编辑:程序博客网 时间:2024/05/13 08:47
有时为了调试,需要在程序中实现modbus主机的功能,网上有一个现成的libmodbus C库,支持Linux, Mac OS X, FreeBSD, QNX 和 Win32。
下载地址为:http://libmodbus.org/download/
本文档主要说明这个库在Qt中使用的方法。
我下载的是libmodbus-3.0.6.tar.gz, 使用的Qt版本为Qt 5.3.2, QtCreator版本为QtCreator 3.2.1。
解压压缩包的到源码文件夹,然后使用mingw自带的msys工具来运行源码文件夹中的configure配置脚本,生成下面需要的config.h头文件。
注:我的msys工具所在路径为:D:\MingW\msys\1.0\msys.bat,运行这个bat文件会出来一个命令行窗口,在这个命令行窗口中切换到源码文件夹中使用./configure命令来运行配置脚本生成config.h头文件,如图。
将源码文件夹中src目录下的所有.h和.c文件都拷贝到Qt工程目录(*.pro所在目录)下一个新建的名为libmodbus(可以是任意合法的名字)的文件夹中(使用msys配置前复制也不会出错,但为了统一最好是配置完后再复制),然后将源码文件夹中生成的config.h头文件也复制到libmodbus文件夹下。
在QtCreator工程中“添加现有文件”将modbus文件夹下所有的.h和.c文件都选中添加。
修改libmodbus文件夹下的modbus-private.h和modbus.c代码中的”#include <config.h>”为”#include <libmodbus/config.h>”,保存。
该modbus库依赖于windows系统的ws2_32.dll库文件,在C盘中搜索到并复制到Qt工程根目录(*.pro文件所在目录)下名为dll(可以是任何合法的名字)的文件夹中。在*.pro文件中加上”LIBS += -Ldll -lws2_32”,这样编译时就可以找到该链接库了。
建立测试代码,我的测试代码是分别使用RTU和TCP实现对modbus从机的查询,相关代码和运行效果在下面给出。
Qt工程文件树:
下面是一些源码:
LibModbusTest2.pro
#-------------------------------------------------## Project created by QtCreator 2015-04-03T11:38:46##-------------------------------------------------QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = LibModbusTest2TEMPLATE = appSOURCES += main.cpp\ mainwindow.cpp \ libmodbus/modbus.c \ libmodbus/modbus-data.c \ libmodbus/modbus-rtu.c \ libmodbus/modbus-tcp.cHEADERS += mainwindow.h \ libmodbus/modbus.h \ libmodbus/modbus-private.h \ libmodbus/modbus-rtu.h \ libmodbus/modbus-rtu-private.h \ libmodbus/modbus-tcp.h \ libmodbus/modbus-tcp-private.h \ libmodbus/modbus-version.h \ libmodbus/config.hLIBS += -Ldll -lws2_32
mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QVBoxLayout>#include <QMessageBox>#include "libmodbus/modbus.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent){ this->resize(200, 60); this->setWindowTitle("libmodbus slave test"); pbRtu=new QPushButton("以modbus rtu方式读取地址1中前20个寄存器值", this); pbRtu->resize(200, 30); pbTcp=new QPushButton("以modbus tcp方式读取地址1中前20个寄存器值", this); pbRtu->resize(200, 30); QWidget *w=new QWidget(); QVBoxLayout *layout=new QVBoxLayout(); layout->addWidget(pbRtu); layout->addWidget(pbTcp); w->setLayout(layout); this->setCentralWidget(w); connect(pbRtu, SIGNAL(clicked()), this, SLOT(doRtuQuery())); connect(pbTcp, SIGNAL(clicked()), this, SLOT(doTcpQuery()));}MainWindow::~MainWindow(){}void MainWindow::doRtuQuery(){ modbus_t *mb; uint16_t tab_reg[32]={0}; mb = modbus_new_rtu("COM1", 9600, 'N', 8, 1); //相同的端口只能同时打开一个 modbus_set_slave(mb, 1); //设置modbus从机地址 modbus_connect(mb); struct timeval t; t.tv_sec=0; t.tv_usec=1000000; //设置modbus超时时间为1000毫秒 modbus_set_response_timeout(mb, &t); int regs=modbus_read_registers(mb, 0, 20, tab_reg); QMessageBox::about(NULL, "报告", QString("Rtu读取寄存器的个数:%1").arg(regs)); modbus_close(mb); modbus_free(mb);}void MainWindow::doTcpQuery(){ modbus_t *mb; uint16_t tab_reg[32]={0}; mb = modbus_new_tcp("127.0.0.1", 5101); //由于是tcp client连接,在同一个程序中相同的端口可以连接多次。 modbus_set_slave(mb, 1); //从机地址 modbus_connect(mb); struct timeval t; t.tv_sec=0; t.tv_usec=1000000; //设置modbus超时时间为1000毫秒,注意:经测试,如果没有成功建立tcp连接,则该设置无效。 modbus_set_response_timeout(mb, &t); int regs=modbus_read_registers(mb, 0, 20, tab_reg); QMessageBox::about(NULL, "报告", QString("Tcp读取寄存器的个数:%1").arg(regs)); modbus_close(mb); modbus_free(mb);}
运行效果:
注:在libmodbus源代码目录下有一个tests目录,下面是使用libmodbus实现modbus Master和Slave的一些例子,很有参考价值。
(---------------仅供学习交流-----------------)
- 在windows平台上使用Qt和libmodbus库实现modbus主机功能
- win32使用Qt和libmodbus库实现modbus主机功能
- Qt+MSVC使用libmodbus实现modbus主机功能
- libmodbus实现modbus poll功能
- 【modbus】libmodbus库的移植与使用
- linux下使用libmodbus库实现modbusTCP与modbusRTU功能
- 使用libmodbus库快速构建上位机(二) 串口modbus上位机
- 在Windows平台上PAN实现的要点和难点
- 一个modbus协议库移植——libmodbus-master
- ubuntu下Qt配置qwt和libmodbus
- 在Windows平台上实现云自动化
- 如何在Windows平台上使用OPatch
- 在windows平台上使用Github.com
- 在Windows上使用putty连接一台Linux主机
- 用OC和UI实现购物车功能 在iOS平台上
- freemodbus项目基础上增加modbus主机功能
- Ubuntu上安装和使用SSH,Xming+PuTTY在Windows下远程Linux主机使用图形界面的程序
- Ubuntu上安装和使用SSH,Xming+PuTTY在Windows下远程Linux主机使用图形界面的程序
- mysql执行update用到replace需要注意
- HTML5初窥4----视频(Video)
- iOS开发教程之ASIHTTPRequest:使用download cache
- 100阶乘末尾有多少个零
- 如何查看某个端口被谁占用
- 在windows平台上使用Qt和libmodbus库实现modbus主机功能
- 开源中国iOS客户端学习——(十一)AES加密
- IOS SDK详解之沙盒(一)图解+小工具
- sql语句里的limit使用方法
- leetcode_173_Binary Search Tree Iterator
- UVA11375
- 数据库的数据添加和查询
- CAS实现SSO单点登录原理
- 通过UltraEdit(UE)转化\r\n(回车换行)与\n(换行)