• open62541直接导入NodeSet文件


    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 文件.

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <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">
    3. <NamespaceUris>
    4. <Uri>http://yourorganisation.org/demo2022/</Uri>
    5. </NamespaceUris>
    6. <Aliases>
    7. <Alias Alias="Boolean">i=1</Alias>
    8. <Alias Alias="Double">i=11</Alias>
    9. <Alias Alias="HasTypeDefinition">i=40</Alias>
    10. <Alias Alias="HasComponent">i=47</Alias>
    11. </Aliases>
    12. <Extensions>
    13. <Extension>
    14. <ua:ModelInfo Tool="UaModeler" Hash="Yl8uWJaLMTz0jvkxYQoGkw==" Version="1.6.0"/>
    15. </Extension>
    16. </Extensions>
    17. <UAObject NodeId="ns=1;i=5001" BrowseName="1:Meter">
    18. <DisplayName>Meter</DisplayName>
    19. <References>
    20. <Reference ReferenceType="HasTypeDefinition">i=58</Reference>
    21. <Reference ReferenceType="HasComponent">ns=1;i=6001</Reference>
    22. <Reference ReferenceType="HasComponent">ns=1;i=5002</Reference>
    23. <Reference ReferenceType="HasComponent">ns=1;i=6002</Reference>
    24. <Reference ReferenceType="HasComponent" IsForward="false">i=85</Reference>
    25. </References>
    26. </UAObject>
    27. <UAVariable DataType="Double" NodeId="ns=1;i=6001" BrowseName="1:Current" AccessLevel="3">
    28. <DisplayName>Current</DisplayName>
    29. <References>
    30. <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
    31. <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
    32. </References>
    33. </UAVariable>
    34. <UAObject NodeId="ns=1;i=5002" BrowseName="1:Switch">
    35. <DisplayName>Switch</DisplayName>
    36. <References>
    37. <Reference ReferenceType="HasTypeDefinition">i=58</Reference>
    38. <Reference ReferenceType="HasComponent">ns=1;i=6004</Reference>
    39. <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
    40. </References>
    41. </UAObject>
    42. <UAVariable DataType="Boolean" NodeId="ns=1;i=6004" BrowseName="1:Status" AccessLevel="3">
    43. <DisplayName>Status</DisplayName>
    44. <References>
    45. <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
    46. <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5002</Reference>
    47. </References>
    48. </UAVariable>
    49. <UAVariable DataType="Double" NodeId="ns=1;i=6002" BrowseName="1:Voltage" AccessLevel="3">
    50. <DisplayName>Voltage</DisplayName>
    51. <References>
    52. <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
    53. <Reference ReferenceType="HasComponent" IsForward="false">ns=1;i=5001</Reference>
    54. </References>
    55. </UAVariable>
    56. <UAVariable DataType="Double" NodeId="ns=1;i=6003" BrowseName="1:Temperature" AccessLevel="3">
    57. <DisplayName>Temperature</DisplayName>
    58. <References>
    59. <Reference ReferenceType="HasTypeDefinition">i=63</Reference>
    60. <Reference ReferenceType="HasComponent" IsForward="false">i=85</Reference>
    61. </References>
    62. </UAVariable>
    63. </UANodeSet>

    第二步:手工编写一个configuration.xml 文档。这一步以后可以使用一个小的软件工具,组态方式生成。

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <UAObject NodeId="ns=1;i=5001" BrowseName="1:Meter">
    3. <Param BrowseName="Meter1">
    4. <DisplayName>
    5. Meter 1
    6. </DisplayName>
    7. <Description>Electricity Meter 1</Description>
    8. </Param>
    9. <UAVariable DataType="Double" NodeId="ns=1;i=6001" BrowseName="1:Current" AccessLevel="3">
    10. <Value>10</Value>
    11. <DataSource></DataSource>
    12. </UAVariable>
    13. <UAVariable DataType="Double" NodeId="ns=1;i=6002" BrowseName="1:Voltage" AccessLevel="3">
    14. <Value>220</Value>
    15. </UAVariable>
    16. <UAObject NodeId="ns=1;i=5002" BrowseName="1:Switch">
    17. <Param BrowseName="Meter1">
    18. <DisplayName>
    19. Meter 1
    20. </DisplayName>
    21. </Param>
    22. <UAVariable DataType="Boolean" NodeId="ns=1;i=6004" BrowseName="1:Status" AccessLevel="3">
    23. <Value>On</Value>
    24. </UAVariable>
    25. </UAObject>
    26. <UAVariable DataType="Double" NodeId="ns=1;i=6003" BrowseName="1:Temperature" AccessLevel="3">
    27. <Value>25.6</Value>
    28. </UAVariable>
    29. </UAObject>

    从上面的代码看,configuration.XML 中添加了下面的内容

    1 Object 节点的参数 BrowseName,DisplayName,Description 它们使用Param 描述

    1. <Param BrowseName="Meter1">
    2. <DisplayName>
    3. Meter 1
    4. </DisplayName>
    5. <Description>Electricity Meter 1</Description>
    6. </Param>

    2 Variable节点添加了Value 和DataSource 分别是初始值(Value)和与硬件对应的地址(DataSource)

    1. <UAVariable DataType="Double" NodeId="ns=1;i=6001" BrowseName="1:Current" AccessLevel="3">
    2. <Value>10</Value>
    3. <DataSource></DataSource>
    4. </UAVariable>

    第三步:由Nodeset.xml 产生ObjectType 节点(未完成)

    第四步:由Configuration.XML 产生Object实例,并且初始化。(未完成)

    结束语

     目前只是技术方案,完成会更新。请多给意见呀!

  • 相关阅读:
    rabbitMQ集群
    Python零基础入门-8 错误和异常
    程序员半夜回家反被外卖员室友嘲讽:加班到凌晨,收入还没我高
    RunnerGo:性能测试领域的领跑者
    如何使用 Vue.js 中的自定义指令编写一个URL清洗器
    《UnityShader入门精要》学习4
    vue+vite+ts添加eslint校验和代码提交校验
    复试(服务器测试实习生)、一面
    南卡护眼灯和好视力护眼灯哪个好?深度测试对比两款护眼台灯
    C++之weak_ptr与shared_ptr智能指针实例(一百九十五)
  • 原文地址:https://blog.csdn.net/yaojiawan/article/details/125466471