拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台

小 T 导读:工业物联网监控平台极为重要,但对企业而言,自研耗时耗力,研发高手不好找,开发出来还不一定好用;现成的解决方案太贵,直接拿来用不一定适合……很多企业的管理者提到监控平台就头疼。图扑物联将自己的底层平台IoTop与高效、高速的TDengine Database无缝集成,无需高手彻夜“肝”,零门槛,即使是菜鸟,从上手到完成只需10分钟,就能搭建一款炫酷的工业物联网监控平台。

应用场景

在物联网、工业互联网领域,任何一个项目的实现都离不开两部分:数据和展示。

对于工业生产监测数据的展示,图扑已经积累了很成熟的基于HTML5的2D、3D数据可视化技术,提供了一套所见即所得的WEB图形组态编辑器,包含丰富的图表展示方式。客户可以使用图扑提供的IoT Platform快速的搭建私有云,非常便捷的建立起物联网和工业互联网的WEB SCADA,实现边缘计算和海量数据的展示。

针对海量的设备上报数据,我们在做实时显示的同时还考虑将历史数据也进行无损保存,并在IoT Platform上给用户提供数据查询的支持。但这就对底层的时序数据存储提出了相当高的要求。在对比了包括InfluxDB在内的几个数据库后,在最新的解决方中,我们选用了TDengine作为时序数据的存储引擎。TDengine是涛思数据推出的一款开源的专为物联网、车联网、工业互联网、IT运维等场景设计和优化的超高性能时序数据库(Time-Series Database),本身还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度。

图扑的IoT Platform可以支持设备的接入,架构示意图如下。

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

实际应用案例-中央水机监测系统

以山东大禹水处理有限公司中央水机监控项目为例,我们来介绍在图扑物联网云平台上集成使用TDengine Database的思路。每个中央水机设备采集与下发控制的数据包含:进水流量、产水PH、产水电导、膜前压力、浓水压力、产水流量、开机冲洗时间设置、总计时间、停机冲洗时间设置、原水泵、高压泵、进水阀、浓排阀、紫外线、回流阀、恢复、手自动切换、产水率、产水液位、多介质返洗、活性炭返洗、原水液位等。平台通过坚实可靠的连接多台网关控制多台PLC设备,实时监测这些指标、管理设备并进行实时报警,达到水务治理的目的。

现场的传感器主要包括温度、压力、流量等采集设备,现场的执行器主要包括电机、电磁阀控制的开关等,PLC通过DI/DO、AI/AO实现传感器信息的采集和执行器动作的控制。PLC设备与MQTT网关之间采用Modbus/TCP协议通讯,MQTT网关获取采集到的PLC设备数据后再通过MQTT协议转发到云端物联网平台。平台接收到 MQTT 网关推送的数据后,会先根据用户配置的存储策略将数据写入到TDengine中。用户通过浏览器访问图形组态画面可以实时接收平台的数据推送,并以直观的方式查看组态画面的变化,实现对中央水机设备的图形化监测。平台上可设立多个项目,一台服务器可多个项目共存。

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

受益于TDengine的超高性能和超小体量,整个平台架构变得简化,解决工业物联网监控分析系统开发成本高、周期长、运维难度大等痛点。

以schemaless方式使用TDengine

创建数据库iot_datas,数据的保持时间为365天,过期的数据将会被成块删除:

CREATE DATABASE IF NOT EXISTS iot_datas KEEP 365

超级表iot_meters用于存储设备的数据信息创建超级表的语句如下:

CREATE TABLE iot_meters (ts timestamp, value double) TAGS(device_id binary(20), point_id binary(20));

此时可使用自动建表语法来实现写入数据时,用超级表定义的表结构自动创建不存在的子表,若该表已存在则不会建立新表。自动建表语法跟insert/import语法非常相似,唯一区别是语句中增加了超级表和标签信息。

假设有 1 个设备 meter_001,设备下有 1 路温度 temp 和 1 路湿度 humi,我们可以采用写入数据自动建表的方法:

INSERT INTO iot_datas.meter_001_humi USING iot_datas.iot_meters TAGS ('meter_001', 'humi') VALUES ('2018-01-01 00:00:00.000',95);
​INSERT INTO iot_datas.meter_001_temp USING iot_datas.iot_meters TAGS ('meter_001', 'temp') VALUES ('2018-01-01 00:00:00.000',20);

注意:自动建表语句只能自动建立子表而不能建立超级表,这就要求超级表已经被事先定义好。这里实现schemaless的方式就是将超级表定义成一个单值模型,也即每条记录为:时间戳+采集值。在超级表的标签列中,要定义出设备ID、点位ID甚至点位物理量名称、点位分组等信息。这样同一设备不同点位的数据上报后,可以通过自动建表的语法向其对应子表中写入,在写入时指定tag值。此时,如果此点位对应子表不存在则会被自动创建;如果此点位对应子表已经存在,则TDengine本身会跳过建表过程,直接写入数据,这样也就是实现了一种schemaless的写入方式。

当然,在确定设备(子表)已经存在的情况下,可以同时向不同的超级表中同时插入数据。注意为了提高写入速度,对同一条insert SQL语句,可以向多张表插入新记录,具体如下:

INSERT INTO iot_datas.meter_001_humi VALUES ('2018-01-01 00:00:01.000', 95)​            iot_datas.meter_001_temp VALUES ('2018-01-01 00:00:01.000', 20)

