学习open62541 --- [75] 生成namespace文件的简便方法

2023-05-16

在之前的文章中,生成namespace文件是使用open62541提供的nodeset_compiler.py,根据nodeset_compiler.rst(位于open62541/doc/)里的描述,有更好的方法:使用cmake命令ua_generate_nodeset_and_datatypes来生成。

nodeset_compiler.py只能生成nodeset文件;ua_generate_nodeset_and_datatypes不仅可以生成nodeset文件,还能生成datatype文件和nodeid文件,另外可以很简单的处理依赖问题。

PS:ua_generate_nodeset_and_datatypes也是open62541提供的。

open62541也提供了例子,即example/nodeset/,但是看着明白却不知道怎么用。本文从实践的角度来讲解具体用法,开发环境是Debian 10


一 修改python脚本权限

因为ua_generate_nodeset_and_datatypes会调用python脚本generate_nodeid_header.py,所以先要给脚本添加权限,否则无法生成,这个坑也是我调试了很久才发现的…

chmod 755 open62541/tools/generate_nodeid_header.py

二 命令解释

ua_generate_nodeset_and_datatypes是一个自定义的CMake命令,位于文件open62541/tools/cmake/macros_public.cmake里,

其用法介绍如下,
在这里插入图片描述
其产生的CMake目标为open62541-generator-ns-${NAME},这个NAME由用户指定。该命令的输入参数有以下这些,

  • Options:
    • INTERNAL:Include internal headers. Required if custom datatypes are added.
  • Arguments taking one value:
    • NAME:Short name of the nodeset. E.g. ‘di’
    • FILE_NS:Path to the NodeSet2.xml file. Multiple values can be passed. These nodesets will be combined into one output.
    • [FILE_CSV]:Optional path to the .csv file containing the node ids, e.g. ‘OpcUaDiModel.csv’
    • [FILE_BSD]:Optional path to the .bsd file containing the type definitions, e.g. ‘Opc.Ua.Di.Types.bsd’. Multiple files can be passed which will all combined to one resulting code.
    • [BLACKLIST]:Blacklist file passed as --blacklist to the nodeset compiler. All the given nodes will be removed from the generated nodeset, including all the references to and from that node. The format is a node id per line. Supported formats: “i=123” (for NS0), “ns=2;s=asdf” (matches NS2 in that specific file), or recommended “ns=http://opcfoundation.org/UA/DI/;i=123” namespace index independent node id
    • [TARGET_PREFIX]:Optional prefix for the resulting targets. Default open62541-generator
  • Arguments taking multiple values:
    • [NAMESPACE_MAP]:Array of Namespace index mappings to indicate the final namespace index of a namespace uri when the server is started. This parameter is mandatory if FILE_CSV or FILE_BSD is set.
    • [IMPORT_BSD]:Optional combination of types array and path to the .bsd file containing additional type definitions referenced by the FILES_BSD files. The value is separated with a hash sign, i.e. ‘UA_TYPES#${PROJECT_SOURCE_DIR}/deps/ua-nodeset/Schema/Opc.Ua.Types.bsd’.
      Multiple files can be passed which will all be imported.
    • [DEPENDS]:Optional list of nodeset names on which this nodeset depends. These names must match any name from a previous call to this funtion. E.g. ‘di’ if you are generating the ‘plcopen’ nodeset

这里只需要注意:xx.NodeSet2.xml提供nodeset,.csv文件提供nodeid的定义,.bsd文件提供datatype的定义。


三 使用

首先搭建一个基本工程,这里不再赘述,工程里的CMakeLists.txt内容如下,

cmake_minimum_required(VERSION 3.5)

project(demo)

set(OPEN62541_VERSION "v1.3.4") # 设置open62541的版本号
set(UA_NAMESPACE_ZERO FULL CACHE STRINGS "xxx" FORCE) # UA_NAMESPACE_ZERO必须设置为FULL

# 必须要有这个,因为ua_generate_nodeset_and_datatypes由open62541提供
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/open62541)

