Cómo utilizar la biblioteca libmodbus-master para implementar modbus en QT
LibModbusTest2.pro
#----------------------- -- ------------------------
#
# Proyecto creado por QtCreator 2015-04- 03T11: 38:46
#
#------------------------------- - --------------------
QT = interfaz gráfica de usuario principal
mayor que (QT_MAJOR_VERSION, 4): QT = widgets< / p>
OBJETIVO = LibModbusTest2
PLANTILLA = aplicación
FUENTES = main.cpp\
mainwindow.cpp \
libmodbus/modbus. c \
libmodbus/modbus-data.c (
libmodbus/modbus-rtu.c) (
libmodbus/modbus-tcp.c) (
libmodbus/modbus-rtu.c) p>
HEADERS = mainwindow.h (
libmodbus/modbus.h) (
libmodbus/modbus- private.h) (
libmodbus/ modbus-rtu.h \
libmodbus/modbus-rtu-private.h \
libmodbus/modbus-tcp. h \
libmodbus/modbus-tcp -private.h \
libmodbus/modbus-version.h \
libmodbus/ config.h
LIBS = -Ldll -lws2_32
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ui_mainwindow.h"
# include
#include
#include "libmodbus/modbus.h"
MainWindow::MainWindow(QWidget *padre):
p>QMainWindow(padre)
{
this-gt; 200, 60);
this-gt; setWindowTitle("prueba de esclavo libmodbus");
pbRtu=new QPushButton("Leer las primeras 20 direcciones de la dirección 1 en un modbus rtu Lea los primeros 20 valores de registro en la dirección 1 como modbus rtu", esto
s);
pbRtu-gt; resize(200, 30);
pbTcp=new QPushButton("Lea los primeros 20 valores de registro en la dirección 1 como modbus tcp", esto) ;
pbRtu-gt; resize(200, 30);
QWidget *w=nuevo QWidget();
QVBoxLayout *layout=nuevo QVBoxLayout () ;
layout-gt;addWidget(pbRtu);
layout-gt;addWidget(pbTcp);
w-gt;setLayout(layout) ;
this-gt; setCentralWidget(w);
connect(pbRtu, SIGNAL(clicked()), this, SLOT(doRtuQuery()));
connect(pbTcp, SIGNAL(clicked()), this, SLOT(doTcpQuery()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::doRtuQuery()
{
modbus_t *mb;
uint16_t tab_reg[32]= {0};
mb = modbus_new_rtu("COM1", 9600, 'N', 8, 1); //Solo uno de los mismos puertos puede estar abierto en el mismo tiempo
modbus_set_slave(mb, 1); //Establece la dirección del esclavo modbus
modbus_connect (mb);
struct timeval t; p>
t.tv_sec=0;
t.tv_usec=1000000; //establece el tiempo de espera de modbus en 1000 milisegundos
modbus_set_response_timeout(mb, amp; t); p>
int regs=modbus_read_registers(mb, 0, 20, tab_reg);
QMessageBox::about(NULL, "Reporting", QString("Número de registros leídos por 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", 5101); //Porque es tcp
Conexión de cliente, el mismo puerto se puede conectar varias veces en el mismo programa.
modbus_set_slave(mb, 1); //Dirección del esclavo
modbus_connect(mb);
struct timeval t;
t . tv_sec=0;
t.tv_usec=1000000; //Establezca el tiempo de espera de modbus en 1000 milisegundos. Nota: Si la conexión tcp no se establece correctamente, esta configuración no será válida.
modbus_set_response_timeout(mb, amp; t);
int regs=modbus_read_registers(mb, 0, 20, tab_reg);
QMessageBox::about(NULL); , "Reporte", QString("Número de registros leídos por Tcp: 1").arg(regs));
modbus_close(mb);
modbus_free(mb);
}
.