图扑IoT Platform介绍

IoTopo 将TDengine的schemaless方案,做的更加简便,只需要一个数据库一个超级表,所有设备测点都是这个超级表下的一个子表,子表的名称可以仅由设备序列号+测点ID组成。整个过程可以通过平台的可视化界面完成。

1)时序数据库配置

iotopo物联网平台采用RESTful接口连接TDengine,用户可以修改链接参数,修改数据库名称,修改数据保留天数。保存修改后,平台会自动创建数据库和超级表,底层建表语句见前文。配置界面下如所示:

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

2) 添加设备

在设备管理界面,新建一个设备,输入设备序列号和设备名称,在通讯设置中,关联 MQTT 网关,点击确定。如下图所示,我们创建了一个中央水机的设备,序列号名称为:zhongyangshuijiceshi。

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

3) 配置测点及存储策略

添加完设备后,需要配置设备测点,测点ID 要与 MQTT 网关推送的数据保持一致。如果测点需要保存到TDengine。可以配置存储间隔(以秒为单位),存储间隔为 0 或空时不进行保存,存储间隔为 -1 时表示变化存储(数据发生变化时存储),存储间隔为 -2 时表示实时存储(接收到 MQTT 网关推的数据时存储)。

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

当测点数据需要存储到TDengine时,平台会将数据保存到超级表下面的子表中,比如保存“进水流量”的底层 SQL 语句如下:

INSERT INTO iot_datas.zhongyangshuijiceshi_jinshuiliuliang USING iot_datas.iot_meters TAGS ('zhongyangshuijiceshi', 'jinshuiliuliang')     VALUES ('2018-01-01 00:00:00.000', 20);

4)在组态画面中显示测点数据

在制作组态画面时可以绑定测点的实时数据,如下图所示,选中一个文本框点击绑定按钮,弹出数据绑定界面,选择实时数据和对应的测点即可完成绑定。

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库
拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

运行组态画面时,IoT Platform会自动从数据库中读取相应的测点数据并进行实时更新。组态画面是可以导入和嵌入到其他项目中的,演示地址如下:

http://demo.iotopo.com/share?url=displays/ff2eb425-633d-11ea-83c1-fa163e07e858.json

5)访问自建的 TDengine 数据库

如果用户需要用到非IoT Platform创建的TDengine数据库,可以通过创建数据源和数据集的方式访问TDengine。首先用户需要在数据源管理界面创建一个数据源,配置方法也是需要提供REST接口,和数据库名称。

创建数据源:

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

创建数据集:

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

用户在组态画面中可以选择一个表格控件,然后点击表格控件的“行数据”绑定按钮,在绑定界面中选择绑定数据集即可完成绑定,详细可以参考:

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

通过前面简单的配置,中央水机监控系统大部分功能就实现了。用户可以通过IoTopo物联网平台方便的从TDengine中查询到所有接入点位的数据,如下图:

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

利用平台的组态工具,我们还开发了如下实时监控界面。

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

平台选用TDengine的理由

在之前一个版本,平台底层使用的是InfluxDB来存储时序数据。然而InfluxDB在面对海量数据时的读写性能存在瓶颈,因此我们决定采用性能更强悍的TDengine。在深入使用TDengine后,我们还发现了诸多优势。

1)支持SQL语句

TDengine支持SQL语句操作,使得TDengine可以通过插件方式无缝的嵌入到很多大数据展示系统方案中。

2)动态建表

在TDengine实现schemaless的写入方式,使数据库可以动态的适配多样的工业场景。

3)性能高、体量小

TDengine对顺序产生的时序数据插入、查询、聚合统计性能非常高,而整个数据库体量却非常小,这就让我们的平台变得更易搭建和维护。

4)节约存储成本

由于TDengine是个列式存储数据库,数据压缩后其存储空间比一般数据库大大减少。

IoTopo工业物联网平台组态示例

IoTopo工业物联网平台前端界面采用标准HTML5开发,支持 2D/3D图形组态,同时听过丰富的组态模版,可满足绝大多数工业数据可视化监控应用场景。

下面举几个项目的例子,来展示IoTopo物联网平台的组态界面。更多的界面可以访问:

http://www.iotopo.com/examples/

​某智能新风系统项目

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

某工厂智能监控项目

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

某风力发电SCADA项目

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

某生活园区可视化项目

拒绝高深技术栈,裸机10分钟搭建酷炫的工业物联网监控平台 - TDengine Database 时序数据库

TDengine的集成为工业物联网平台提供了坚实的底层,但后期也还有很多细化的工作等待去开展,比如:多个超级表的适配、多维度tag的支持等。只要我们踏踏实实做产品,在物联网和工业互联网的潮流中,一定可以做出更多的贡献。

作者简介:白华军,智慧水务研究院院长(博士),从业16年,包括SAP ERP专家顾问、软件需求分析师、技术架构师、软件项目经理等。持续推动着大型电子商务与管理信息系统成功应用与运维;对JAVA,ASP.NET、C/C++/C#,WINDOWS/LINUX系统、HANA数据库、工业物联网、数据仓库等技术都有资深建树。

原文首发于https://mp.weixin.qq.com/s/mTzoRAVmuWYRCPGYzC-bRg