100 lines
2.7 KiB
C++
100 lines
2.7 KiB
C++
#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);
|
||
}
|