public void SetServerStatus(ServerStatusDataType status) { ProductNameTextBox.Text = "---"; ProductUriTextBox.Text = "---"; ManufacturerNameTextBox.Text = "---"; SoftwareVersionTextBox.Text = "---"; BuildNumberTextBox.Text = "---"; BuildDateTextBox.Text = "---"; StartTimeTextBox.Text = "---"; CurrentTimeTextBox.Text = "---"; StateTextBox.Text = "---"; SecondsUntilShutdownTextBox.Text = "---"; ShutdownReasonTextBox.Text = "---"; if (status != null) { if (status.BuildInfo != null) { ProductNameTextBox.Text = status.BuildInfo.ProductName; ProductUriTextBox.Text = status.BuildInfo.ProductUri; ManufacturerNameTextBox.Text = status.BuildInfo.ManufacturerName; SoftwareVersionTextBox.Text = status.BuildInfo.SoftwareVersion; BuildNumberTextBox.Text = status.BuildInfo.BuildNumber; BuildDateTextBox.Text = status.BuildInfo.BuildDate.ToLocalTime().ToString("yyyy-MM-dd"); } StartTimeTextBox.Text = status.StartTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); CurrentTimeTextBox.Text = status.CurrentTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"); SecondsUntilShutdownTextBox.Text = (status.SecondsTillShutdown > 0) ? status.SecondsTillShutdown.ToString() : ""; ShutdownReasonTextBox.Text = (status.SecondsTillShutdown > 0) ? String.Format("{0}", status.ShutdownReason) : ""; StateTextBox.Text = status.State.ToString(); } }
private void Timer_Tick(object sender, EventArgs e) { try { ServerStatusDataType status = m_server.GetStatus(); StartTimeTB.Text = Utils.Format("{0:HH:mm:ss.ff}", status.StartTime.ToLocalTime()); CurrentTimeTB.Text = Utils.Format("{0:HH:mm:ss.ff}", status.CurrentTime.ToLocalTime()); ServerStateTB.Text = Utils.Format("{0}", status.State); } catch (Exception exception) { HandleException(this.Text, MethodBase.GetCurrentMethod(), exception); } }
public ServerStatusDataType GetServerStatus() { // Get the current DataValue object for the ServerStatus node NodeId nodeId = new NodeId(Variables.Server_ServerStatus); DataValue dataValue = _session.ReadValue(nodeId); // Unpack the ExtensionObject that the DataValue contains, then return ServerStatusDataType object // that represents the current server status ExtensionObject extensionObject = (ExtensionObject)dataValue.Value; ServerStatusDataType serverStatus = (ServerStatusDataType)extensionObject.Body; return(serverStatus); }
private void ReadButton_Click(object sender, EventArgs e) { if (_client == null) { // Get IP address and port string ipAddress = IPAddressTextBox.Text; string port = PortTextBox.Text; _client = new OPCUAClient(ipAddress, port, _application.ApplicationConfiguration); } if (!_client.Connected) { // If the client hasn't connected something has gone wrong. // Reset client and return _client = null; return; } // Get server status and update TextBoxes ServerStatusDataType serverStatus = _client.GetServerStatus(); ServerStatusTextBox.Text = serverStatus.State.ToString(); ServerStartTimeTextBox.Text = serverStatus.StartTime.ToLocalTime().ToString(); CurrentServerTimeTextBox.Text = serverStatus.CurrentTime.ToLocalTime().ToString(); // Loop through each tag, get value and update row foreach (DataRow row in _tagDataTable.Rows) { DataValue dataValue = _client.GetValue(row["Tag Address"].ToString(), 2); if (dataValue == null) { continue; } row["Data Type"] = dataValue.WrappedValue.TypeInfo.ToString(); row["Value"] = dataValue.Value.ToString(); row["Timestamp"] = dataValue.SourceTimestamp.ToLocalTime().ToString(); row["Quality"] = StatusCode.IsGood(dataValue.StatusCode) ? "Good" : "Bad"; } }
/// <summary> /// Constructs the server. /// </summary> public ServerObject(string applicationUri, NodeManager nodeManager) { // the namespace table is used for the namepace indexes in NodeIds and QualifiedNames // The first index (added by default) is the UA namespace. The second is the application uri. m_namespaceUris = new NamespaceTable(); m_namespaceUris.Append(applicationUri); // the server table is used for the server index in remote NodeIds (a.k.a. ExpandedNodeIds) // The first index is always the current server. m_serverUris = new StringTable(); m_serverUris.Append(applicationUri); m_serviceLevel = 100; m_serverStatus = new ServerStatusDataType(); m_serverStatus.StartTime = DateTime.UtcNow; m_serverStatus.CurrentTime = DateTime.UtcNow; m_serverStatus.State = ServerState.Running_0; m_serverStatus.SecondsTillShutdown = 0; m_serverStatus.ShutdownReason = null; m_serverStatus.BuildInfo = new BuildInfo(); m_serverStatus.BuildInfo.BuildDate = new DateTime(2008, 7, 1); m_serverStatus.BuildInfo.SoftwareVersion = "1.00"; m_serverStatus.BuildInfo.BuildNumber = "218.0"; m_serverStatus.BuildInfo.ManufacturerName = "My Company"; m_serverStatus.BuildInfo.ProductName = "My Sample Server"; m_serverStatus.BuildInfo.ProductUri = "http://mycompany.com/MySampleServer/v1.0"; // tell the node manager to call this object whenever the value of these attributes are read. nodeManager.SetReadValueCallback(new NodeId(Variables.Server_NamespaceArray), GetNamespaceArray); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerArray), GetServerArray); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServiceLevel), GetServiceLevel); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus), GetServerStatus); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus_StartTime), GetServerStatus_StartTime); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus_CurrentTime), GetServerStatus_CurrentTime); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus_State), GetServerStatus_State); }
/// <summary> /// Constructs the server. /// </summary> public ServerObject(string applicationUri, NodeManager nodeManager) { // the namespace table is used for the namepace indexes in NodeIds and QualifiedNames // The first index (added by default) is the UA namespace. The second is the application uri. m_namespaceUris = new NamespaceTable(); m_namespaceUris.Append(applicationUri); // the server table is used for the server index in remote NodeIds (a.k.a. ExpandedNodeIds) // The first index is always the current server. m_serverUris = new StringTable(); m_serverUris.Append(applicationUri); m_serviceLevel = 100; m_serverStatus = new ServerStatusDataType(); m_serverStatus.StartTime = DateTime.UtcNow; m_serverStatus.CurrentTime = DateTime.UtcNow; m_serverStatus.State = ServerState.Running_0; m_serverStatus.SecondsTillShutdown = 0; m_serverStatus.ShutdownReason = null; m_serverStatus.BuildInfo = new BuildInfo(); m_serverStatus.BuildInfo.BuildDate = new DateTime(2008, 7, 1); m_serverStatus.BuildInfo.SoftwareVersion = "1.00"; m_serverStatus.BuildInfo.BuildNumber = "218.0"; m_serverStatus.BuildInfo.ManufacturerName = "My Company"; m_serverStatus.BuildInfo.ProductName = "My Sample Server"; m_serverStatus.BuildInfo.ProductUri = "http://mycompany.com/MySampleServer/v1.0"; // tell the node manager to call this object whenever the value of these attributes are read. nodeManager.SetReadValueCallback(new NodeId(Variables.Server_NamespaceArray), GetNamespaceArray); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerArray), GetServerArray); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServiceLevel), GetServiceLevel); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus), GetServerStatus); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus_StartTime), GetServerStatus_StartTime); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus_CurrentTime), GetServerStatus_CurrentTime); nodeManager.SetReadValueCallback(new NodeId(Variables.Server_ServerStatus_State), GetServerStatus_State); }
/// <summary> /// Creates the ServerObject and attaches it to the NodeManager. /// </summary> private void CreateServerObject() { lock (m_diagnosticsNodeManager.Lock) { // get the server object. ServerObjectState serverObject = m_serverObject = (ServerObjectState)m_diagnosticsNodeManager.FindPredefinedNode( ObjectIds.Server, typeof(ServerObjectState)); // update server capabilities. serverObject.ServiceLevel.Value = 255; serverObject.ServerCapabilities.LocaleIdArray.Value = m_resourceManager.GetAvailableLocales(); serverObject.ServerCapabilities.MinSupportedSampleRate.Value = 0; serverObject.ServerCapabilities.MaxBrowseContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxBrowseContinuationPoints; serverObject.ServerCapabilities.MaxQueryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxQueryContinuationPoints; serverObject.ServerCapabilities.MaxHistoryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxHistoryContinuationPoints; // setup callbacks for dynamic values. serverObject.NamespaceArray.OnSimpleReadValue = OnReadNamespaceArray; serverObject.NamespaceArray.MinimumSamplingInterval = 1000; serverObject.ServerArray.OnSimpleReadValue = OnReadServerArray; serverObject.ServerArray.MinimumSamplingInterval = 1000; serverObject.ServerDiagnostics.EnabledFlag.OnSimpleReadValue = OnReadDiagnosticsEnabledFlag; serverObject.ServerDiagnostics.EnabledFlag.MinimumSamplingInterval = 1000; // initialize status. ServerStatusDataType serverStatus = new ServerStatusDataType(); serverStatus.StartTime = DateTime.UtcNow; serverStatus.CurrentTime = DateTime.UtcNow; serverStatus.State = ServerState.Shutdown; serverStatus.BuildInfo.ProductName = m_serverDescription.ProductName; serverStatus.BuildInfo.ProductUri = m_serverDescription.ProductUri; serverStatus.BuildInfo.ManufacturerName = m_serverDescription.ManufacturerName; serverStatus.BuildInfo.SoftwareVersion = m_serverDescription.SoftwareVersion; serverStatus.BuildInfo.BuildNumber = m_serverDescription.BuildNumber; serverStatus.BuildInfo.BuildDate = m_serverDescription.BuildDate; serverObject.ServerStatus.MinimumSamplingInterval = 1000; serverObject.ServerStatus.CurrentTime.MinimumSamplingInterval = 1000; m_serverStatus = new ServerStatusValue( serverObject.ServerStatus, serverStatus, m_dataLock); m_serverStatus.Timestamp = DateTime.UtcNow; m_serverStatus.OnBeforeRead = OnReadServerStatus; // initialize diagnostics. m_serverDiagnostics = new ServerDiagnosticsSummaryDataType(); m_serverDiagnostics.ServerViewCount = 0; m_serverDiagnostics.CurrentSessionCount = 0; m_serverDiagnostics.CumulatedSessionCount = 0; m_serverDiagnostics.SecurityRejectedSessionCount = 0; m_serverDiagnostics.RejectedSessionCount = 0; m_serverDiagnostics.SessionTimeoutCount = 0; m_serverDiagnostics.SessionAbortCount = 0; m_serverDiagnostics.PublishingIntervalCount = 0; m_serverDiagnostics.CurrentSubscriptionCount = 0; m_serverDiagnostics.CumulatedSubscriptionCount = 0; m_serverDiagnostics.SecurityRejectedRequestsCount = 0; m_serverDiagnostics.RejectedRequestsCount = 0; m_diagnosticsNodeManager.CreateServerDiagnostics( m_defaultSystemContext, m_serverDiagnostics, OnUpdateDiagnostics); // set the diagnostics enabled state. m_diagnosticsNodeManager.SetDiagnosticsEnabled( m_defaultSystemContext, m_configuration.ServerConfiguration.DiagnosticsEnabled); // TBD - Load the Software Certificates. } }
/// <summary> /// Creates the ServerObject and attaches it to the NodeManager. /// </summary> private void CreateServerObject() { lock (m_diagnosticsNodeManager.Lock) { // get the server object. ServerObjectState serverObject = m_serverObject = (ServerObjectState)m_diagnosticsNodeManager.FindPredefinedNode( ObjectIds.Server, typeof(ServerObjectState)); // update server capabilities. serverObject.ServiceLevel.Value = 255; serverObject.ServerCapabilities.LocaleIdArray.Value = m_resourceManager.GetAvailableLocales(); serverObject.ServerCapabilities.MinSupportedSampleRate.Value = 0; serverObject.ServerCapabilities.MaxBrowseContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxBrowseContinuationPoints; serverObject.ServerCapabilities.MaxQueryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxQueryContinuationPoints; serverObject.ServerCapabilities.MaxHistoryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxHistoryContinuationPoints; // setup callbacks for dynamic values. serverObject.NamespaceArray.OnSimpleReadValue = OnReadNamespaceArray; serverObject.NamespaceArray.MinimumSamplingInterval = 1000; serverObject.ServerArray.OnSimpleReadValue = OnReadServerArray; serverObject.ServerArray.MinimumSamplingInterval = 1000; serverObject.ServerDiagnostics.EnabledFlag.OnSimpleReadValue = OnReadDiagnosticsEnabledFlag; serverObject.ServerDiagnostics.EnabledFlag.OnSimpleWriteValue = OnWriteDiagnosticsEnabledFlag; serverObject.ServerDiagnostics.EnabledFlag.MinimumSamplingInterval = 1000; // initialize status. ServerStatusDataType serverStatus = new ServerStatusDataType(); serverStatus.StartTime = DateTime.UtcNow; serverStatus.CurrentTime = DateTime.UtcNow; serverStatus.State = ServerState.Shutdown; serverStatus.BuildInfo.ProductName = m_serverDescription.ProductName; serverStatus.BuildInfo.ProductUri = m_serverDescription.ProductUri; serverStatus.BuildInfo.ManufacturerName = m_serverDescription.ManufacturerName; serverStatus.BuildInfo.SoftwareVersion = m_serverDescription.SoftwareVersion; serverStatus.BuildInfo.BuildNumber = m_serverDescription.BuildNumber; serverStatus.BuildInfo.BuildDate = m_serverDescription.BuildDate; serverObject.ServerStatus.MinimumSamplingInterval = 1000; serverObject.ServerStatus.CurrentTime.MinimumSamplingInterval = 1000; m_serverStatus = new ServerStatusValue( serverObject.ServerStatus, serverStatus, m_dataLock); m_serverStatus.Timestamp = DateTime.UtcNow; m_serverStatus.OnBeforeRead = OnReadServerStatus; // initialize diagnostics. m_serverDiagnostics = new ServerDiagnosticsSummaryDataType(); m_serverDiagnostics.ServerViewCount = 0; m_serverDiagnostics.CurrentSessionCount = 0; m_serverDiagnostics.CumulatedSessionCount = 0; m_serverDiagnostics.SecurityRejectedSessionCount = 0; m_serverDiagnostics.RejectedSessionCount = 0; m_serverDiagnostics.SessionTimeoutCount = 0; m_serverDiagnostics.SessionAbortCount = 0; m_serverDiagnostics.PublishingIntervalCount = 0; m_serverDiagnostics.CurrentSubscriptionCount = 0; m_serverDiagnostics.CumulatedSubscriptionCount = 0; m_serverDiagnostics.SecurityRejectedRequestsCount = 0; m_serverDiagnostics.RejectedRequestsCount = 0; m_diagnosticsNodeManager.CreateServerDiagnostics( m_defaultSystemContext, m_serverDiagnostics, OnUpdateDiagnostics); // set the diagnostics enabled state. m_diagnosticsNodeManager.SetDiagnosticsEnabled( m_defaultSystemContext, m_configuration.ServerConfiguration.DiagnosticsEnabled); // TBD - Load the Software Certificates. } }
/// <summary> /// Creates the ServerObject and attaches it to the NodeManager. /// </summary> private void CreateServerObject() { lock (m_diagnosticsNodeManager.Lock) { // get the server object. ServerObjectState serverObject = m_serverObject = (ServerObjectState)m_diagnosticsNodeManager.FindPredefinedNode( ObjectIds.Server, typeof(ServerObjectState)); // update server capabilities. serverObject.ServiceLevel.Value = 255; serverObject.ServerCapabilities.LocaleIdArray.Value = m_resourceManager.GetAvailableLocales(); serverObject.ServerCapabilities.ServerProfileArray.Value = m_configuration.ServerConfiguration.ServerProfileArray.ToArray(); serverObject.ServerCapabilities.MinSupportedSampleRate.Value = 0; serverObject.ServerCapabilities.MaxBrowseContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxBrowseContinuationPoints; serverObject.ServerCapabilities.MaxQueryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxQueryContinuationPoints; serverObject.ServerCapabilities.MaxHistoryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxHistoryContinuationPoints; serverObject.ServerCapabilities.MaxArrayLength.Value = (uint)m_configuration.TransportQuotas.MaxArrayLength; serverObject.ServerCapabilities.MaxStringLength.Value = (uint)m_configuration.TransportQuotas.MaxStringLength; serverObject.ServerCapabilities.MaxByteStringLength.Value = (uint)m_configuration.TransportQuotas.MaxByteStringLength; serverObject.ServerCapabilities.OperationLimits.MaxNodesPerRead.Value = 0; serverObject.ServerCapabilities.OperationLimits.MaxNodesPerWrite.Value = 0; serverObject.ServerCapabilities.OperationLimits.MaxNodesPerMethodCall.Value = 1000; serverObject.ServerCapabilities.OperationLimits.MaxNodesPerBrowse.Value = 0; serverObject.ServerCapabilities.OperationLimits.MaxNodesPerRegisterNodes.Value = 0; // setup callbacks for dynamic values. serverObject.NamespaceArray.OnSimpleReadValue = OnReadNamespaceArray; serverObject.NamespaceArray.MinimumSamplingInterval = 1000; serverObject.ServerArray.OnSimpleReadValue = OnReadServerArray; serverObject.ServerArray.MinimumSamplingInterval = 1000; // dynamic change of enabledFlag is disabled to pass CTT serverObject.ServerDiagnostics.EnabledFlag.AccessLevel = AccessLevels.CurrentRead; serverObject.ServerDiagnostics.EnabledFlag.UserAccessLevel = AccessLevels.CurrentRead; serverObject.ServerDiagnostics.EnabledFlag.OnSimpleReadValue = OnReadDiagnosticsEnabledFlag; serverObject.ServerDiagnostics.EnabledFlag.OnSimpleWriteValue = OnWriteDiagnosticsEnabledFlag; serverObject.ServerDiagnostics.EnabledFlag.MinimumSamplingInterval = 1000; // initialize status. ServerStatusDataType serverStatus = new ServerStatusDataType(); serverStatus.StartTime = DateTime.UtcNow; serverStatus.CurrentTime = DateTime.UtcNow; serverStatus.State = ServerState.Shutdown; serverStatus.BuildInfo.ProductName = m_serverDescription.ProductName; serverStatus.BuildInfo.ProductUri = m_serverDescription.ProductUri; serverStatus.BuildInfo.ManufacturerName = m_serverDescription.ManufacturerName; serverStatus.BuildInfo.SoftwareVersion = m_serverDescription.SoftwareVersion; serverStatus.BuildInfo.BuildNumber = m_serverDescription.BuildNumber; serverStatus.BuildInfo.BuildDate = m_serverDescription.BuildDate; serverObject.ServerStatus.MinimumSamplingInterval = 1000; serverObject.ServerStatus.CurrentTime.MinimumSamplingInterval = 1000; m_serverStatus = new ServerStatusValue( serverObject.ServerStatus, serverStatus, m_dataLock); m_serverStatus.Timestamp = DateTime.UtcNow; m_serverStatus.OnBeforeRead = OnReadServerStatus; // initialize diagnostics. m_serverDiagnostics = new ServerDiagnosticsSummaryDataType(); m_serverDiagnostics.ServerViewCount = 0; m_serverDiagnostics.CurrentSessionCount = 0; m_serverDiagnostics.CumulatedSessionCount = 0; m_serverDiagnostics.SecurityRejectedSessionCount = 0; m_serverDiagnostics.RejectedSessionCount = 0; m_serverDiagnostics.SessionTimeoutCount = 0; m_serverDiagnostics.SessionAbortCount = 0; m_serverDiagnostics.PublishingIntervalCount = 0; m_serverDiagnostics.CurrentSubscriptionCount = 0; m_serverDiagnostics.CumulatedSubscriptionCount = 0; m_serverDiagnostics.SecurityRejectedRequestsCount = 0; m_serverDiagnostics.RejectedRequestsCount = 0; m_diagnosticsNodeManager.CreateServerDiagnostics( m_defaultSystemContext, m_serverDiagnostics, OnUpdateDiagnostics); // set the diagnostics enabled state. m_diagnosticsNodeManager.SetDiagnosticsEnabled( m_defaultSystemContext, m_configuration.ServerConfiguration.DiagnosticsEnabled); ConfigurationNodeManager configurationNodeManager = m_diagnosticsNodeManager as ConfigurationNodeManager; configurationNodeManager?.CreateServerConfiguration( m_defaultSystemContext, m_configuration); } }
/// <summary> /// Creates the ServerObject and attaches it to the NodeManager. /// </summary> private void CreateServerObject() { lock (m_diagnosticsNodeManager.Lock) { // get the server object. ServerObjectState serverObject = m_serverObject = (ServerObjectState)m_diagnosticsNodeManager.FindPredefinedNode( ObjectIds.Server, typeof(ServerObjectState)); // update server capabilities. serverObject.ServiceLevel.Value = 255; serverObject.ServerCapabilities.LocaleIdArray.Value = m_resourceManager.GetAvailableLocales(); serverObject.ServerCapabilities.ServerProfileArray.Value = m_configuration.ServerConfiguration.ServerProfileArray.ToArray(); serverObject.ServerCapabilities.MinSupportedSampleRate.Value = 0; serverObject.ServerCapabilities.MaxBrowseContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxBrowseContinuationPoints; serverObject.ServerCapabilities.MaxQueryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxQueryContinuationPoints; serverObject.ServerCapabilities.MaxHistoryContinuationPoints.Value = (ushort)m_configuration.ServerConfiguration.MaxHistoryContinuationPoints; serverObject.ServerCapabilities.MaxArrayLength.Value = (uint)m_configuration.TransportQuotas.MaxArrayLength; serverObject.ServerCapabilities.MaxStringLength.Value = (uint)m_configuration.TransportQuotas.MaxStringLength; serverObject.ServerCapabilities.MaxByteStringLength.Value = (uint)m_configuration.TransportQuotas.MaxByteStringLength; // Any operational limits Property that is provided shall have a non zero value. var operationLimits = serverObject.ServerCapabilities.OperationLimits; var configOperationLimits = m_configuration.ServerConfiguration.OperationLimits; if (configOperationLimits != null) { operationLimits.MaxNodesPerRead = SetPropertyValue(operationLimits.MaxNodesPerRead, configOperationLimits.MaxNodesPerRead); operationLimits.MaxNodesPerHistoryReadData = SetPropertyValue(operationLimits.MaxNodesPerHistoryReadData, configOperationLimits.MaxNodesPerHistoryReadData); operationLimits.MaxNodesPerHistoryReadEvents = SetPropertyValue(operationLimits.MaxNodesPerHistoryReadEvents, configOperationLimits.MaxNodesPerHistoryReadEvents); operationLimits.MaxNodesPerWrite = SetPropertyValue(operationLimits.MaxNodesPerWrite, configOperationLimits.MaxNodesPerWrite); operationLimits.MaxNodesPerHistoryUpdateData = SetPropertyValue(operationLimits.MaxNodesPerHistoryUpdateData, configOperationLimits.MaxNodesPerHistoryUpdateData); operationLimits.MaxNodesPerHistoryUpdateEvents = SetPropertyValue(operationLimits.MaxNodesPerHistoryUpdateEvents, configOperationLimits.MaxNodesPerHistoryUpdateEvents); operationLimits.MaxNodesPerMethodCall = SetPropertyValue(operationLimits.MaxNodesPerMethodCall, configOperationLimits.MaxNodesPerMethodCall); operationLimits.MaxNodesPerBrowse = SetPropertyValue(operationLimits.MaxNodesPerBrowse, configOperationLimits.MaxNodesPerBrowse); operationLimits.MaxNodesPerRegisterNodes = SetPropertyValue(operationLimits.MaxNodesPerRegisterNodes, configOperationLimits.MaxNodesPerRegisterNodes); operationLimits.MaxNodesPerTranslateBrowsePathsToNodeIds = SetPropertyValue(operationLimits.MaxNodesPerTranslateBrowsePathsToNodeIds, configOperationLimits.MaxNodesPerTranslateBrowsePathsToNodeIds); operationLimits.MaxNodesPerNodeManagement = SetPropertyValue(operationLimits.MaxNodesPerNodeManagement, configOperationLimits.MaxNodesPerNodeManagement); operationLimits.MaxMonitoredItemsPerCall = SetPropertyValue(operationLimits.MaxMonitoredItemsPerCall, configOperationLimits.MaxMonitoredItemsPerCall); } else { operationLimits.MaxNodesPerRead = operationLimits.MaxNodesPerHistoryReadData = operationLimits.MaxNodesPerHistoryReadEvents = operationLimits.MaxNodesPerWrite = operationLimits.MaxNodesPerHistoryUpdateData = operationLimits.MaxNodesPerHistoryUpdateEvents = operationLimits.MaxNodesPerMethodCall = operationLimits.MaxNodesPerBrowse = operationLimits.MaxNodesPerRegisterNodes = operationLimits.MaxNodesPerTranslateBrowsePathsToNodeIds = operationLimits.MaxNodesPerNodeManagement = operationLimits.MaxMonitoredItemsPerCall = null; } // setup PublishSubscribe Status State value PubSubState pubSubState = PubSubState.Disabled; var default_PubSubState = (BaseVariableState)m_diagnosticsNodeManager.FindPredefinedNode( VariableIds.PublishSubscribe_Status_State, typeof(BaseVariableState)); default_PubSubState.Value = pubSubState; // setup value for SupportedTransportProfiles var default_SupportedTransportProfiles = (BaseVariableState)m_diagnosticsNodeManager.FindPredefinedNode( VariableIds.PublishSubscribe_SupportedTransportProfiles, typeof(BaseVariableState)); default_SupportedTransportProfiles.Value = "uadp"; // setup callbacks for dynamic values. serverObject.NamespaceArray.OnSimpleReadValue = OnReadNamespaceArray; serverObject.NamespaceArray.MinimumSamplingInterval = 1000; serverObject.ServerArray.OnSimpleReadValue = OnReadServerArray; serverObject.ServerArray.MinimumSamplingInterval = 1000; // dynamic change of enabledFlag is disabled to pass CTT serverObject.ServerDiagnostics.EnabledFlag.AccessLevel = AccessLevels.CurrentRead; serverObject.ServerDiagnostics.EnabledFlag.UserAccessLevel = AccessLevels.CurrentRead; serverObject.ServerDiagnostics.EnabledFlag.OnSimpleReadValue = OnReadDiagnosticsEnabledFlag; serverObject.ServerDiagnostics.EnabledFlag.OnSimpleWriteValue = OnWriteDiagnosticsEnabledFlag; serverObject.ServerDiagnostics.EnabledFlag.MinimumSamplingInterval = 1000; // initialize status. ServerStatusDataType serverStatus = new ServerStatusDataType(); serverStatus.StartTime = DateTime.UtcNow; serverStatus.CurrentTime = DateTime.UtcNow; serverStatus.State = ServerState.Shutdown; serverStatus.BuildInfo.ProductName = m_serverDescription.ProductName; serverStatus.BuildInfo.ProductUri = m_serverDescription.ProductUri; serverStatus.BuildInfo.ManufacturerName = m_serverDescription.ManufacturerName; serverStatus.BuildInfo.SoftwareVersion = m_serverDescription.SoftwareVersion; serverStatus.BuildInfo.BuildNumber = m_serverDescription.BuildNumber; serverStatus.BuildInfo.BuildDate = m_serverDescription.BuildDate; serverObject.ServerStatus.MinimumSamplingInterval = 1000; serverObject.ServerStatus.CurrentTime.MinimumSamplingInterval = 1000; m_serverStatus = new ServerStatusValue( serverObject.ServerStatus, serverStatus, m_dataLock); m_serverStatus.Timestamp = DateTime.UtcNow; m_serverStatus.OnBeforeRead = OnReadServerStatus; // initialize diagnostics. m_serverDiagnostics = new ServerDiagnosticsSummaryDataType(); m_serverDiagnostics.ServerViewCount = 0; m_serverDiagnostics.CurrentSessionCount = 0; m_serverDiagnostics.CumulatedSessionCount = 0; m_serverDiagnostics.SecurityRejectedSessionCount = 0; m_serverDiagnostics.RejectedSessionCount = 0; m_serverDiagnostics.SessionTimeoutCount = 0; m_serverDiagnostics.SessionAbortCount = 0; m_serverDiagnostics.PublishingIntervalCount = 0; m_serverDiagnostics.CurrentSubscriptionCount = 0; m_serverDiagnostics.CumulatedSubscriptionCount = 0; m_serverDiagnostics.SecurityRejectedRequestsCount = 0; m_serverDiagnostics.RejectedRequestsCount = 0; m_diagnosticsNodeManager.CreateServerDiagnostics( m_defaultSystemContext, m_serverDiagnostics, OnUpdateDiagnostics); // set the diagnostics enabled state. m_diagnosticsNodeManager.SetDiagnosticsEnabled( m_defaultSystemContext, m_configuration.ServerConfiguration.DiagnosticsEnabled); ConfigurationNodeManager configurationNodeManager = m_diagnosticsNodeManager as ConfigurationNodeManager; configurationNodeManager?.CreateServerConfiguration( m_defaultSystemContext, m_configuration); } }
/// <summary> /// Tests the session keep alive when there are no errors. /// </summary> private bool DoKeepAliveTest() { bool success = true; double increment = MaxProgress / 3; double position = 0; m_keepAliveCount = 0; int currentKeepAlive = Session.KeepAliveInterval; List <Subscription> subscriptions = new List <Subscription>(); KeepAliveEventHandler handler = new KeepAliveEventHandler(Session_KeepAlive); try { Session.KeepAlive += handler; // add several subscriptions with long publish intervals. for (int publishingInterval = 10000; publishingInterval <= 20000; publishingInterval += 1000) { Subscription subscription = new Subscription(); subscription.MaxMessageCount = 100; subscription.LifetimeCount = 100; subscription.KeepAliveCount = 10; subscription.PublishingEnabled = true; subscription.PublishingInterval = publishingInterval; MonitoredItem monitoredItem = new MonitoredItem(); monitoredItem.StartNodeId = VariableIds.Server_ServerStatus_CurrentTime; monitoredItem.AttributeId = Attributes.Value; monitoredItem.SamplingInterval = -1; monitoredItem.QueueSize = 0; monitoredItem.DiscardOldest = true; subscription.AddItem(monitoredItem); Session.AddSubscription(subscription); subscription.Create(); subscriptions.Add(subscription); } // get a value to read. ReadValueId nodeToRead = new ReadValueId(); nodeToRead.NodeId = VariableIds.Server_ServerStatus; nodeToRead.AttributeId = Attributes.Value; ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); nodesToRead.Add(nodeToRead); int testDuration = 5000; // make sure the keep alives come at the expected rate. for (int keepAliveInterval = 500; keepAliveInterval < 2000; keepAliveInterval += 500) { m_keepAliveCount = 0; DateTime start = DateTime.UtcNow; DataValueCollection results = null; DiagnosticInfoCollection diagnosticsInfos = null; Session.Read( null, 0, TimestampsToReturn.Neither, nodesToRead, out results, out diagnosticsInfos); ClientBase.ValidateResponse(results, nodesToRead); ClientBase.ValidateDiagnosticInfos(diagnosticsInfos, nodesToRead); ServerStatusDataType status = ExtensionObject.ToEncodeable(results[0].Value as ExtensionObject) as ServerStatusDataType; if (status == null) { Log("Server did not return a valid ServerStatusDataType structure. Value={0}, Status={1}", results[0].WrappedValue, results[0].StatusCode); return(false); } if ((DateTime.UtcNow - start).TotalSeconds > 1) { Log("Unexpected delay reading the ServerStatus structure. Delay={0}s", (DateTime.UtcNow - start).TotalSeconds); return(false); } Log("Setting keep alive interval to {0}ms.", keepAliveInterval); Session.KeepAliveInterval = keepAliveInterval; if (m_errorEvent.WaitOne(testDuration, false)) { Log("Unexpected error waiting for session keep alives. {0}", m_error.ToLongString()); return(false); } if (m_keepAliveCount < testDuration / keepAliveInterval) { Log("Missing session keep alives. Expected={0}, Actual={1}", testDuration / keepAliveInterval, m_keepAliveCount); return(false); } Log("{0} keep alives received in {1}ms.", m_keepAliveCount, testDuration); position += increment; ReportProgress(position); } ReportProgress(MaxProgress); } finally { Session.RemoveSubscriptions(subscriptions); Session.KeepAliveInterval = currentKeepAlive; Session.KeepAlive -= handler; } return(success); }