随着工业物联网的发展,工业设备的智能化程度越来越高,然而设备的通讯受限于不同设备的物理链路、各种不同的协议,因此大多数数据不能互联互通数据采集。同时,现有的SQL数据库也很难适应工业物联网中时间序列数据的存储特点,使得数据的存储和查询效率很低。

目前,国内外厂商对于工业物联网数据采集措施,主要有两种方案数据采集。

一是利用嵌入式工业网关接入工业现场,或通过以太网,或通过串口,或通过OPC服务器等介质进行数据采集数据采集。这种方式需要购买厂商的硬件设备,往往价格高昂,并且与设备厂商的平台进行强绑定,不利于用户开发,难以满足个性化和定制化需求。优点是对于要求不多的客户,使用省心,不需要考虑很多,并且售后服务比较有保障。

二是利用数据传输单元DTU进行透明传输,将现场设备接入厂商云端,通过Socket方式实现数据采集数据采集。这种方式不需要购买或替换厂商的硬件网关,能直接利用用户已有的设备,减少了硬件成本开销。缺点是云服务价格取决于厂商,用户的话语权减弱,且迁移数据受限制。

文章介绍了一种新型的利用Modbus工业总线现场协议进行数据采集的方法,实现了在云端对边缘设备进行数据采集的功能数据采集。借助这种方法,工业数据的采集可以不依赖于具体硬件网关,减少使用成本,对于企业及时参与工业物联网的发展有一定的启示意义。

1 需求及解决方案

该系统主要实现在云端对边缘设备进行采集的功能,同时进行可视化的呈现数据采集。国内做数据采集工业网关的厂家非常多,证明这个技术方向有一定的研究价值。本采集系统使用Modbus+MQTT+InfluxDB的技术方案,经过验证,技术上具有一定的可行性,可以满足用户的数据采集需求。

1.1 数据采集

用户使用本数据采集系统时,首要的需求便是采集现场数据数据采集。这要求系统能够支持用户设备的通信协议。经过分析研究,Modbus TCP与Modbus RTU协议已经能够满足用户的基础需求。另外,为了支持一些原始的串口协议,系统也加入了对于DTU透传模块的支持,经过正确配置后也可以通过DTU模块读取下属设备的数据。只有对协议的支持是远远不够的。为了能够方便用户的操作配置,系统的配置文件一定要清晰明了,不使用户感到迷惑。

因此系统选用的JSON格式作为配置格式,既方便用户阅读和修改配置,也便于程序读取和解析数据采集。

1.2 数据存储

在满足用户的采集需求后,另一个问题便是数据存储问题数据采集。由于时序数据的天然特殊性,SQL类数据库并不适合存储该类数据。因此本系统选用时序数据库中性能较为优异的InfluxDB数据库作为存储方案,为如何收集数据,如何存储数据,如何处理和监视数据,以及如何可视化数据提出了合适的解决方案。

另外,系统还提供了备选方案,如存储到MQTT中,后面接入消息队列,可以进一步处理;用户也可以选择直接存入云厂商数据库,例如,百度云天工TSDB数据库数据采集。

1.3 数据可视化

用户对于数据的分析和处理有着强烈的需求数据采集。例如,用户想要知道某台设备数据的波动情况,来判断这台设备是否稳定;或者根据数据的趋势来对后续数据的情况进行预测分析;这些都要求系统能够对数据进行可视化展示,或者对数据转发至具有可视化能力的平台中。为解决这个问题,系统提供多种方案,如Chronograf展示或Grafana展示,也可以借助百度云天工的物可视进行展示。

2 系统设计

本系统使用的开发软件为Jetbrains Goland,使用GO语言作为开发语言数据采集。

系统采用Modbus作为数据采集的协议,MQTT作为配置文件下发和数据存储方案,InfluxDB和OpenTSDB作为时序数据库进行存储,用GO语言进行代码编写,JSON协议作为配置文件和API交互的格式,使用Docker容器虚拟化平台进行系统的整体部署和安装数据采集。系统整体框架可分为三部分:主函数模块、采集驱动模块、存储驱动模块。

2.1 主函数模块

工业物联网环境下设备数据采集实现  第1张

主函数模块为该模块程序的入口数据采集。程序主要执行的动作有:加载配置文件、加载存储驱动、加载采集驱动、开始采集任务、注册系统监听事件、阻塞主函数等待等。

程序执行的流程为:

首先从JSON文件中读取并加载配置文件,然后将存储模块的配置文件交给存储模块去加载,将采集模块的配置交给采集模块去加载数据采集。待加载完成后,循环遍历驱动字典,为每个采集驱动实例开辟线程,并开始采集任务。接着,程序注册了对于系统的监听事件,当按下键盘停止程序时,程序会循环遍历驱动字典并停止每个驱动实例。此外,程序还在主线程中一直循环等待阻塞,使得其他采集线程能一直执行。主函数模块流程图如图1所示。


图1 主函数模块流程图

主函数模块代码如下:

