Linux 下的 Modbus 详解
在 Linux 系统中,Modbus 通信可以通过多种方式实现,包括使用开源库(如 libmodbus
)或编写自定义代码。Modbus 协议在 Linux 中通常用于工业自动化、设备监控等场景。
Linux 下的 Modbus 实现方式
- Modbus RTU :通过串口(如
/dev/ttyUSB0
或/dev/ttyS0
)实现。 - Modbus TCP:通过以太网实现,使用 TCP/IP 协议。
常用工具和库
libmodbus
:一个开源的 Modbus 库,支持 Modbus RTU 和 Modbus TCP。mbpoll
:一个命令行工具,用于测试 Modbus 设备。pymodbus
:Python 的 Modbus 库,支持 Modbus RTU 和 Modbus TCP。
安装依赖
安装 libmodbus
bash
sudo apt update
sudo apt install libmodbus-dev
安装 mbpoll
bash
sudo apt install mbpoll
安装 pymodbus
bash
pip install pymodbus
Modbus RTU 示例(C 语言,使用 libmodbus
)
以下是一个使用 libmodbus
库实现 Modbus RTU 通信的示例。
代码示例
c
#include <stdio.h>
#include <modbus.h>
int main() {
modbus_t *ctx;
uint16_t tab_reg[10];
int rc;
// 创建 Modbus RTU 上下文
ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
if (ctx == NULL) {
fprintf(stderr, "Unable to create the libmodbus context\n");
return -1;
}
// 设置从机地址
modbus_set_slave(ctx, 1);
// 打开串口
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
// 读取保持寄存器(功能码 0x03)
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) {
fprintf(stderr, "Read failed: %s\n", modbus_strerror(errno));
} else {
printf("Read registers: ");
for (int i = 0; i < rc; i++) {
printf("%d ", tab_reg[i]);
}
printf("\n");
}
// 关闭连接并释放资源
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
编译和运行
bash
gcc -o modbus_rtu_example modbus_rtu_example.c -lmodbus
./modbus_rtu_example
Modbus TCP 示例(C 语言,使用 libmodbus
)
以下是一个使用 libmodbus
库实现 Modbus TCP 通信的示例。
代码示例
c
#include <stdio.h>
#include <modbus.h>
int main() {
modbus_t *ctx;
uint16_t tab_reg[10];
int rc;
// 创建 Modbus TCP 上下文
ctx = modbus_new_tcp("127.0.0.1", 502);
if (ctx == NULL) {
fprintf(stderr, "Unable to create the libmodbus context\n");
return -1;
}
// 连接到 Modbus TCP 服务器
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
// 读取保持寄存器(功能码 0x03)
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1) {
fprintf(stderr, "Read failed: %s\n", modbus_strerror(errno));
} else {
printf("Read registers: ");
for (int i = 0; i < rc; i++) {
printf("%d ", tab_reg[i]);
}
printf("\n");
}
// 关闭连接并释放资源
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
编译和运行
bash
gcc -o modbus_tcp_example modbus_tcp_example.c -lmodbus
./modbus_tcp_example
Modbus RTU 示例(Python,使用 pymodbus
)
以下是一个使用 pymodbus
库实现 Modbus RTU 通信的示例。
代码示例
python
from pymodbus.client import ModbusSerialClient
# 配置串口参数
client = ModbusSerialClient(
method='rtu',
port='/dev/ttyUSB0',
baudrate=9600,
timeout=1
)
if client.connect():
print("Connected to Modbus RTU Device")
# 读取保持寄存器(功能码 0x03)
response = client.read_holding_registers(address=0, count=10, unit=1)
if not response.isError():
print("Holding Registers:", response.registers)
else:
print("Error reading holding registers")
# 写单个保持寄存器(功能码 0x06)
client.write_register(address=0, value=123, unit=1)
print("Write single register completed")
# 关闭连接
client.close()
else:
print("Failed to connect to Modbus RTU Device")
Modbus TCP 示例(Python,使用 pymodbus
)
以下是一个使用 pymodbus
库实现 Modbus TCP 通信的示例。
代码示例
python
from pymodbus.client import ModbusTcpClient
# 连接到 Modbus TCP 服务器
client = ModbusTcpClient('127.0.0.1', port=502)
if client.connect():
print("Connected to Modbus TCP Server")
# 读取保持寄存器(功能码 0x03)
response = client.read_holding_registers(address=0, count=10, unit=1)
if not response.isError():
print("Holding Registers:", response.registers)
else:
print("Error reading holding registers")
# 写单个保持寄存器(功能码 0x06)
client.write_register(address=0, value=123, unit=1)
print("Write single register completed")
# 关闭连接
client.close()
else:
print("Failed to connect to Modbus TCP Server")
使用 mbpoll
测试 Modbus 设备
mbpoll
是一个命令行工具,用于测试 Modbus 设备。
读取保持寄存器(Modbus TCP)
bash
mbpoll -a 1 -t 4 -r 0 -c 10 127.0.0.1
读取保持寄存器(Modbus RTU)
bash
mbpoll -a 1 -t 4 -r 0 -c 10 -b 9600 -P none /dev/ttyUSB0
总结
在 Linux 系统中,Modbus 通信可以通过 libmodbus
、pymodbus
或 mbpoll
等工具实现。根据需求选择合适的工具和协议类型(RTU 或 TCP),即可轻松实现 Modbus 通信。