emsApplication/applications/examples/qt5ModbusExample/mainwindow.cpp

100 lines
2.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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