配置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,则串口之间无法通信,可能会产生寄存器读取失败的问题。