如何定义和使用自定义结构类型?

时间:2016-11-29 07:13:58

标签: data-structures types opc-ua

说我想用"字段"定义类型Person。就OPC-UA而言NameAge(定义ByteStream的任何结构的节点并序列化/反序列化数据是微不足道的 - 这不是我所追求的)。另外,我想定义类型为person的变量节点Person,并在一个步骤中写入该节点。 怎么做?

请注意:当我使用此类数据person更新(Kevin, 47)时,(Jane, 22)客户端应该订阅,或者直接读取变量时只有2对,而不是(Kevin,22) 1}}。

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

1 个答案:

答案 0 :(得分:1)

使用OPC UA可以实现上述目标。它被称为信息建模..

它取决于SDK的OPC UA SDK(Framework)是否受支持..

如果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支持节点集文件解析,请将此片段放在现有节点集文件中并导入。或者创建一个节点集文件,并将此代码段并导入您的服务器代码中。

这将轻松创建对象类型及其实例。

我希望这会有所帮助。

谢谢。