Precauciones para usar libmodbus en Qt 5 en Windows

Precauciones para usar libmodbus en Qt 5 en Windows

Cuando creé el software, quería usar la comunicación modbus, así que busqué información sobre la comunicación modbus, pero después de leerlo, sentí que algunos problemas eran diferentes de los que encontraron otros, así que lo resolví yo mismo.

Descargar y compilar archivos de biblioteca libmodbus

Como biblioteca modbus, libmodbus se puede descargar directamente en el sitio web oficial. Se recomienda información en línea para descargar la versión libmodbus-3.0.6.tar.gz, pero solo la versión 3.1.6 se encuentra en el sitio web oficial. La introducción es estable a largo plazo. Entonces descárgalo. Descomprima el paquete comprimido libmodbus, hay dos carpetas, libmodbus-3.1.6 y PaxHeaders.27399. Abra la carpeta libmodbus-3.1.6, busque el script de configuración configure, necesita usar la herramienta para generar el archivo config.h.

Descargue e instale la herramienta msys

Busqué información en Internet, incluido un blog que explicaba con más detalle, seguí sus pasos paso a paso. Publiqué la URL a continuación:

Descargué msys directamente desde github. Hay muchos recursos. Elegí msys2-installer, principalmente porque la computadora es de 64 bits, así que elegí el paquete de instalación de 64 bits. La descarga es rápida y solo toma una docena de segundos para 90M. Haga doble clic en el archivo exe para instalarlo. Es más fácil de lo esperado. Una vez completada la instalación, en la barra de menú de inicio, hay tres métodos de inicio, simplemente ignórelo y ábralo de cualquier manera;
URL de descarga: https: // github. Para com / msys2 / msys2-installer,
instalé las funciones de forma selectiva según mis necesidades, respectivamente, de la siguiente manera:
** 1. ** Realice cd + nombre de archivo para ingresar al directorio: abra el archivo / etc / profile y agregue una variable clave: "Exportar MSYS =" winsymlinks: lnk "
** 2. ** Configurar espejos domésticos para descargar recursos de manera fácil y rápida: modifique los 3 archivos espejo archivos de lista de espejos en el archivo /etc/pacman.d, y yo uso el enlace del blogger
.la configuración ** 3 ** git y vim editor instalados: un poco como linux, comando de instalación: pacman -S git;
** . 4 ** configuración de instalación de zsh :. en linux, se usa por defecto bash, Pero ahora la mayoría de la gente usa zsh, que es conveniente y rápido. El comando para instalar zsh: pacman -S zsh; el tema zsh usa oh-my-zsh, y necesitas enlazar a la URL correspondiente de github para descargar. Usé el blogger La segunda forma es efectiva.
** 5. ** Modifique el shell predeterminado a zsh: en el archivo msys2_shell.cmd, cambie la variable de LOGINSHELL a zsh, luego ingrese automáticamente zsh después de iniciar msys2, y elija el tema en oh-my-zsh yo mismo, usé ys. Utilice vim editor para abrir el archivo zshrc en el directorio raíz, modifique el nombre de ZSH_THEME en él y complete la modificación.
** 6. ** La parte más importante: instalación de gcc y configuración del entorno: instalé mingw64 mingw-x86_64-gcc versión. Comando de instalación: pacman -S mingw -w64-x86_64-gcc. La instalación está completa.

config.h generación

Abra msys2, busque el archivo de configuración en el archivo previamente descomprimido y ejecútelo, luego copie todos los archivos .cy .h en la carpeta src debajo de la carpeta libmodbus3.1.6 en una carpeta vacía, y el archivo config.h generado Cópielo y nombre la carpeta libmodbus. En este punto, se genera el archivo de biblioteca libmodbus.
Inserte la descripción de la imagen aquí

Qt nuevo proyecto

Abra Qt en el lado de Windows, mi versión de Qt es 5.13.2, la versión de QtCreater es 4.10.1, después de abrir, después de crear un nuevo archivo de proyecto, en la opción Agregar archivo, seleccione todos los archivos en el archivo libmodbus anterior y agréguelos , atención especial es el problema de la ruta config.h , la ruta es la ruta config.h su archivo libmodbus config.h, por lo que es necesario que contenga configuraciones como modbus-private.h, modbus.c y otros archivos de encabezado. h archivo de ruta.

Inserte la descripción de la imagen aquí

Agregar archivo dll

Además, la biblioteca modbus depende del archivo de biblioteca ws2_32.dll del sistema de ventanas, búsquelo en la unidad c, cópielo en la carpeta del proyecto creado, asígnele el nombre de carpeta dll y agregue "LIBS + = - al archivo del proyecto. Pro Ldll -lws2_32 ", completo, comience a ejecutar el programa.

