4

基于OpenHarmony 系统通过Modbus协议读取设备数据

 10 months ago
source link: https://www.51cto.com/article/759449.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
29bb494679f06aca912614a08b9603fe980e5f.png

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com

Modbus简介

原文链接:链接

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

Modbus RTU(Remote Terminal Unit 远程终端单元):这种方式常采用RS-485做为物理层,一般利用芯片的串口实现数据报文的收发,报文数据采用二进制数据进行通信。

Modbus TCP/IP 或 Modbus TCP :这是一种 Modbus 变体版本,使用 TCP/IP 网络进行通信,通过 502 端口进行连接。报文不需要校验和计算,因为以太网底层已经实现了CRC32 数据完整性校验

Modbus RTU

地址:取值范围是0-247,如果是0,就是主站广播报文;如果是1-247,则有可能是主站请求或者从站应答。

功能码:也就是报文命令,代表主站对从站的操作,读或者写。

数据:数据字段,主请求报文,从应答报文会有所差异。也就是说假设抓取总线报文,如何区分是主站请求还是从站应答,则需要通过数据字段进行区分了。

CRC校验:采样CRC16,16位循环冗余校验。

部分功能码解析

1、功能码 –读线圈状态

  • 主机发送:01 01 00 01 00 08 6C 0C
  • 从机回复: 01 01 01 2F 10 54
  • 主机解析:01 地址(设备ID)
01  功能码;

            00 01  代表查询的起始线圈地址,即从0001线圈开始查询。

            00 08 查询线圈数量。

            6C 0C 循环冗余校验。

从机解析:01 地址(设备ID)。

01  功能码;

            01  代表后面数据的字节数。

            2F    读取以0001线圈开始的8个线圈的状态。0x2F二进制为00101111,对应状态为1111                         0100

            10 54 循环冗余校验。

2、功能码 –-读离散输入寄存器

功能:读离散输入寄存器,位操作,可读单个或多个,类似功能码0X01。

3、功能码 –-读保持寄存器的值

  • 主机发送:01 03 00 01 00 01 D5 CA
  • 从机回复: 01 03 02 00 01 79 84
  • 主机解析:01 地址(设备ID)
03  功能码;

            00 01  代表查询的起始寄存器地址,即从0001寄存器开始查询。

            00 01 查询寄存器数量。

            D5 CA 循环冗余校验。

从机解析:01 地址(设备ID)。

03  功能码;

            02  代表后面数据的字节数。

            00 01 查询0001寄存器的值。

            79 84 循环冗余校验。

4、功能码 –-读输入寄存器

功能:读输入寄存器,字节操作,可读单个或多个,类似功能码0X03。

5、功能码 –-写单个保持寄存器

功能:对单个线圈进行写操作,位操作,只能写一个。写入0xFF00表示将线圈置为ON,写入0x0000表示将线圈置为OFF,其它值无效。

主机发送数据:从站地址+功能码+寄存器起始地址+数据值+校验码

    从站应答数据:从站地址+功能码+寄存器地址+写入值+校验码

6、功能码 –-写单个保持寄存器

  • 主机发送:01 06 00 02 00 01 E9 CA
  • 从机回复: 01 06 00 02 00 01 E9 CA
  • 主机解析:01 地址(设备ID)
06  功能码;

            00 02  代表待写入的起始寄存器地址,即从0002寄存器开始写数据。

            00 01 写入的寄存器的值。即给0002寄存器写入0001

            E9 CA 循环冗余校验。

从机解析:01 地址(设备ID)。

06  功能码;

            02  代表后面数据的字节数。

            00 01 查询0001寄存器的值。

            E9 CA 循环冗余校验。

7、功能码 –-写多个线圈状态

  • 主机发送:01 0F 00 01 00 07 01 6B B2 B9
  • 从机回复: 01 0F 00 01 00 07 45 C9
  • 主机解析:01 地址(设备ID)
0F  功能码;

            00 01  代表待写入的起始线圈地址,即从0001线圈开始写数据。

            00 07 待写入的线圈的数量。

            01 后面写入数据的字节数。

            6B写入寄存器的值,即11010110。二进制01101011

            B2 B9 循环冗余校验。

从机解析:01 地址(设备ID)。

0F  功能码;

            00 01  代表待写入的起始线圈地址,即从0001线圈开始写数据。

            00 07 待写入的线圈的数量。

            45 C9 循环冗余校验。

8、功能码 – 写多个保持寄存器

  • 主机发送:01 10 00 04 00 03 06 00 01 00 00 00 01 5B 55
  • 从机回复: 01 10 00 04 00 03 C1 C9
  • 主机解析:01 地址(设备ID)
10  功能码;

            00 04  代表待写入的起始寄存器地址,即从0004寄存器开始写数据。

            00 03 待写入的寄存器的数量。

            06 后面写入数据的字节数。

         0001,0000,0001写入寄存器的值。即给0004,0005,0006寄存器分别写入0001,0000,0001

            5B 55 循环冗余校验。

从机解析:01 地址(设备ID)。

10  功能码;

            00 04  代表待写入的起始寄存器地址,即从0004寄存器开始写数据。

            00 03 待写入的的寄存器的值。即给0004,0005,0006寄存器分别写入0001,0000,0001

            C1 C9 循环冗余校验。

在OpenHarmony上面使用Modbus

原文链接:链接

加入Modbus C++库libmodbus

适配文件在当前目录下的cpp文件夹中。

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

把上面文件加入编译:

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

Modbus TCP

配置Modbus信息

设置IP和端口号以及DeviceID。

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

设置数据地址和长度。

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

把测试代码执行起来

引入测试代码库。

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

初始化Modbus连接。

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

读取数据。

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

基于OpenHarmony 系统通过Modbus协议读取设备数据-开源基础软件社区

Modbus RTU

Modbus RTU主要是通过RS485或者232接口读取数据的modbus协议。

libmodbus库函数解析

功能码函数:

modbus_read_registers

modbus_read_input_registers

modbus_read_bits

modbus_read_input_bits

modbus数据转换函数

modbus_get_float_abcd

获取浮点数ABCD

modbus_set_float_abcd

设置浮点数ABCD

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK