其乐融融的IT技术小站

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

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

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协议读取设备数据-开源基础软件社区

c文件:

基于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

03

modbus_read_input_registers

04

modbus_read_bits

01

modbus_read_input_bits

02

modbus数据转换函数

函数

转换内容

modbus_get_float_abcd

获取浮点数ABCD

modbus_set_float_abcd

设置浮点数ABCD

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

51CTO 开源基础软件社区

https://ost.51cto.com

赞 ()
分享到:更多 ()

相关推荐

内容页底部广告位3
留言与评论(共有 0 条评论)
   
验证码: