Open62541节点集编译报错:无法识别Safety:OutFlagsType类型
解决open62541编译时无法识别
Opc.Ua.Safety:OutFlagsType的问题 针对你遇到的RuntimeError,以下是从依赖顺序、配置、模型定义三个维度的具体解决步骤:
1. 修正UA-Model Compiler的编译顺序
自定义类型MyResponseSPDUDataType依赖Safety节点集的OutFlagsType,必须确保编译器先加载Safety节点集的类型定义:
- 执行UA-Model Compiler时,先传入Safety节点集文件,再传入自定义模型文件,示例命令:
ua-model-compiler -d SafetyNodeset2.xml -g AppModel.xml -o generated - 检查生成的
generated目录,确认包含Safety相关的类型文件(如ua_safety_types.h、ua_safety_types.c),且自定义类型的代码中正确引用了这些头文件。
2. 调整CMakeLists.txt的依赖配置
确保open62541编译时优先处理Safety节点集的生成代码,再加载自定义模型:
# 定义Safety节点集的生成文件路径 set(SAFETY_GENERATED_SRC ${CMAKE_CURRENT_SOURCE_DIR}/generated/ua_safety_types.c ${CMAKE_CURRENT_SOURCE_DIR}/generated/ua_safety_nodeset.c ) set(SAFETY_GENERATED_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/generated) # 定义自定义模型的生成文件路径 set(APP_GENERATED_SRC ${CMAKE_CURRENT_SOURCE_DIR}/generated/ua_app_types.c ${CMAKE_CURRENT_SOURCE_DIR}/generated/ua_app_nodeset.c ) # 生成命名空间时明确依赖Safety节点集 UA_GENERATE_NAMESPACE( NAME app_namespace FILES ${CMAKE_CURRENT_SOURCE_DIR}/AppModel.xml DEPENDENCIES ${CMAKE_CURRENT_SOURCE_DIR}/SafetyNodeset2.xml ) # 编译配置:先引入Safety的头文件,再链接生成文件 add_executable(MyOpcUaApp main.c ${SAFETY_GENERATED_SRC} ${APP_GENERATED_SRC}) target_include_directories(MyOpcUaApp PRIVATE ${SAFETY_GENERATED_INCLUDE}) target_link_libraries(MyOpcUaApp open62541)
3. 检查自定义AppModel.xml的命名空间引用
确保自定义模型中正确导入Safety命名空间,且类型引用的前缀与导入一致:
<UANodeSet xmlns="http://opcfoundation.org/UA/2011/03/UANodeSet.xsd" xmlns:safety="Opc.Ua.Safety"> <!-- 导入Safety节点集的命名空间URI --> <ImportNamespace>http://opcfoundation.org/UA/Safety/</ImportNamespace> <UADataType NodeId="ns=1;i=1001" BrowseName="MyResponseSPDUDataType"> <Definition Name="MyResponseSPDUDataType"> <!-- 使用正确的前缀引用Safety类型 --> <Field Name="OutFlags" DataType="safety:OutFlagsType"/> </Definition> </UADataType> </UANodeSet>
4. 清理缓存重新构建
删除Visual Studio的build目录,重新运行CMake生成解决方案后再编译,避免旧缓存残留未更新的类型定义导致依赖缺失。
内容的提问来源于stack exchange,提问作者tue2017
相关产品推荐
相关产品推荐

