Visual Studio 上基于libmodbus库的modbus RTU模式开发


本文内容是基于《Modbus软件开发实战指南》

看这本书的缘由是,我在做libmodbus+qt上位机,参考了网上的一些资料,照着来了一遍,总是编译不过,就在博客中搜索,意外中看到了这本书,下载pdf居然也充钱收费,果断借了书,针对其中有用的部分,码字分享之,希望对各位有用。

第一部分:编译libmodbus库,在VS平台上(与之前在MSYS的编译方式有所不同)

1.在github上下载libmodbus源代码,下载网址:https://github.com/stephane/libmodbus.

2.解压完成后,在src/win32文件目录下,双击configure.js,生成了config.h文件和modbus-version.h文件。

3.打开项目文件modbus-9.sln,在弹出的文件升级对话框中,点击确定。

4.将源文件夹下的modbus-version.h替换成新生成的modbus-version.h。

5.右键点击项目,选择属性,打开属性对话框,选择该VS版本下的MDK,并去除掉Version选项的定义。

6.编译通过。生成modbus.dll和modbus.lib文件。

第二部分:编写RTU Master端(主机端)

新建项目工程,将之前生成的dll文件、lib文件以及libmodbus库里的头文件,复制到项目文件所在的目录下,并通过添加现有文件到项目中,至此libmodbus中的各种接口函数可以应用了。

接下来,就是文中要贴的代码了。

RTU-Master的代码流程:
1.初始化并生成modbus_t结构体;
2.设置从机端的ID;
3.启动调试模式;
4.建立modbus连接;
5.申请动态内存;
6.生成随机数,其他地方是读取寄存器/线圈的输入;
7.线圈寄存器的单个读写/批量读写/保持寄存器的单个读写/批量读写/读取多个寄存器;
8.释放内存;
9.关闭modbus连接;
10.释放modbus结构体

RTU-Slave的代码流程:
1.初始化并生成modbus_t结构体;
2.设置从机端的ID;
3.起点调试模式;
4.建立modbus连接;
5.modbus_mapping_new()初始化寄存器,返回一个modbus_mapping_t指针;
6.调用modbus_receive()函数判断串口的接收数据,负责接收和分析;
7.调用modbus_reply()函数,对接收到的请求指示发送响应(回复);
8.释放modbus_mapping_t结构体;
9.关闭modbus连接;
10.释放modbus_t结构体

 

补充函数解释:

1.modbus_mapping_new()函数的使用和说明:
modbus_mapping_t modbus_mapping_new(int nb_bits,int nb_input_bits,int nb_registers,int nb_registers);
modbus_mapping_new()函数需要分配4个数组来存储位、输入位、寄存器和输入寄存器。若不需要为特定类型的数据分配数组,可在参数中传递0值,关联指针则为NULL。
该函数返回一个modbus_mapping_t指针。

2.modbus_receive()函数的使用和说明:
int modbus_receive(modbus_t *ctx,uint8_t *req);
modbus_receive()函数是Modbus从机端/服务器使用此功能接收和分析主机端/客户机发送的指示请求。

3.modbus_reply()函数的使用和说明:
*int modbus_reply(modbus_t *ctx,const uint8_t *req,int req_length,modbus_mapping_t *mb_mapping);
modbus_reply()函数是对接收到的请求发送响应,先是分析参数中请求req,然后利用ctx来构建和发送响应。此功能是为Modbus 服务器设计的。

4.modbus_mapping_free()函数的使用和说明:
void modbus_mapping_free(modbus_mapping_t *mb_mapping);
modbus_mapping_free()函数将释放mb_mapping_t结构中的四个数组,并最终释放mb_mapping所引用的mb_mapping_t。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM