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

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位循环冗余校验。

部分功能码解析

01功能码 –读线圈状态

主机发送: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 循环冗余校验。

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

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

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

主机发送: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 循环冗余校验。

04 功能码 –-读输入寄存器

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

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

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

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

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

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

主机发送: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 循环冗余校验。

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

主机发送: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 循环冗余校验。

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

主机发送: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文件夹中

库文件

在这里插入图片描述

c文件

在这里插入图片描述

把上面文件加入编译

在这里插入图片描述

Modbus TCP

配置Modbus信息

设置IP和端口号以及DeviceID
在这里插入图片描述

设置数据地址和长度

在这里插入图片描述

把测试代码执行起来

引入测试代码库

在这里插入图片描述

初始化Modbus连接

在这里插入图片描述

读取数据

在这里插入图片描述

运行调试

在这里插入图片描述

Modbus RTU

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

libmodbus库函数解析

功能码函数

函数功能吗
modbus_read_registers03
modbus_read_input_registers04
modbus_read_bits01
modbus_read_input_bits02

modbus数据转换函数

函数转换内容
modbus_get_float_abcd获取浮点数ABCD
modbus_set_float_abcd设置浮点数ABCD
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值