2016-11-29 141 views
0

假设我想根据OPC-UA定义类型为Person的“字段”NameAge(定义任何ByteStream结构的节点以及序列化/反序列化数据是很简单的 - 这不是我所追求的)。我也想定义Person类型的变量节点person并一步写入该节点。 如何做?如何定义和使用自定义结构类型?

请注意:当我有这样的数据(Kevin, 47)更新person(Jane, 22)客户应直接读取当变量只有2对,不会像(Kevin,22)获得认购,或。

我使用OPC-UA .Net官方堆栈,但我应该能够从任何给定的框架“翻译”。

回答

1

随着OPC UA什么一直试图实现以上是可能的。它被称为信息建模..

这取决于OPC UA SDK(框架),以SDK是否支持..

如果SDK支持自定义对象类型,创建自定义变量类型,那么可以使用简单的节点集XML文件创建自定义类型。

在您的示例中,您可以创建一个名为Person并创建一个相同的实例。如上所述,您将能够实现推送通知。

请查找下面提到的Nodeset XML Snippet,用于创建自定义对象类型自定义变量并创建相同的实例。

<!-- Below XML logic will explain on how to create Custom Object Type and Custom Variable Type--> 
 

 
<UAObjectType NodeId="ns=2;s=PersonType" BrowseName="2:PersonType"> 
 
    <DisplayName>PersonType</DisplayName> 
 
    <Description>A Person Object Type</Description> 
 
    <References> 
 
    <Reference ReferenceType="HasComponent">ns=2;s=NameType</Reference> 
 
    <Reference ReferenceType="HasComponent">ns=2;s=AgeType</Reference> 
 
    <Reference ReferenceType="HasSubtype" IsForward="false">i=58</Reference> 
 
    </References> 
 
</UAObjectType> 
 

 
<UAVariableType NodeId="ns=2;s=AgeType" BrowseName="2:AgeType" DataType="Byte"> 
 
    <DisplayName>AgeType</DisplayName> 
 
    <Description>A Age variable type. it is component of AgeType</Description> 
 
    <References> 
 
    <Reference ReferenceType="HasComponent" IsForward="false" >ns=2;s=PersonType</Reference> 
 
    <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference> 
 
    </References> 
 
</UAVariableType> 
 

 
<UAVariableType NodeId="ns=2;s=NameType" BrowseName="2:NameType" DataType="LocalizedText"> 
 
    <DisplayName>NameType</DisplayName> 
 
    <Description>A Name Variable type. it is component of NameType</Description> 
 
    <References> 
 
    <Reference ReferenceType="HasComponent" IsForward="false" >ns=2;s=PersonType</Reference> 
 
    <Reference ReferenceType="HasSubtype" IsForward="false">i=63</Reference> 
 
    </References> 
 
</UAVariableType> 
 

 
<!-- Below XML logic will explain on how to create instance of an object using above mentioned types--> 
 
<!-- This will create a person1 object inside the Object folder --> 
 

 
<UAObject NodeId="ns=2;s=Person1" BrowseName="2:Person1"> 
 
    <DisplayName>Person1</DisplayName> 
 
    <References> 
 
    <Reference ReferenceType="Organizes" IsForward="false">i=85</Reference> 
 
    <Reference ReferenceType="HasComponent">ns=2;s=Name1</Reference> 
 
    <Reference ReferenceType="HasComponent">ns=2;s=Age1</Reference> 
 
    <Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=2;s=PersonType</Reference> 
 
    </References> 
 
</UAObject> 
 

 
<UAVariable NodeId="ns=2;s=Age1" BrowseName="2:Age1" DataType="Byte"> 
 
    <DisplayName>Age1</DisplayName> 
 
    <Description>A Age variable type. it is component of AgeType</Description> 
 
    <References> 
 
    <Reference ReferenceType="HasComponent" IsForward="false" >ns=2;s=Person1</Reference> 
 
    <Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=2;s=AgeType</Reference> 
 
    </References> 
 
    <Value> 
 
    <Byte>10</Byte> 
 
    </Value> 
 
</UAVariable> 
 

 
<UAVariable NodeId="ns=2;s=Name1" BrowseName="2:Name1" DataType="LocalizedText"> 
 
    <DisplayName>Name1</DisplayName> 
 
    <Description>A Name Variable type. it is component of NameType</Description> 
 
    <References> 
 
    <Reference ReferenceType="HasComponent" IsForward="false" >ns=2;s=Person1</Reference> 
 
    <Reference ReferenceType="HasTypeDefinition" IsForward="false">ns=2;s=NameType</Reference> 
 
    </References> 
 
    <Value> 
 
    <LocalizedText> 
 
     <Locale>en</Locale> 
 
     <Text>MyName</Text> 
 
    </LocalizedText> 
 
    </Value> 
 
</UAVariable>

如果SDK支持节点集文件解析,那么请把这个片段在现有的节点集文件并导入。或者创建一个节点集文件并将这个片段并导入到您的服务器代码中。

这将很容易地创建一个对象类型及其实例。

我希望这会有所帮助。

谢谢。

+0

非常感谢,我现在无法测试并将其翻译成代码,但我会尽快尝试。你的回答对我很有帮助,所以再次感谢你! – astrowalker

+0

当然..欢迎..请让我知道,如果你需要更多的细节.. –