码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo


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

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

    国产麒麟系统相关开发

    上一篇:《麒麟系统开发笔记(十三):在国产麒麟系统上编译OSG库、搭建基础开发环境和移植测试Demo》
    下一篇:敬请期待…


    前言

      在国产麒麟系统上实现modbusTcp和modbus232/485通讯,使用libmodbus库。
      本篇在厂家指定的麒麟系统上编译libmodbus库,迁移modbusTcpDemo工程。


    相关博客

      《案例分享: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基础模板》
      《麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo》
      《案例分享:Qt西门子PLC调试模拟工具(包含PLC上位机通讯,PLC服务器,读写Byte、Int、DInt、Real)(持续更新,当前v1.6.0)》


    补充

      modbus232/485的demo就不移植了,可以查看相关博客,移植按照本文一样,主要修改配置引用。


    国产麒麟系统版本

      在这里插入图片描述


    libModbus介绍

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


    编译libmodbus(国产麒麟V10)

    步骤一:下载解压

      https://github.com/stephane/libmodbus
      在这里插入图片描述

    步骤二:配置configure

    cd
    cd work/src/libmodbus-3.1.6
    cCd libmodbus-3.1.6
    ls
    

      在这里插入图片描述

      以下是动态库:

    ./configure --prefix=/home/yang/work/src/libmodbus-3.1.6/install
    

      若是需要静态库可更改如下:

    ./configure --prefix=/home/yang/work/src/libmodbus-3.1.6/installStatic –enable-static
    

      在这里插入图片描述

      在这里插入图片描述

    步骤三:编译make

    make -j16
    

      在这里插入图片描述

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

    步骤四:安装make install

    make install
    

      在这里插入图片描述

    步骤五:稍微核对下文件

      在这里插入图片描述

      在这里插入图片描述

      与windows下相比,就是.a变成了.so,这是动态库,可以编译成静态库:
      在这里插入图片描述

      下面这是静态库的(静态库依赖编译出来,也需要运行库,这点没深究了,可能还需要其他基础动态库依赖吧?):
      在这里插入图片描述

    步骤六:安装到系统

      为了运行时不单独去链接运行库,重新来一次,装到系统里面去。

    ./configure
    make -j8
    make
    sudo make install
    sudo ldconfig
    

    获取台达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的网络地址。


    模块化

      在windows上加上兼容麒麟系统:
       在这里插入图片描述

    modbusTcpManager.pri

    INCLUDEPATH += $$PWD
    DEPENDPATH += $$PWD
    
    HEADERS += \
        $$PWD/ModbusTcpManager.h
    
    SOURCES += \
        $$PWD/ModbusTcpManager.cpp
    
    # libmodbus-3.1.6
    
    win {
        INCLUDEPATH += $$PWD/libmodbus-3.1.6/include
        LIBS += -L$$PWD/libmodbus-3.1.6/lib -lmodbus -lws2_32
    }
    unix {
        INCLUDEPATH += $$PWD/libmodbus-3.1.6_kylin/include
        LIBS += -L$$PWD/libmodbus-3.1.6_kylin/lib -lmodbus
    }
    

    Demo

    #ifndef MODBUSTCPMANAGER_H
    #define MODBUSTCPMANAGER_H
    
    #include 
    #include 
    
    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
    

    Demo演示

      连接台达PLC测试:
      在这里插入图片描述


    工程模板v1.1.0

      在这里插入图片描述


    上一篇:《麒麟系统开发笔记(十三):在国产麒麟系统上编译OSG库、搭建基础开发环境和移植测试Demo》
    下一篇:敬请期待…


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

  • 相关阅读:
    455. 分发饼干 --力扣 --JAVA
    计算机毕业设计java+springboot+vue的在线考试系统
    总结类体中的内容及其执行的先后顺序(学习中途总结)
    2-SAT
    对话框管理器第八章:对话框中的自定义导航
    JavaWeb-解析Servlet的适配器模式和Servlet配置
    SR800-D 5G工业路由器:将无人驾驶汽车的通信能力提升到极限
    基于SSM开发教务查询管理系统
    Clickhouse 学习笔记(6)—— ClickHouse 分片集群
    自动驾驶感知算法实战13——自动驾驶感知未来发展方向分享
  • 原文地址:https://blog.csdn.net/qq21497936/article/details/140387947
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号