基于Milo SDK 0.68(Kotlin)获取OPC-UA诊断信息的惯用方式咨询
Milo SDK 0.68(Kotlin)采集OPC-UA诊断信息的惯用方式
一、服务器摘要诊断的惯用写法
Milo SDK内置了对应OPC-UA标准诊断对象的类型,无需手动强转单个属性值,直接读取整个诊断对象节点更高效且符合SDK设计习惯:
// 获取服务器诊断摘要节点ID(直接使用内置标识符) val serverDiagnosticsSummaryNode = Identifiers.Server_ServerDiagnostics_ServerDiagnosticsSummary // 读取整个诊断对象 val summary = opcUaClient.readValue( 0.0, TimestampsToReturn.Source, serverDiagnosticsSummaryNode ).get().value.value as ServerDiagnosticsSummaryDataType // 直接访问摘要内的属性,无需手动类型转换 val currentSessionCount = summary.currentSessionCount val totalSessionCount = summary.totalSessionCount
ServerDiagnosticsSummaryDataType是Milo内置的类型,完全映射OPC-UA标准的服务器诊断摘要结构,能直接获取所有诊断属性,避免单个节点读取的冗余操作。
二、会话诊断返回null的解决方法
会话诊断并非单个属性节点,而是以会话诊断数组的形式存在,之前返回null大概率是读取了错误的节点路径,正确步骤如下:
- 读取会话诊断数组节点,获取所有会话对应的诊断对象NodeId列表:
val sessionDiagnosticsArrayNode = Identifiers.Server_ServerDiagnostics_SessionDiagnosticsArray // 读取数组得到所有会话诊断节点的ID集合 val sessionNodeIds = opcUaClient.readValue( 0.0, TimestampsToReturn.Source, sessionDiagnosticsArrayNode ).get().value.value as List<NodeId>
- 遍历NodeId列表,逐个读取每个会话的诊断对象:
val sessionDiagnosticsList = sessionNodeIds.map { nodeId -> opcUaClient.readValue( 0.0, TimestampsToReturn.Source, nodeId ).get().value.value as SessionDiagnosticsDataType } // 示例:输出第一个会话的关键诊断信息 sessionDiagnosticsList.firstOrNull()?.run { println("会话ID: $sessionId") println("客户端名称: $clientName") println("客户端IP: $clientAddress") }
SessionDiagnosticsDataType是Milo内置的会话诊断类型,包含会话ID、客户端信息、会话时长等完整诊断数据,通过数组节点获取所有会话后再读取单个会话诊断,就能避免返回null的问题。
内容的提问来源于stack exchange,提问作者Vlad C.
相关产品推荐
相关产品推荐

