【问题标题】:How to define and use custom structure type?如何定义和使用自定义结构类型?
【发布时间】:2016-11-29 07:13:57
【问题描述】:

假设我想根据 OPC-UA 定义类型 Person 与“字段”NameAge(定义任何 ByteStream 结构的节点并序列化/反序列化数据是微不足道的——这不是我所追求的)。此外,我想定义Person 类型的变量节点person 并一步写入该节点。 怎么做?

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

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

【问题讨论】:

    标签: data-structures types opc-ua


    【解决方案1】:

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

    取决于 OPC UA SDK(Framework) to 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支持nodeset文件解析,那么请把这个sn -p放到已有的nodeset文件中并导入。或者创建一个节点集文件并将这个 sn-p 并导入到您的服务器代码中。

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

    我希望这会有所帮助。

    谢谢。

    【讨论】:

    • 非常感谢,我现在无法测试并将其转换为代码,但我会尽快尝试。您的回答对我很有帮助,再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多