opcUA 编译和建模入门教程(zhanzhi学习笔记)

news2025/5/23 2:42:42
  • 一、使用SIOME免费工具建模

        从西门子官网下载软件SIOS,需要注册登录,下载安装版就行。下载后直接安装就可以用了,如图:

      安装完成后打开,开始建模,如图左上角有新建模型的按钮。

      新建了新工程后,需要添加命名空间,在右边Namespaces的位置,点击Add New Namespace,比如要创建一个Boiler的命名空间,则输入:http://opcfoundation.org/UA/Boiler

      有了命名空间之后就要创建对象,但是创建对象之前需要先创建ObjectType,在左侧Types->ObjectTypes->BaseObjectType,右键Add New ObjectType添加对象类型,输入名称和选择命名空间就可以了,如图:

       在BoilerType下面添加Child可以添加变量和方法,如图,DataType双击后,可以选择数据类型。NodeClass可以选择变量还是方法:

        有了ObjectType后,就可以添加对象了,回到最上面的Objects节点,右键选中Add Instance。TypeDefinition需要双击后选择之前创建的类型。

以上完成后,保存,文件名为:Boiler.NodeSet2.xml

参考教程:https://blog.csdn.net/whahu1989/article/details/105079566

二、配置模型编译工具

        从网站上下载https://github.com/OPCFoundation/UA-ModelCompiler源码,如果网站打不开直接用下载链接:https://codeload.github.com/OPCFoundation/UA-ModelCompiler/zip/refs/heads/master,下载后用visual studio打开如图:

这里需要用Release编译,编译后进入的运行文件路径下,然后将需要生成的xml拷贝过来(为了方便输入路径)。如图,xml的放置在Boiler中:

  

打开cmd,然后使用命令编译:

Opc.Ua.ModelCompiler.exe compile -d2 ./Boiler/Boiler.NodeSet2.xml -cg Boiler.csv -o2 NewBoiler -version v105

其中./Boiler/Boiler.NodeSet2.xml是需要被编译的xml,Boiler.csv有没有的没关系,NewBoiler是输出的文件夹。结果如下:

这里要注意,生成后的文件夹中包含了一个同名的xml。而我们一般使用的是uanodes二进制文件(因为直接使用xml,程序容易出现读取截断,字符无法识别等各种问题)。二进制文件我们不能直接使用,所以要判定生成的文件对不对,就使用生成后的xml。最简单的办法就是把生成后的xml重新导入到建模软件中查看。

参考教程链接:UA-ModelCompiler 使用教程 - GitCode博客

三、导入服务器验证

3.1 导入编译后的节点信息

   需要从官网下载C#源代码,或者从开源网站下载C++源代码。这里先以C#为例子。下载地址:

https://github.com/OPCFoundation/UA-.NETStandard/

  

   其中ConsoleReferenceServer就是示例服务器,可以直接用。服务器的地址空间配置放在Quickstarts.Servers工程中,其中Boiler文件夹是默认给的模型示例。我们需要做的事情就是仿照其中的BoilerNodeManager.cs写一个文件。

    在UA-.NETStandard-master\Applications\Quickstarts.Servers路径下,创建NewBoiler文件夹,并把ModelCompiler编译工具生成的文件拷贝到文件夹中,然后导入到C#工程中,导入的方法是点击解决方案的显示所有文件按钮,然后找到新增的文件夹,右键包括到项目中。注意:记得新建一个BoilerNodeManager.cs文件。如图所示:

3.2 修改NodeManage代码

从示例代码中把nodeManage文件拷贝过来后,首先需要修改命名空间。打开文件Opc.Ua.Boiler.DataTypes.cs,可以看到ModelCompiler生成的命名空间:Opc.Ua.Boiler。在BoilerNodeManager文件中,涉及到命名空间的地方都需要修改,如图:

根据第一章我们创建的对象信息,我们没有创建Boilers以及相关的操作,所以示例程序中CreateBoiler这种函数都是不需要的。我们需要关注的是LoadPredefinedNodes函数,通过断点调试可以查看从二进制文件中加载进来的节点。其中LoadFromBinaryResource需要填写二进制文件所在的位置。如图所示,Boiler需要改成NewBoiler。把"Quickstarts.Servers.Boiler.Boiler.PredefinedNodes.uanodes"改成"Quickstarts.Servers\\NewBoiler\\Opc.Ua.Boiler.PredefinedNodes.uanodes"

