对象” 是 MixIOT 体系中最重要的概念,也是整个 MixIOT 的基础,MixIOT 体系中的所有工作,都是围绕 “对象” 开展和进行的。在 MixIOT 体系中,我们所说的 “数据”,一定是有所本,这个 “本”,就是“对象”。

我们以佳华瓦斯电站为例,来说明 “对象” 到底是什么。这是一张佳华瓦斯电站的总体图,在 “终端管理” 应用里面,已经完成了数据终端对接以及数据采集。

如果只从 “参数” 或 “数据” 的角度来看,这张图描述的内容,实际上是有两层意思。

(一)参数

第一层意思是客观存在的 “参数”。

纳入到物联网系统的这些客观存在的东西,无论是发电机组、温度压力表、甲烷浓度测定仪还是并网电量表,它们都有自己特有的属性数据。如下图:

发电机组的属性数据就很多,比如 “一体阀开度反馈值”、“发动机转速”等等。通过发电机组的数据表就可以知道,这样的属性数据有103个之多。

干管前端和末端的温度压力表,属性数据只有两个,介质的温度和压力;瓦斯 CH4浓度测量表的属性数据只有一个,就是浓度百分比;并网电量表的属性数据也只有一个,就是并网电量累计读数。

“属性数据”,就是这些客观存在(发电机组、温度压力表、甲烷浓度测定仪、并网电量表)的 “参数”。这些“参数”在某一个具体时刻所呈现出来的数值,就叫这些“参数”的“值”。

无论是否参与到工业互联网项目中,这些设备或仪表以及它们的 “参数”、“参数值” 都是客观存在的。“参数” 会以某种形式存在,比如发电机组的数据,就保存在发电机组控制器(PLC)的寄存器里面;而仪器仪表的数据,是存在于某个输出的数据单元里面。

只要是在工业领域工作的人,对这些都应该是非常熟悉的。

(二)适配器键值

第二层意思是数据终端(数据采集设备)的 “适配器键值”。

当使用数据终端(Aprus适配器)对接到对端(发电机组、仪表等)后,就可以利用配置里面的 Lua 程序把对端的 “参数” 获取到。

回顾一下在 “终端管理” 里面,对接发电站的配置(佳华A)里面 Config脚本 (config.lua)是这样写的:

我们只看一个地方:

这个写法的含义是,把发电机组的属性参数 “发动机转速” 获取出来,放到数据终端中名为 “L1_3_223” 的适配器键值(AprusKey)中。

换句话说,“L1 _3 _223” 就是代表发电机组“发动机转速”的适配器键值(AprusKey)。

这样,就可以来完整描述第二层意思:

我们现在应该对数据终端的配置(Lua程序脚本)有了更深的认识。实际上,Config 脚本(cofig.lua)要做的事情,就是把对端的参数从哪儿拿出来,拿出来后放到哪一个适配器键值中。

而 Aprus 脚本(aprus.lua)要做的事情,就是用什么协议保证这些对端的参数可以被拿出来。

数据终端(Aprus适配器)获取到这些数据后,就按配置的要求,把实际数据放到适配器键值里面,发送到MixIOT平台。

那么,当这些 “适配器键值” 数据被发送到 MixIOT 平台上的时候,在 MixIOT 平台上看到的景象就变成了:

可以这样来解读:

  • 编号为AX20230423202的数据终端的 “L1_3_223” 适配器键值所代表的数据,就是 “2#机组的发动机转速” 这个参数;
  • 编号为AX20230423205的数据终端的 “L1_3_507” 适配器键值所代表的数据,就是 “5#机组的燃气压力” 这个参数;
  • 编号为AX20230423501的数据终端的 “L1_2_101” 适配器键值所代表的数据,就是 “瓦斯CH4浓度” 个参数;
  • 编号为AX20230423301的数据终端的 “L1_1_104” 适配器键值所代表的数据,就是 “4#机组的并网发电量” 这个参数;
  • 编号为AX20230423401的数据终端的 “L1_1_131” 适配器键值所代表的数据,就是 “干管前端压力” 这个参数;
  • 编号为AX20230423402的数据终端的 “L1_1_143” 适配器键值所代表的数据,就是“干管末端温度” 这个参数;
    …….

所以,这第二层的意思的本质,就是把 “设备的参数” 转换成了数据终端的 “适配器键值”。

(三)报文

这从数据终端详情中的 “报文” 中就可以直观地看到:

数据终端就这样按所设定的时间间隔,把所采集到的数据,以 {“AprusKey”:“数值”} 的形式,把数据上报到 MixIOT 平台。 MixIOT 平台也就有了源源不断来自于所有数据终端的数据。

(四)核心载体

到现在为止,“数据” 好像是有了。但这些 “数据”,仅仅是 “数据”,还不能称之为是 “一个有机整体” 的数据。换言之,这些数据还缺乏一个 “核心载体”,使得这些 “数据” 成为这个 “核心载体” 的数据。

