二、数据模型
整个SCADA系统,其功能其实是对数据流动的控制,如下图所示:
(1)采集模块是系统的入口,所有数据来自采集模块。
(2)采集到的数据是实时变化的,而数据库可能要求1分钟或1小时存放一条数据,这时候需要对数据进行采样。
(3)原始数据或许只是数字,而我们在展现时,会要求显示单位、保留一定的小数位数,又或者,什么数字代表什么状态,这就要求对数据进行一定的格式化。
(4)数据经过整理之后,按照一定的通信协议上传至服务器。
那作为系统核心的数据,究竟以怎样的格式进行存放呢?
上位机对一台仪器的操作,无非包含以下几项内容:
(1)读取其测量数值。
(2)读取其状态。
(3)发送命令,执行某项任务。
可以发现,一般开发语言里的“属性”这一概念,刚好能表达上述内容。例如:
public double Temperature { get; set; }
public string RunningState { get; set; }
private int runningMode;
public int RunningMode
{
get
{
return runningMode;
}
set
{
runningMode = value;
//执行其他动作
}
}
我们转换一下名称,把设备的所有这些属性,称为“因子”。存在3种主要类型的因子:
测量因子:代表仪器的测量值,例如温湿度计的温度值、湿度值。
状态因子:代表仪器的状态,例如仪器是否正在运行、是否在线等。
反控因子:代表对仪器的操作,例如关闭仪器、调高温度等。
那么,代表仪器的数据,都具有以下的形式:
设备名.因子名 = 值
我们可以使用一个列表List,或一个字典Dictionary,去存储这一形式的数据。
采集模块,需要把各种各样的仪器数据,整理成上述形式。同时,需要把上述形式的数据,解析成仪器具体的数据类型。例如,某个温湿度计,在地址为6的寄存器上,存放了温度的10倍整数值。那么,采集模块应该完成以下的工作:
温湿度计.温度=(地址为6的寄存器值)/10。
上式的等号,在代码里面就是读寄存器。
然后,当我们要设定一个值时,其完成的工作就是:
(地址为6的寄存器值)=温湿度计.温度*10
上式的等号,在代码里面就是写寄存器。
在采集模块开发完成以后(我们在下一章讲述采集模块的开发细节),上层模块操作数据的方式就变得非常简单明了了。举个例子,组态模块的开发:当我们要在某个地方显示温度时,可以拖一下文本框到那个地方,然后把文本框的内容输入为:{温湿度计.温度}。如果我们想点击一个按钮,即改变当然温度,可以在按钮的命令内容里,写:{温湿度计.温度}=25。