这里必须注意,程序运行的时候,读取资源文件是以可执行文件所在的位置做相对位置的,所以还需要把二进制文件(最好是整个文件夹)拷贝到执行目录下。这就是LoadFromBinaryResource读取的真实路径。

如下图,正确读取二进制文件后,断点调试可以看到读取的3个节点就是我们用西门子软件创建的3个节点。

四、使用客户端查看服务器信息

      这里我们下在免费的UaExpert。下载和使用参考教程:使用UaExpert - 水滴大海 - 博客园。

点击加号添加服务后,可以看到我们新增的boiler1和变量var。也可以看到示例程序原来就有的Boilers。

五、方法调用

5.1 建模工具上创建方法

       和创建变量一样,先找到BoilerType,然后AddChild,这里的NodeClass要选择Method。函数名这里用“func”。注意,完成后,还需在References中把ModelingRule中的√打上。

然后在对象节点下就可以看到创建的方法了。

     如果需要入参和出参,在BoilerType的func下。可以看到InputArguments和OutputArguments。我们分别添加一个int型入参Arg1和int型出参returnVal。选择“Add New Argument”,把DataType改成我们需要的int类型即可。

5.2 代码中加入方法的执行函数

      打开ModelComplier自动生成的文件,文件中有一个叫做“Opc.Ua.Boiler.Classes.cs”。在文件中可以看到,有一个继承自BaseObjectState类的子类BoilerTypeState。我们需要扩展这个类。我们需要做的是,覆盖父类的OnAfterCreate函数,然后把我们的方法通过这个函数注册进去。如下图,OnFunc是我们自定义用来执行func调用的函数,OnAfterCreate是覆盖BaseObjectState的方法。也是注册我们自己方法的执行函数OnFunc的入口。

完成后,还需要在我们第三章中建立的NodeManage文件中,完善AddBehaviourToPredefinedNode函数。主要是需要调用Call函数。如图,最重要的就是这三句代码,其他的照着写就行

case ObjectTypes.BoilerType:   // 我们创建的对象类型

MethodState func = activeNode.func;     // 我们调用的函数

func.Call(context, activeNode.NodeId, inputArguments, errors, outputArguments); // 进入函数

       完成后就可以编译调试了,现在UaExpert工具上,找到func然后选Call,弹出的界面中,Arg1参数填入1。点Call即可,在服务端代码的断点中,可以看到OnFunc函数的inputArguments中接收到了1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2383557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【关联git本地仓库,上传项目到github】

目录 1.下载git2.绑定用户3.git本地与远程仓库交互4.github项目创建5.上传本地项目到github6.完结撒花❀❀❀!!! 1.下载git git下载地址:https://git-scm.com/downloads 下载安装后创建快捷地址:(此处比较…

WebRTC技术EasyRTC音视频实时通话驱动智能摄像头迈向多场景应用

一、方案背景​ 在物联网蓬勃发展的当下,智能摄像头广泛应用于安防、家居、工业等领域。但传统智能摄像头存在视频传输延迟高、设备兼容性差、网络波动时传输不稳定等问题,难以满足用户对实时流畅交互视频的需求。EasyRTC凭借低延迟、高可靠、跨平台特性…

java 代码查重(三)常见的距离算法和相似度(相关系数)计算方法

目录 一、几种距离度量方法 【 海明距离 /汉明距离】 【 欧几里得距离(Euclidean Distance) 】 【 曼哈顿距离 】 【 切比雪夫距离 】 【 马氏距离 】 二、相似度算法 【 余弦相似度 】 【 皮尔森相关系数 】 【 Jaccard相似系数 /杰卡德距离】…

LangChain4j入门AI(六)整合提示词(Prompt)

前言 提示词(Prompt)是用户输入给AI模型的一段文字或指令,用于引导模型生成特定类型的内容。通过提示词,用户可以告诉AI“做什么”、 “如何做”以及“输出格式”,从而在满足需求的同时最大程度减少无关信息的生成。有…

redis--redisJava客户端:Jedis详解

在Redis官网中提供了各种语言的客户端,地址: https://redis.io/docs/latest/develop/clients/ Jedis 以Redis命令做方法名称,学习成本低,简单实用,但是对于Jedis实例是线程不安全的(即创建一个Jedis实例&a…

[CSS3]百分比布局

