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

相关推荐
丁劲犇17 分钟前
开始在本地部署自己的 Gitea 服务器
运维·服务器·gitea
异常君38 分钟前
Windows 与 Linux 虚拟内存机制对比:设计理念与实现差异
java·linux·windows
bcxwz66943 分钟前
linux 故障处置通用流程-36计-14-27
linux·运维·服务器
孙克旭_44 分钟前
day028-Shell自动化编程-判断进阶
linux·运维·数据库·自动化
vortex51 小时前
浅谈 Linux 防火墙:从原理到实践
linux·网络·php
L.S.V.1 小时前
MYSQL(三)--服务器启动参数与配置
服务器·数据库·mysql
刘大辉在路上1 小时前
群晖NAS套件历史版本资源
服务器·群晖·nas
一介草民丶1 小时前
Jenkins | Jenkins构建成功服务进程关闭问题
运维·servlet·jenkins
蓝牙先生1 小时前
使用yocto搭建qemuarm64环境
linux
藥瓿亭1 小时前
2024 CKA模拟系统制作 | Step-By-Step | 16、题目搭建-sidecar 代理容器日志
linux·运维·docker·云原生·容器·kubernetes·cka