Node-OPC-UA读取S7-1500自定义DataType首次报错后续正常问题咨询
Node-OPC-UA读取S7-1500自定义DataType ExtensionObject的问题
环境与问题描述
使用Node v16.14.2 + Node-OPC-UA v2.75.0,读取S7-1500中带有自定义DataType的大型ExtensionObject时,出现以下情况:
- 首次读取会输出大量
Cannot find dataType Definition错误日志 - 报错后读取功能恢复正常,能成功获取数据
- 服务器端无异常,已启用对<=1.3版本DataType的支持
错误输出
17:20:35.217Z :populate_data_type_manager_104:50 Error Error: Cannot find dataType Definition ! with nodeId =ns=2;i=6522 ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:34:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.240Z :populate_data_type_manager_104:177 err= Error ... at assert (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-assert\source\index.ts:12:21) ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:175:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.293Z :populate_data_type_manager_104:50 Error Error: Cannot find dataType Definition ! with nodeId =ns=2;i=6525 ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:34:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.294Z :populate_data_type_manager_104:177 err= Error ... at assert (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-assert\source\index.ts:12:21) ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:175:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.347Z :populate_data_type_manager_104:50 Error Error: Cannot find dataType Definition ! with nodeId =ns=3;i=3400 ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:34:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.348Z :populate_data_type_manager_104:177 err= Error ... at assert (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-assert\source\index.ts:12:21) ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:175:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.441Z :populate_data_type_manager_104:50 Error Error: Cannot find dataType Definition ! with nodeId =ns=3;i=3500 ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:34:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.443Z :populate_data_type_manager_104:177 err= Error ... at assert (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-assert\source\index.ts:12:21) ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:175:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.732Z :populate_data_type_manager_104:50 Error Error: Cannot find dataType Definition ! with nodeId =ns=2;i=15889 ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:34:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.734Z :populate_data_type_manager_104:177 err= Error ... at assert (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-assert\source\index.ts:12:21) ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:175:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.798Z :populate_data_type_manager_104:50 Error Error: Cannot find dataType Definition ! with nodeId =ns=2;i=15888 ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:34:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5) 17:20:35.800Z :populate_data_type_manager_104:177 err= Error ... at assert (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-assert\source\index.ts:12:21) ... at C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\source\private\populate_data_type_manager_104.ts:175:19 ... at Generator.next (<anonymous>) ... at fulfilled (C:\Users\me\Desktop\my-opcua-client\node_modules\node-opcua-client-dynamic-extension-object\dist\private\populate_data_type_manager_104.js:5:58) ... at processTicksAndRejections (node:internal/process/task_queues:96:5)
相关代码逻辑
const opcClient = OPCUAClient.create({ applicationName: 'my-opc-client', securityMode: MessageSecurityMode.None, securityPolicy: SecurityPolicy.None, endpointMustExist: true, keepSessionAlive: true, }); await opcClient.connect(<myIp>); const opcSession = await opcClient.createSession(); opcClient.on('close', () => { logger.error('OPC-Client has closed the connection'); }); opcClient.on('abort', () => { logger.error('OPC-Client has aborted the connection'); }); opcClient.on('connected', () => { logger.error('OPC-Client is connected'); }); opcClient.on('connection_lost', () => { logger.error('OPC-Client has lost the connection'); }); opcClient.on('connection_reestablished', () => { logger.info('OPC-Client has reestablished the connection'); }); const mainLoop = async () => { try { const processData = await opcSession.read( [ { nodeId: 'ns=3;s="020_FIFO_OPCUA"."Setpoints"' }, { nodeId: 'ns=3;s="020_FIFO_OPCUA"."Actuals"' } ] ); await writeToDatabase(processData); setTimeout(() => mainLoop(), 500); } catch (error : any) { logger.error(error.message); setTimeout(() => mainLoop(), 5000); } }; mainLoop();
问题分析与解决方法
核心原因
首次读取时,Node-OPC-UA客户端尚未从服务器加载完整的自定义DataType定义,就尝试解析ExtensionObject,导致找不到对应DataType节点的定义而报错。后续读取时,客户端已缓存了这些DataType定义,因此能正常解析数据。
解决措施
主动预加载自定义DataType
在建立会话后、首次读取数据前,主动加载服务器上的所有自定义DataType定义。可以通过浏览服务器的DataType文件夹(NodeId为ns=0;i=2253),然后读取每个自定义DataType的节点信息,让客户端提前缓存:// 示例:浏览DataType文件夹并加载定义 const browseResult = await opcSession.browse("ns=0;i=2253"); for (const reference of browseResult.references) { if (reference.nodeClass === NodeClass.DataType) { await opcSession.read({ nodeId: reference.nodeId, attributeId: AttributeIds.DataTypeDefinition }); } }使用官方API初始化DataType管理器
调用Node-OPC-UA提供的populateDataTypeManager方法,在会话建立后主动触发DataType管理器的初始化,确保所有自定义DataType都被加载完成:const { populateDataTypeManager } = require("node-opcua-client-dynamic-extension-object"); // 初始化DataType管理器 await populateDataTypeManager(opcSession); // 再启动读取循环 mainLoop();延迟首次读取
在会话建立后,延迟几秒再启动mainLoop,给客户端足够时间自动加载DataType定义。这种方法简单但依赖网络稳定性,适合测试场景:// 会话建立后延迟3秒启动读取 setTimeout(() => mainLoop(), 3000);检查权限配置
确认客户端对报错中提到的DataType节点(如ns=2;i=6522等)有读取权限,服务器需允许客户端获取这些节点的定义信息。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

