/// <summary> /// Creates the diagnostics node for a subscription. /// </summary> public NodeId CreateSessionDiagnostics( ServerSystemContext systemContext, SessionDiagnosticsDataType diagnostics, NodeValueSimpleEventHandler updateCallback, SessionSecurityDiagnosticsDataType securityDiagnostics, NodeValueSimpleEventHandler updateSecurityCallback) { NodeId nodeId = null; lock (Lock) { SessionDiagnosticsObjectState sessionNode = new SessionDiagnosticsObjectState(null); // create a new instance and assign ids. nodeId = CreateNode( systemContext, null, ReferenceTypeIds.HasComponent, new QualifiedName(diagnostics.SessionName), sessionNode); diagnostics.SessionId = nodeId; securityDiagnostics.SessionId = nodeId; // check if diagnostics have been enabled. if (!m_diagnosticsEnabled) { return nodeId; } // add reference to session summary object. sessionNode.AddReference( ReferenceTypeIds.HasComponent, true, ObjectIds.Server_ServerDiagnostics_SessionsDiagnosticsSummary); // add reference from session summary object. SessionsDiagnosticsSummaryState summary = (SessionsDiagnosticsSummaryState)FindPredefinedNode( ObjectIds.Server_ServerDiagnostics_SessionsDiagnosticsSummary, typeof(SessionsDiagnosticsSummaryState)); if (summary != null) { summary.AddReference(ReferenceTypeIds.HasComponent, false, sessionNode.NodeId); } // initialize diagnostics node. SessionDiagnosticsVariableState diagnosticsNode = sessionNode.CreateChild( systemContext, BrowseNames.SessionDiagnostics) as SessionDiagnosticsVariableState; // wrap diagnostics in a thread safe object. SessionDiagnosticsVariableValue diagnosticsValue = new SessionDiagnosticsVariableValue( diagnosticsNode, diagnostics, Lock); // must ensure the first update gets sent. diagnosticsValue.Value = null; diagnosticsValue.Error = StatusCodes.BadWaitingForInitialData; diagnosticsValue.CopyPolicy = Opc.Ua.VariableCopyPolicy.Never; diagnosticsValue.OnBeforeRead = OnBeforeReadDiagnostics; // initialize security diagnostics node. SessionSecurityDiagnosticsState securityDiagnosticsNode = sessionNode.CreateChild( systemContext, BrowseNames.SessionSecurityDiagnostics) as SessionSecurityDiagnosticsState; // wrap diagnostics in a thread safe object. SessionSecurityDiagnosticsValue securityDiagnosticsValue = new SessionSecurityDiagnosticsValue( securityDiagnosticsNode, securityDiagnostics, Lock); // must ensure the first update gets sent. securityDiagnosticsValue.Value = null; securityDiagnosticsValue.Error = StatusCodes.BadWaitingForInitialData; securityDiagnosticsValue.CopyPolicy = Opc.Ua.VariableCopyPolicy.Never; securityDiagnosticsValue.OnBeforeRead = OnBeforeReadDiagnostics; // save the session. SessionDiagnosticsData sessionData = new SessionDiagnosticsData( sessionNode, diagnosticsValue, updateCallback, securityDiagnosticsValue, updateSecurityCallback); m_sessions.Add(sessionData); // send initial update. DoScan(true); } return nodeId; }
public SessionDiagnosticsData( SessionDiagnosticsObjectState summary, SessionDiagnosticsVariableValue value, NodeValueSimpleEventHandler updateCallback, SessionSecurityDiagnosticsValue securityValue, NodeValueSimpleEventHandler securityUpdateCallback) { Summary = summary; Value = value; UpdateCallback = updateCallback; SecurityValue = securityValue; SecurityUpdateCallback = securityUpdateCallback; }