# 必须设置变量open62541_TOOLS_DIR,否则报错,用户根据实际位置定义
set(open62541_TOOLS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/open62541/tools CACHE PATH "Path to the directory that contains the tooling of the stack")
# 必须设置变量open62541_NODESET_DIR,否则报错,用户根据实际位置定义
set(open62541_NODESET_DIR ${CMAKE_CURRENT_SOURCE_DIR}/open62541/deps/ua-nodeset CACHE PATH "Path to the directory that contains the OPC UA schema repository")


# PLCopen and Robotics requires the full ns0 as basis
if(UA_NAMESPACE_ZERO STREQUAL "FULL")

    # Generate types and namespace for DI
    ua_generate_nodeset_and_datatypes(
        NAME "di"
        FILE_CSV "${open62541_NODESET_DIR}/DI/OpcUaDiModel.csv"
        FILE_BSD "${open62541_NODESET_DIR}/DI/Opc.Ua.Di.Types.bsd"
        NAMESPACE_MAP "2:http://opcfoundation.org/UA/DI/"
        FILE_NS "${open62541_NODESET_DIR}/DI/Opc.Ua.Di.NodeSet2.xml"
        INTERNAL
    )

    # generate PLCopen namespace which is using DI
    ua_generate_nodeset_and_datatypes(
        NAME "plc"
        # PLCopen does not define custom types. Only generate the nodeset
        FILE_NS "${open62541_NODESET_DIR}/PLCopen/Opc.Ua.PLCopen.NodeSet2_V1.02.xml"
        # PLCopen depends on the di nodeset, which must be generated before
        DEPENDS "di"
        INTERNAL
    )

    # Generate types and namespace for Robotics
    ua_generate_nodeset_and_datatypes(
        NAME "robotics"
        FILE_CSV "${open62541_NODESET_DIR}/Robotics/Opc.Ua.Robotics.NodeIds.csv"
        FILE_BSD "${open62541_NODESET_DIR}/Robotics/Opc.Ua.Robotics.Types.bsd"
        NAMESPACE_MAP "3:http://opcfoundation.org/UA/Robotics/"
        FILE_NS "${open62541_NODESET_DIR}/Robotics/Opc.Ua.Robotics.NodeSet2.xml"
        DEPENDS "di"
        INTERNAL
    )

endif()

本文例子生成3个nodeset:DI,PLCopen和Robotics,其中PLCopen和Robotics依赖DI,相关nodeset文件在open62541/deps/ua-nodeset里。注意要先生成DI的nodeset,因为它是被另外2个依赖。

操作步骤如下:

  1. 修改python脚本权限,第一节已经说过
  2. cd到build目录下执行cmake ..
  3. 生成DI的nodeset:make open62541-generator-ns-di, "di"就是NAME对应的值
  4. 生成PLCopen的nodeset:make open62541-generator-ns-plc,"plc"就是NAME对应的值
  5. 生成Robotics的nodeset:make open62541-generator-ns-robotics,"robotics"就是NAME对应的值

执行完毕之后,在build/src_generated/open62541下可以看到生成的.c/h文件,
在这里插入图片描述
过去使用nodeset_compiler.py只能生成namespace_xx_generated.c/h,而使用这个cmake命令还能生成xx_nodeids.h和types_xx_generated.c/h。