这个 “核心载体”,就是 “MixIOT对象”

那么,什么是 MixIOT 对象?

在回答这个问题之前,还是回到佳华瓦斯电站:

需要明确一个问题,我们打算对 “佳华瓦斯电站” 做些什么?

如果我们要实时监控1#机组的28个关键参数数据情况,也就是说,只希望对1#机组的重要参数进行监控,那么,就可以把1#机组的这28个关键参数构成一个对象。

我们把这个对象命名为 “1#机组关键参数对象”。这些关键参数完全能代表1#机组的运行状态, 当然也可以把这个对象命名为 “1#机组”。
把这个关系捋一下。

1#机组本身有103个参数:

数据终端通过 Lua 脚本,对其中49个参数进行了采集:

在 Lua 脚本中,就确定了这些参数对应的 AprusKey。

采集的数据以报文形式,保存在MixIOT平台数据系统:

到了这一步,说明 MixIOT 平台中,已经形成了数据终端报文的原始数据。

如果要查询什么数据,只要知道哪一个终端的哪一个AprusKey就行。

所以:

“1#机组燃气压力” <= 等价于 => AprusID = “AX20230423201”,AprusKey =“L1 _3 _507”

同理:

“1#机组燃气温度” <= 等价于 => AprusID = “AX20230423201”,AprusKey = “L1_3 _511”
“1#机组增压压力” <= 等价于 => AprusID = “AX20230423201”,AprusKey = “L1 _3 _519”
…..
“1#机组增压温度” <= 等价于 => AprusID = “AX20230423201”,AprusKey =“L1 _3 _515”

……

