本文转载,原文作者:源码先生, 文章链接:https://www.debugself.com/2019/11/27/opc_guide/, 请勿用于商业用途。如有侵权,请告知删除,谢谢!
八大物联网IoT上云协议快速入门教程
物联网IoT协议之mqtt快速入门教程
物联网IoT协议之OPC UA快速入门教程
物联网IoT协议之 LoRaWAN快速入门教程
物联网IoT协议之NB-IoT/CoAP快速入门教程
物联网IoT上云协议之Modbus快速入门教程
IPv6快速入门教程
物联网IoT协议之6LoWPAN快速入门教程
物联网IoT协议之HTTP快速入门教程
车联网V2X快速入门教程
OPC UA是一套通信协议标准,完成设备与设备,设备与应用之间的数据交互。源码先生的物联网IoT协议之mqtt快速入门教程中的mqtt也是一套数据交互的协议标准,两者虽然协议内容不同,但最终目的一致,都是为了实现不同系统的数据交互。
OPC UA前身是OPC,第一个OPC规范在1996年发布,包括一整套接口、属性和方法的标准集;OPC基于Windows操作系统的COM技术,所以只能运行在Windows上。
OPC UA是OPC的重大升级,在平台独立性、安全性,可靠性等方面做出了升级,更能适应现代工业通信的需求,虽然升级内容很多,但OPC UA 对比OPC并无革命性的变化。
OPC主要用在自动化控制系统、仪器仪表及过程控制系统,具有很明显的工业基因,而且OPC发展这么多年,也很少扩展到非工业领域。
随着近年物联网、工业4.0、工业互联网、IT和OT(Operational Technology)融合等需求的出现,人们希望把工业设备融入到物联网中,深耕工业领域的OPC UA,自然成为大家关注的重点对象!
mqtt和OPC UA都是为了实现不同系统的数据交互,mqtt相对比较简单,mqtt通过发布订阅实现数据交互,而OPC UA要复杂不少,通过对比两者的差异,对入门OPC UA很有帮助。
在mqtt中,设备以及应用程序都作为客户端连接到mqtt服务器(Broker),形成以mqtt服务器为中心的拓扑结构。
在OPC UA中,设备不是作为客户端,而是作为OPC UA Server提供各种服务,应用程序作为客户端连接到设备,调用OPC UA Server提供的各种服务。
OPC UA中,设备除了作为OPC UA Server,也可以同时作为客户端连接到其他设备,形成非中心化的拓扑结构。
mqtt标准中没有定义业务模型,mqtt服务器只是个中转站,用来透传转发多个客户端的消息。应用程序需要在应用层自定义业务模型,主流物联网云平台都使用类似json的格式描述业务模型,阿里云的物模型如下图
OPC UA中,使用面向对象的方式定义业务模型。面向对象中通过类(包括类成员变量,类成员函数,类实例),以及类之间的继承关系实现对业务的建模,而OPC UA的通过节点,以及节点之间的引用关系实现对业务的建模。
OPC UA的节点(Node)
节点是OPC UA数据交互的基本单元,客户端和服务器之间的交互通信,都是基于节点进行的。OPC UA中预定义了8种节点:
节点的属性用来描述节点,下面是所有节点共有的通用属性。
OPC UA的引用(Reference)
引用描述了两个节点之间的关系,用来把多个节点关联起来,OPC UA预定义了多种引用,下面重点介绍几种常用的引用。
hasTypeDefinition
hasTypeDefinition用来描述面向对象中类、类实例之间的关系。
hasSubType
hasSubType用来描述面向对象中的继承关系。当子类从父类继承后,子类拥有一个hasSubType引用指向父类。
hasComponents
hasComponents类似设计模式中的组合模式。
Organizes
Organizes用来指明两个节点的层次结构,可以类比为文件夹和文件的关系,通过Organizes,可以把多个文件(节点)组织到同一个文件夹(父节点)下面。
OPC UA中的服务(Service)
服务可以看做是OPC UA Server提供的API集合,也可以看做是RPC(Remote Procedure Call)接口集合,服务以方法的方式提供出来,服务使用了类似Web的请求-应答机制,当客户端调用一个服务时,客户端发送一个请求给服务器,服务器处理完成请求后,返回响应消息给客户端。
客户端访问服务器提供的所有功能,都是通过调用服务完成。
其中常用的服务有:
mqtt标准中没有定义语义化的内容,应用程序要想知道设备提供了哪些功能/服务,只能靠应用程序和设备双方提前约定,或者通过阅读设备提供的说明文档。
OPC UA Server中节点的通用属性BrowseName、DisplayName、Description等描述了节点的属性和功能,应用程序连接到OPC UA Server后,通过浏览这些属性就可以了解设备提供的功能和服务。
mqtt和OPC UA都提供了发布订阅的功能,OPC UA的发布订阅功能用来实现设备数据的监控,但设备数据有变化时,订阅者会实时收到通知。
上面的概念很抽象,要先对OPC UA有初步的认识,还是来个Hello World比较靠谱。
免费且好用的OPC UA客户端,源码先生推荐Unified Automation公司的UAExpert,在其官网https://www.unified-automation.com/上注册后可以免费下载,也可以到百度云盘下载 https://pan.baidu.com/s/1TM1yQ-K1bUBDav_rABb75Q 下载,提取码:11f8 。
相比mqtt官方提供了一大票公开的mqtt测试服务器地址,公开的在线OPC UA Server少的可怜,源码先生在互联网上认真了搜了一番,只能找到唯一的一个,即opc.tcp://opcua.rocks:4840/ 。
UAExpert连接”在线OPC UA Server”
启动UAExpert,依次选择[Server]–[Add]–[Advanced],按下图输入信息。
通过右键菜单连接服务器。
第一次连接时,会提示服务器证书的警告,此时需要选择信任(Trust)服务器的证书。
连接成功后,会在地址空间中显示出服务器的全部节点。
展开节点后,会发现opc.tcp://opcua.rocks:4840/提供了一个Hello World的方法,可通过右键菜单调用该方法。
Hello World方法需要输入参数,这里填入测试字符串“www.debugself.com” ,并点击Call按钮。
服务器执行Hello World方法,返回执行结果。通过输出参数可以看出,Hello World方法,简单的把输入参数前面添加了Hello后,然后返回给客户端的。
上面的“在线OPC UA Server”网速很慢,测试时可能连接失败,这是也可以自己部署本地OPC UA Server。https://github.com/Pro/opcua-animal-server 是一个使用open62541构建OPC UA Server的示例,为了方便部署,我把opcua-animal-server构建成docker镜像(构建过程请参考 https://github.com/gdbself/opcua-animal-server/ ),方便一键本地部署。
以Ubuntu系统为例,首先要安装docker(docker已经是云端开发的基础设施,不了解docker的话,有必要借此学习下docker的用法)。
|
|
运行下面的docker命令部署本地OPC UA Server(真的一键部署,很方便,有木有?)。
|
|
UAExpert连接“本地OPC UA Server”
启动UAExpert,依次选择[Server]–[Add]–[Advanced],按下图输入信息。
注意,请把图中的192.168.170.128替换为自己Ubuntu电脑的IP地址。
连接OPC UA Server成功后,可以看到服务器地址空间中显示了所有节点。选中Cat的Name节点,在右侧的属性框中可以看到这只猫的Value属性值为Cattie,意为这是猫的名称为Cattie。
OPC UA中的概念很多,初学者会感觉OPC UA很复杂,这里再强调一次,OPC UA本质是按照面向对象的方式对业务建模,搞不懂OPC UA时,按照面向对象的思路,基本可以做到拨云见日。