emsApplication/applications/examples/qt5ModbusExample/mainwindow.cpp

100 lines
2.7 KiB
C++
Raw Normal View History

2025-03-04 11:27:16 +08:00
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include <QMessageBox>
#include <QDebug>
#include "libmodbus/modbus.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(200, 60);
this->setWindowTitle("libmodbus slave test");
//pbRtu = new QPushButton("以modbus rtu方式读取地址1中前20个寄存器值", this);
pbRtu = new QPushButton("modbus rtu", this);
pbRtu->resize(200, 30);
//pbTcp=new QPushButton("以modbus tcp方式读取地址1中前20个寄存器值", this);
pbTcp = new QPushButton("modbus tcp", this);
pbTcp->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()
{
delete ui;
}
void MainWindow::doRtuQuery()
{
modbus_t *mb;
uint16_t tab_reg[32]= {0};
mb = modbus_new_rtu("\\\\.\\COM20", 9600, 'N', 8, 1); //相同的端口只能同时打开一个
//modbus_set_debug(mb, true);
modbus_set_slave(mb, 1); //设置modbus从机地址
modbus_rtu_set_serial_mode(mb, MODBUS_RTU_RS485);
modbus_connect(mb);
struct timeval t;
t.tv_sec=0;
t.tv_usec=1000000; //设置modbus超时时间为1000毫秒
modbus_set_response_timeout(mb, t.tv_usec,t.tv_usec);
// uint16_t buffer[8] = { 0 };
// for (int i = 0; i < 8; i++)
// {
// buffer[i] = rand();
// qDebug() << buffer[i];
// }
// modbus_write_registers(mb, 40001, 8, buffer);
int regs=modbus_read_registers(mb, 40001, 10, 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", 502); //由于是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.tv_usec,t.tv_usec);
int regs=modbus_read_registers(mb, 40001, 10, tab_reg);
QMessageBox::about(NULL, "报告", QString("Tcp读取寄存器的个数:%1").arg(regs));
modbus_close(mb);
modbus_free(mb);
}