最后,选择了32个参数形成了我们需要的对象(1#机组):

对 “1#机组” 这个对象而言,我们用 “对象变量” 来描述,也就是说,描述 “1#机组” 这个对象的方式就不再跟 “终端” 和 “AprusKey” 有关系了。

如果用 “S01”、“S02”、“S03”、……、“S31” 和 “S32” 这 32个变量名,分别代表 “1#机组” 这个对象的 “一体阀开度反馈值”、“主燃气阀开度反馈值”、“辅燃气阀开度反馈值”、……、“运行时间(小时)” 和 “运行时间(分钟)”。

一旦这个关系形成,事情就变得清晰和简单了。我们希望研究什么,就把它 “塑造” 成一个 MixIOT 对象,只需要去关注这个对象的变量就行,而无需再去关心这些变量数据都是从哪里来的。

这时,我们也许还会觉得这个 “1#机组对象”,跟真实存在的 “1#机组设备” 没有什么区别,只是数据少了些而已。没错,因为这个 “1#机组对象” 本来就是用来实时监控1#机组设备运行的。

还是回到佳华瓦斯电站的数据图:

如果我们现在想要掌握整个电站的 “工况条件与生产”情况,包括:

(1)机组的运行功率设定情况(每台机组的J功率预设值);
(2)实际运行功率情况(每台机组的有功功率、无功功率);
(3)机组的产能情况(每台机组的并网发电量);
(4)燃气供应情况(干管两端压力和温度);

以及

(5)燃气条件(瓦斯CH4浓度)。

(五)对象变量与适配器键值之间的映射关系

那么,我们就构建一个名为 “电站工况条件与生产” 对象。这个对象可以这些对象变量来描述:

——机组产能设定——
变量J1 ,代表1#机组J功率预设值,其数据来自终端AX20230423201的L1_3_475键值;
变量J2 ,代表2#机组J功率预设值,其数据来自终端AX20230423202的L1_3_475键值;
变量J3 ,代表3#机组J功率预设值,其数据来自终端AX20230423203的L1_3_475键值;
变量J4 ,代表4#机组J功率预设值,其数据来自终端AX20230423204的L1_3_475键值;
变量J5 ,代表5#机组J功率预设值,其数据来自终端AX20230423205的L1_3_475键值;

——-机组实际运行功率—–
变量X1 ,代表1#机组有功功率,其数据来自终端AX20230423201的L1_3_593键值;
变量Y1 ,代表1#机组无功功率,其数据来自终端AX20230423201的L1_3_595键值;
变量X2 ,代表2#机组有功功率,其数据来自终端AX20230423202的L1_3_593键值;
变量Y2 ,代表2#机组无功功率,其数据来自终端AX20230423202的L1_3_595键值;
变量X3 ,代表3#机组有功功率,其数据来自终端AX20230423203的L1_3_593键值;
变量Y3 ,代表3#机组无功功率,其数据来自终端AX20230423203的L1_3_595键值;
变量X4 ,代表4#机组有功功率,其数据来自终端AX20230423204的L1_3_593键值;
变量Y4 ,代表4#机组无功功率,其数据来自终端AX20230423204的L1_3_595键值;
变量X5 ,代表5#机组有功功率,其数据来自终端AX20230423205的L1_3_593键值;
变量Y5 ,代表5#机组无功功率,其数据来自终端AX20230423205的L1_3_595键值;

——-机组实际产出—–
变量P1 ,代表1#机组并网电量,其数据来自终端AX20230423301的L1_1_101键值;
变量P2 ,代表2#机组并网电量,其数据来自终端AX20230423301的L1_1_102键值;
变量P3 ,代表3#机组并网电量,其数据来自终端AX20230423301的L1_1_103键值;
变量P4 ,代表4#机组并网电量,其数据来自终端AX20230423301的L1_1_104键值;
变量P5 ,代表5#机组并网电量,其数据来自终端AX20230423301的L1_1_105键值;

——-实际燃气条件—–
变量FP ,代表干管前端压力,其数据来自终端AX20230423401的L1_1_131键值;
变量FT ,代表干管前端温度,其数据来自终端AX20230423401的L1_1_143键值;
变量EP ,代表干管末端压力,其数据来自终端AX20230423402的L1_1_131键值;
变量ET ,代表干管末端温度,其数据来自终端AX20230423402的L1_1_143键值;
变量GD ,代表瓦斯CH4浓度,其数据来自终端AX20230423501的L1_1_101键值。

不难发现,这个 “电站工况条件与生产” 对象,并没有像之前的 “1#机组” 对象那样,与电站的1#机组有一个非常强的对应关系。而且非常有意思的是,这个对象有25个变量,但却涉及该电站的全部9个数据终端。

最重要的是,这个 “电站工况条件与生产” 对象并非是一台或几台 “设备”,但从这个对象的变量就不难看出来,它可以完美诠释佳华电站在当前的燃气条件下,产能是如何设定的,机组是怎么运行的,实际产出又是怎样的。

这个 “电站工况条件与生产” 对象具体是什么好像也说不清楚,其实这 就MixIOT 的魅力所在:对象可以很具体,也可以很抽象,它可以是这个,也可以是那个,可以是任何东西。

“对象” 之所以如此无所不能,就是因为构成 “对象” 的 “变量” 集合是柔性多变。这就是为什么我们把 MixIOT 对象变量成为 FV(Flexible Variable,柔性变量)。

FV 的取名并没有什么特别限制,字母开头,字母数字下划线,只要没有特殊字符就行,长度限制为32个字符之内。如果简单起见,就跟前一个对象一样,用 S01、S02、……、S32。

如果要讲究一点,就可以像第二个对象一样,用一些有意义的字母。比如,J1 就是1#机组J功率预设值,这就有点意思了,同理,J2、J3、J4、J5,不用说我们也知道是什么。

X1、Y1,分别是1#机组有功功率、无功功率,“X-Y” 对应 “有-无”,也很合理。

P1 是1#机组实际产量,P 是 Production,也很合适。

剩下的用两个字母代表含义:

FP(Front Pressure) 前端压力;
FT(Front Temperature) 前端温度;
EP(End Pressure)末端压力;
ET(End Temperature)末端温度;
GD(Gas CH4 Density)甲烷CH4浓度。

(六)对象的独立性

MixIOT 对象的创立,标志着从客观存在(如设备,产线,仪器仪表等)的原始 “参数”、到经过数据采集后的 “键值”、最后再到对象的 “FV(变量)” 这一过程。

这个过程的变化遵守一种对应关系,我们称这种关系为 “映射关系(Mapping Correspondence)”, 通常简称为 “映射(Mapping)”

回到之前的“1#机组”这个对象看一下:对象变量 “S01~S32” 与 AprusKey 之间的对应关系,就是一个 “映射关系”:

在考虑映射关系的时候,实际上已经不需要再去关注电站的发电机组设备(客观存在)了, 只需要明确数据终端的 “键值(AprusKey)” 以及其含义就可以了。

同理,我们也可以构造一个“2#机组”对象:

很容易发现,对象“2#机组”与对象“1#机组”的对应关系是一样的,只是“数据终端”不一样。

回顾一下我们在“终端管理”里面完成的工作,就很清楚了,因为每台机组都用了一个数据终端去对接,但这些数据终端的“配置”是一样的,也就是说,每台机组经过这些数据终端采集什么,都是一样的。

也就是说,一个相同的映射关系下,有五个不同的对象。

而“电站工况条件与生产”这个对象,一个映射关系下,就只有一个对象。

如果还没有忘记 “终端管理” 应用是怎么回事的话,那么就一定可以联想到,这个逻辑非常类似终端的配置。如果把 “对象” 看作是 “终端”,“对象的映射关系” 就相当于 “终端的配置”。

实际上,这个逻辑是相似的:一个 “终端” 是某个 “终端配置” 的具体实例。

所以,一个 “对象” 就是某个 “对象映射关系” 的具体实例。

文档更新时间: 2024-07-11 21:26   作者:Mixiot