C# 的西门子数控系统 OPCUA 数据采集开发从零入门

前言

OPCUA(OPC Unified Architecture)是一种应用层数据通信协议,其规范由OPC基金会(OPC Foundation)制定,笔者在工作期间(面向西门子数控系统的数据采集)接触该协议较多。

西门子数控系统产品称作Sinumerik ,其内部嵌入了一个OPCUA服务器 ,通过以太网连接,可以用上位机(普通电脑或工控机)的OPCUA客户端程序访问OPCUA服务器,获取Sinumerik数控系统内的各种数据。

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

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

基于其他协议的数据采集暂不讨论。

准备工作

准备开发环境

1、Visual Studio2022

笔者使用的开发软件是微软的Visual Studio 2022,其完整安装包较大。

建议配置时参考网上其他文章(关键词:.NET开发,VS 2022)。操作系统是windows11家庭版。

2、dotNet(.NET)

dotNet(.NET)开发环境/运行环境和C#的关系可以理解为JDK/JVM和Java之间的关系,如果是计算机专业的应该能明白。

如果不是计算机的,我简略解释一下,计算机底层(CPU)需要的是计算机电子电路能够理解的二进制机器码,不同CPU架构(x86、ARM)的机器码不一样,我们写的C#代码文本都需要转换、翻译成和计算机能读懂的机器码,因此有了.NET这类软件框架作为中间媒介,负责转换、翻译,让计算机能够执行程序。

3、NuGet第三方包管理器

Visual Studio里面有个叫NuGet的东西,相当于Python的pip,Java的Maven,其作用是在我们的项目里引入其他人写好的模块(第三方包)。

对于OPCUA相关的项目,必不可少的是OPC基金会提供的OPCUA相关模块,我们都是使用这个NuGet引入的。

获取OPCUA客户端示例

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

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

获取OPCUA服务器

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

1、获取Prosys软件

推荐使用Prosys的软件,叫"Prosys OPC UA Simulation Server",别下载错了。

Prosys官网入口: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、切换模式

这个软件有两种模式,基础模式(Basic Mode)和专家模式(Expert Mode),我们用专家模式。

切换方法如下:

3、添加个用户

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

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

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

OPCUA 初试

首先把prosys软件运行起来,即OPCUA服务器开始工作。

然后用Visual Studio2022打开客户端项目,开始运行客户端代码。

1、连接服务器

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

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

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

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

2、浏览OPCUA服务器内容

界面左侧用于连接服务器和会话管理(创建、切换、断开、查看信息),界面右侧则是基于当前会话的一些功能。

首先是浏览OPCUA服务器。OPCUA服务器内容可以树状目录形式进行浏览,点击"浏览"按钮,即可显示OPCUA服务器的根目录节点内容:

这里每一个内容都称作一个**"节点(Node)",一个节点包含多个"属性(Attribute)"**。

单击节点,即可显示节点信息(即节点内的各个属性):

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

点击"返回"按钮即可返回上一级目录。

以上是基本的浏览功能,实际上也包含了节点信息读取(readNode)和节点值读取(readValue),两种读取功能。在OPCUA中,基本的节点操作有:

其中"写入"操作用的较少,因为笔者的工作中,OPCUA服务器数据对应的是数控系统内数据,随意改写会导致安全问题。

实现这几个操作就基本完成了一个客户端的主干功能,后面我们将结合源码和文档对这些操作逐步解读。

3、观察节点信息

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

例如这个节点名称为"Counter"的节点,其ID为"ns=3;i=1002",ns是"namespace"的简写,代表一个命名空间,"3"是该命名空间在服务器上的索引号,"1002"是其在该命名空间内的索引号。

该节点值为4。

我们进行数据采集,通常是通过OPCUA客户端的浏览功能(Browser)找到想要获取值的节点(例如机床Z轴坐标或电流)的ID,然后调用读取(readNode)或监控(subscription)方法,获取其值。

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

总结

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

关键词

OPC UA, OPC Unified Architecture, 数据采集, 西门子Sinumerik, OPC UA 客户端开发, C#, .NET, Prosys OPC UA Simulation Server, OPC基金会, OPC UA 服务器搭建, OPC UA 节点浏览, OPC UA 节点读取, 数控系统通信, 工业物联网, 工厂数字化, Visual Studio 2022, NuGet 包管理, OPC UA 示例代码

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:一条工作犬

出处:cnblogs.com/gongzuoquan/p/18588720

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

相关推荐
希望永不加班26 分钟前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式
浮游本尊1 小时前
一次合同同步背后的多阶段流水线:从外部主数据到本地歧义消解
后端
lv__pf1 小时前
springboot原理
java·spring boot·后端
段小二2 小时前
服务一重启全丢了——Spring AI Alibaba Agent 三层持久化完整方案
java·后端
UIUV2 小时前
Go语言入门到精通学习笔记
后端·go·编程语言
lizhongxuan2 小时前
开发 Agent 的坑
后端
段小二2 小时前
Agent 自动把机票改错了,推理完全正确——这才是真正的风险
java·后端
itjinyin3 小时前
ShardingSphere-jdbc 5.5.0 + spring boot 基础配置 - 实战篇
java·spring boot·后端
Victor3563 小时前
MongoDB(91)如何在MongoDB中使用TTL索引?
后端