Libmodbus在win11下的编译与VS2019下的运行

前言

        由于工作需要学习了一下ModbusTCPModbusRTU,这两种通讯方式是工业上常用的两种通讯协议。协议内容比较短,也比较简单,容易学习,建议日后进军工业行业的小伙伴预先学习一下。如果该博客有错误,或者有其他不理解的地方,欢迎评论或者私信,博主看见会尽快、尽力回答各位小伙伴的。

        Libmodbus 提供了一组函数和工具,使开发者能够轻松地实现 Modbus 通信功能。其中包括了ModbusTCP和ModbusRTU,使用起来非常简单。但是也需要小伙伴熟悉一下协议内容,博主发现两篇介绍非常详细,也容易理解的博客,不太了解这两种通讯协议的小伙伴可以进去学习一下。Modbus TCP通讯协议-CSDN博客Modbus RTU协议认识_modbus rtu 数据类型-CSDN博客。通常对这两种通讯的调试都会用到Modbus pollModbus slave,这边就放在这篇博客的最下面了。

下载Libmodbus

下载网址为:GitHub - stephane/libmodbus: A Modbus library for Linux, Mac OS, FreeBSD and Windows

下载流程:Code--》Download ZIP。然后放到自己想放的文件夹中,解压。

解压完成后应该如下图所示:

         进入到这个路径下:D:\modbus\libmodbus-master\libmodbus-master\src\win32(这个需要根据自己的进行修改

编译

        右键--》在终端中打开(如果没有这个选项的小伙伴可以按下Win+R,输入cmd,然后cd到该路径下),然后输入

cscript configure.js

        然后回车,出现如下情况则说明成功

         这里可能会失败,请失败的小伙伴在其他博客上搜一下原因。

         成功之后,就会生成一个config.h文件。

        将config.h文件复制到src目录下。

        打开VS2019,新建一个解决方案,这里用的是空项目(这里很重要,而且最好可以直接将名字命名为modbus,避免后面去改或者出现其他问题)。将x86改为x64,输入下面代码。

#include<iostream>

int main() {

}

进入到这个路径下

        新建文件夹,名字为 libmodbus,将src下的.h和.c文件都放在这个文件夹下。然后,将win32下的modbus.rc放在上面路径下。

        将.h头文件和.c文件都加载到解决方案中,可以右键头文件(源文件或资源文件)--》现有项。添加完成后,如下图所示:

        双击modbus.rc修改其中的代码,会报错,直接点确定就行。将

#include "../modbus-version.h"
改为
#include "modbus-version.h"

        然后打开项目--》属性--》C/C++ --》附加包含目录加入libmodbus的绝对路径;还有资源--》附加包含目录加入libmodbus的绝对路径;链接器--》输入--》附加依赖项中添加“ws2_32.lib”;如果需要可以在C/C++ --》预处理器--》预处理器定义中添加“_CRT_SECURE_NO_WARNINGS”;配置属性--》常规--》配置类型改为.dll;最后点击应用,然后是生成。

        在E:\c++\modbus\x64\Debug下就生成了.lib和.dll文件。

         至此,编译完成。下面就可以使用上面的这两个库文件了。

使用Libmodbus和Modbus slave测试

        测试cpp文件代码如下:

#include <iostream>
#include "modbus.h"

int main() {
    modbus_t* modbusContext;
    const char* ipAddress = "192.168.3.155"; // Modbus TCP 从机的 IP 地址
    const int port = 503; // Modbus TCP 端口号
    const int slaveId = 1; // 从机 ID

    modbusContext = modbus_new_tcp(ipAddress, port);
    if (modbusContext == nullptr) {
        std::cerr << "Failed to create Modbus context" << std::endl;
        return 1;
    }

    // 打开 Modbus 连接
    if (modbus_connect(modbusContext) == -1) {
        std::cerr << "Modbus connection failed: " << modbus_strerror(errno) << std::endl;
        modbus_free(modbusContext);
        return 1;
    }

    // 读取线圈状态
    const int read_regAddress = 0; // 读取寄存器地址
    const int numBits = 10; // 寄存器字节数
    uint16_t coilStatus[numBits];
    
    int rc = modbus_read_registers(modbusContext, read_regAddress, numBits, coilStatus);       // 读多个寄存器
    if (rc == -1) {
        std::cerr << "Failed to read Modbus coils: " << modbus_strerror(errno) << std::endl;
    }
    else {
        std::cout << "Coil value: " << static_cast<int>(coilStatus[0]) << std::endl;
    }

    // 写入寄存器状态
    const int write_regAddress = 1; // 读取寄存器地址
    const uint16_t writeValue = 321;
    rc = modbus_write_register(modbusContext, write_regAddress, writeValue);     // 写单一寄存器
    if (rc == -1) {
        std::cerr << "Failed to write Modbus coil: " << modbus_strerror(errno) << std::endl;
    }
    else {
        std::cout << "Write successful" << std::endl;
    }

    // 关闭 Modbus 连接
    modbus_close(modbusContext);
    modbus_free(modbusContext);

    system("pause");

    return 0;
}

        上面先读取了寄存器的地址的值,然后又将22写入到了寄存器。

        打开Modbus slave,设置成下面表格,然后点击OK。

        然后点击Connection,再设置好IP和端口号,点击OK就可以了。

         下面将寄存器的0号位改为123,使用测试程序进行读取,然后再修改1号位的值为321

 

        成功~~

附件:

链接:https://pan.baidu.com/s/1ujZ1LfSdnMA7AhtkruVPnw 
提取码:o75f

博主花了1块多买的,如果有用,还希望一件三连哇~~~

  • 25
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值