EMS从0到1之数据采集
数据采集
- 写在前面
- Modbus是什么?
- Modbus 的特点
- Modbus 的工作方式
- Modbus 的功能
- 设计思路
- Modbus开源通讯库
- Model&Service
- 要做什么
- Model
- 连接信息类
- 设备数据类
- Service
- 写在结尾
写在前面
这篇文章主要讲解EMS如何实现数据采集
Modbus是什么?
Modbus 是一种通信协议,广泛应用于工业自动化领域,用于在电子设备之间传输信息。它是由 Modicon 公司(现在的施耐德电气的一部分)于1979年发明的,最初是为可编程逻辑控制器(PLC)之间的通信设计的。Modbus 协议因其简单性和可靠性而成为工业通信的标准之一,并且可以在多种物理层和网络拓扑上实现。
Modbus 的特点
开放性:作为一个公开发布的标准,任何人都可以免费使用 Modbus 协议。
简易性:其命令结构相对简单,易于理解和实现。
灵活性:支持多种物理层(如RS-232、RS-485等)和网络层(如以太网),适用于不同的应用场景。
广泛应用:不仅限于PLC,还被用在智能仪表、传感器、驱动器等各种工业设备中。
Modbus 的工作方式
Modbus 协议定义了两种主要的操作模式:
- Modbus RTU (Remote Terminal Unit):
采用二进制编码消息格式,适合串行通信链路(如RS-232或RS-485)。
数据传输效率较高,但对时序要求严格。 - Modbus ASCII (American Standard Code for Information Interchange):
使用文本字符表示消息,便于调试和监控。
比RTU更冗长,但具有更好的容错能力。 - Modbus TCP
Modbus RTU的扩展版本,专门为以太网环境设计。Modbus TCP简化了地址寻址机制,并直接利用现有的以太网硬件和基础设施。
Modbus 的功能
读写数据寄存器:可以读取或写入设备内部的数据寄存器,这些寄存器通常用来存储测量值、设定点、状态信息等。
线圈和离散输入操作:允许客户端设置或查询数字输出(线圈)的状态,以及读取数字输入(离散输入)的状态。
异常处理:当请求的操作无法完成时,服务器会返回一个异常响应给客户端。
设计思路
Modbus开源通讯库
这里我推荐NModbus。
关于轮子的选择,我这边说几点我的经验之谈吧,新手有官方选官方,官方不行选引用最多的,老玩家就比较随意了,选用着最顺手的,也有很多老玩家会魔改一些用的比较多的轮子,来满足自己的需求。
Model&Service
要做什么
首先要明确我们想做什么,我们要通过Modbus协议采集设备的数据,这个过程可以分为几个部分,连接设备,发送指令,接受数据,解析数据。
Model
根据上面的内容,我们首先可以明确我们要创建如下几个类:连接信息类,设备数据类。
连接信息类
通过了解Modbus协议我们可以知道,我们会有两种连接方式,TCP和RTU,所以我们需要创建一个类,这个类中要包含TCP和RTU的连接信息同时还要说明这个连接使用的是那种连接方式
Class DeviceConnectionInfo
{
// TCP连接信息
public string IPAddress {get;set;}
public int IPPort {get;set;}
// RTU连接信息
public string Port {get;set;}
public int BandRate {get;set;}
public int DataBits {get;set;}
public int StopBits {get;set;}
public int CheckMode {get;set;}
public string ConnectionMode {get;set}
}
这样一个简单的设备连接信息类就完成了
设备数据类
设备数据类根据设备不同又可以分为多种,一个储能系统包括但不限于以下设备:BMS,PCS,电表,温度控制,湿度控制,消防。
根据他们的设备属性来创建对应的设备数据类,这里我就不过多赘述了。
Service
数据采集的主要业务流程是设备连接,指令发送,数据接收,数据解析,设备断开,这里是第一个分歧点,是创建多个业务逻辑去分别完成这些工作还是创建一个业务逻辑将这些工作组合起来,这里你可以先按照你的思路来完成你的代码,完成后我们再来讨论。
这里我先说我的结论,我将这5个流程并为了一个完整的业务逻辑来实现。
然后来说为什么,我的出发点是这样的,我觉得一个完整的业务逻辑必须能独立运行,除非必要情况下不依赖于其他业务,如果按照单独流程来创建业务逻辑,那么指令发送和数据接收就是必须相互依赖的独立服务,这违反了我对完整业务逻辑的概念,所以我会将他们作为数据采集一个业务逻辑。同样的我也会将设备连接和设备断开合并,同时在开发过程中我们知道了,设备连接和数据采集其实都需要用到同一个类,那就是ModbusClient,设备连接创建了ModbusClient,数据采集用的也是这个类,所以我会将这两个业务逻辑也合并在一起,作为设备通讯。所以一个数据采集服务中,又拆分出了设备通讯服务,数据解析服务。
写在结尾
可能有同学会比较疑惑,为啥我没有贴出来我的代码,是不是忘记了,这里我统一回复一下,这个系列的文章更多的是讲解思路,代码基本上都是手写的,行数比较多的代码我就没写出来,如果有代码上的问题和疑惑欢迎大家在评论区讨论,天道酬勤,与君共勉!