大连图扑物联科技有限公司是一家专注于物联网数据可视化解决方案的公司,致力于帮助企业快速搭建自己的物联网数据可视化监控平台,帮助企业有效降低研发成本和运维成本,缩短产品上市周期,旗下有多个业务产线包含(2D组态、3D组态、大屏设计、组态云、工业物联网云平台等)。IoTopo平台是其旗下主打产品之一,可应用于智能制造、智能建筑、智慧交通、智慧农业、智慧城市等多个行业和领域,为其行业提供应用解决方案、整体解决方案,并可以帮助企业打造自己的专属解决方案。
本文项目落地公司-山东大禹水处理有限公司,于1997年成立,注册资金5000万,坐落于泰安市大汶口工业园,是专业从事水处理节能环保类现代科技服务型公司。经过二十多年的艰苦努力,已成为全国知名技术服务型企业和中国水处理领域的骨干企业。目前,山东大禹公司主要有三大业务板块,一是以工业循环水为主的工业水处理;二是以中央水机和直饮水系统为主的民用水处理;三是以小型一体化污水处理和中水回用为主的污水处理。企业先后承担省市国家级一系列科技攻关项目,拥有9项专利、1项国际领先、2项国际先进、1项国内领先水平的科研成果,已通过ISO9001国际标准质量管理体系、ISO14001国际标准环境管理体系、OHSAS18001国际标准职业健康安全管理体系认证、获中石化、国家电网入网、中石油公司许可。连续十年被银行系统及省相关部门评为诚信企业。
在物联网、工业互联网领域,任何一个项目的实现都离不开两部分:数据和展示。
对于工业生产监测数据的展示,图扑已经积累了很成熟的基于HTML5的2D、3D数据可视化技术,提供了一套所见即所得的WEB图形组态编辑器,包含丰富的图表展示方式。客户可以使用图扑提供的IoT Platform快速的搭建私有云,非常便捷的建立起物联网和工业互联网的WEB SCADA,实现边缘计算和海量数据的展示。
针对海量的设备上报数据,我们在做实时显示的同时还考虑将历史数据也进行无损保存,并在IoT Platform上给用户提供数据查询的支持。但这就对底层的时序数据存储提出了相当高的要求。在对比了包括InfluxDB在内的几个数据库后,在最新的解决方中,我们选用了TDengine作为时序数据的存储引擎。TDengine是涛思数据推出的一款开源的专为物联网、车联网、工业互联网、IT运维等场景设计和优化的超高性能时序数据库,本身还提供缓存、数据订阅、流式计算等功能,最大程度减少研发和运维的复杂度。
图扑的IoT Platform可以支持设备的接入,架构示意图如下。
前端采集设备将数据上报至通讯网关,再接入IoT Platform。数据进入平台后存入TDengine。IoT Platform美观实用,灵活便捷,TDengine也走的是轻量化的设计思路。使用TDengine和IoTopo可以仅仅通过鼠标的拖拽,单手快速搭建一个项目。
以山东大禹水处理有限公司中央水机监控项目为例,我们来介绍在图扑物联网云平台上集成使用TDengine的思路。每个中央水机设备采集与下发控制的数据包含:进水流量、产水PH、产水电导、膜前压力、浓水压力、产水流量、开机冲洗时间设置、总计时间、停机冲洗时间设置、原水泵、高压泵、进水阀、浓排阀、紫外线、回流阀、恢复、手自动切换、产水率、产水液位、多介质返洗、活性炭返洗、原水液位等。通过坚实可靠的连接多台网关控制多台PLC设备,实时监测这些指标、管理设备并进行实时报警,达到水务治理的目的。
现场的传感器主要包括温度、压力、流量等采集设备,现场的执行器主要包括电机、电磁阀控制的开关等,PLC通过DI/DO、AI/AO实现传感器信息的采集和执行器动作的控制。PLC设备与MQTT网关之间采用Modbus/TCP协议通讯,MQTT网关获取采集到的PLC设备数据后再通过MQTT协议转发到云端物联网平台。平台接收到 MQTT 网关推送的数据后,会先根据用户配置的存储策略将数据写入到TDengine中。用户通过浏览器访问图形组态画面可以实时接收平台的数据推送,并以直观的方式查看组态画面的变化,实现对中央水机设备的图形化监测。
平台上可设立多个项目,一台服务器可多个项目共存。受益于TDengine的超高性能和超小体量,整个平台架构变得简化,解决工业物联网监控分析系统开发成本高、周期长、运维难度大等痛点。
在很多的工业场景中,上报数据的点位是不确定的,上报频率也不完全相同,也就是说用户在向TDengine中写数据时,还并不能确定某个设备对应表的schema。对于这种场景,要求的是一种schemaless的写入方式。TDengine提供的一种动态建库、建表的功能,通过巧妙的使用此功我们实现了schemaless的写入方式。具体示例如下:
创建数据库iot_datas,数据的保持时间为365天,过期的数据将会被成块删除:
CRREATE 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)
IoTopo 将TDengine的schemaless方案,做的更加简便,只需要一个数据库一个超级表,所有设备测点都是这个超级表下的一个子表,子表的名称可以仅由设备序列号+测点ID组成。整个过程可以通过平台的可视化界面完成:
iotopo物联网平台采用RESTful接口连接TDengine,用户可以修改链接参数,修改数据库名称,修改数据保留天数。保存修改后,平台会自动创建数据库和超级表,底层建表语句见前文。配置界面如图所示;
在设备管理界面,新建一个设备,输入设备序列号和设备名称,在通讯设置中,关联 MQTT 网关,点击确定。如下图所示,我们创建了一个中央水机的设备,序列号名称为:zhongyangshuijiceshi;
添加完设备后,需要配置设备测点,测点ID 要与 MQTT 网关推送的数据保持一致。如果测点需要保存到 TDengine。可以配置存储间隔(以秒为单位),存储间隔为 0 或空时不进行保存,存储间隔为 -1 时表示变化存储(数据发生变化时存储),存储间隔为 -2 时表示实时存储(接收到 MQTT 网关推的数据时存储)。
当测点数据需要存储到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);
在制作组态画面时可以绑定测点的实时数据,如下图所示,选中一个文本框点击绑定按钮,弹出数据绑定界面,选择实时数据和对应的测点即可完成绑定。
运行组态画面时,IoT Platform会自动从数据库中读取相应的测点数据并进行实时更新。组态画面是可以导入和嵌入到其他项目中的,演示地址如下:
http://demo.iotopo.com/share?url=displays/ff2eb425-633d-11ea-83c1-fa163e07e858.json
如果用户需要用到非IoT Platform创建的TDengine数据库,可以通过创建数据源和数据集的方式访问TDengine。首先用户需要在数据源管理界面创建一个数据源,配置方法也是需要提供REST接口,和数据库名称。
用户在组态画面中可以选择一个表格控件,然后点击表格控件的“行数据”绑定按钮,在绑定界面中选择绑定数据集即可完成绑定,详细可以参考
http://www.iotopo.com
通过前面简单的配置,中央水机监控系统大部分功能就实现了。用户可以通过IoTopo物联网平台方便的从TDengine中查询到所有接入点位的数据,如图;
在之前一个版本,平台底层使用的是InfluxDB来存储时序数据。然而InfluxDB在面对海量数据时的读写性能存在瓶颈,因此我们决定采用性能更强悍的TDengine。在深入使用TDengine后,我们还发现了诸多优势。
1)支持SQL语句
TDengine支持SQL语句操作,使得TDengine可以通过插件方式无缝的嵌入到很多大数据展示系统方案中。
2)动态建表
在TDengine实现schemaless的写入方式,使数据库可以动态的适配多样的工业场景。
3)性能高、体量小
TDengine对顺序产生的时序数据插入、查询、聚合统计性能非常高,而整个数据库体量却非常小,这就让我们的平台变得更易搭建和维护。
5)节约存储成本
由于TDengine是个列式存储数据库,数据压缩后其存储空间比一般数据库大大减少。
IoTopo工业物联网平台前端界面采用标准HTML5开发,支持 2D/3D图形组态,同时听过丰富的组态模版,可满足绝大多数工业数据可视化监控应用场景。下面举几个项目的例子,来展示IoTopo物联网平台的组态界面。更多的界面可以访问:
http://www.iotopo.com/examples/
TDengine的集成为工业物联网平台提供了坚实的底层,但后期也还有很多细化的工作等待去开展,比如:多个超级表的适配、多维度tag的支持等。只要我们踏踏实实做产品,在物联网和工业互联网的潮流中,一定可以做出更多的贡献。
图扑Web组态软件:http://iotopo.com/platform/
图扑2D、3D可视化示例:https://www.hightopo.com/demos/index.html