移动端特点 PC和手机 PC端网页和移动端网页的有什么不同? PC屏幕大,网页固定版心手机屏幕小,网页宽度多数为100% 谷歌模拟器 使用谷歌模拟器可以在电脑里面调试移动端的网页 屏幕尺寸 了解屏幕尺寸概念 屏幕尺寸: 指的是屏幕对角线的长度&#xff…

【Java微服务组件】异步通信P2—Kafka与消息

欢迎来到啾啾的博客🐱。 记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 目录 引言Kafka与消息生产者发送消息到Kafka批处理发送设计消息的幂等信息确保消息送达acks配置…

R语言空间数据处理入门教程

我的课程《R语言空间数据处理入门教程》已重新恢复课程售卖,有需要的读者可以学习。 👇点击下方链接(文末“阅读原文”可直达),立即开启你的空间数据之旅: https://www.bilibili.com/cheese/play/ss13775…

使用zap,对web应用/API接口 做安全检测

https://www.zaproxy.org/getting-started/ 检测方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 执行baseline测试 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 执行api测试 docker run -t ghcr.io/zaproxy/zaproxy…

UE5.6新版本—— 动画光照系统重点更新

UE5.6预览版已经可以下载,发布会在下个月的6.5号发布。 5.6界面UI设计 5.6 对引擎进行了大规模的重新设计,先看整体内容,主题UI设计 被调整了位置,左边大多数的选择,框选工具,吸附工具,挪到了左…

腾讯位置服务重构出行行业的技术底层逻辑

位置智能:重构出行行业的技术底层逻辑 在智慧城市建设与交通出行需求爆发的双重驱动下,位置服务正从工具层跃升为出行行业的核心基础设施。腾讯位置服务以“连接物理世界与数字空间”为核心理念,通过构建高精度定位、实时数据融合、智能决策…

如何用JAVA手写一个Tomcat

一、初步理解Tomcat Tomcat是什么? Tomcat 是一个开源的 轻量级 Java Web 应用服务器,核心功能是 运行 Servlet/JSP。 Tomcat的核心功能? Servlet 容器:负责加载、实例化、调用和销毁 Servlet。 HTTP 服务器:监听端口…

使用 Qt QGraphicsView/QGraphicsScene 绘制色轮

使用 Qt QGraphicsView/QGraphicsScene 绘制色轮 本文介绍如何在 Qt 中利用 QGraphicsView 和 QGraphicsScene 实现基础圆形绘制,以及进阶的色轮(Color Wheel)效果。 色轮是色彩选择器的常见控件,广泛应用于图形设计、绘画和 UI …

使用glsl 来做视频矫正

描述、优点 使用glsl来代替opencv的undistort 和 鱼眼矫正,并且最后使用opencv的LUT给glsl 来使用,来达到加速的目的,并且做到和opencv 一模一样的效果,达到实时视频的加速矫正。 优点: 没有cuda,也可以做到实时视频矫正,包含各类板子和amd的cpu,intel核显 矫正的基本作…

03-Web后端基础(Maven基础)

1. 初始Maven 1.1 介绍 Maven 是一款用于管理和构建Java项目的工具,是Apache旗下的一个开源项目 。 Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性…

蓝桥杯19682 完全背包

问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi​,价值为 wi​。每件物品可以使用无限次。 请问可以通过什么样的方式选择物品,使得物品总体积不超过 M 的情况下总价值最大,输出这个最大价值即可。 输入格式 第一行…

DeepSeek源码解构:从MoE架构到MLA的工程化实现

文章目录 **一、代码结构全景:从模型定义到分布式训练****二、MoE架构:动态路由与稀疏激活的工程化实践****1. 专家路由机制(带负载均衡)****数学原理:负载均衡损失推导** **三、MLA注意力机制:低秩压缩与解…

【VLNs篇】02:NavGPT-在视觉与语言导航中使用大型语言模型进行显式推理

方面 (Aspect)内容总结 (Content Summary)论文标题NavGPT: 在视觉与语言导航中使用大型语言模型进行显式推理 (NavGPT: Explicit Reasoning in Vision-and-Language Navigation with Large Language Models)核心问题探究大型语言模型 (LLM) 在复杂具身场景(特别是视…

(T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复

一、不小心删除 今天是2025年5月15日,非常沉重的一天,就在今早8点左右的时候我打算继续做我的毕业设计,由于开机的过程十分缓慢(之前没有),加上刚开机电脑有卡死的迹象,再加上昨天晚上关电脑前…

TDengine 安全部署配置建议

背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明,并提供部署和配置建议,为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…