OPCUA 探讨(一)——测试与开发环境搭建

一、前言

OPCUA(OPC Unified Architecture)是一种应用层数据通信协议,其规范由OPC基金会(OPC Foundation)制定,笔者在工作期间(面向西门子数控系统的数据采集)接触该协议较多。
西门子数控系统产品称作Sinumerik,其内部嵌入了一个OPCUA服务器,通过以太网连接,可以用上位机(普通电脑或工控机)的OPCUA客户端程序访问OPCUA服务器,获取Sinumerik数控系统内的各种数据。

采集到数据之后,我们才能构建更进一步的工作,例如机床的数字孪生 、工厂信息可视化大屏、实时机床健康状态评估等等,可以说数据采集是所有上层服务的基础。目前在机床数据采集方面,不同厂家的数控系统对外提供的采集协议都不太一样,例如FANUC有FOCAS、西门子有OPCUA、华中数控有NC-Link,我们很可能遇到实际工厂中有支持不同协议的多种数控系统,这时就需要我们在数据采集软件中实现支持不同协议的采集功能。

本系列文章聚焦于西门子数控系统Sinumerik支持的OPCUA通信协议,探讨如何使用微软dotNet框架(C#)开发数据采集程序,并逐步完善各项功能,此外会结合OPC基金会官方文档探讨OPCUA底层结构。基于其他协议的数据采集暂不讨论。

二、准备工作

2.1 准备开发环境

2.1.1 Visual Studio2022

笔者使用的开发软件是微软的Visual Studio 2022,其完整安装包较大。
建议配置时参考网上其他文章(关键词:.NET开发,VS2022)。操作系统是windows11家庭版。

2.1.2 dotNet(.NET)

dotNet(.NET)开发环境/运行环境和C#的关系可以理解为JDK/JVM和Java之间的关系,如果是计算机专业的应该能明白。
如果不是计算机的,我简略解释一下,计算机底层(CPU)需要的是计算机电子电路能够理解的二进制机器码,不同CPU架构(x86、ARM)的机器码不一样,我们写的C#代码文本都需要转换、翻译成和计算机能读懂的机器码,因此有了.NET这类软件框架作为中间媒介,负责转换、翻译,让计算机能够执行程序。

2.1.3 NuGet第三方包管理器

Visual Studio里面有个叫NuGet的东西,相当于Python的pip,Java的Maven,其作用是在我们的项目里引入其他人写好的模块(第三方包)。
对于OPCUA相关的项目,必不可少的是OPC基金会提供的OPCUA相关模块,我们都是使用这个NuGet引入的。

2.2 获取OPCUA客户端示例

示例代码在 https://gitee.com/zuoquangong/opcuaapi
(注:该示例代码目前十分粗糙,存在UI层面的bug,一些重要功能如“订阅”有待补全,笔者正在着手整理中)

本OPCUA客户端示例的界面如下,设计的比较朴素,界面操作方法见第三章。

2.3 获取OPCUA服务器

我们在开发时身边可能不会有Sinumerik数控系统,那么需要在电脑上安装一个可以用于测试的OPCUA服务器软件。

2.3.1 获取Prosys软件

推荐使用Prosys的软件,叫“Prosys OPC UA Simulation Server”,别下载错了。
Prosys官网入口:https://prosysopc.com/

注意,红框里这个“opc.tcp://SAM.mshome.net:53530/OPCUA/SimulationServer”就是该OPCUA服务器的访问地址(传输层为TCP协议),我们的OPCUA客户端访问这个地址即可。
实际Sinumerik中,OPCUA服务器的端口是4840,可以连接的IP通常有X127调试端口的192.168.215.1(该IP固定不可调),以及X130的公司网络端口192.168.1.6(该IP可以自己设,或通过DHCP获取)。

2.3.2 切换模式

这个软件有两种模式,基础模式(Basic Mode)和专家模式(Expert Mode),我们用专家模式。切换方法如下:

2.3.3 添加个用户

Sinumerik系统的OPCUA默认用户是OpcUaClient,我们在prosys里也建一个这样的用户。

注意,两次密码一致“Add User”按钮才能被点击。

这样新用户创建完毕,OPCUA客户端程序可以使用该用户身份与Prosys的OPCUA服务器建立会话连接。

三、OPCUA初试

首先把prosys软件运行起来,即OPCUA服务器开始工作。
然后用Visual Studio2022打开客户端项目,开始运行客户端代码。

3.1 连接服务器

出现界面后,在服务器地址输入prosys提供的OPC地址,并填写用户名、密码信息。

点击“创建”,即可在服务器和客户端之间建立一个OPCUA会话:

成功建立OPCUA会话(Session)之后,可以查看当前会话相关信息:

我们可以通过点击“创建”按钮,创建并维持多个会话;通过会话下拉菜单选择当前会话(currentSession);点击“取消”按钮,可以断开(DisConnect)当前会话。

3.2 浏览OPCUA服务器内容

界面左侧用于连接服务器和会话管理(创建、切换、断开、查看信息),界面右侧则是基于当前会话的一些功能。
首先是浏览OPCUA服务器。OPCUA服务器内容可以树状目录形式进行浏览,点击“浏览”按钮,即可显示OPCUA服务器的根目录节点内容:

这里每一个内容都称作一个“节点(Node)”,一个节点包含多个“属性(Attribute)”
单击节点,即可显示节点信息(即节点内的各个属性):

双击节点即可进入该节点,浏览其内部节点结构(例如双击“Objects”节点):

点击“返回”按钮即可返回上一级目录。
以上是基本的浏览功能,实际上也包含了节点信息读取(readNode)和节点值读取(readValue),两种读取功能。在OPCUA中,基本的节点操作有:

其中“写入”操作用的较少,因为笔者的工作中,OPCUA服务器数据对应的是数控系统内数据,随意改写会导致安全问题。
实现这几个操作就基本完成了一个客户端的主干功能,后面我们将结合源码和文档对这些操作逐步解读。

3.3 观察节点信息

通常我们更关注如何读取一个节点的值(readValue),我们可以观察到每个节点都有一个ID

例如这个节点名称为“Counter”的节点,其ID为“ns=3;i=1002”,ns是“namespace”的简写,代表一个命名空间,“3”是该命名空间在服务器上的索引号,“1002”是其在该命名空间内的索引号。该节点值为4。
我们进行数据采集,通常是通过OPCUA客户端的浏览功能(Browser)找到想要获取值的节点(例如机床Z轴坐标或电流)的ID,然后调用读取(readNode)或监控(subscription)方法,获取其值。

如果咱们客户端能缓存节点ID就不用浏览,可以直接读取节点值了。

总结

后续我们将对示例源码和服务器节点结构等问题进行讨论。

附录

OPC基金会:OPCUA英文文档
OPCUA技术开发英文文档

*附言

由于作者水平有限,可能在文章中出现错误或不当描述,如有发现此类情况希望您能及时提供反馈,非常感谢!
如果感觉本文对您有所帮助,希望为文章点个推荐,谢谢。
作者联系方式,163邮箱:zuoquangong@163.com

posted @ 2024-12-05 16:23  一条工作犬  阅读(179)  评论(0编辑  收藏  举报