QT中实现modbus,使用libmodbus-master库,怎么实现

QT中实现modbus,使用libmodbus-master库,怎么实现,第1张

千锋扣丁学堂IT为您解答:

LibModbusTest2.pro

#-------------------------------------------------

#

# Project created by QtCreator 2015-04-03T11:38:46

#

#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = LibModbusTest2

TEMPLATE = app

SOURCES += main.cpp\

mainwindow.cpp \

libmodbus/modbus.c \

libmodbus/modbus-data.c \

libmodbus/modbus-rtu.c \

libmodbus/modbus-tcp.c

HEADERS += 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.h

LIBS += -Ldll -lws2_32

mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

#include

#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)

}

Modbus簇主要有三种协议: Modbus-RTU、Modbus-ASCII、Modbus-TCP

工控行业通常的设备组网看,三者应用的范围如下:

三者报文格式的区别如下:

RTU相比较ASCII具备更紧凑的报文流,传输效率更高,目前MODBUS-ASCII已经应用较少。

Modbus的 *** 作对象有4种: 线圈、离散输入、保持寄存器、输入寄存器 。

modbus_rtu.c

程序流程图


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12195156.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存