我的之前文章:使用IOT-Tree Server和InfluxDB对采集数据进行记录 专门讲述使用时序数据库InfluxDB对物联网系统进行数据记录。
但是,大量的工业现场应用要求使用传统的关系数据库进行数据记录。例如:生产线每个环节都需要记录产量、合格品和NG品数量。每次记录都必须把当前PLC中的多个计数值同时获取并且形成关系数据库表中的一条记录。
虽然也可以使用时序数据库进行相同功能的实现,但技术的惯性和业务系统方便整合的角度有着大量的需求。
注:我之前文章:使用IOT-Tree消息流实现实时数据同步:标签实时数据--关系数据库表。这篇文章讲述的是IOT-Tree接入现场各种设备之后的所有标签数据,通过消息流特定节点,配置定时同步的功能。关系数据库中对应的数据表每条记录对应一个数据标签Tag,并且会根据定时器不断的更新,并没有做任何的历史记录。
本文介绍的是使用IOT-Tree Server内部【关系数据库】消息流模块,对工业现场接入的设备数据进行采集和记录,满足后续的数据统计分析需要。
本文对如何接入工业现场各种PLC(如西门子,欧姆龙等)不做展开了,请参考下面文章或其他IOT-Tree的文档。
使用IOT-Tree Server通过PPI协议连接西门子PLC S7-200 Smart
使用IOT-Tree Server连接西门子PLC S7-300/1200/1500
使用IOT-Tree Server通过MC协议连接三菱Q系列PLC
使用IOT-Tree Server通过FINS协议连接欧姆龙CP2E-N系列PLC
IOT-Tree完成一个具体项目的过程,非常详细,如下:
下面的内容是一个IOT-Tree项目在现场设备接入数据标签配置完成之后,后续的配置过程。
1 配置关系数据库数据源
在IOT-Tree Server运行实例启动之后,访问管理主界面 http://localhost:9090/admin/
在数据源区块,点击添加,选择"JDBC"类型(对应关系数据库)。填写你配置好的数据库访问参数(我使用的是mysql8版本):

完成之后,点击新增数据源的测试图标,如果提示成功,说明数据源配置完成。

2 消息流配置过程
进入你的项目管理界面,本文使用IOT-Tree Server中的"Water tank and Medicament dosing "这个Demo项目进行说明。
你如果对这个Demo项目不熟悉,可以参考下面文章(你只需要2分钟就可以配置完成项目,然后启动):
IOT-Tree快速开始
https://gitcode.com/jasonzhu8888/iot-tree/blob/main/web/doc/cn/doc/quick_start.md
2.1 新建消息流
在左下角添加消息流,在弹出对话框填写如下:

完成之后点击"数据记录"这个新增的消息流程,右边就会出现流程绘制区域。
2.2 配置关系数据库节点与数据表节点
在绘制区左边节点列表,选择"存储"分类下面的"关系数据库"节点,拖拽到绘图区,就可以添加一个关系数据库节点,如图:

双击"关系数据库 1"节点,在弹出的对话框中选择之前配置的数据源。确定之后"关系数据库 1"节点的错误提示就消失了。

2.3 配置标签数据读取
我们需要一次读取多个标签,组合成一条记录然后写入到数据库表中。因此,第一步我们需要添加分类"接入与设备"下面的"标签数据读取"节点,同样拖拽添加即可:

双击打开此节点对话框选择添加多个标签如下:

其中,每个标签对应一个变量(Var)名称。这样,当此节点有任意输入消息时,就会自动读取上面定义的三个标签数据值,然后形成如下JSON格式的数据输出:
javascript
{
"wl":3.21,
"flow":23.1,
"flowt":1111
}
2.4 配置JSON到数据表Table写入过程
2.4.1 配置JSON到Table的映射
我们需要把上面节点输出的JSON格式数据写入到数据库表中。为此,IOT-Tree中的"关系数据库"模块专门提供了一个子节点"JSON To Table",用来支持JSON数据到数据库表的写入。
点击选中"关系数据库 1",在左下角弹出的子节点列表中,选中"JSON To Table"拖拽到绘图区,就完成了添加,然后双击打开编辑对话框,如下:


可以看到,此节点本质就是一个关系数据库表的设计及到JSON属性的映射关系。我们可以新增不同的数据库列定义如下:

上面是表结构的列定义,以及每一列对应JSON格式中的属性名称。其中,ID列作为主键可以在数据插入时自动生成。确定之后我们就完成了这个节点的配置。
但是:你肯定疑惑了,上面配置了这么多------数据库表设置在哪里?
2.4.2 配置数据库表
别着急,我们再次选中"关系数据库 1",拖拽子节点"DB Table"到绘图区,然后把"JSON To Table 1"中的"Relational DB Table"端子与此关联,如图:

双击打开"DB Table 1",填写Table Name=water_rec

我们把"标签数据读取 1"的第一个输出端子与"JSON To Table 1"的输入端子连接,最终效果如下:

2.4.3 生成数据库表
点击选中"JSON To Table 1",在节点右下角的面板展开图标进行展开,可以看到里面有个"Create Table"按钮,点击此按钮,就会自动在数据库中建立表"water_rec":

我们可以到mysql数据库中查看这个表结构:

可以看到,数据表water_rec除了自动生成我们上面定义的列之外,还有个特殊时间戳列"_rec_ms"。此列在数据插入时会自动写入当前的时间戳(unix毫秒数)。
2.5 使用标签触发方式
2.5.1 手动触发测试结果
我们可以添加一个"手动触发器",连接"标签数据读取1"。点击触发标记,然后我们查看数据库表,就可以发现有一条记录添加成功:


2.5.2 定时触发
你可以使用"定时触发器"放到"标签数据读取1"前面,并且设定时间间隔,就可以定时读取数据并写记录到数据库表中,太简单不展开了。
2.5.3 特定条件触发
这个比较重要:在很多现场做这种记录时,必须根据一定的条件触发,否则获取的数据可能是无效的。比如,生产线系统一些测量数据需要一定的时间才能完成,PLC这边一般需要有个完成测量标记M地址------用来告诉上位系统(如IOT-Tree Server):"本次测量完成,A B C三个地址的数据现在是有效数据,你可以取数据了。"
对于IOT-Tree来说,A B C和M这四个地址,都是不同的标签而已,只需要监听M地址对应的标签值,当发生变化时才触发获取A B C对应的标签值。
还是在分类"接入与设备"中,选择"标签变化触发器",放置"标签数据读取 1"前面,设置里面监听的标签即可。

3 运行效果

上面整个过程看起来内容有点多,实际几分钟就可以完成。可以发现,使用IOT-Tree Server完全可以作为生产线边缘配套软件使用,可以随着每个不同的产线做快速适配,最大限度的降低系统成本。
事实上,我们已经在国内某个先进的生产线上使用了IOT-Tree Server作为边缘配套,一个20多个环节的产线(每个环节都有独立的PLC),只用了5天就完成了PLC接入、数据点位的配置采集,生产过程的记录、并预留了OPC UA、RESTful和关系数据库等各种接口------为用户的MES或ERP系统打好了底层基础。
