从去年伊始,国内外一些大公司都先后推出了面向物联网领域的平台产品,如微软 Azure 平台的 IoT Hub、阿里云平台的物联网开发套件、百度云平台的物接入 IoT Hub、物解析 IoT Parser 和物管理 IoT Device 等等,但上述公司的产品从平台特色和技术角度来看,相对比较适合一些企业级项目开发及智能硬件的云连接、云存储的使用,其实并不太适合一些对控制实时性较高、接入点多、业务逻辑相对复杂的工业领域。
工业自动化领域相对比较封闭,发展也比较慢,多年来涉及到通信相关的,大部分还是采用现场工业总线等技术来实现。笔者曾发过一篇《浅谈工业级物联网项目架构设计及实施》,里面除了介绍了工业物联网的概念和特色外,还介绍了物联网通用中间件平台的架构设计。时至今日,随着国内外大公司的介入,物联网越来越热。下面笔者将结合工控领域的特色及当前物联网领域的一些新技术新趋势,分享工业物联网和民用物联网的特色及异同,并从自身实际应用开发的角度,解读从端到云,工业物联网项目的全栈快速开发之路。
最近诞生的共享单车,短短一年多的时间就遍布国内一二线城市,迅速成为一个现象级应用,可以说是民用物联网领域最大的应用。小米的智能家居套件,以低廉的价格,相对实用的功能,也赢得了不少智能家居爱好者的追捧,也是比较典型的民用物联网应用。
工业物联网对大部分人来说,相对陌生,往往是面向行业的应用,比如我们当前所做的养殖物联网监控,污水处理物联网监控和垃圾处理物联网监控。
那民用物联网和工业物联网的区别是什么呢?
从技术角度来说,民用物联网和工业物联网并没有本质的区别,都是有云、有端、都具备传感器数据采集、设备控制及通信传输等功能。只是工业物联网脱胎于工控自动化网络,后者对可靠性和实时性有较高的要求,有各种工业级别的现场总线,如 Profibus,Modbus RTU/TCP,CANopen 等等,后续又在民用以太网的基础上,推出了工业以太网。那时候还没有云的概念,考虑到安全,网络都是私有的,很少和因特网进行互联。从某种意义上来说,没有云技术的高速发展,就不会有现在的民用物联网上各种现象级应用。当然工业物联网也得益于云技术的成熟,才能使高门槛的工业自动化技术得到了一定程度上的普及,否则也很难有今天所谓的工业物联网。不过民用物联网和工业物联网区别还是有的,下面将一一简要介绍。
全栈开发的概念来源于 Web 开发领域,指同时具备前端和后台开发的能力。引申到工业物联网领域,全栈开发意味着要懂硬件开发,要懂各种传感器、云开发、Web 开发技术、手机 APP 开发、各种通信技术和数据存取,大数据时代还要求懂数据挖掘和分析。
这对全栈工程师来说,要求就非常高了。考虑到实际,从技术路线来看,全栈开发还是分派系的,如“Java 派”,各种层面的开发都是以 Java 类的开发技术为主。如“.NET 派”,各种层面的开发都是用.NET 技术进行开发。由于历史原因,我从 2001 年开始进入工控开发,工控软件类开发大都以微软技术为主,所以全栈开发主要采用了.NET 技术。
民用物联网端的开发和工业物联网端的开发还是有很大区别的,民用物联网端产品是厂家直接基于芯片进行产品开发。是典型的硬件开发了。而工业物联网端的开发,往往是在第三方厂家的产品基础上进行二次开发,也就是更多的是做集成类的开发工作。
我们所做的工业物联网的端设备就是供其他工业物联网集成商进行二次开发的。当然我们也会基于我们的软硬件产品进行工业物联网项目的集成开发。
这里着重介绍的就是在现有的工业物联网产品基础上进行的项目开发。
目前工业领域常见的 IO 接口如下:
Modbus RTU: 施耐德公司制定的基于 RS485/RS232 的串行通信总线协议。
Modbus TCP: 施耐德公司制定的基于以太网的通信总线协议。
PPI:西门子公司专为 S7-200 系列 PLC 开发的通讯协议。
Profibus:是一种国际化、开放式、不依赖于设备生产商的现场总线标准。
CANopen:是一种架构在 CAN 上的高层通信协协议,包括通信子协议及设备子协议。
常见的智能模块其实种类比较多的,比如智能电表,智能水表,各种 PLC 及其配套的扩展模块等等。我们这里主要介绍的就是凌霄物联网智能网关、智能终端、智能 IO 模块和综合采集模块。
网关除具备网口、USB、SD 卡及扩展两路智能模组(无线通信、RTC、存储等板卡)外,还可以配置各种不同通信接口板(当然也可以直接对接智能终端或智能 IO 上的输入输出子板)。
智能终端和智能 IO 模块的主要区别有,一是通信接口,智能终端有三种接口可选,以太网、RS485 和 CAN;而智能 IO 模块仅具备 CAN 接口。二就是智能终端支持二次开发,能独立运行,也可以作为智能网关的扩展模块,而智能 IO 仅作为智能网关的扩展模块存在。
智能终端和智能 IO 模块,根据对外接口不同,主要有如下种类的模块:
综合采集器,是一个九合一的传感器集成模块,可以说是国内外集成度最高的一款产品。一次可以采集的传感器数据有 3 路温度,1 路湿度、1 路氧气、1 路氨气、1 路二氧化碳、1 路光照、1 路 PM2.5。该模块可以通过 RS485 直接和网关相连,标准 Modbus RTU 通信协议。
图 2 是 YFIOs 数据组态系统的架构图,其包含三部分:驱动层,核心层(驱动引擎及实时数据库)和策略层。
所谓的二次开发大部分就是开发和具体业务联系密切相关的策略程序,此外就是少部分的驱动程序开发(除了对接特殊设备,大部分情况下无需用户开发驱动程序)。
下面我们用一个简单示例来介绍一下 YFIOs 组态开发。
我们需要准备如下设备:1 台物联网智能网关,1 台物联网智能终端(或智能 IO),1 台综合采集器,1 条 USB 线及附属电源及连接线等。设备及辅材准备好后,按如下方式进行接线:
如图 4 所示,根据设备的类型,对应的网关接口,新建综合采集器和输入输出智能终端对应的用户设备。
设备创建后,对应的设备变量也会自动创建。
无需任何编程,只要把相关的驱动和配置信息部署到网关,就可以直接监控设备的通信状态、IO 输入状态和连接的传感器数据。如果有 IO 继电器输出,也可以在 IO 监控界面,直接修改对应的值以改变继电器的开闭状态。
如果仅仅实现数据从端到云的传输,那么无需写用户策略。当然对大部分的工业物联网现场应用来说,还是需要一定的业务逻辑进行处理的。比如检测到设备电机过热,则要求网关立即停止电机运行或者对外发出报警信号。这里我们写一个最简单的用户策略,就是当一路开关量输入为高电平的时候,让一路继电器闭合,低电平的时候则继电器释放。
开发用户策略,可以采用微软 Visual Studio IDE 开发工具进行开发,我们也提供了对应的模板程序,可以直接填入必要的业务代码即可。如图 6 所示,标准的用户策略其实只需要实现 3 个接口函数即可:OnLoad
、OnRun
和OnUnload
。
OnLoad 在用户策略开始加载的时候执行,只执行一次。OnRun 按设定的间隔,循环被 YFIOs 的驱动引擎调用。OnUnload 是策略被卸载前执行一次。
图 6 中在 OnRun 添加的代码如下:
if (op.IOReadInt("QI44:I1") != op.IOReadInt("QI44:Q1"))
{
op.Extern_IOWrite("QI44:Q1", op.IOReadInt("QI44:I1").ToString());
op.Print(MessageType.Debug, "I1=" + op.IOReadInt("QI44:I1").ToString(), Name);
}
以上代码的意思是,从 YFIOs 实时数据库中读取 QI44:I1 通道值,如果和继电器的输出状态不同,则继电器的状态和输入通道保持一致。
用户策略编写完毕后,则可以用 YFIOsManager 工具进行加载和调试了(如图 7 和图 8 所示)。
从图 8 中我们可以看出,当 I1 输入状态被改变的时候,继电器的输出状态也被改变了,调试窗口中也输出了对应的调试信息。
如果不和云端通信,也就不需要添加 QCPB 云端通信策略了,但是如果没有这部分也称之不上为物联网项目了,只是一个典型的小自动化项目而已。
和添加用户策略一样,我们添加上 QCPB 云端通信策略,除了设置运行间隔外,我们还需要设定相关的参数,如图 9 所示。
IP 地址是指云端服务器端地址,端口号默认为 12000,项目 ID 是指云端创建对应项目时的 ID 号(这个后文会有介绍)。由于 QCPB 协议支持变化上传数据,所以针对浮点数,需要设置数据变化的阈值。
“IO 配置”面板中有一个导出按钮,可以单击导出,保存后的 XML 文件在创建云端项目及云端组态画面的时候会用到。
MQTT 是 Message Queuing Telemetry Transport 的缩写,中文意思是消息队列遥测传输,它是 IBM 开发的一个即时通讯协议,目前已经成为物联网主流的通信协议,微软云、百度云、阿里云等都支持该通信协议。这意味着设备只要支持了该通信协议,就可以和当前主流的云进行云端通信。凌霄物联网网关也支持该协议,在一个消防相关的项目中,就是通过该协议把采集到的数据上传到的微软 Azure IoT Hub 中。
WebSocket 协议是 HTML5 标准里,基于 TCP 的一种新的网络协议,2011 年被 IETF 定为标准 RFC 6455。它实现了浏览器与服务器全双工(full-duplex)通信,服务器可随时向客户端发送信息,不仅通信数据量变小,同时也大大改善了网页动画的实时性能。我们的 YFHMI 组态动画,就是基于 WebSocket 通信协议和服务器中间件 YFCloud 进行通信的。
这是我们自行开发的一个基于二进制格式的云端通信协议,其优点是通信数据量小,支持数据变化上传。除了支持数据通信外,还支持设备的远程诊断、远程参数下载和远程升级等功能。支持 TCP/IP 以太网和 GPRS 双链路自动切换通信模式。本篇文章中所介绍的云端通信就是基于该协议来实现的。
云端 YFCloud 有三部分组成:Web 后台、Web 前台和 YFIOs 云端中间件。Web 后台和前台采用 ASP.NET 进行开发,YFIOs 云端中间件也是采用.NET 技术进行开发,是一个标准的 Windows 服务程序。
首先登录 YFCloud 物联网中间件通用监控平台就可以开始创建云端项目了。YFCloud 的构建思想是,先有项目模板,然后再基于项目模板创建应用。这样的好处就是,基于一个项目模板可以创建若干应用。
先添加一个项目模板,然后比较重要的一步就是导入【2.4.5】章节所导出的 IO 配置文件,从而构建云端 IO 实时数据库(如图 11 所示)。
基于我们刚刚创建的“工业物联网演示”模板创建一个项目应用。创建一个项目应用后,系统会自动生成一个项目 ID 号,把这个 ID 号填入【2.4.5】章节中所示的云端通信策略中的 IO 配置面板中,填入后部署到物联网智能网关即可。
YFIOs 云端中间件脱胎于嵌入式 YFIOs,从图 12 的架构图上就可以看出,嵌入式 YFIOs 是一个“单机版”的数据组态平台,而云端中间件 YFIOs 是一个“网络版”数据组态平台。
YFIOs 云端中间件集成了 WebSocket 服务器,Web 动态网页可以通过 WebSocket 协议和服务器进行通信。
YFIOs 云端中间件以项目为最小单位来进行管理的,一个或多个项目对应一个项目模板,实际应用通过项目 ID 进行区分。
在云端服务器上打开 YFIOs 云端中间件-客户端程序,可以看到在“工业物联网演示”项目模板下,我们看到“工业物联网 Demo”应用的运行标志已经变为绿色,表示物联网智能网关设备已经和云端连接成功。右侧的显示面板上可以看到从物联网智能网关上传到云端的各种 IO 数据。在该界面上,也可以对继电器变量进行操作,写入 0 或 1,可以看到物联网智能终端上对应的继电器闭合或开启。
针对一个具体的项目,远程参数即可能云端策略需要,也可能同时远程设备上的策略需要,如果是这种情况,处理要复杂一些,相关参数需要保存到云端服务器,并且参数一旦修改,需要同时通知云端策略和远程设备上的策略。如果仅远程设备需要,那么简单期间,可以直接通过 YFIOs 云端中间件直接传递一个二进制参数文件即可。
远程升级的实现要相对复杂,因为升级文件相对较大,并且传输通道有可能是 GPRS 窄带传输,所以需要分段进行传输。要确保整个的升级文件,完整可靠的传输到远程的物联网智能网关上,并且重启重连成功后,才算真正的升级完毕。
由于基于同一个项目模板下的多个相关应用的物联网智能网关上的应用往往是一样的,所以只要设定一个升级文件就可以升级整个项目模板下的所有的项目应用。但是这有一个前提,要升级的固件版本,要比设备上当前运行的版本高。
考虑到一些特殊情况的存在,YFIOs 云端中间件也支持远程强制升级,不管当前什么版本,不管以前运行的什么应用,都可以强制实现远程升级的功能。
YFIOs 云端中间件的策略和 YFIOs 嵌入式的策略开发基本相同,也含有 OnLoad、OnRun 和 OnUnload,差别就是云端中间的策略能力更强,可以充分利用 Windows 平台本身的.NET Framework 能力。
有些业务逻辑即可以放在设备端的策略里,也可以放到云端的策略里,比如一些当日量和累积量的处理和换算。有些最好放到设备端,比如某些指标超过阈值,需要立即关闭或开启设备的。有些则放在云端更合理,比如需要把数据进行永久存储的。
云端策略分三种类型:核心策略、公共策略和用户策略。核心策略,YFIOs 云端中间件每个项目都会执行,公共策略是多个项目可选择性的执行,用户策略则是用户项目模板下的项目才会执行。其上三种策略从代码结构上没有什么区别,以所在的目录决定其策略类型。
YFHMI 画面组态最早支持 WinCE 平台,后来在 WinCE 平台软件的基础上开发出了基于.NET Micro Framework 平台的版本。.NET Micro Framework 一般运行在相对资源较小的物联网芯片(Cortex-M 系列)上,所以 YFHMI 在性能和体积上做了进一步的优化。考虑到 Html5+WebSocket 是未来 WEB 前端的主流,在 YFHMI 支持 Windows 版本后,又直接推出了 Html5 的组态版本。
在创建基本组态画面的同时,我们还是需要导入在【2.4.5】章节所导出的 IO 配置文件,以便于动画绑定对应的 IO 变量(如图 16 所示)。
我们构建的组态画面比较简单,两个指示灯分别对应智能终端的 I1、I2,一个切换开关对应 Q2,四个文本框分别对应 T1、T2、T3 和 H。IO 变量导入后,相关的图元分别绑定上对应的变量。
5.1.2 导出 Html5 文件
导出的 bg.png、Monitor.html、PublishIO.xml 和 YFWebSocket.js 四个文件需要上传到云端对应的项目模板目录下。导出的 PublishIO.xml 文件需要导入云端 IO 列表,以设定对应的发布 IO。
在 Web 网页上我们打开动画监控页,可以看到这个内容是和我们在 YFHMI 中创建的组态画面是一致的,并且其显示的数据也和真实设备的值一样(和 YFIOs 云端中间件的 IO 实时数据保持一致)。这个时候如果我们用鼠标操作开关按钮,可以看到物联网智能终端的继电器吸合或释放。
综上,我们可以看出无需太多专业技能,无需太多时间,就可以从端到云构建一套相对实用,且有一定复杂度的工业物联网方案。下面我们将介绍的案例,就是我们这两三年来在实际现场实施的项目,是真正得到实际运行考验的项目。
广西龙滩和恭城的污水监控和监测系统,分别在 2014 和 2015 年开始着手实施,最初龙滩项目没有远程监控画面,仅包含现场自动化系统,在恭城远程监控画面实现后,才又增添了远程监控功能。目前该项目已经在现场运行了两年以上。
广西龙滩垃圾处理系统在 2015 年开始研发实施,和污水监控系统不同的是,除了包含现场自动化控制、远程云端监控外,现场还有显示器进行现场监控。所以 YFHMI 构建的组态,不仅支持 HTML 5 网页组态画面,还支持嵌入式组态画面。
物联网养殖监控系统是我们在 2015 年底和新希望六合还有微软共同合作研发的一套养殖监控系统。目前已经在山东济南、潍坊、河南新乡、武陟,河北香河等地进行了安装实施。
本系统和上面介绍的污水处理和垃圾处理系统有些不同,上述两个系统的架构,核心就是物联网智能网关连接若干不同功能的智能终端和智能电表,通信也是仅采用 3G/4G 方式和远程服务器进行通信。物联网养殖系统除了包含上述的功能外,还专门为其研制了九合一的综合采集器,此外还能连接智能电表、智能水表,环控器等等智能设备。为了保证通信的可靠性,还支持 GPRS/因特网双网自动切换功能。在远程监控端,除了具备网页监控,微信监控外,还提供手机 APP 进行远程操控。
作者:刘洪峰,网名叶帆,叶帆科技创始人兼 CEO,前微软(中国).NET Micro Framework 开发团队成员,微软全球最有价值专家(MVP),CSDN 十大 MVB。以微软.NET MF 系统为核心,研发了物联网智能网关、YFIOs 和 YFHMI 等物联网中间件软硬件平台。
2017 年 7 月 1 日(星期六),线上物联网全栈开发峰会将在 CSDN 学院召开,刘洪峰将与其他六位专家将一起从整体架构、技术栈、应用开发平台到实战经验与安全方案,希望通过一天的时间,帮助开发者快速掌握物联网全栈开发之道,目前峰会正在七折优惠中,欲购从速,详情点击我要报名!