通过Milo实现的OPC UA客户端连接并订阅Prosys OPC UA Simulation Server模拟服务器

本文主要是介绍通过Milo实现的OPC UA客户端连接并订阅Prosys OPC UA Simulation Server模拟服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景

前面我们搭建了一个本地的 PLC 仿真环境,并通过 KEPServerEX6 读取 PLC 上的数据,最后还使用 UAExpert 作为 OPC 客户端完成从 KEPServerEX6 这个OPC服务器的数据读取与订阅功能:SpringBoot集成Milo库实现OPC UA客户端:连接、遍历节点、读取、写入、订阅与批量订阅。

注意,如果实际工作中,仅仅需要测试下 OPC UA 客户端的功能,那么就Duck不必搭建本地的 PLC 仿真环境,而是借助一些 OPC UA 服务端的模拟工具。在这篇文章中,我们将使用 Prosys OPC UA Simulation Server 作为 OPC UA 的服务端,并通过我们前面自己实现的 OPC UA 客户端来连接这个模拟的 OPC UA 的服务器,即:

通过 Milo 实现的 OPC UA 客户端连接 Prosys OPC UA Simulation Server 模拟的 OPC UA 服务器。

下载安装:Prosys OPC UA Simulation Server

https://downloads.prosysopc.com/opc-ua-simulation-server-downloads.php

模拟OPC UA服务器

双击启动 Prosys OPC UA Simulation Server 后,首页显示了服务器的地址信息。

2023-04-16-Home.jpg

如果需要修改这个默认的连接地址,可通过 Endpoints 菜单进行设置(我这里用的是默认的地址)。

2023-04-16-Endpoints.jpg

Objects 菜单下,可以看到 Prosys OPC UA Simulation Server 默认自带了计数器、随机数、梯形图、锯齿波、正弦波、三角波等节点,可通过 OPC UA 客户端进行读取测试。

2023-04-16-Objects.jpg

基于Milo实现的OPC UA客户端测试

作为示例,以下通过连接服务器(匿名连接)读取指定节点的值以及订阅指定节点来完成与 Prosys OPC UA Simulation Server 模拟 OPC UA 服务器的操作。

在实际编码测试之前,可以先通过 UAExpert 作为 OPC 客户端完成从模拟服务器的数据读取与订阅功能,顺便再次明确下 NodeId 的信息。

2023-04-16-UAExpert.jpg

public class OpcUaStart {public void start() throws Exception {OpcUaClientService opcUaClientService = new OpcUaClientService();// 与OPC UA服务端建立连接,并返回客户端实例OpcUaClient client = opcUaClientService.connectOpcUaServer("你的机器名称", "53530", "/OPCUA/SimulationServer");// 两种方式定义节点NodeId nodeId = new NodeId(3, 1002); // 注意第2个参数类型为数字
//        NodeId nodeId = NodeId.parse("ns=3;i=1002"); // 通过parse静态方法定义// 读取指定节点的值opcUaClientService.readNodeValue(client, nodeId);// 订阅指定节点opcUaClientService.subscribe(client, nodeId);}
}

测试结果如下:
2023-04-16-Result.jpg

可能遇到的问题

Prosys OPC UA Simulation Server 界面上没有 Endpoints 菜单?

解决方法: Prosys OPC UA Simulation Server 界面上如果没有 Endpoints 菜单,可通过左上角的 Options 菜单 Switch to Expert Mode 切换一下。

2023-04-16-Options.jpg

基于Milo实现的OPC UA客户端如何读取、订阅 Prosys OPC UA Simulation Server 中的节点数据?

StatusCode{name=Bad_NodeIdUnknown, value=0x80340000, quality=bad}

2023-04-16-Cursor.jpg

原因分析: 根据状态提示,再结合我们读取节点数据的实现: readNodeValue 方法关键的参数分别为: int namespaceIndex , String identifier 。之前连接 KEPServerMilo Serveridentifier 的类型都是 String ,可以正常读取,但是连接 Prosys OPC UA Simulation Server 后,无法读取,我尝试直接改为 int 类型后,读取成功。

解决方法:

方法1:将 readNodeValue 方法的 String identifier 参数改为 int identifier ,即在传参时使用整数类型,可以通过增加一个重载的方法实现。

public void readNodeValue(OpcUaClient client, int namespaceIndex, int identifier)

方法2: 修改 readNodeValue 方法直接接收 NodeId 类型,这时可以通过各种方式定义 NodeIdNodeId 提供了各种重载和解析方法。

public void readNodeValue(OpcUaClient client, NodeId nodeId)// 方式1:构造方法定义NodeId,注意第2个参数类型为数字
NodeId nodeId = new NodeId(3, 1002); // 方式2:静态解析定义NodeId
NodeId nodeId = NodeId.parse("ns=3;i=1002");

Note:方式2:静态解析定义NodeId,这种方法是我通过基于 GPT-4 大模型的 Cursor 问答得知的:Cursor编程初体验,搭载GPT-4大模型,你的AI助手,自然语言编程来了。

2023-04-15-MiloResult.jpg

Reference

Prosys_OPC_UA_Simulation_Server_UserManual用户手册

Source Code

https://github.com/heartsuit/demo-spring-boot/tree/master/springboot-opcua


If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

这篇关于通过Milo实现的OPC UA客户端连接并订阅Prosys OPC UA Simulation Server模拟服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708869

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P