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 通信。

相关推荐
码农学院6 小时前
基于运维监控体系的网络品牌推广方案:从架构设计到技术实现
运维·网络
爱写代码的森12 小时前
鸿蒙三方库 | harmony-utils之ImageUtil图片保存到本地详解
服务器·华为·harmonyos·鸿蒙·huawei
大耳朵-小飞象15 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
极客侃科技15 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
HLC++16 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室17 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
白露与泡影17 小时前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
神奇霸王龙18 小时前
Claude Code屠榜:MiMo与Grok紧追Codex
服务器·网络·人工智能·gpt·ai·ai编程
Web极客码18 小时前
WordPress SEO优化:提升网站排名的13个关键步骤
服务器·seo·wordpress
生活爱好者!19 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器