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

相关推荐
BD_Marathon16 小时前
SpringBoot——辅助功能之切换web服务器
服务器·前端·spring boot
晚风吹人醒.17 小时前
SSH远程管理及访问控制
linux·运维·ssh·scp·xshell·访问控制·远程管理
Uncertainty!!18 小时前
Linux多用户情况下个别用户输入密码后黑屏
linux·远程连接
necessary65318 小时前
使用Clion查看linux环境中的PG源码
linux·运维·服务器
江湖有缘20 小时前
Jump个人仪表盘Docker化部署教程:从0到 搭建专属导航页
运维·docker·容器
小猪佩奇TONY20 小时前
Linux 内核学习(14) --- linux x86-32 虚拟地址空间
linux·学习
Lam㊣20 小时前
Centos 7 系统docker:更换镜像源
linux·docker·centos
FL162386312920 小时前
win11+WSL+Ubuntu-xrdp+远程桌面闪退+黑屏闪退解决
linux·运维·ubuntu
石头53020 小时前
Kubernetes监控全栈解决方案:从零搭建Prometheus+Grafana监控体系
linux
ha204289419420 小时前
Linux操作系统学习记录之---TcpSocket
linux·网络·c++·学习