func main() {

config := loadConfig()

S := drivers.NewStorage(config.Info.Storage)

driverMap := drivers.NewDriver(config.Info.Gateway, S)

for k := range driverMap {

driver := driverMap[k]

go driver.Start()

监听系统事件,有停止信号时关闭程序并销毁资源数据采集。

var stopLock sync.Mutex

stop := false

stopChan := make(chan struct{}, 1)

signalChan := make(chan os.Signal, 1)

go func() {

-signalChan

stopLock.Lock()

stop = true

stopLock.Unlock()

log.Println("Cleaning before stop...")

程序终止之前,先要关闭所有正在运行的任务,并销毁对应的资源数据采集。

for k := range driverMap {

driver := driverMap[k]

go driver.Stop()

stopChan - struct{}{}

os.Exit(0)

signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)

使用select一直阻塞主程序,等待其他函数执行,或者等待中断信号发送select {}数据采集。

2.2 采集驱动模块

该模块是程序的核心数据采集,该模块程序主要执行的动作有:

解析存储配置、生成采集驱动、调度采集程序、开始和停止采集任务、校验数据类型、转换数据格式、监听网络端口等数据采集。程序执行的流程是:首先解析配置文件,判断每个驱动的采集协议,根据不同协议生成对应的采集驱动,然后开始采集。

采集时,如果协议是Modbus,首先判断函数功能码,然后去调用对应的函数数据采集。采集到的结果是原始值,与用户的需求值不相吻合。因此调用转换函数。转换函数首先判断传进来的采集结果是否为空,为空则直接返回。

如果采集到的数据不为空,首先判断采集点表中数据类型是否正确数据采集。如果正确,利用反射机制调用对应转换函数,将传进来的原始值转换为对应的需求值。

如果协议是原始串口类型,则启动网络监听程序,等待客户端连接数据采集。如果有客户端请求连接,判断客户端合法性,合法则接受客户端连接,否则拒绝。服务器校验通过并接受连接后,程序发送采集指令到客户端,等待客户端返回结果,然后同样的将数据进行转换操作后返回。采集驱动模块流程图如图2所示。


图2 采集驱动模块流程图

2.3 存储驱动模块

这一部分是程序的结尾部分,也是程序向上传输的通道数据采集。当每个采集驱动采集到数据并转换完成后,都会调用存储模块,对数据进行写入。存储驱动的流程是:获取到数据后,根据对应的存储驱动启用与否,调用对应的存储函数进行写入,可以是写入数据库,也可以是发送到MQTT的Topic里面去。数据发送后,如果失败则打印相应的日志,如果成功,返回并进行下一次数据的发送。


图3 存储驱动模块流程图

3 系统实现

系统使用Go语言编写,在Goland里面添加Docker远程部署,链接到服务器,点击运行即可将系统部署到服务器数据采集。开发中需要使用的代码文件和用途描绘如表1所示。

表1 项目部分GO代码说明


系统使用Docker部署数据采集。需要编写Dockerfile和entrypoint.sh代码。

Dockerfile代码内容如下:

FROM alpine:latest

MAINTAINER GuoYuchao ihidchaos@qq.com

ENV LANG C.UTF-8

WORKDIR /root/

COPY ./bin bin

COPY ./entrypoint.sh entrypoint.sh

ENTRYPOINT ./entrypoint.sh

entrypoint.sh代码内容如下:

#!/bin/sh

cd ~/bin/ || exit

./linux_amd64 &

status=$?

if [ $status -ne 0 ]; then

exit $status

fi

while true ; do

sleep 1

done

在Goland里面添加Docker远程部署配置,连接到服务器,点击运行即可将本系统部署到服务器数据采集。部署完后进行系统测试,先查看服务器是否存在在Docker容器中,显示系统已经成功部署,如图4所示。


图4 系统部署结果

部署成功后进行数据采集结果测试、数据存储测试,以及数据可视化测试数据采集。先看采集程序是否采集到了数据,接着检查InfluxDB和OPEN TSDB数据库,再检查数据是否正确的发送到了数据库中,最后检查TSDB数据可视化,数据可视化结果如图5所示。


图5 Chronograf数据可视化和Grafana数据可视化

4 结论

本系统解决了传统的数据采集系统使用C语言和一些单片机产品组合开发存在的开发效率低下,产品价格昂贵,部署、维护难度高花费大等缺点,实现了数据采集、数据存储、数据可视化的功能,满足了工业物联网环境下企业对数据采集和智能化生产的需求,借助这种方法,工业数据的采集可以不依赖于具体的硬件网关,减少了企业智能化改造的成本,同时数据可视化的呈现为企业进行生产优化和决策提供了依据,助力企业智能化的发展数据采集。

本文作者:欧阳旻 郭玉超 王桓 王志兵 原文刊载于《软件工程》2020年12期

了解更多精彩内容,请关注我们公众号【ID:xingongyecn】,或百度搜“新工业网”数据采集。

微信号:565859400
添加上方技术, 在线咨询
复制微信号