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

相关推荐
花晓木11 分钟前
SSH无法启动问题:OpenSSL version mismatch. Built against 30000070, you have 30200020
linux·运维·ssh
vvw&23 分钟前
如何在 Ubuntu 22.04 上安装并开始使用 RabbitMQ
java·linux·运维·服务器·spring·ubuntu·rabbitmq
Tfly__30 分钟前
ubuntu 18.04安装GCOPTER(最新)
linux·c++·ubuntu·github·ros·无人机·运动规划
小白也有IT梦1 小时前
Ubuntu 系统配置指南:Fcitx5 输入法与 KDE 桌面环境安装教程
linux·ubuntu
数巨小码人1 小时前
vim文本编辑器常用命令和快捷键
linux·编辑器·vim
皓月盈江1 小时前
Linux Debian安装ClamAV和命令行扫描病毒方法,以及用Linux Shell编写了一个批量扫描病毒的脚本
linux·运维·ubuntu·debian·clamav·开源杀毒
boy快快长大1 小时前
【NebulaGraph】查询案例(六)
java·服务器·数据库
steveqobs1 小时前
Debian-linux运维-locale配置(locale failed)
linux·运维·debian
hahaqi95272 小时前
uniapp生成h5后发布到服务器碰到的问题解决
运维·服务器·uni-app
女王の专属领地2 小时前
产品初探Devops!以及AI如何赋能Devops?
运维·devops