Linux Modbus协议详解,代码示例

Linux 下的 Modbus 详解

在 Linux 系统中,Modbus 通信可以通过多种方式实现,包括使用开源库(如 libmodbus)或编写自定义代码。Modbus 协议在 Linux 中通常用于工业自动化、设备监控等场景。

Linux 下的 Modbus 实现方式
  1. Modbus RTU :通过串口(如 /dev/ttyUSB0/dev/ttyS0)实现。
  2. 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 通信可以通过 libmodbuspymodbusmbpoll 等工具实现。根据需求选择合适的工具和协议类型(RTU 或 TCP),即可轻松实现 Modbus 通信。

相关推荐
热爱编程的小白白5 小时前
【Playwright自动化】录制生成脚本
运维·自动化
ROCKY_8175 小时前
计算机网络考试考点——应用层
服务器·网络·计算机网络
e***74955 小时前
Modbus报文详解
服务器·开发语言·php
java_logo5 小时前
MySQL Server Docker 容器化部署指南
linux·运维·数据库·docker·容器
运维管理6 小时前
anolis openeuler 文件复制上用命令-学习篇
服务器
I***t7166 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
誰能久伴不乏6 小时前
Linux文件套接字AF_UNIX
linux·服务器·c语言·c++·unix
BJ_Bonree6 小时前
数智先锋 | 核心应用响应时常<1s、多终端崩溃率低至 0.1%!Bonree ONE 赋能蓝月亮应用性能与终端体验双重升级!
运维
张鱼小丸子6 小时前
电脑刷机教程:轻松重装系统指南
运维
a41324476 小时前
如何解决centos上oracle连接问题
linux·oracle·centos