模块化系统
ScadaSystem是一个由众多模块组装而成的低耦合系统,其主程序没有对任何特定种类仪器设备、通信链路、平台、数据库的支持,所有这些功能都在模块中实现。系统定义了以下种类的模块:
- 链路:负责维持通信、收发字节流。
- 存储:负责对接数据库,将数据持久化。
- 采集:负责数据采集。
- 上传:负责数据上传。
- 中间件:负责对采集到的数据进行处理,触发定制化功能。
主程序中对所有模块的调用流程如下图所示:
模块化技术
为实现模块化,其技术实现是使用.NET的反射技术。
建立一个基础类库ScadaBase,其中定义了所有模块的基类。
继承对应的基类,开发模块,编译生成dll。
主线程根据配置,将需要的dll载入内存并实例化。
调用模块方法。
链路模块
链路模块继承于以下接口(为描述方便,接口进行了简化,下同):
class LinkBase { void Initialize(); void Open(); void Close(); void Send(byte[] data); byte[] Receive(); }大多链路原生支持的就是字节流的收发,但某些链路,SDK原生支持的是特定的格式。例如MQTT,要求有主题、负载,而且是订阅模式,这需要在模块中进行转换以适配系统的运行。
采集模块
采集模块继承于以下接口:
class AcquireBase { void Initialize(); void AcquireData(); }在实际应用中,被采集的设备可分为以下几类:
需要请求,然后回复数据
无需发送请求,主动发送数据
请求和回复并存,不一定存在关联
对于每一类,开发出具体的基类,然后采集模块再继承这几个基类。
上传模块
上传模块继承于以下接口:
class UploadBase { void Initialize(); void UploadData(); }在实际应用中,上传情况可分为以下几类:
- 定时或在数据发生改变时,主动上传数据
- 需要平台请求,才回复数据
对于每一类,开发出具体的基类,然后上传模块再继承这几个基类。
存储模块
存储模块继承于以下接口:
class StoreBase { void Initialize(); void StoreData(); void QueryData(); }在实际应用中,触发存储的时机可分为以下几类:
- 定时或在特定时间点存储数据
- 在数据发生改变时存储数据
- 自定义存储时机
对于每一类,开发出具体的基类,然后存储模块再继承这几个基类。