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