简介

  • ModBus 相关理论知识

Contexts 上下文 资源句柄

  • 使用 modbus_new_rtu 申请,返回一个 modbus_t ,它包含所有必要的数据

modbus 协议 详解

Modbus(Modular Communications System)是一种通信协议,用于在不同设备之间进行数据通信和控制。它通常用于工业自动化领域,用于连接和控制各种设备,如传感器、执行器、PLC(可编程逻辑控制器)等。Modbus协议的详解包括以下几个方面:

  1. 协议类型
    • Modbus RTU:基于串行通信,以二进制格式传输数据。
    • Modbus ASCII:也是基于串行通信,但以ASCII字符形式传输数据。
    • Modbus TCP:基于TCP/IP网络通信,用于以太网连接。
  2. 通信方式
    • Modbus是主从(Master-Slave)协议,其中有一个主设备(主站)可以向多个从设备(从站)发送请求,并接收它们的响应。
    • 主站发出请求,从站回应请求,并提供所需的数据。
  3. 数据格式
    • Modbus通信包括读(读取从站的数据)和写(向从站写入数据)操作。
    • 请求和响应消息通常包括功能码、数据字段、CRC校验等部分。
  4. 寄存器
    • Modbus协议使用寄存器来表示数据,寄存器可以是输入寄存器、保持寄存器、输入状态、线圈状态等不同类型。
    • 输入寄存器通常用于表示只读数据,如传感器读数。
    • 保持寄存器通常用于表示读写数据,如控制器的设置参数。
  5. 功能码
    • 功能码用于指定要执行的操作,如读取输入寄存器、写入保持寄存器等。
    • 常见的功能码包括读操作(功能码 3 和功能码 4)和写操作(功能码 6 和功能码 16)。
  6. 异常处理
    • Modbus协议包括异常码,用于指示错误情况,如无效功能码、寄存器不可用等。
    • 异常响应通常包含一个特殊的异常功能码,以及一个描述异常的代码。
  7. 通信速率
    • Modbus RTU和Modbus ASCII的通信速率通常在9600、19200、38400等不同速率之间选择。
    • Modbus TCP通常使用以太网连接,通信速率由以太网规范确定。
  8. 安全性
    • Modbus协议在设计上没有内置安全性,因此在需要安全通信的环境中,通常需要使用其他协议或方法来加强安全性。

总的来说,Modbus协议是一种用于在工业自动化环境中进行设备间通信和控制的标准化协议。它有多种变体和实现,可以根据不同的通信需求和硬件来选择合适的协议类型。 Modbus协议的详细规范可以在Modbus.org等资源中找到。如果需要使用Modbus协议,通常需要查看相关设备的文档以了解如何配置和使用它。

CRC 详解

CRC (Cyclic Redundancy Check) 是一种错误检测码,用于验证数据的完整性。它是一种快速且广泛应用的校验算法,常用于通信协议、存储设备、网络传输等领域。

CRC 的基本原理是通过对数据进行多项式计算来生成校验值,这个校验值称为 CRC 值。发送方在传输数据前,会计算数据的 CRC 值,并将该值附加到数据后面一并传输。接收方在接收到数据后,也会计算接收到的数据的 CRC 值,并与接收到的 CRC 值进行比较。如果两个 CRC 值匹配,表示数据没有出现错误;如果 CRC 值不匹配,表示数据可能在传输过程中发生了错误或被篡改。

CRC 的特点包括:

  1. 快速:CRC 是一种非常快速的校验算法,适用于实时数据传输和处理。

  2. 简单:CRC 的实现相对简单,通常用位操作来处理数据和多项式计算。

  3. 检测能力:CRC 能够检测不少常见的错误,但并不是绝对可靠,无法检测所有错误。

  4. 冗余:CRC 增加了一定的冗余数据,用于检测错误。

在使用 CRC 时,需要事先定义一个生成多项式。不同的 CRC 标准使用不同的多项式,常见的标准有 CRC-16、CRC-32 等。选择合适的 CRC 标准取决于具体应用的要求。

