/// <summary> /// Deletes a monitored item. /// </summary> protected override ServiceResult DeleteMonitoredItem( ISystemContext context, IMonitoredItem monitoredItem, out bool processed) { processed = false; // check for valid handle. MemoryBufferState buffer = monitoredItem.ManagerHandle as MemoryBufferState; if (buffer == null) { return(base.DeleteMonitoredItem( context, monitoredItem, out processed)); } // owned by this node manager. processed = true; // get the monitored item. MemoryBufferMonitoredItem datachangeItem = monitoredItem as MemoryBufferMonitoredItem; if (datachangeItem == null) { return(StatusCodes.BadMonitoredItemIdInvalid); } // delete the item. buffer.DeleteItem(datachangeItem); return(ServiceResult.Good); }
/// <summary> /// Changes the monitoring mode for an item. /// </summary> protected override ServiceResult SetMonitoringMode( ISystemContext context, IMonitoredItem monitoredItem, MonitoringMode monitoringMode, out bool processed) { processed = false; // check for valid handle. MemoryBufferState buffer = monitoredItem.ManagerHandle as MemoryBufferState; if (buffer == null) { return(base.SetMonitoringMode( context, monitoredItem, monitoringMode, out processed)); } // owned by this node manager. processed = true; // get the monitored item. MemoryBufferMonitoredItem datachangeItem = monitoredItem as MemoryBufferMonitoredItem; if (datachangeItem == null) { return(StatusCodes.BadMonitoredItemIdInvalid); } // delete the item. MonitoringMode previousMode = datachangeItem.SetMonitoringMode(monitoringMode); // need to provide an immediate update after enabling. if (previousMode == MonitoringMode.Disabled && monitoringMode != MonitoringMode.Disabled) { DataValue initialValue = new DataValue(); initialValue.Value = null; initialValue.ServerTimestamp = DateTime.UtcNow; initialValue.SourceTimestamp = DateTime.MinValue; initialValue.StatusCode = StatusCodes.Good; MemoryTagState tag = new MemoryTagState(buffer, datachangeItem.Offset); ServiceResult error = tag.ReadAttribute( context, datachangeItem.AttributeId, NumericRange.Empty, null, initialValue); datachangeItem.QueueValue(initialValue, error); } return(ServiceResult.Good); }
/// <summary> /// Modifies the parameters for a monitored item. /// </summary> protected override ServiceResult ModifyMonitoredItem( ISystemContext context, DiagnosticsMasks diagnosticsMasks, TimestampsToReturn timestampsToReturn, IMonitoredItem monitoredItem, MonitoredItemModifyRequest itemToModify, out MonitoringFilterResult filterError) { filterError = null; // check for valid handle. MemoryBufferState buffer = monitoredItem.ManagerHandle as MemoryBufferState; if (buffer == null) { return(base.ModifyMonitoredItem( context, diagnosticsMasks, timestampsToReturn, monitoredItem, itemToModify, out filterError)); } // owned by this node manager. itemToModify.Processed = true; // get the monitored item. MemoryBufferMonitoredItem datachangeItem = monitoredItem as MemoryBufferMonitoredItem; if (datachangeItem == null) { return(StatusCodes.BadMonitoredItemIdInvalid); } // validate parameters. MonitoringParameters parameters = itemToModify.RequestedParameters; // no filters supported at this time. MonitoringFilter filter = (MonitoringFilter)ExtensionObject.ToEncodeable(parameters.Filter); if (filter != null) { return(StatusCodes.BadFilterNotAllowed); } // modify the monitored item parameters. ServiceResult error = datachangeItem.Modify( diagnosticsMasks, timestampsToReturn, itemToModify.RequestedParameters.ClientHandle, itemToModify.RequestedParameters.SamplingInterval); return(ServiceResult.Good); }
/// <summary> /// Deletes the monitored item. /// </summary> public void DeleteItem(MemoryBufferMonitoredItem monitoredItem) { lock (m_dataLock) { if (monitoredItem.AttributeId != Attributes.Value) { m_nonValueMonitoredItems.Remove(monitoredItem.Id); return; } if (m_monitoringTable != null) { int elementOffet = (int)(monitoredItem.Offset / ElementSize); MemoryBufferMonitoredItem[] monitoredItems = m_monitoringTable[elementOffet]; if (monitoredItems != null) { int index = -1; for (int ii = 0; ii < monitoredItems.Length; ii++) { if (Object.ReferenceEquals(monitoredItems[ii], monitoredItem)) { index = ii; break; } } if (index >= 0) { m_itemCount--; if (monitoredItems.Length == 1) { monitoredItems = null; } else { monitoredItems = new MemoryBufferMonitoredItem[monitoredItems.Length - 1]; Array.Copy(m_monitoringTable[elementOffet], 0, monitoredItems, 0, index); Array.Copy(m_monitoringTable[elementOffet], index + 1, monitoredItems, index, monitoredItems.Length - index); } m_monitoringTable[elementOffet] = monitoredItems; } } } } }
/// <summary> /// Deletes the monitored item. /// </summary> public void DeleteItem(MemoryBufferMonitoredItem monitoredItem) { lock (m_dataLock) { if (monitoredItem.AttributeId != Attributes.Value) { m_nonValueMonitoredItems.Remove(monitoredItem.Id); return; } if (m_monitoringTable != null) { int elementOffet = (int)(monitoredItem.Offset / ElementSize); MemoryBufferMonitoredItem[] monitoredItems = m_monitoringTable[elementOffet]; if (monitoredItems != null) { int index = -1; for (int ii = 0; ii < monitoredItems.Length; ii++) { if (Object.ReferenceEquals(monitoredItems[ii], monitoredItem)) { index = ii; break; } } if (index >= 0) { m_itemCount--; if (monitoredItems.Length == 1) { monitoredItems = null; } else { monitoredItems = new MemoryBufferMonitoredItem[monitoredItems.Length - 1]; Array.Copy(m_monitoringTable[elementOffet], 0, monitoredItems, 0, index); Array.Copy(m_monitoringTable[elementOffet], index + 1, monitoredItems, index, monitoredItems.Length - index); } m_monitoringTable[elementOffet] = monitoredItems; } } } } }
/// <summary> /// Creates a new data change monitored item. /// </summary> public MemoryBufferMonitoredItem CreateDataChangeItem( ServerSystemContext context, MemoryTagState tag, uint subscriptionId, uint monitoredItemId, ReadValueId itemToMonitor, DiagnosticsMasks diagnosticsMasks, TimestampsToReturn timestampsToReturn, MonitoringMode monitoringMode, uint clientHandle, double samplingInterval) /* ISystemContext context, MemoryTagState tag, uint monitoredItemId, uint attributeId, DiagnosticsMasks diagnosticsMasks, TimestampsToReturn timestampsToReturn, MonitoringMode monitoringMode, uint clientHandle, double samplingInterval)*/ { lock (m_dataLock) { MemoryBufferMonitoredItem monitoredItem = new MemoryBufferMonitoredItem( m_server, m_nodeManager, this, tag.Offset, 0, monitoredItemId, context.OperationContext.Session, itemToMonitor, diagnosticsMasks, timestampsToReturn, monitoringMode, clientHandle, null, null, null, samplingInterval, 0, false, 0); /* MemoryBufferMonitoredItem monitoredItem = new MemoryBufferMonitoredItem( this, monitoredItemId, tag.Offset, attributeId, diagnosticsMasks, timestampsToReturn, monitoringMode, clientHandle, samplingInterval); */ if (itemToMonitor.AttributeId != Attributes.Value) { m_nonValueMonitoredItems.Add(monitoredItem.Id, monitoredItem); return monitoredItem; } int elementCount = (int)(SizeInBytes.Value / ElementSize); if (m_monitoringTable == null) { m_monitoringTable = new MemoryBufferMonitoredItem[elementCount][]; m_scanTimer = new Timer(DoScan, null, 100, 100); } int elementOffet = (int)(tag.Offset / ElementSize); MemoryBufferMonitoredItem[] monitoredItems = m_monitoringTable[elementOffet]; if (monitoredItems == null) { monitoredItems = new MemoryBufferMonitoredItem[1]; } else { monitoredItems = new MemoryBufferMonitoredItem[monitoredItems.Length + 1]; m_monitoringTable[elementOffet].CopyTo(monitoredItems, 0); } monitoredItems[monitoredItems.Length - 1] = monitoredItem; m_monitoringTable[elementOffet] = monitoredItems; m_itemCount++; return monitoredItem; } }
/// <summary> /// Creates a new data change monitored item. /// </summary> public MemoryBufferMonitoredItem CreateDataChangeItem( ServerSystemContext context, MemoryTagState tag, uint monitoredItemId, ReadValueId itemToMonitor, DiagnosticsMasks diagnosticsMasks, TimestampsToReturn timestampsToReturn, MonitoringMode monitoringMode, uint clientHandle, double samplingInterval) { lock (_dataLock) { var monitoredItem = new MemoryBufferMonitoredItem( Server, NodeManager, this, tag.Offset, 0, monitoredItemId, context.OperationContext.Session, itemToMonitor, diagnosticsMasks, timestampsToReturn, monitoringMode, clientHandle, null, null, null, samplingInterval, 0, false, 0); if (itemToMonitor.AttributeId != Attributes.Value) { _nonValueMonitoredItems.Add(monitoredItem.Id, monitoredItem); return(monitoredItem); } var elementCount = (int)(SizeInBytes.Value / ElementSize); if (_monitoringTable == null) { _monitoringTable = new MemoryBufferMonitoredItem[elementCount][]; _scanTimer = new Timer(DoScan, null, 100, 100); } var elementOffet = (int)(tag.Offset / ElementSize); var monitoredItems = _monitoringTable[elementOffet]; if (monitoredItems == null) { monitoredItems = new MemoryBufferMonitoredItem[1]; } else { monitoredItems = new MemoryBufferMonitoredItem[monitoredItems.Length + 1]; _monitoringTable[elementOffet].CopyTo(monitoredItems, 0); } monitoredItems[monitoredItems.Length - 1] = monitoredItem; _monitoringTable[elementOffet] = monitoredItems; _itemCount++; return(monitoredItem); } }
/// <summary> /// Creates a new set of monitored items for a set of variables. /// </summary> /// <remarks> /// This method only handles data change subscriptions. Event subscriptions are created by the SDK. /// </remarks> protected override ServiceResult CreateMonitoredItem( ISystemContext context, NodeState source, uint subscriptionId, double publishingInterval, DiagnosticsMasks diagnosticsMasks, TimestampsToReturn timestampsToReturn, MonitoredItemCreateRequest itemToCreate, ref long globalIdCounter, out MonitoringFilterResult filterError, out IMonitoredItem monitoredItem) { filterError = null; monitoredItem = null; MemoryTagState tag = source as MemoryTagState; // use default behavoir for non-tag sources. if (tag == null) { return(base.CreateMonitoredItem( context, source, subscriptionId, publishingInterval, diagnosticsMasks, timestampsToReturn, itemToCreate, ref globalIdCounter, out filterError, out monitoredItem)); } // validate parameters. MonitoringParameters parameters = itemToCreate.RequestedParameters; // no filters supported at this time. MonitoringFilter filter = (MonitoringFilter)ExtensionObject.ToEncodeable(parameters.Filter); if (filter != null) { return(StatusCodes.BadFilterNotAllowed); } // index range not supported. if (itemToCreate.ItemToMonitor.ParsedIndexRange != NumericRange.Empty) { return(StatusCodes.BadIndexRangeInvalid); } // data encoding not supported. if (!QualifiedName.IsNull(itemToCreate.ItemToMonitor.DataEncoding)) { return(StatusCodes.BadDataEncodingInvalid); } // read initial value. DataValue initialValue = new DataValue(); initialValue.Value = null; initialValue.ServerTimestamp = DateTime.UtcNow; initialValue.SourceTimestamp = DateTime.MinValue; initialValue.StatusCode = StatusCodes.Good; ServiceResult error = source.ReadAttribute( context, itemToCreate.ItemToMonitor.AttributeId, itemToCreate.ItemToMonitor.ParsedIndexRange, itemToCreate.ItemToMonitor.DataEncoding, initialValue); if (ServiceResult.IsBad(error)) { return(error); } // get the monitored node for the containing buffer. MemoryBufferState buffer = tag.Parent as MemoryBufferState; if (buffer == null) { return(StatusCodes.BadInternalError); } // create a globally unique identifier. uint monitoredItemId = Utils.IncrementIdentifier(ref globalIdCounter); // determine the sampling interval. double samplingInterval = itemToCreate.RequestedParameters.SamplingInterval; if (samplingInterval < 0) { samplingInterval = publishingInterval; } // create the item. MemoryBufferMonitoredItem datachangeItem = buffer.CreateDataChangeItem( context as ServerSystemContext, tag, subscriptionId, monitoredItemId, itemToCreate.ItemToMonitor, diagnosticsMasks, timestampsToReturn, itemToCreate.MonitoringMode, itemToCreate.RequestedParameters.ClientHandle, samplingInterval); /* * // create the item. * MemoryBufferMonitoredItem datachangeItem = buffer.CreateDataChangeItem( * context, * tag, * monitoredItemId, * itemToCreate.ItemToMonitor.AttributeId, * diagnosticsMasks, * timestampsToReturn, * itemToCreate.MonitoringMode, * itemToCreate.RequestedParameters.ClientHandle, * samplingInterval); */ // report the initial value. datachangeItem.QueueValue(initialValue, null); // update monitored item list. monitoredItem = datachangeItem; return(ServiceResult.Good); }
/// <summary> /// Creates a new data change monitored item. /// </summary> public MemoryBufferMonitoredItem CreateDataChangeItem( ServerSystemContext context, MemoryTagState tag, uint subscriptionId, uint monitoredItemId, ReadValueId itemToMonitor, DiagnosticsMasks diagnosticsMasks, TimestampsToReturn timestampsToReturn, MonitoringMode monitoringMode, uint clientHandle, double samplingInterval) /* * ISystemContext context, * MemoryTagState tag, * uint monitoredItemId, * uint attributeId, * DiagnosticsMasks diagnosticsMasks, * TimestampsToReturn timestampsToReturn, * MonitoringMode monitoringMode, * uint clientHandle, * double samplingInterval)*/ { lock (m_dataLock) { MemoryBufferMonitoredItem monitoredItem = new MemoryBufferMonitoredItem( m_server, m_nodeManager, this, tag.Offset, 0, monitoredItemId, context.OperationContext.Session, itemToMonitor, diagnosticsMasks, timestampsToReturn, monitoringMode, clientHandle, null, null, null, samplingInterval, 0, false, 0); /* * MemoryBufferMonitoredItem monitoredItem = new MemoryBufferMonitoredItem( * this, * monitoredItemId, * tag.Offset, * attributeId, * diagnosticsMasks, * timestampsToReturn, * monitoringMode, * clientHandle, * samplingInterval); */ if (itemToMonitor.AttributeId != Attributes.Value) { m_nonValueMonitoredItems.Add(monitoredItem.Id, monitoredItem); return(monitoredItem); } int elementCount = (int)(SizeInBytes.Value / ElementSize); if (m_monitoringTable == null) { m_monitoringTable = new MemoryBufferMonitoredItem[elementCount][]; m_scanTimer = new Timer(DoScan, null, 100, 100); } int elementOffet = (int)(tag.Offset / ElementSize); MemoryBufferMonitoredItem[] monitoredItems = m_monitoringTable[elementOffet]; if (monitoredItems == null) { monitoredItems = new MemoryBufferMonitoredItem[1]; } else { monitoredItems = new MemoryBufferMonitoredItem[monitoredItems.Length + 1]; m_monitoringTable[elementOffet].CopyTo(monitoredItems, 0); } monitoredItems[monitoredItems.Length - 1] = monitoredItem; m_monitoringTable[elementOffet] = monitoredItems; m_itemCount++; return(monitoredItem); } }