Modbus数据采集方案

  • Post author:
  • Post category:其他



目录


目标


Modbus协议简介


配置界面以及实例


概述

modbus协议应该是工业行业应用最广泛的协议,由于其协议简单、通讯标准、扩展性强的特点,被各个行业大量的应用。作为通讯网关机来说,设计一个便捷易懂的配置方式显得尤其重要。本方案基于modbus的特点,将配置界面分为5大块,分别为缓存配置、遥信配置、遥测配置、遥调配置,通过配置的方式即可实现对数据的读取和转换。

Modbus协议简介

关于modbus协议的介绍网上已经有很多了,这里我只做一个简单的介绍。



对于协议的分析,我有个万能的方法论,它适用于任何行业和任何协议:

  • 所有数据可以将它分为4类数据,分别是DI(数字量输入)、DO(数字量输出)、AI(模拟量输入)、AO(模拟量输出);DI通常指的是开关控指令,比如开关指令;DO指的是开关的状态;AI量指的是温度的调节;AO量指的是温度本身的值。
  • 分析协议,看协议是如何将这4类数据进行传输和编码
  • 分析通讯流程:总体分为平衡式和非平衡式,平衡式为主站端和子站端,都可以发起通讯请求;非平衡式只能是一端发起数据请求,另一端只被动回复;比如Modbus协议就是典型的非平衡式通讯协议,主站发起,子站回复,还有我们之前介绍的IEC103串口协议,也是非平衡式的。平衡式的协议有IEC104、IEC61850-MMS协议。一般来所,通讯媒介为串口的大多为非平衡式,通讯媒介为网口的大多为平衡式。

下面我们来具体分析Modbus协议怎么传输这4类数据。

首先来了解一下寄存器、线圈。寄存器就可以理解为16位的数据、线圈为布尔量。针对这些数据的读取和写入有如下8个功能码,分别对应上述的4类数据的读取和写入。

//DO
0x01: 读线圈寄存器
0x02: 读离散输入寄存器

//AO
0x03: 读保持寄存器
0x04: 读输入寄存器

//DI
0x05: 写单个线圈寄存器
0x0f: 写多个线圈寄存器

//AI
0x06: 写单个保持寄存器
0x10: 写多个保持寄存器

下面看一下示例报文:通过指定读取寄存器的起始地址以及长度就可以读取到任意一个寄存器的值,线圈也类似通过响应的功能码读取。

主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E

//主机发送
01:设备地址
03:功能码
00 00:起始地址
00 01:读取寄存器个数
84 0A:CRC16校验码

//从机回复
01:设备地址
03:功能码
02:字节长度
19 98:寄存器的值(地址为0的寄存器,值为0x1998)
B2 7E: CRC16校验码

配置界面以及实例

如下为一个电表的点表:

首先定义一个读取的缓存,包含以上的寄存器

挑选每一个数据,数据1就为读取到的数据

其他数据的配置跟上述的类似。



版权声明:本文为dubuzherui原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。