#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #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); }