zoukankan      html  css  js  c++  java
  • LibModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板

    前言

      本文章讲解libmodbus。

     

    libModbus介绍

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

     

    编译:平台windows + Qt5.9.3 + mingw32

    步骤一:下载

      https://github.com/stephane/libmodbus
      QQ群下载地址:1047134658(点击“文件”搜索“modbus”,群内与博文同步更新)

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

      在这里插入图片描述

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

    export PATH=$PATH:/mingw530_32/bin
    

    步骤四:配置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
    

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

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

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

    步骤五:编译make

    make -j16
    

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

    步骤六:安装make install

    make install
    

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

    步骤七:读者请稍微核对下文件

      在这里插入图片描述

     

    模块化

      在这里插入图片描述

     

    Demo

    bool ModbusManager::testEnvAndRtu()
    {
        LOG << LIBMODBUS_VERSION_STRING;
        // 步骤一:创建modbus RTU
        modbus_t *pModbus = 0;
        pModbus = modbus_new_rtu("com5",
                                 115200,
                                 'E',
                                 8,
                                 1);
        if(!pModbus)
        {
            LOG << "Failed to modbus_new_rtu";
            return false;
        }
        LOG << "Succeed to modbus_new_rtu";
        // 步骤二: 485 RTU 模式
        modbus_rtu_set_serial_mode(pModbus, MODBUS_RTU_RS485);
        // 步骤三: 设置从机站号 1
        modbus_set_slave(pModbus, 1);
        // 步骤四:设置超时时间 100 ms
        modbus_set_response_timeout(pModbus, 0, 100 * 1000);
        // 步骤五: 连接 (注意:经过测试,只是485和232只是打开串口,并未交互)
        int ret = modbus_connect(pModbus);
        if(ret)
        {
            LOG << "Failed to modbus_connect, ret =" << ret;
            return false;
        }
        LOG << "Succeed to modbus_connect, ret =" << ret;
        // 步骤六:读取线圈
        uint8_t buffer8t[10] = {0x00};
        ret = modbus_read_bits(pModbus, 25, 10, buffer8t);
        if(ret <= 0)
        {
            LOG << "Failed to modbus_read_registers, ret =" << ret;
            return false;
        }
        LOG << "Succeed to modbus_read_registers, ret =" << ret;
        // 步骤七:打印返回
        for(int index = 0; index < 10; index++)
        {
            LOG << QString("%1").arg(buffer8t[index]);
        }
        // 步骤八:读取寄存器
        uint16_t buffer16t[10] = {0x00};
        ret = modbus_read_registers(pModbus, 95, 10, buffer16t);
    
        if(ret <= 0)
        {
            LOG << "Failed to modbus_read_registers, ret =" << ret;
            return false;
        }
        LOG << "Succeed to modbus_read_registers, ret =" << ret;
        // 步骤九:打印返回
        for(int index = 0; index < 10; index++)
        {
            LOG << QString("%1").arg(buffer16t[index]);
        }
    
        // 步骤十:读取寄存器
        memset(buffer16t, 0, 10);
        ret = modbus_read_input_registers(pModbus, 100, 1, buffer16t);
        if(ret <= 0)
        {
            LOG << "Failed to modbus_read_registers, ret =" << ret;
            return false;
        }
        LOG << "Succeed to modbus_read_input_registers, ret =" << ret;
        // 步骤十一:打印返回
        for(int index = 0; index < 10; index++)
        {
            LOG << QString("%1").arg(buffer16t[index]);
        }
        return true;
    }
    
     

    Demo演示

      在这里插入图片描述

     

    工程模板

      modbusDemo_v1.0.0_基础模板_读取线圈_读取寄存器简单测试.rar

     

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

  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/qq21497936/p/14708397.html
Copyright © 2011-2022 走看看