当然也可以根据需要来设置,如果需要生成xx_nodeids.h和types_xx_generated.c/h,那么就使用FILE_CSV和FILE_BSD来指定对应的文件,前提是这些csv和bsd文件事先存在;如果不需要,只要namespace_xx_generated.c/h,那么就可以删除FILE_CSV和FILE_BSD,例如Robotics,可以改成如下,

    # Generate namespace for Robotics
    ua_generate_nodeset_and_datatypes(
        NAME "robotics"
        FILE_NS "${open62541_NODESET_DIR}/Robotics/Opc.Ua.Robotics.NodeSet2.xml"
        DEPENDS "di"
        INTERNAL
    )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习open62541 --- [75] 生成namespace文件的简便方法 的相关文章

  • namespace “std“没有成员“function“

    添加头文件 include lt functional gt 确保C 43 43 版本为C 43 43 11或更高
  • VsCode C++ namespace has no member错误

    此问题VSCode C 43 43 插件本身bug 在官方未推出相应布丁之前 xff0c 可按照以下步骤避免该问题 xff1a 1 按顺序打开 xff1a 文件 首选项 设置 2 在右边 xff0c 用户设置窗口添加以下代码 xff1a 3
  • 关于ROS中的namespace

    当我们给发布的消息起名字时 xff0c 注意 34 points image 34 和 34 points image 34 是不一样的 xff0c 前者表示这个话题的名字是一个绝对名称 xff0c 它不在任何的namespace中 xff
  • 《自己动手写Docker》书摘之一: Linux Namespace

    Linux Namespace 介绍 我们经常听到说Docker 是一个使用了Linux Namespace 和 Cgroups 的虚拟化工具 xff0c 但是什么是Linux Namespace 它在Docker内是怎么被使用的 xff0
  • 【C++】nomember named ‘to_string‘ in namespace ‘std’

    在使用 Android Studio 编写 C 43 43 代码时 xff0c 出现如下错误 xff1a nomember named 39 to string 39 in namespace 39 std 39 原因 xff1a 这是因为
  • 虚拟网络namespace 到bridge

    前言 容器的网络是一大难点 xff0c 不管是docker 还是kubernetes 都绕不开计算机网络 以下的介绍主要以计算机网络的namespace 和bridge 两个方面来展开介绍 xff0c 方便深入理解容器的网络原理 1 nam
  • error: ‘PoseStamped’ in namespace ‘geometry_msgs’ does not name a type

    报错现象 error PoseStamped in namespace geometry msgs does not name a type void gt callback const geometry msgs PoseStamped
  • 学习open62541 --- [71] Alarm and Condition

    本文讲述Alarm and Condition的用法 xff0c 主要以源码里提供的例子为基础进行讲解和演示 xff0c 即tutorial server alarms conditions c xff0c 该例子写的有点乱 xff0c 本
  • 学习open62541 ---[68] 使用Wireshark观察通信消息

    Wireshark是强大的网络协议分析工具 xff0c 而open62541也是基于socket的 xff0c 所以也可以用其来观察OPCUA通信消息 一 安装Wireshark 去https www wireshark org 去下载并安
  • 学习open62541 --- [70] 深入理解变量监测

    本文深入探讨一下变量监测的用法和原理 一 累积传输 先前写的关于变量监测的文章 xff0c 都是设置一个采样时间 xff0c 然后有变化了就通知一下 xff0c 有时我们希望变化累积一段时间再一起传给client xff0c 这时如何设置呢
  • 学习open62541 --- [72] client删除subscription时的warning

    本文记录一个问题的理解过程 xff0c 试验条件 xff1a 使用open62541运行server使用asyncua运行clientclient会向server添加subscription xff0c 然后在断开连接前删除subscrip
  • 学习open62541 --- [73] 数据源造成无法监测变量的问题解决

    本人最近遇到一个问题 xff1a 给一个变量添加数据源后 xff0c 使用监测项去监测变量变化 xff0c 如果采样时间为0 xff0c 会发现无法监测到变量的变化 本文讲述这种情况的发生原因以及解决办法 一 Server例子 首先准备se
  • 学习open62541 --- [74] 软链接的妙用

    一 原理 在同一台电脑里 xff0c 可能会有多个工程同时用到open62541 xff0c 比较简单的办法是每个工程都拷贝一份open62541源码 xff0c 但是这样会造成空间浪费 xff0c 而且open62541的源码包本身也不小
  • 学习open62541 --- [75] 生成namespace文件的简便方法

    在之前的文章中 xff0c 生成namespace文件是使用open62541提供的nodeset compiler py xff0c 根据nodeset compiler rst xff08 位于open62541 doc xff09 里
  • [C++]实现顺序表和单链表

    顺序表 include
  • QT中的this指针什么意思?namespace又是什么意思?

    初学者对于qt中的this指针会摸不着头脑 下面我谈谈自己的理解 结论 this指针 指的就是qt designer里面ui界面 也就是xxx ui文件 举个例子 现在我有三个文件 分别是server h头文件 server cpp源文件
  • C++命名空间

    为了避免变量 函数 类 结构体等重命名 我们可以使用命名空间 简单的用例 定义命名空间 namespace name 代码声明 使用命名空间 code为name命名空间中的成员 name code using指令 使用 using name
  • C# Namespace详解

    我现在感到学好C 就是就是要知道C 的基本语法 C 的新的特点 C 能干什么 其中我感到不管如何 NAMESPACE都是很关键的 可以说不是只对C 而言 而是整个 NET都是由NAMESPACE组成的 所以我在看了C 的基本语法后 就直奔N
  • 详解Namespace与资源限制ResourceQuota,LimitRange

    前面我们对K8s的基本组件与概念有了个大致的印象 并且基于K8s实现了一个初步的CI CD流程 但对里面涉及的各个对象 如Namespace Pod Deployment Service Ingress PVC等 及各对象的管理可能还缺乏深
  • c++命名空间

    命名空间 主要解决全局变量的冲突 内部不允许私有变量 所有变量都是公有的 namespace data int x 10 data x 为域作用符 直接使用等同于使用全局变量 不存在就是0 不包含匿名命名空间内变量 同一个文件引用stati

