当前位置:网站首页>open62541直接导入NodeSet文件
open62541直接导入NodeSet文件
2022-06-28 07:10:00 【姚家湾】
upc ua 建模的方式通常是使用建模工具建模(比如uaModeler),直接输出C,C++,C# 源代码,然后与OPC UA 服务器的代码一起编译。opc ua 开源项目也是如此。它提供了一个python 编写的nodeset_compiler工具。将nodeset.XML 编译成为myNS.c和.h文件。然后结合到server 的代码中。
如果是开发一个特定的产品,它的opc ua 模型是预先确定的。那么这样做还能容忍,毕竟这是由程序员做的工作。但是,如果开发的产品是一个通用产品,需要OT 工程师来构建OPC UA 的模型。那么对于OT 工程师就太麻烦了。他们不擅长这样的工作。
解决的方法是由server 程序来动态构建opc ua 模型。在server 的程序中导入nodeset.xml 文档,由server 中的程序自动构建server 端的信息模型。实现opc ua 服务器的动态建模。

在Server 程序中利用nodeset.xml 构建的是对象的类型(objectType),然后将对象类型实例化,这时需要额外的信息。它们通过configuration.xml 提供。
实现的细节
首先使用uamodeler 软件建一个opcua的nodeset模型。并且输出nodeset.xml 文件.
<?xml version="1.0" encoding="utf-8"?>
<UANodeSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:uax="http://opcfoundation.org/UA/2008/02/Types.xsd" xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:s1="http://yourorganisation.org/demo2022/Types.xsd" xmlns:ua="http://unifiedautomation.com/Configuration/NodeSet.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<NamespaceUris>
<Uri>http://yourorganisation.org/demo2022/</Uri>
</NamespaceUris>
<Aliases>
<Alias Alias="Boolean">i=1</Alias>
<Alias Alias="Double">i=11</Alias>
<Alias Alias="HasTypeDefinition">i=40</Alias>
<Alias Alias="HasComponent">i=47</Alias>
</Aliases>
<Extensions>
<Extension>
<ua:ModelInfo Tool="UaModeler" Hash="Yl8uWJaLMTz0jvkxYQoGkw==" Version="1.6.0"/>
</Extension>
</Extensions>
<UAObject NodeId="ns=1;i=5001" BrowseName="1:Meter">
<DisplayName>Meter</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=6001</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=5002</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=6002</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">i=85</Reference>
</References>
</UAObject>
<UAVariable DataType="Double" NodeId="ns=1;i=6001" BrowseName="1:Current" AccessLevel="3">
<DisplayName>Current</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
</References>
</UAVariable>
<UAObject NodeId="ns=1;i=5002" BrowseName="1:Switch">
<DisplayName>Switch</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=58</Reference>
<Reference ReferenceType="HasComponent">ns=1;i=6004</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
</References>
</UAObject>
<UAVariable DataType="Boolean" NodeId="ns=1;i=6004" BrowseName="1:Status" AccessLevel="3">
<DisplayName>Status</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5002</Reference>
</References>
</UAVariable>
<UAVariable DataType="Double" NodeId="ns=1;i=6002" BrowseName="1:Voltage" AccessLevel="3">
<DisplayName>Voltage</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
</References>
</UAVariable>
<UAVariable DataType="Double" NodeId="ns=1;i=6003" BrowseName="1:Temperature" AccessLevel="3">
<DisplayName>Temperature</DisplayName>
<References>
<Reference ReferenceType="HasTypeDefinition">i=63</Reference>
<Reference ReferenceType="HasComponent" IsForward="false">i=85</Reference>
</References>
</UAVariable>
</UANodeSet>
第二步:手工编写一个configuration.xml 文档。这一步以后可以使用一个小的软件工具,组态方式生成。
<?xml version="1.0" encoding="utf-8"?>
<UAObject NodeId="ns=1;i=5001" BrowseName="1:Meter">
<Param BrowseName="Meter1">
<DisplayName>
Meter 1
</DisplayName>
<Description>Electricity Meter 1</Description>
</Param>
<UAVariable DataType="Double" NodeId="ns=1;i=6001" BrowseName="1:Current" AccessLevel="3">
<Value>10</Value>
<DataSource></DataSource>
</UAVariable>
<UAVariable DataType="Double" NodeId="ns=1;i=6002" BrowseName="1:Voltage" AccessLevel="3">
<Value>220</Value>
</UAVariable>
<UAObject NodeId="ns=1;i=5002" BrowseName="1:Switch">
<Param BrowseName="Meter1">
<DisplayName>
Meter 1
</DisplayName>
</Param>
<UAVariable DataType="Boolean" NodeId="ns=1;i=6004" BrowseName="1:Status" AccessLevel="3">
<Value>On</Value>
</UAVariable>
</UAObject>
<UAVariable DataType="Double" NodeId="ns=1;i=6003" BrowseName="1:Temperature" AccessLevel="3">
<Value>25.6</Value>
</UAVariable>
</UAObject>从上面的代码看,configuration.XML 中添加了下面的内容
1 Object 节点的参数 BrowseName,DisplayName,Description 它们使用Param 描述
<Param BrowseName="Meter1">
<DisplayName>
Meter 1
</DisplayName>
<Description>Electricity Meter 1</Description>
</Param>2 Variable节点添加了Value 和DataSource 分别是初始值(Value)和与硬件对应的地址(DataSource)
<UAVariable DataType="Double" NodeId="ns=1;i=6001" BrowseName="1:Current" AccessLevel="3">
<Value>10</Value>
<DataSource></DataSource>
</UAVariable>第三步:由Nodeset.xml 产生ObjectType 节点(未完成)
第四步:由Configuration.XML 产生Object实例,并且初始化。(未完成)
结束语
目前只是技术方案,完成会更新。请多给意见呀!
边栏推荐
- Compilation principles final review
- 声网 VQA:将实时互动中未知的视频画质用户主观体验变可知
- What if the applet page is set to 100% height or left blank?
- Puge -- singleton mode
- 微信小程序分页功能,下拉刷新功能,直接干货拿来就用
- Singleton singleton mode
- Detailed explanation of collection class methods____ (4) Judgment and assignment, etc
- Recommend 10 popular jupyter notebook plug-ins to make you fly efficiently
- Last 29 days
- Floating and positioning
猜你喜欢

