目录
一、协议基本原理
Modbus 是一种串行通信协议,用于工业自动化系统中的数据传输。它被广泛应用于监控和控制设备。Modbus 协议由 Modicon(现在是施耐德电气的一部分)在 1979 年开发,用于其 PLC(可编程逻辑控制器)中。它是一种开源协议,可以在不同类型的网络和设备中使用。
它是用于在电子设备之间的串行线路上传输信息的方法。请求信息的设备被称为 Modbus 客户端(即主站),提供信息的设备是 Modbus 服务器(从站),在标准 Modbus 网络中,有一个客户端和多达 247 个服务器,每个服务器都有从1到 247 的唯一服务器地址。客户端还可以向服务器写入信息。
1. Modbus 协议类型
Modbus 协议有多种变体,主要包括:
Modbus RTU(Remote Terminal Unit):
- 通信方式:串行通信,常通过 RS-232 或 RS-485 接口实现。
- 数据格式:数据以二进制形式传输,使用 CRC 校验。
- 特点:适用于点对点或多点通讯,能够处理较长的传输距离和较高的数据传输速度。
Modbus ASCII(American Standard Code for Information Interchange):
- 通信方式:串行通信,类似于 Modbus RTU,但数据以 ASCII 编码形式传输。
- 数据格式:数据以 ASCII 码形式传输,使用 LRC 校验。
- 特点:数据易于调试和查看,但相较于 RTU,传输效率较低。
Modbus TCP/IP:
- 通信方式:基于以太网的 TCP/IP 协议进行通信。
- 数据格式:数据在 IP 网络中传输,使用 TCP 作为传输层协议。
- 特点:支持更快的数据传输速度和更复杂的网络架构,适合局域网和广域网。
Modbus Plus:
- 通信方式:专有的串行网络协议,主要用于 Modicon PLC。
- 数据格式:不同于 RTU 和 ASCII,使用专有的通讯协议。
- 特点:主要用于特定设备和应用场景。
2. Modbus 主要特性
- 主从结构:Modbus 协议基于主从结构,一个主设备(通常是控制系统)和多个从设备(传感器、执行器等)。
- 功能码:Modbus 使用功能码来标识请求的操作类型,如读取寄存器、写入寄存器等。功能码的范围通常为 1 到 255。
- 数据单位:数据通过寄存器传输,寄存器分为不同类型,如保持寄存器、输入寄存器、离散输入和线圈。
- 地址:每个设备和寄存器都有唯一的地址,主设备通过这些地址进行数据访问。
3. Modbus通信原理及流程
因为目前网上已经有很多优秀的文章讲的十分清晰,所以我这里就不做无意义工作了,把我看过的觉得讲的不错的一些文章分享给大家:
详解Modbus通信协议—清晰易懂
Modbus技术文章
Modbus基本原理
这里给大家分享下协议中文版文档:
链接:https://pan.baidu.com/s/1ubd3RoYD5GtAquWHq7_uAA
提取码:ozrh
--来自百度网盘超级会员V7的分享
二、开源库资源
在 Linux 系统上,Modbus 通讯协议的开源库有几个比较流行的选择,常见的有:
1. libmodbus
- 简介:
libmodbus
是一个广泛使用的 C 语言库,用于实现 Modbus 协议。它支持 Modbus RTU、Modbus TCP 和 Modbus ASCII。 - 特点:
- 易于使用且功能全面。
- 支持同步和异步操作。
- 提供了丰富的文档和示例代码。
- 官方网站:stephane/libmodbus
- 安装:可以通过源代码编译或使用包管理工具安装(例如在 Debian/Ubuntu 上使用
sudo apt-get install libmodbus-dev
)。
2. modbus-tk
- 简介:
modbus-tk
是一个 Python 的 Modbus 库,旨在简化 Modbus 通讯的实现。支持 Modbus RTU 和 Modbus TCP。 - 特点:
- 使用 Python 编写,适合需要快速开发和脚本化的场景。
- 支持同步和异步模式。
- 官方网站:modbus-tk GitHub
- 安装:可以通过 Python 包管理工具
pip
安装:pip install modbus-tk
。
3. pymodbus
- 简介:
pymodbus
是另一个 Python 实现的 Modbus 库,支持 Modbus RTU、Modbus TCP 和 Modbus ASCII。 - 特点:
- 功能全面,适合需要复杂 Modbus 通讯的应用。
- 提供了详细的文档和示例。
- 官方网站:pymodbus GitHub
- 安装:可以通过 Python 包管理工具
pip
安装:pip install pymodbus
。
4. Modbus Master/Slave
- 简介:
Modbus Master/Slave
是一个基于 C 的库,支持 Modbus RTU 和 Modbus TCP。它提供了用于创建 Modbus 主机和从机的功能。 - 特点:
- 提供了主机和从机的功能实现。
- 使用较为简单。
- 官方网站:Modbus Master/Slave GitHub
5. libmodbus-py
- 简介:
libmodbus-py
是一个 Python 绑定库,用于调用libmodbus
的功能。 - 特点:
- 提供了对
libmodbus
的 Python 绑定,适合希望在 Python 中使用libmodbus
的用户。
- 提供了对
- 安装:可以通过 pip 安装:
pip install libmodbus-py
。
三、Linux:交叉编译libmodbus
重复制造就是垃圾,所以这里推荐下其他大神的教程:libmodbus交叉编译静态库
#include <modbus.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *Argv[])
{
modbus_t *mb;
uint16_t tab_reg[32];
int rc;
// 创建 Modbus RTU 上下文
mb = modbus_new_rtu("/dev/ttyS0", 9600, 'N', 8, 1);
if (mb == NULL)
{
fprintf(stderr, "Failed to create the libmodbus context\n");
return -1;
}
// 设置从机地址
modbus_set_slave(mb, 1);
// 连接到串口
if (modbus_connect(mb) == -1)
{
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(mb);
return -1;
}
// 读取保持寄存器
rc = modbus_read_registers(mb, 0, 10, tab_reg);
if (rc == -1)
{
fprintf(stderr, "Read failed: %s\n", modbus_strerror(errno));
} else
{
for (int i = 0; i < rc; i++)
{
printf("Register %d: %d\n", i, tab_reg[i]);
}
}
// 关闭连接
modbus_close(mb);
// 释放资源
modbus_free(mb);
return 0;
}
欢迎大家指导和交流!如果发现任何错误或遗漏,烦请立即指正,期待与大家一同进步!