当前位置:   article > 正文

libModbus库开发笔记(二):libmodbus介绍、编译、modbusTcp连接台达PLC和modbusTcp基础模板

libmodbus

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/140371764

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Qt开发专栏:三方库开发技术

上一篇:《libModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板
下一篇:敬请期待…


前言

  QModbus有bug(无法读取线圈),FreeModbus移植有点小麻烦且代码不好封装(回调),而libmodbus相对来说最合适,上一篇做好了modbus485、232的读取方式,本篇讲解通过tcp网线的读取方式。
  本篇描述tcp通过网线走tcp的modubus tcp rtu方式读取写入。


相关博客

  《案例分享:Qt modbus485调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.3.0)
  《案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)
  《台达PLC开发笔记(一):台达PLC连接介绍,分别使用485、网口与台达PLC建立连接
  《台达PLC开发笔记(二):台达PLC设置主机通讯参数为RTU并成功通讯
  《西门子PLC开发笔记(一):PLC介绍,西门子S1200系列接线、编程、下载和仿真
  《libModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板
  《libModbus库开发笔记(二):libmodbus介绍、编译、modbusTcp连接台达PLC和modbusTcp基础模板
  《案例分享:Qt西门子PLC调试模拟工具(包含PLC上位机通讯,PLC服务器,读写Byte、Int、DInt、Real)(持续更新,当前v1.6.0)


libModbus介绍

  libmodbus是一个免费软件库,可根据Modbus协议发送/接收数据。该库用C编写,并支持RTU(串行)和TCP(以太网)通信。


编译libmodbus(平台windows + Qt5.9.3 + mingw32)

步骤一:下载

  https://github.com/stephane/libmodbus

步骤二:使用msys编译,配置好环境

  在这里插入图片描述

步骤三:命令行引入mingw32环境变量

export PATH=$PATH:/mingw530_32/bin
  • 1

步骤四:配置configure

cd /home/21497/compile/modbus
tar xvf libmodbus-3.1.6.tar.gz
cd libmodbus-3.1.6
./configure --prefix=/home/21497/compile/modbus/libmodbus-3.1.6/install
  • 1
  • 2
  • 3
  • 4

  在这里插入图片描述

  错误,识别平台失败,如下图:
  在这里插入图片描述

./configure --prefix=/home/21497/compile/modbus/libmodbus-3.1.6/install -build=x86
  • 1

  是在mysy使用linux环境编译x86构架下的,如下图:
  在这里插入图片描述

步骤五:编译make

make -j16
  • 1

  在这里插入图片描述

  再单线程确认一下
  在这里插入图片描述

步骤六:安装make install

make install
  • 1

  会出错,缺一些文件夹,手动自己建文件夹即可。
  在这里插入图片描述

步骤七:稍微核对下文件

  在这里插入图片描述


获取台达PLC的IP地址

  (注意:经手过三个台达了,基本默认地址都是192.168.1.5)

步骤一:下载安装COMMGR

  从台达官网下载最新的通讯软件。
  官网:https://downloadcenter.delta-china.com.cn/DownloadCenter?v=1&CID=06&itemID=060301&downloadID=AS%E7%B3%BB%E5%88%97&dataType=8&sort_expr=cdate&sort_dir=DESC
  下载最新的探索驱动软件:
  在这里插入图片描述

  在这里插入图片描述

步骤二:探测台达PLC地址

  点开:
  在这里插入图片描述

  在这里插入图片描述

  在这里插入图片描述

  点击“搜寻”,电脑必须和PLC在同一个网段,这里都是1网段:
  在这里插入图片描述

  搜索到了如下图:
  在这里插入图片描述

  这样,我们就获取到了PLC的网络地址。

模块化

  在这里插入图片描述


Demo

#ifndef MODBUSTCPMANAGER_H
#define MODBUSTCPMANAGER_H

/************************************************************\
 * 控件名称: modbus tcp管理类
 * 控件描述:
 *          1.连接远程modbus服务器
 *          2.PLC读取bool、int、dInt、real(float)、dReal(double)
 *          3.PLC写入bool、int、dInt、real(float)、dReal(double)
 * 著作权信息
 *      作者:长沙红胖子Qt
 *      公司:长沙创微智科信息技术有限公司
 *      网址:www.chuangweizhike.com
 *      博客导航总览:https://hpzwl.blog.csdn.net/article/details/102478062
 *      联系方式:QQ(21497936) 微信(yangsir198808)
 * 版本信息
 *       日期             版本         描述
 *   2024年07月09日     v1.0.0       基础功能,支持线圈、int、dint、单精度浮点,双精度浮点类型
\************************************************************/

#include <QObject>
#include <QMutex>

union RealByte {
    float f;
    quint8 buf[4];
};

union DRealByte {
    double f;
    quint8 buf[8];
};

// libmodbus
#include "modbus/modbus.h"
#include "modbus/modbus-version.h"
#include "modbus/modbus-rtu.h"
#include "modbus/modbus-tcp.h"

class ModbusTcpManager : public QObject
{
    Q_OBJECT
private:
    explicit ModbusTcpManager(QObject *parent = 0);

public:
    bool testEnvAndRtu();

public:
    static ModbusTcpManager *getInstance();

public:
    void setIp(const QString &ip);
    void setPort(const quint16 &port);
    void setTimeOutMs(int timeOutMs);

public:
    QString getIp() const;
    quint16 getPort() const;
    int getTimeOutMs() const;

signals:
    void signal_connected(bool connected);
    void signal_disConnected();

    void signal_readBitsResult(bool result, int startAddr, QList<bool> listBool);
    void signal_readIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_readDIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_readRealsResult(bool result, int startAddr, QList<float> listFloat);
    void signal_readDRealsResult(bool result, int startAddr, QList<double> listDouble);

    void signal_writeBitsResult(bool result, int startAddr, QList<bool> listBool);
    void signal_writeIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_writeDIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_writeRealsResult(bool result, int startAddr, QList<float> listFloat);
    void signal_writeDRealsResult(bool result, int startAddr, QList<double> listDouble);

public slots:
    void slot_start();
    void slot_stop();
    void slot_connect();
    void slot_disConnect();

    void slot_readBits(int startAddr, int size);
    void slot_readInts(int startAddr, int size);
    void slot_readDInts(int startAddr, int size);
    void slot_readReals(int startAddr, int size);
    void slot_readDReals(int startAddr, int size);

    void slot_writeBits(int startAddr, QList<bool> listBool);
    void slot_writeInts(int startAddr, QList<int> listInt);
    void slot_writeDInts(int startAddr, QList<int> listInt);
    void slot_writeReals(int startAddr, QList<float> listFloat);
    void slot_writeDReals(int startAddr, QList<double> listDouble);

private:
    static ModbusTcpManager *_pInstance;
    static QMutex _mutex;

private:
    QString _ip;
    quint16 _port;
    int _timeOutMs;

private:
    bool _running;
    bool _connected;

private:
    modbus_t *_pModbus;

};

#endif // MODBUSTCPMANAGER_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114

Demo演示

  在这里插入图片描述


工程模板

  在这里插入图片描述


上一篇:《libModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板
下一篇:敬请期待…


本文章博客地址:https://blog.csdn.net/qq21497936/article/details/140371764

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号