推荐10个好用到爆的Jupyter Notebook插件,让你效率飞起

Recommend several 0 code, free, learning and using visualization tools

PLC -- 笔记

Hungry for a long time, the brain will enter the "power saving mode"! Your senses are weakened and you can't see clearly

Overview, implementation and use of CRC32

Comment la passerelle BACnet / IP recueille - t - elle les données du système central de contrôle des bâtiments?

hack the box:RouterSpace题解

Devtools implementation principle and performance analysis practice

Pfizer's new Guankou medicine has entered the Chinese market, and the listing of relevant products of domestic pharmaceutical enterprises is just around the corner

Eyebeam advanced settings
随机推荐
普歌--三大基础排序,冒泡·选择·快速
7-1 懂的都懂
R 语言绘制 动画气泡图
小程序页面设置100%高度还是留白怎么办?
微信小程序分页功能,下拉刷新功能,直接干货拿来就用
Rust FFI programming - libc crate
Extern "C" overview
VM332 WAService.js:2 Error: _vm.changeTabs is not a function报错
The code is correct, and the rendering page does not display the reason
实现这个 issue 得700块钱人民币,有人做嘛?
【星海出品】 运维巡检合集
Top 25 most popular articles on vivo Internet technology in 2021
SQL statement optimization steps (1)
炒股开户在手机上安全吗?
Iphone6plus enters the list of antique products netizen: I'm still using it
KMP string
XML序列化向后兼容
Trie string statistics
Voice network VQA: make the user's subjective experience of unknown video quality in real-time interaction known
VM332 WAService. js:2 Error: _ vm. Changetabs is not a function