随机推荐

  • 学习open62541 --- [71] Alarm and Condition

    本文讲述Alarm and Condition的用法 xff0c 主要以源码里提供的例子为基础进行讲解和演示 xff0c 即tutorial server alarms conditions c xff0c 该例子写的有点乱 xff0c 本
  • 学习open62541 ---[68] 使用Wireshark观察通信消息

    Wireshark是强大的网络协议分析工具 xff0c 而open62541也是基于socket的 xff0c 所以也可以用其来观察OPCUA通信消息 一 安装Wireshark 去https www wireshark org 去下载并安
  • UART、IIC、SPI、CAN通信的区别与应用

    文章目录 1 通信的基本知识1 1 数据通信的种类1 1 1 串行通信1 1 2 并行通信1 1 3 总结 1 2 数据通信的传输方向1 2 1 单工1 2 2 半双工1 2 3 全双工1 2 4 总结 1 3 数据通信的方式1 3 1 同
  • 学习open62541 --- [69] Client监测多个变量值

    有读者问Client如何监测多个变量值 xff0c 这篇文章给了提示 xff0c 但是没给例子 xff0c 本文给出详细例子 xff0c 使用的open62541版本是1 3 3 xff0c 运行环境debian10 5 一 准备Serve
  • 学习CANopen --- [6] 自定义对象字典

    在前面几篇文章中 xff0c 我们运行例子时都需要一个eds文件 xff0c 比较麻烦 xff0c 本文讲述如何在代码中自定义对象字典 xff0c 只添加自己需要的OD项 如果是作为master来使用 xff0c 还是比较方便的 自定义对象
  • 学习CANopen --- [7] 使用块(Block)下载

    对于一次传输超过4字节的情形 xff0c SDO可以使用Segment传输或者Block传输 xff0c Segment传输在第6篇文章中已经介绍 xff0c 本文讲解Block传输中的下载情况 一 与Segment传输的比较 相比于Seg
  • 学习open62541 --- [70] 深入理解变量监测

    本文深入探讨一下变量监测的用法和原理 一 累积传输 先前写的关于变量监测的文章 xff0c 都是设置一个采样时间 xff0c 然后有变化了就通知一下 xff0c 有时我们希望变化累积一段时间再一起传给client xff0c 这时如何设置呢
  • 学习CANopen --- [8] 多主机同时运行时的问题

    本文记录一下实际使用CANopen时开启多个主机遇到的问题 一 问题描述 本人在嵌入式设备上用Python CANopen库写一个SDO xff0c 由于数据比较多 xff0c 就使用了Segment download xff0c 大概需要
  • 学习CANopen --- [9] CAN总线的状态检查

    本文讲述如何判断CAN总线是否存在以及是否bus off xff0c 以vcan0进行讲解 xff0c vcan0是虚拟的CAN接口 xff0c 可以把它看做一个软件CAN适配器 xff08 区别于硬件CAN适配器 xff0c 如PeakC
  • 学习CANopen --- [10] 汽车外接OBD模块原理

    在某宝上搜索汽车OBD xff0c 可以发现很多卖OBD模块的 xff0c 通过接入OBD模块可以增加车子本身没有的功能 xff0c 如锁车升窗 xff0c 行车自动落锁和后视镜折叠等 xff0c 那么其实现原理是什么呢 xff1f 使用时
  • 学习open62541 --- [72] client删除subscription时的warning

    本文记录一个问题的理解过程 xff0c 试验条件 xff1a 使用open62541运行server使用asyncua运行clientclient会向server添加subscription xff0c 然后在断开连接前删除subscrip
  • 启明欣欣STM32开发板闪烁LED实验

    最近在咸鱼上买了一块启明欣欣的STM32板子 xff0c 准备在上面测试open62541和CANopen xff0c 到货后如下图 xff0c 找商家要了资料 xff0c 然后运行一个LED灯的实验来简单测试下板子 xff0c 本文记录一
  • Python fpdf2生成表格

    fpdf2库可以用来生成pdf文档 xff0c 该库是从fpdf库fork来的 xff0c 老库自2018年就不再更新维护了 xff0c fpdf2对用户更友好 xff0c api也更方便使用 一 fpdf2介绍 其网址是https pyf
  • Android动态分析工具-Inspeckage

    1 Inspeckage简介 Inspeckage是一个用来动态分析安卓app的xposed模块 Inspeckage对动态分析很多常用的功能进行了汇总并且内建一个webserver 整个分析操作可以在友好的界面环境中进行 2 下载地址 I
  • 行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

    根据BehaviorTree CPP的官方介绍 xff0c 3 x版本已经不再维护了 xff0c 建议使用4 x版本 xff0c 4 x版本和3 x版本的区别可以看这里 https www behaviortree dev migratio
  • OPC UA性能评估

    本文是对这篇论文的总结 xff0c 该文章从性能和资源使用方面比较了工业4 0的4个主要协议 xff1a OPC UA xff0c DDS xff0c ROS和MQTT 这4个协议都是基于以太网 xff08 Ethernet based x
  • 学习open62541 --- [73] 数据源造成无法监测变量的问题解决

    本人最近遇到一个问题 xff1a 给一个变量添加数据源后 xff0c 使用监测项去监测变量变化 xff0c 如果采样时间为0 xff0c 会发现无法监测到变量的变化 本文讲述这种情况的发生原因以及解决办法 一 Server例子 首先准备se
  • 启明欣欣STM32开发板移植FreeRTOS

    承接这篇文章 xff0c 本篇讲述如何把FreeRTOS移植到启明欣欣STM32开发板里 xff0c 比较简单 xff0c 网上也有各种教程 xff0c 本文也是参考其它文章 xff0c 这里再记录一下 一 搭建基础工程 启明欣欣STM32
  • 学习open62541 --- [74] 软链接的妙用

    一 原理 在同一台电脑里 xff0c 可能会有多个工程同时用到open62541 xff0c 比较简单的办法是每个工程都拷贝一份open62541源码 xff0c 但是这样会造成空间浪费 xff0c 而且open62541的源码包本身也不小
  • 学习open62541 --- [75] 生成namespace文件的简便方法

    在之前的文章中 xff0c 生成namespace文件是使用open62541提供的nodeset compiler py xff0c 根据nodeset compiler rst xff08 位于open62541 doc xff09 里