概述及项目背景
互联网、物联网和工业制造业的结合属于信息化和工业化融合的范畴,深入推进“两化”融合,是我国化解资源环境约束、摆脱对物质消耗过度依赖、转变经济发展方式的必然选择,更是构筑国家竞争新优势不可错失的历史性机遇。习近平总书记曾多次强调,要“做好信息化和工业化深度融合这篇大文章”。
现有的工业互联网平台,主要由物资需求计划(MRP)、制造执行系统(MES)、仓库管理系统(WMS)、ERP系统等等组成,以数字化的方式将企业的购、存、产、销、人、财、物资源统一管理起来。
在工厂的制造过程中,最重要的就是生产设备,如何实现对生产设备数据的监控和分析,是工业互联网重要的研究课题。
中国目前大部分工厂还处于自动化、智能化较低的工业2.0阶段,生产设备只有简单的控制逻辑,少数设备有本地数据接口,如何将这部分庞大的数据采集到互联网,是本文的讨论重点。
产品架构及工作流程
目标:使用低成本方案,将传统制造设备数据采集上云,实现数据展示和分析。
考虑到现实情况,本方案需满足以下需求:
- 由于很多制造业的利润微薄,本方案成本需要足够低,百元级别
- 由于大多数设备没有数据接口,本方案应采用非侵入式的、加装设备实现数据采集
- 实现数据的上下行,即支持数据上报,同时支持远程控制设备
- 实现简单的数据大屏、APP监控,开放数据接口供进一步进行数据分析
- 标准化,安装简单,做到通用方案无需技术人员上门安装,进一步降低成本
经过以多种方案的选型,我们选用了nodeMCU+阿里云的方案。nodeMCU是一款带有ESP8266 WiFi模块的开源的物联网平台,可以使用我熟悉的arduino IDE进行开发,成本约13元。
阿里云是一个成熟的物联网平台,可以通过MQTT协议连接设备,基于阿里云的各种SaaS应用,能够方便的开发数据大屏、APP等应用,按消息数收费,消息数量不多小项目几乎免费。
整体的工作流程如下。
- 在阿里云平台创建产品和设备,定义设备功能参数
- 进行设备端嵌入式开发调试
- 在阿里云平台创建应用(数据大屏)
- 大屏和设备联调
nodeMCU介绍
NodeMCU,是一个开源的物联网平台。 它使用Lua脚本语言编程。该平台基于eLua开源项目,底层使用ESP8266 sdk 0.9.5版本。由于我不熟悉Lua语言,可以使用arduino IDE和C语言进行开发,配置方法可以参见这篇文章。
nodeMCU的引脚图和技术参数如下图,一共有11个数字I/O口,我们可以通过这些I/O口外接传感器或执行器,来实现数据采集和远程控制。
第一步·创建设备
在开始开发之前,我们需要明确设备的功能,在这个样例中,我们将要实现一个制袋机器的监控设备,实现制袋数量的实时上传。
打开阿里云物联网平台,新建一个产品,输入名称,选择“自定义品类”,“直连设备”,其他默认,点击保存,完成创建。
此时我们就在云端创建了一个虚拟的“机器”,下一步需要定义这个“机器”的功能。打开刚刚创建的产品详情,点击“功能定义”tab,可以看到此产品的所有功能。
点击添加自定义功能,添加一个属性“制袋数量”,表示机器当前的总产量。关于物模型的详细定义可以参考之前的文章。
至此,我们创建了一个产品,这个产品有个属性“制袋数量”。下一步我们要基于这个产品创建一个设备,“设备”是“产品”的实例,是一个个的实体,我们需要创建一个设备,拿到设备的“三元组”(),就可以将平台上这个虚拟的“设备”和我们实际的设备对应起来。
创建好设备后,获取到“三元组”(ProductKey,DeviceSecret,DeviceName)备用,至此云端的虚拟设备已创建好,可以看到设备是“离线状态”,因为平台还没有检测到此设备联网,下一步我们将要进行设备端的开发,让设备联网后,带着上面的“三元组”上报消息,即可让设备在线。
第二步·nodeMCU嵌入式开发
设备端的接入本质上是让设备连接WiFi后,通过MQTT协议和阿里云进行数据交换,有大神已经写好了相关的库,我们就无需造轮子了,点此查看SDK。
在SDK的示例代码中,我们只需要关注以下几个参数,设备三元组:
- #define PRODUCT_KEY “xxx“
- #define DEVICE_NAME “Device_D“
- #define DEVICE_SECRET “xxxxxxxxxxxxxx“
设备将要连接的wifi名称和密码:
- #define WIFI_SSID “xxxxx“
- #define WIFI_PASSWD “xxxxx“
另外我们用一个参数pack_num来表示“制袋数量”,和我们在产品中创建的参数对应。
// 引入 wifi 模块,并实例化,不同的芯片这里的依赖可能不同 #include <ESP8266WiFi.h> static WiFiClient espClient; // 引入阿里云 IoT SDK #include <AliyunIoTSDK.h> // 设置产品和设备的信息,从阿里云设备信息里查看 #define PRODUCT_KEY "xxx" #define DEVICE_NAME "Device_D" #define DEVICE_SECRET "xxxxxxxxxxxxxx" #define REGION_ID "cn-shanghai" // 设置 wifi 信息 #define WIFI_SSID "xxxxx" #define WIFI_PASSWD "xxxxx" //需要上报的制袋数量pack_num参数 int pack_num = 0; void setup() { Serial.begin(115200); // 初始化 wifi wifiInit(WIFI_SSID, WIFI_PASSWD); // 初始化 iot,需传入 wifi 的 client,和设备产品信息 AliyunIoTSDK::begin(espClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET, REGION_ID); // 发送一个数据到云平台,修改属性,pack_num是在设备产品中定义的参数 AliyunIoTSDK::send("pack_num", pack_num); } void loop() { AliyunIoTSDK::loop(); } // 初始化 wifi 连接 void wifiInit(const char *ssid, const char *passphrase) { WiFi.mode(WIFI_STA); WiFi.begin(ssid, passphrase); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("WiFi not Connect"); } Serial.println("Connected to AP"); }
我们用一个红外反射传感器来获取数量,每当有物体接近时,传感器的输出电压会变为高电平,我们将传感器放置在产品出口处,每当有一个产品经过即输出一个高电平,通过nodeMCU的I/O口获取高电平数量即可统计“制袋数量”。
传感器的VCC、GND端口分别连接nodeMCU的3V、G端口用于供电,D0接入nodeMCU的D8端口,用于检测电平并统计。数量的统计需要用到中断函数,并经过去抖处理,此处需要一定的C语言和arduino经验,就不再赘述,可以直接参考项目源码。
连接并将代码上传到nodeMCU开发板,打开串口监视器,可以看到设备已经连接到WiFi,同时阿里云平台上的设备状态应该也变成了“在线”。
至此,设备已成功连接到云端,能够实时上报数据。有了数据,下一步我们将做一个数据大屏,将数据以展示出来。
第三步·云端应用开发-数据大屏
阿里云有成熟的在线编辑工具,无须代码,就可以在线以拖拽的方式生成一个页面。打开IoT studio,创建一个web应用
创建完成后,打开编辑页面,添加一个大屏组件,点击编辑大屏,即可拖入组件,绘制页面。
每个组件可以和上面我们创建的设备参数绑定,例如nodeMCU上报的“制袋数量”更新后,可以同步更新大屏上的数字翻牌器,做到显示实时数据。
选择一个组件,点击“设置数据源”,选择产品、设备和属性,即可完成配置。
完成编辑后,发布页面,可以配置独立域名,例如iot.zfpack.com,访问域名即可打开制作的页面。
总结
我们用20元的不到的成本搭建了一个物联网应用,从数据采集、设备管理、数据展示都可以在平台上简单完成,采集的数据后期可以进行处理分析,为业务决策、流程优化提供参考。当然,本方案采用的nodeMCU和相关传感器能否在工业环境长期稳定运行还需要进一步测试。
技术和成本已经不是限制工业互联网发展的障碍,如何通过数据发掘更大的价值才是我们需要思考的。
1 条评论
parallx · 2021年4月19日 15:42
厉害啊