当前位置: 首页 > article >正文

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

  • 一、使用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.lryc.cn/news/2383557.html

相关文章:

  • 【关联git本地仓库,上传项目到github】
  • 初步认识HarmonyOS NEXT端云一体化开发
  • WebRTC技术EasyRTC音视频实时通话驱动智能摄像头迈向多场景应用
  • 分布式ID生成器:原理、对比与WorkerID实战
  • java 代码查重(三)常见的距离算法和相似度(相关系数)计算方法
  • LangChain4j入门AI(六)整合提示词(Prompt)
  • redis--redisJava客户端:Jedis详解
  • [CSS3]百分比布局
  • 【Java微服务组件】异步通信P2—Kafka与消息
  • R语言空间数据处理入门教程
  • 使用zap,对web应用/API接口 做安全检测
  • UE5.6新版本—— 动画光照系统重点更新
  • TypeScript 泛型讲解
  • 腾讯位置服务重构出行行业的技术底层逻辑
  • 面试相关的知识点
  • 如何用JAVA手写一个Tomcat
  • 使用 Qt QGraphicsView/QGraphicsScene 绘制色轮
  • 游戏开发实战(三):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
  • 使用glsl 来做视频矫正
  • 03-Web后端基础(Maven基础)
  • LLM驱动下的软件工程再造:驾驭调试、测试与工程化管理的智能新范式
  • 大语言模型与人工智能:技术演进、生态重构与未来挑战
  • SpringSecurity授权、认证
  • 蓝桥杯19682 完全背包
  • DeepSeek源码解构:从MoE架构到MLA的工程化实现
  • leetcode 3355. 零数组变换 I 中等
  • 【VLNs篇】02:NavGPT-在视觉与语言导航中使用大型语言模型进行显式推理
  • (T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复
  • 创建react工程并集成tailwindcss
  • TDengine 安全部署配置建议