一.libmodbus 库
免费的开源的,modbus 开发库,支持 RTU 和 TCP
官网:libmodbus.org
在线文档:https://libmodbus.org/reference/
二.源码简介
项目 | 说明 |
---|---|
doc 目录 | 各 API 接口的详细说明文档 |
src 目录 | 源码都在这个目录下 |
tests 目录 | 自带的测试代码 |
src/win32 目录 | windows 平台下的项目文件(使用 VS) |
Makefile.am | linux 平台下用于生成 makefile 文件 |
Modbus.c | 核心源码 |
Modbus.h libmodbus | 对外暴露的接口文件 |
Modbus-data.c | 实现数据处理的公用函数,比如大小端、位处理 |
Modbus-private.h | libmodbus 内部使用的数据结构和函数声明 |
Modbus-rtu.c | RTU 模式相关的函数定义 |
Modbus-rtu.h | RTU 模式对外提供的 API |
Modbus-private.h | RTU 模式内部使用的数据结构和函数声明 |
Modbus-tcp.c | TCP 模式相关的函数定义 |
Modbus-tcp.h | TCP 模式对外提供的 API |
Modbus-tcp-private.h | TCP 模式内部使用的数据结构和函数声明 |
Modbus-version.h.in | 版本定义 |
三.使用 VS 编译 modbus
- VS2017 WIN32 平台
- 双击 configure.js 进行配置
- 使用 VS 打开解决方案:modbus-9.sln
- 对项目重新生成,编译失败。把 modbus-version.h 从项目中移除,再重新添加 src 目录下
的 modbus-vsersion.h 文件 - 对项目重新生成,编译失败,提示:
- 找不到SDK
- 选择自己已有的SDK版本就行
再次重新生成,得到如下两个库文件:
- modbus.dll
- modbus.lib
以上是调试模式下的库文件,把 VS 设置位 release 模式,重复以上步骤,即可得到 release
版本的库文件。
四.从站设置
- 硬件环境配置
- 使用虚拟串口工具,实现 com5 <——>com6
- Modbus 从站设置:(使用 com6)
- 内容设置
五.vs2017使用modbus
- 导入 libmodbus 相关的库和头文件:
- 源码
#include<stdio.h>
#include"modbus.h"
//代码加载库文件
#pragma comment(lib,"modbus.lib")
int main()
{
//创建一个modbus设备
modbus_t *mb = modbus_new_rtu("com5", 9600, 'N', 8, 1);
//连接
modbus_connect(mb);
//选择modbus 从站的地址,从站地址1是开始就设置好了的
modbus_set_slave(mb, 1);
uint16_t regs[4];
// int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
//80 是起始地址,4是读取个数,regs是用来存储数据的
modbus_read_registers(mb, 80, 4, regs);
modbus_close(mb);
modbus_free(mb);//释放内从
for (int i = 0; i < 4; i++)
{
printf("%d ", regs[i]);
}
return 0;
}
六.问题思考
使用vs编译modbus库文件生成的lib和dll文件是不是相当于.cpp文件
在使用Visual Studio编译Modbus库时生成的 .lib 和 .dll 文件并不相当于 .cpp 文件。它们之间有几个关键的区别:
- 文件类型:
- .cpp 文件是源代码文件,包含用C++编写的程序代码。
- .lib 文件是静态库文件,包含了编译后的函数和对象代码,可以在链接时被静态链接到其他程序中。
- .dll 文件是动态链接库,包含了可执行的代码和数据,可以在运行时被多个程序共享。
- 用途:
- .cpp 文件需要被编译为目标文件(例如 .obj 文件),然后链接成可执行文件或库。
- 使用 .lib 文件时,它会在编译时将库的内容直接嵌入到最终生成的可执行文件中。
- 使用 .dll 文件时,程序在运行时会加载这个文件,节省了内存,并允许多个程序共享相同的代码。
- 代码访问:
- .cpp 文件是可读的源代码,可以查看和修改。
- .lib 和 .dll 文件是编译后的二进制文件,通常不是人类可读的,不能直接修改。
总结来说,.lib 和 .dll 文件是经过编译的代码,提供了可供其他程序使用的功能接口,而.cpp文件是其源代码形式。
实际用法上和.cpp文件是是否相同
在实际用法上,.lib 和 .dll 文件虽然与 .cpp 文件的本质不同,但在某些方面可以被看作是其“实现”或“功能”的载体。具体来说:
- 功能复用:
- .lib 和 .dll 文件提供了在 .cpp 文件中定义的功能或接口。你可以在其他程序中使用这些库的功能,就像在你自己的 .cpp 文件中直接调用那些功能一样。
- 接口定义:
- 当你使用 .lib 或 .dll 文件时,通常还会有一个相应的头文件(.h),其中包含了函数的声明、类的定义等。这些头文件可以在你的 .cpp 文件中被包含,从而使得调用库中的功能变得简单。
- 编程模型:
- 在使用时,程序员并不需要关心这些库的实现细节,只需要调用相应的接口函数,与使用 .cpp 文件中的函数调用方式相似。
- 构建与链接:
- 在使用 .lib 文件时,链接器会将其内容链接到最终的可执行文件中;而使用 .dll 文件时,程序在运行时会动态加载这个库。这两种方式都允许你在代码中使用库提供的功能。
总结来说,虽然在本质和文件结构上有很大不同,但在实现功能和调用接口的使用上,.lib 和 .dll 文件可以认为与 .cpp 文件在某种程度上是类似的,尤其是当我们关注的是它们所提供的功能时。