总体而言,CRC 是一种简单、高效且广泛应用的错误检测码。它在数据传输和存储中起着重要的作用,帮助保障数据的完整性和可靠性。

linux libmodbus 库 详解

libmodbus 是一个用于通信协议 Modbus 的开源C库,用于实现 Modbus 协议的通信。Modbus 是一种通信协议,用于连接工业自动化设备,使它们能够在不同设备之间进行数据传输。以下是关于 libmodbus 库的详细信息:

安装 libmodbus 库

你可以使用你的 Linux 发行版的包管理器来安装 libmodbus 库。例如,如果你使用的是 Ubuntu,可以使用以下命令安装:

1
sudo apt-get install libmodbus-dev

使用 libmodbus 库

以下是一些关于 libmodbus 库的基本使用方法和功能:

  1. 创建 modbus 上下文

    1
    
    modbus_t* ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
    

    在这个示例中,我们创建了一个用于串口通信的 Modbus 上下文。

  2. 连接到 Modbus 设备

    1
    2
    3
    4
    5
    
    if (modbus_connect(ctx) == -1) {
        perror("Connection failed");
        modbus_free(ctx);
        return -1;
    }
    

    使用 modbus_connect 函数连接到 Modbus 设备。

  3. 读取和写入 Modbus 寄存器

    1
    2
    3
    4
    5
    
    uint16_t data[5];
    int num = modbus_read_registers(ctx, 0, 5, data);
       
    uint16_t value = 1234;
    modbus_write_register(ctx, 10, value);
    

    使用 modbus_read_registers 函数读取寄存器数据,使用 modbus_write_register 函数写入寄存器数据。

  4. 关闭连接并释放资源

    1
    2
    
    modbus_close(ctx);
    modbus_free(ctx);
    

    在完成通信后,使用 modbus_close 函数关闭连接,并使用 modbus_free 函数释放资源。

  5. 其他功能

    libmodbus 还提供了其他一些功能,如 Modbus TCP/IP 支持、异常处理、不同寄存器类型的读写等。

libmodbus 库使得在 Linux 下实现 Modbus 协议通信变得更加容易。你可以查阅官方文档或在线教程,深入了解 libmodbus 库的更多功能和用法。在编程中,你可以根据需要使用合适的函数来实现 Modbus 通信,并根据通信需求进行相应的设置和处理。

linux libmodbus 库 使用 详解 示例

下面是一个使用 libmodbus 库进行 Modbus 通信的简单示例。在这个示例中,我们将使用 Modbus RTU 通信协议通过串口与 Modbus 设备通信,并读取一些寄存器的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <modbus.h>

int main() {
    modbus_t *ctx;
    uint16_t data[5];

    // 创建 Modbus 上下文,串口路径为 "/dev/ttyUSB0",波特率为 9600
    ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
    if (ctx == NULL) {
        fprintf(stderr, "Unable to create Modbus context\n");
        return 1;
    }

    // 连接到 Modbus 设备
    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return 1;
    }

    // 读取寄存器数据,起始地址为 0,读取 5 个寄存器
    int num = modbus_read_registers(ctx, 0, 5, data);
    if (num == -1) {
        fprintf(stderr, "Read error: %s\n", modbus_strerror(errno));
        modbus_close(ctx);
        modbus_free(ctx);
        return 1;
    }

    // 打印读取的寄存器值
    for (int i = 0; i < num; i++) {
        printf("Register %d: %d\n", i, data[i]);
    }

    // 关闭连接并释放资源
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}

在这个示例中,我们首先创建了一个 Modbus 上下文 ctx,然后使用 modbus_connect 函数连接到 Modbus 设备。接着,使用 modbus_read_registers 函数读取起始地址为 0 的连续 5 个寄存器的值。最后,我们打印出读取的寄存器值,并在完成通信后关闭连接和释放资源。

请注意,此示例是一个基本的用法演示。在实际应用中,你可能需要根据 Modbus 设备的配置和通信需求进行适当的设置和处理。