起因
对GO语言的认识,来自一次与工业圈外朋友的闲聊,彼时我正在思考如何构建一套系统,连接车间设备和管理系统,监控设备上下线状态、设备运行数据和生产指令数据等,在这样的场景中,连接数量多、单一数据量小、单设备数据持续采集的特征就很明显。传统做法是使用C#搭建上位机系统,通过路由器、网关等与每台设备之间通过TCP方式轮训通信,数据采集后存储到关系型数据库,管理系统通过查询关系型数据库得到相应的数据。每当我想到数千台设备同时连入C#后台,轮询批次规划、设备上下线管理、生产指令数据上传下达,再加上关系型数据库的各种表单处理,简直头皮发麻。系统架构进度缓慢,在处理高并发时甚至一筹莫展。
改变
朋友给我介绍说,现在工业互联网应用采用GO语言的比较多。我得承认,在此之前我用过C++、Swift,了解过Python,对于GO语言简直闻所未闻。通过一段时间的了解和摸索,逐步掌握到GO语言中goroutine的魅力。与此同时,发现了同样基于GO高并发特性开发的influxDB时序数据库,完美适配了工业数据采集的高并发、低数据、简单关系、强时序的使用场景,配合上Grafana的炫酷界面,我有一种强烈的预感,这就是我需要的。
初次尝试
为了配合运营商应对一次工业互联网使用情况演示,利用免费的OneNet平台、GO、influxDB和Grafana临时搭建了一套数据采集、展示系统。
生产设备采用西门子S7-1215PLC,装了一块485通信模块,连接到Modbus无线网关,Modbus无线网关自带Modbus TCP转RTU功能,同时集成了MQTT 3.0协议。
将网关配置为向下与PLC通信,采集相应寄存器点位数据、开关量数据;向上按照MQTT协议连接到OneNet平台,以JSON格式上送数据。
用GO语言编写后台采集程序,实际上influxDB有个好伙伴telegraf,可以配置好后无代码采集MQTT数据,尝试过官方教程,无果,索性自己编写数据采集代码,好处是可以自由发挥、任意配置。采集程序访问OneNet平台api,get各项数据,并存储到influxDB相应m