Código de prueba

El código de prueba se basa en el código de un blogger, pero el código del blogger es de hace 5 años, y solo se publican los archivos del proyecto .pro y .cpp, por lo que se basa en la biblioteca libmodbus compilada existente, según el blog. Se hicieron algunos ajustes al código entre los maestros, ya que en el proceso de ejecución se descubrió que la definición de algunas funciones de la API en el archivo modbus.h había cambiado, lo que provocó algunos errores en la compilación del archivo Qt.

La siguiente es la API de tiempo de espera de respuesta en el archivo modbus.h en la biblioteca libmodbus generada por el blogger hace 5 años:

void modbus_get_response_timeout(modbus_t *ctx, struct timeval *timeout);
void modbus_set_response_timeout(modbus_t *ctx, const struct timeval *timeout);

Sin embargo, la definición de la API de tiempo de espera de respuesta en el archivo modbus.h en la biblioteca libmodbus que compilé ahora es así:

MODBUS_API int modbus_get_response_timeout(modbus_t *ctx, uint32_t *to_sec, uint32_t *to_usec);
MODBUS_API int modbus_set_response_timeout(modbus_t *ctx, uint32_t to_sec, uint32_t to_usec);

Primero, el tipo de datos del valor devuelto es inconsistente, y luego los parámetros de la función son inconsistentes, por lo que se deben realizar algunas modificaciones adicionales al probar el código del blogger.

1. Código de archivo del proyecto libmodbus.pro

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11
LIBS += -Ldll -lws2_32

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    H:/libmodbus/modbus-data.c \
    H:/libmodbus/modbus-rtu.c \
    H:/libmodbus/modbus-tcp.c \
    H:/libmodbus/modbus.c \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    H:/libmodbus/config.h \
    H:/libmodbus/modbus-private.h \
    H:/libmodbus/modbus-rtu-private.h \
    H:/libmodbus/modbus-rtu.h \
    H:/libmodbus/modbus-tcp-private.h \
    H:/libmodbus/modbus-tcp.h \
    H:/libmodbus/modbus-version.h \
    H:/libmodbus/modbus.h \
    mainwindow.h

FORMS += \
    mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${
    
    TARGET}/bin
else: unix:!android: target.path = /opt/$${
    
    TARGET}/bin
!isEmpty(target.path): INSTALLS += target

2. El archivo de encabezado de la ventana principal mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QPushButton>
#include "H:/libmodbus/modbus.h"

QT_BEGIN_NAMESPACE
namespace Ui {
    
     class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    
    
    Q_OBJECT

    struct timeval
    {
    
    
        uint32_t  tv_sec;
        uint32_t  tv_usec;
    };

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QPushButton *pbRtu;
    QPushButton *pbTcp;

private slots:
    void doRtuQuery();

    void doTcpQuery();




private:
    Ui::MainWindow *ui;


};
#endif // MAINWINDOW_H

3.ventana principal.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QVBoxLayout>
#include <QMessageBox>
#include "H:/libmodbus/modbus.h"
#include <QPushButton>



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->resize(200, 30);

        pbTcp=new QPushButton("以modbus tcp方式读取地址1中前20个寄存器值", this);
        pbRtu->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()
{
    
    
    //RTU
    modbus_t *mb;
    uint16_t tab_reg[32]={
    
    0};

    mb = modbus_new_rtu("COM3", 9600, 'N', 8, 1);   //相同的端口只能同时打开一个
    modbus_set_slave(mb, 1);  //设置modbus从机地址

    modbus_connect(mb);

    struct timeval t;
    t.tv_sec=0;
    t.tv_usec=1000000;   //设置modbus超时时间为1000毫秒
    modbus_set_response_timeout(mb, t.tv_sec,t.tv_usec);

    int regs=modbus_read_registers(mb, 0, 10, tab_reg);

    QMessageBox::about(NULL, "报告", QString("RTU 读取寄存器的个数: %1").arg(regs));
    modbus_close(mb);
    modbus_free(mb);

}

void MainWindow::doTcpQuery()
{
    
    
    //TCP
    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_sec,t.tv_usec);

    int regs=modbus_read_registers(mb, 0, 10, tab_reg);

    QMessageBox::about(NULL, "报告", QString("TCP 读取寄存器的个数: %1").arg(regs));
    modbus_close(mb);
    modbus_free(mb);

}



En este punto, el contenido compartido ha terminado, espero que sea útil, gracias ~ Consulte
el blog de
referencia del blog 2 para
descargar Msys

Supongo que te gusta

Origin blog.csdn.net/qq_43552324/article/details/108639382
Recomendado
Clasificación