C++配置和使用modbus库时常见问题解决方法

配置modbus库在站内有不少方法,下面是我参考的文章:

libmodbus在Windows平台下安装与编译与测试_libmodbus 编译-CSDN博客

我在应用中遇到的问题如下:

1.LINK2019 无法解析的外部符号 __imp_modbus_set_slave,函数 main 中引用了该符号      

遇到这个问题,大多数情况是依赖库出了问题,首先需要查看一下自己的modbus.lib有没有放在指定位置。当然,大多数人不会犯这个低级错误,那么应该是引入开源项目时忘记添加依赖项,可以照以下流程逐一排查。

首先左键选择项目,右键打开项目属性;

在链接器-常规中查看附加库目录是否添加了modbus.lib所在目录的文件夹

在C/C++-常规中的附加包含目录中添加所有modbus头文件所在的目录

在链接器-输入的附加依赖项中添加库文件moubus.lib的名称

以上步骤未解决问题的话,则可以试试将解决方案平台更换至与modbus库更适配的版本,比如换成x86版本,很多modbus库编译完后大多是32位的x86版本,有时这样可以解决问题

2.从机连接失败 No Error

        我们在应用modbus协议建立连接时会考虑到连接失败的情况,写一个if语句在连接失败时使用modbus_strerror(errno)来抛出异常情况,当出现No Error的问题时找不到具体的错误,这时候就应该检查一下创建modbus对象时,主机和从机的参数是否一致,如modbus_t* ctx = modbus_new_rtu("COM2", 9600, 'N', 8, 1);

        其次,modbus 的RTU连接模式需要有物理的串口连接,可以在我的电脑->管理->设备管理器->端口(COM和LPT)中查看设备中的端口,如下图所示:

        如果找不到这个选项,说明电脑当前没有可用的端口,需要进行物理连接或者使用辅助软件创建一个虚拟端口,可以使用Virtual Serial Port Driver:

        该软件站内有下载方式,这里就不放链接了。

3.寄存器读取失败

        建立连接后,我们一般使用modbus_read_registers(ctx, 0, MAX_READ, tab_reg)函数来读取寄存器中的数据,ctx为我们之前创建的modbus上下文对象,0为开始读取的寄存器地址,MAX_READ是我们定义的能够读取寄存器的最大数量,tab_reg是用来保存寄存器值的数组。

        出现寄存器读取失败的问题,我们首先要检查一下MAX_READ的大小是否超出了寄存器的数量,如果超出了寄存器的数量,那么读取寄存器时可能会出错。

        其次要检查一下主机和从机的端口是否可以互相传输信息,以下图为例,COM1和COM2是相互通信的,COM3和COM4是相互通信的:

此时如果你的主机和从机设置为COM2和COM3,则串口之间无法通信,可能会产生寄存器读取失败的问题。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值