public GetFieldValue ( EventFieldList eventFields, NodeId eventTypeId, IList |
||
eventFields | EventFieldList | |
eventTypeId | NodeId | |
browsePath | IList |
|
attributeId | uint | |
return | object |
/// <summary> /// Processes a Publish response from the server. /// </summary> /// void ItemNotification(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e) { if (InvokeRequired) { BeginInvoke(new MonitoredItemNotificationEventHandler(ItemNotification), monitoredItem, e); return; } else if (!IsHandleCreated) { return; } try { if (monitoredItem != null) { string Key = monitoredItem.StartNodeId.Identifier.ToString() + "." + monitoredItem.RelativePath; ListViewItem[] lvis = listView1.Items.Find(Key, true); Opc.Ua.MonitoredItemNotification change = e.NotificationValue as Opc.Ua.MonitoredItemNotification; if(change != null) { DataValue dv = change.Value; if (lvis.Length == 1) { ListViewItem lvi = lvis[0]; int subindex = lvi.SubItems.IndexOfKey(Key); ListViewItem.ListViewSubItem si = lvi.SubItems[subindex]; TypedMonitoredItem mi = si.Tag as TypedMonitoredItem; if (mi != null) { if (mi.ClientHandle == monitoredItem.ClientHandle) { if (dv != null && dv.Value != null) { if (monitoredItem.Status.Id == StatusCodes.BadNodeIdUnknown) { // Randy said we would get this, but we don't RemoveSessionItem(lvi, true); } else { si.Text = mi.ToString(dv); } } else { // This is what we get RemoveSessionItem(lvi, true); } } else { Utils.Trace("(mi.ClientHandle != monitoredItem.ClientHandle " + MethodBase.GetCurrentMethod()); } } else { Utils.Trace("mi is null " + MethodBase.GetCurrentMethod()); } } else { Utils.Trace("lvis.Length != 1 " + MethodBase.GetCurrentMethod()); } } else { EventFieldList eventFields = e.NotificationValue as EventFieldList; if (eventFields != null) { // get the event fields. NodeId eventType = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.EventType) as NodeId; string sourceName = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.SourceName) as string; DateTime? time = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.Time) as DateTime?; ushort? severity = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.Severity) as ushort?; LocalizedText message = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.Message) as LocalizedText; NodeId sourceNode = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.SourceNode) as NodeId; //Utils.Trace("eventType: {0}, message: {1}, sourceName: {2} sourceNode: {3}", eventType.ToString(), message.Text.ToString(), sourceName.ToString(), sourceNode.ToString()); if (eventType == new NodeId(ObjectTypes.AuditActivateSessionEventType)) { Utils.Trace("AuditActivateSessionEventType detected " + MethodBase.GetCurrentMethod()); AddSessions(); m_Subscription.ModifyItems(); m_Subscription.ApplyChanges(); } } else { Utils.Trace("eventFields is null " + MethodBase.GetCurrentMethod()); } } } else { Utils.Trace("monitoredItem is null " + MethodBase.GetCurrentMethod()); } } catch (Exception exception) { GuiUtils.HandleException(this.Text, MethodBase.GetCurrentMethod(), exception); } }
/// <summary> /// Processes a Publish response from the UA server for AddressSpace changes. /// </summary> /// <param name="monitoredItem"></param> /// <param name="e"></param> void AddressSpaceChange_Notification(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e) { try { EventFieldList eventFields = e.NotificationValue as EventFieldList; if (eventFields == null) { return; } if (monitoredItem != null) { if (monitoredItem.ClientHandle != eventFields.ClientHandle) { return; } } INode eventUA = monitoredItem.GetEventType(eventFields); if (eventUA.NodeId == new NodeId(Opc.Ua.ObjectTypes.BaseModelChangeEventType)) { //TODO:if we get this event we know a change was made, but we do not know what so we will beed to get all EventTypes and compare and update our config data } else if (eventUA.NodeId != new NodeId(Opc.Ua.ObjectTypes.GeneralModelChangeEventType)) { //We are not interested in any other event, so we will return. //If we can set the where clause on the filter for this item, this else clause can be removed. return; } else { object v = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.GeneralModelChangeEventType, new QualifiedName(Opc.Ua.BrowseNames.Changes)); //ChangeStructureDataTypeCollection changes = (ChangeStructureDataTypeCollection) monitoredItem.GetFieldValue(eventFields, ObjectTypes.GeneralModelChangeEventType, new QualifiedName(GeneralModelChangeEvent.Names.Changes)); } } catch (Exception ex) { Utils.Trace(ex, "Unexpected error in AddressSpaceChange_Notification"); } }
/// <summary> /// Processes a Publish response from the UA server. /// </summary> /// <param name="monitoredItem"></param> /// <param name="e"></param> void MonitoredItem_Notification(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e) { try { EventFieldList eventFields = e.NotificationValue as EventFieldList; if (eventFields == null) { return; } if (monitoredItem != null) { if (monitoredItem.ClientHandle != eventFields.ClientHandle) { return; } } INode eventUA = monitoredItem.GetEventType(eventFields); EventCategory cat = FindEventCatInfo(eventUA.BrowseName.ToString()); if (cat == null) return; // The event is not of a category that we recognize. if (cat.EventType == OpcRcw.Ae.Constants.CONDITION_EVENT) { NodeId branchId = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.ConditionType, Opc.Ua.BrowseNames.BranchId) as NodeId; if (!NodeId.IsNull(branchId)) return; // We don't support condition branches in the COM Proxy } EventNotification ev = new EventNotification(); ev.EventId = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.BaseEventType, new QualifiedName(Opc.Ua.BrowseNames.EventId)) as byte[]; ev.SourceID = System.Convert.ToString(monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.BaseEventType, new QualifiedName(Opc.Ua.BrowseNames.SourceName))); ev.Time = System.Convert.ToDateTime(monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.BaseEventType, new QualifiedName(Opc.Ua.BrowseNames.Time))); ev.Message = System.Convert.ToString(monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.BaseEventType, new QualifiedName(Opc.Ua.BrowseNames.Message))); ev.EventType = cat.EventType; ev.EventCategory = cat.CategoryID; ev.Severity = System.Convert.ToInt32(monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.BaseEventType, new QualifiedName(Opc.Ua.BrowseNames.Severity))); List<EventAttribute> Attrs = GetEventAttributes(cat.CategoryID); UniqueList<string> strEventNodeIds = new UniqueList<string>(); foreach (EventAttribute attr in Attrs) if (attr.strEventNodeId != "") strEventNodeIds.AddUnique(attr.strEventNodeId); ev.EventAttributes = new Dictionary<int, object>(); foreach (EventAttribute attr in m_configFile.Attributes) { foreach (string strEventNodeId in strEventNodeIds) { if (attr.strEventNodeId == strEventNodeId) { object value = monitoredItem.GetFieldValue(eventFields, (NodeId)attr.strEventNodeId, new QualifiedName(attr.BrowseName, attr.BrowseNameNSIndex)); if (value == null) { ev.EventAttributes.Add(attr.AttributeID, ""); } else if ((value.GetType() != null) & (short)ComUtils.GetVarType(value) != 0) { ev.EventAttributes.Add(attr.AttributeID, value); } else { // any value with a UA type that does not have a corresponding COM type will be returned as a string ev.EventAttributes.Add(attr.AttributeID, value.ToString()); } } } } //Condition-Related Event properties ev.ConditionName = ""; ev.SubConditionName = ""; ev.ChangeMask = 0; ev.NewState = OpcRcw.Ae.Constants.CONDITION_ENABLED | OpcRcw.Ae.Constants.CONDITION_ACKED; ev.Quality = OpcRcw.Da.Qualities.OPC_QUALITY_GOOD; ev.AckRequired = false; ev.ActiveTime = DateTime.Now; ev.Cookie = 0; if (ev.EventType == OpcRcw.Ae.Constants.CONDITION_EVENT) SetConditionEventFields(monitoredItem, eventFields, ev, cat); //Tracking Events and for Condition-Related Events which are acknowledgment notifications if (cat.EventType == OpcRcw.Ae.Constants.TRACKING_EVENT) ev.ActorID = System.Convert.ToString(monitoredItem.GetFieldValue(eventFields, (NodeId)eventUA.NodeId, new QualifiedName(Opc.Ua.BrowseNames.ClientUserId))); IncomingEventHandler eventHandler = new IncomingEventHandler(); //extract the area associated with this event. AreaNode areaNode; string[] areas = null; if (m_notifiers.TryGetValue(monitoredItem.ClientHandle, out areaNode)) { areas = new string[] { areaNode.AreaName }; } eventHandler.ProcessEventNotificationList(ev, areas); } catch (Exception ex) { Utils.Trace(ex, "Unexpected error in MonitoredItem_Notification"); } }
/// <summary> /// Additional new event processing when the received event maps to a (COM AE) condition event type. We need to extract /// the condition name, subcondition name, changeMask, newState, Quality, AckRequired, ActiveTime and cookie. /// </summary> /// <param name="monitoredItem"></param> /// <param name="eventFields"></param> /// <param name="ev"></param> /// <param name="cat"></param> void SetConditionEventFields(MonitoredItem monitoredItem, EventFieldList eventFields, EventNotification ev, EventCategory cat) { LocalizedText localText; String ConditionName; StatusCode? Status; DateTime? TimeOfLastTransition; try { NodeId eventType = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.BaseEventType, Opc.Ua.BrowseNames.EventType) as NodeId; // UA events are categorized into three subsets. The first of these subsets consists of types and subtypes of ConditionType // which yields the event condition name, quality and enable/disable status. if (m_session.TypeTree.IsTypeOf(eventType, Opc.Ua.ObjectTypes.ConditionType)) { ConditionName = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.ConditionType, Opc.Ua.BrowseNames.ConditionName) as String; if (ConditionName != null) ev.ConditionName = ConditionName; else ev.ConditionName = cat.BrowseName; // Set the subcondition name as conditionname for now. If the event of of type AlarmconditionType and a subcondition (UA substate) // exists then this field will be set accordingly. ev.SubConditionName = ev.ConditionName; bool? enabled = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.ConditionType, "/EnabledState/Id", Attributes.Value) as bool?; Status = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.ConditionType, "/Quality", Attributes.Value) as StatusCode?; ev.Quality = MapStatusToQuality(Status); if (enabled == true) ev.NewState |= OpcRcw.Ae.Constants.CONDITION_ENABLED; else ev.NewState &= ~OpcRcw.Ae.Constants.CONDITION_ENABLED; } // The second of the three UA event subsets consists of types and subtypes of AcknowledgeableconditionType. // This categorization yields events which support acknowledgement in addition to enable/disable state if (m_session.TypeTree.IsTypeOf(eventType, Opc.Ua.ObjectTypes.AcknowledgeableConditionType)) { bool? acked = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.AcknowledgeableConditionType, "/AckedState/Id", Attributes.Value) as bool?; // Extract the "ConditionId" (nodeId of the condition instance) ev.ConditionId = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.AcknowledgeableConditionType, "", Attributes.NodeId) as NodeId; ev.AcknowledgeMethod = Opc.Ua.Methods.AcknowledgeableConditionType_Acknowledge; if (acked == true) { ev.NewState |= OpcRcw.Ae.Constants.CONDITION_ACKED; ev.AckRequired = false; } else { ev.NewState &= ~OpcRcw.Ae.Constants.CONDITION_ACKED; ev.AckRequired = true; } } // the third of the three UA event subsets consists of types and subtypes of AlarmConditionType. This // categorization yields events which support the notion of Active/Inactive and also may support substates // (subconditions). if (m_session.TypeTree.IsTypeOf(eventType, Opc.Ua.ObjectTypes.AlarmConditionType)) { bool? active = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.AlarmConditionType, "/ActiveState/Id", Attributes.Value) as bool?; TimeOfLastTransition = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.AlarmConditionType, "/ActiveState/TransitionTime", Attributes.Value) as DateTime?; if (active == true) { ev.NewState |= OpcRcw.Ae.Constants.CONDITION_ACTIVE; ev.ActiveTime = TimeOfLastTransition ?? DateTime.MinValue; } // Active subconditon. localText = monitoredItem.GetFieldValue(eventFields, Opc.Ua.ObjectTypes.AlarmConditionType, "/ActiveState/EffectiveDisplayName", Attributes.Value) as LocalizedText; if (localText != null && localText.ToString() != "") ev.SubConditionName = localText.ToString(); } else // If this is not an AlarmConditionType (thus no UA active/inactive states apply) default to Active ev.NewState |= OpcRcw.Ae.Constants.CONDITION_ACTIVE; } catch (Exception e) { Utils.Trace(e, "Unexpected error in SetConditionEventFields"); } }
/// <summary> /// /// </summary> /// <param name="monitoredItem"></param> /// <param name="e"></param> protected virtual void ItemNotificationHandler(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e) { try { if (monitoredItem != null) { Opc.Ua.MonitoredItemNotification change = e.NotificationValue as Opc.Ua.MonitoredItemNotification; if (change != null) { DataValue dv = change.Value; if (dv != null) { ListViewItem[] lvis = ItemsLV.Items.Find(monitoredItem.ClientHandle.ToString(), false); if (lvis.Length > 0) { DiagnosticListViewItem dlvi = lvis[0].Tag as DiagnosticListViewItem; dlvi.UpdateInListView(lvis[0], dv, m_Session); } } else { Utils.Trace("dv is null: {0}", MethodBase.GetCurrentMethod()); } } else { EventFieldList eventFields = e.NotificationValue as EventFieldList; if (eventFields != null) { // get the event fields. NodeId eventType = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.EventType) as NodeId; string sourceName = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.SourceName) as string; DateTime? time = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.Time) as DateTime?; ushort? severity = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.Severity) as ushort?; LocalizedText message = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.Message) as LocalizedText; NodeId sourceNode = monitoredItem.GetFieldValue(eventFields, ObjectTypes.BaseEventType, BrowseNames.SourceNode) as NodeId; if (eventType == new NodeId(ObjectTypes.AuditAddNodesEventType)) { } else { } } else { Utils.Trace("eventFields is null " + MethodBase.GetCurrentMethod()); } } } } catch (Exception exception) { GuiUtils.HandleException(this.Text, MethodBase.GetCurrentMethod(), exception); } }