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

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

相关推荐
Goboy5 分钟前
温故而知新,忆 Spring Bean 加载全流程
后端·面试·架构
超浪的晨23 分钟前
Java 内部类详解:从基础到实战,掌握嵌套类、匿名类与局部类的使用技巧
java·开发语言·后端·学习·个人开发
南囝coding1 小时前
做付费社群,强烈建议大家做这件事!
前端·后端
神策技术社区1 小时前
埋点采集之曝光
大数据·数据分析·客户端
Cache技术分享1 小时前
131. Java 泛型 - 目标类型与泛型推断
前端·后端
Codebee2 小时前
OneCode 3.0 VFS客户端驱动(SDK)技术解析:从架构到实战
java·后端·架构
陈哥聊测试2 小时前
拖垮公司的真正元凶:低质量决策
数据分析·产品
喜欢敲代码的程序员3 小时前
Spring Boot中请求参数读取方式
java·spring boot·后端·spring
中烟创新4 小时前
DeepSeek部署实战:模型对比、部署优化与应用场景解析
前端·后端