/// <summary> /// Updates the exclusive limit alarm event. /// </summary> private void UpdateExclusiveLimitAlarm(ExclusiveLimitAlarmState instance, EventType eventType, ONEVENTSTRUCT e) { NodeId state = null; string text = null; if (AeTypeCache.IsKnownName(e.szSubconditionName, "HI HI")) { state = Opc.Ua.ObjectIds.ExclusiveLimitStateMachineType_HighHigh; text = ConditionStateNames.HighHighActive; } if (AeTypeCache.IsKnownName(e.szSubconditionName, "HI")) { state = Opc.Ua.ObjectIds.ExclusiveLimitStateMachineType_High; text = ConditionStateNames.HighActive; } if (AeTypeCache.IsKnownName(e.szSubconditionName, "LO")) { state = Opc.Ua.ObjectIds.ExclusiveLimitStateMachineType_Low; text = ConditionStateNames.LowActive; } if (AeTypeCache.IsKnownName(e.szSubconditionName, "LO LO")) { state = Opc.Ua.ObjectIds.ExclusiveLimitStateMachineType_LowLow; text = ConditionStateNames.LowLowActive; } instance.LimitState = new ExclusiveLimitStateMachineState(instance); instance.LimitState.BrowseName = Opc.Ua.BrowseNames.LimitState; instance.LimitState.CurrentState = new FiniteStateVariableState(instance.LimitState); instance.LimitState.CurrentState.BrowseName = Opc.Ua.BrowseNames.CurrentState; instance.LimitState.CurrentState.Value = text; instance.LimitState.CurrentState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Id, state, false); }
/// <summary> /// Constructs an event object from a notification. /// </summary> /// <param name="session">The session.</param> /// <param name="monitoredItem">The monitored item that produced the notification.</param> /// <param name="notification">The notification.</param> /// <param name="eventTypeMappings">Mapping between event types and known event types.</param> /// <returns> /// The event object. Null if the notification is not a valid event type. /// </returns> public static BaseEventState ConstructEvent( Session session, MonitoredItem monitoredItem, EventFieldList notification, Dictionary<NodeId,NodeId> eventTypeMappings) { // find the event type. NodeId eventTypeId = FindEventType(monitoredItem, notification); if (eventTypeId == null) { return null; } // look up the known event type. NodeId knownTypeId = null; if (!eventTypeMappings.TryGetValue(eventTypeId, out knownTypeId)) { // check for a known type for (int jj = 0; jj < KnownEventTypes.Length; jj++) { if (KnownEventTypes[jj] == eventTypeId) { knownTypeId = eventTypeId; eventTypeMappings.Add(eventTypeId, eventTypeId); break; } } // browse for the supertypes of the event type. if (knownTypeId == null) { ReferenceDescriptionCollection supertypes = FormUtils.BrowseSuperTypes(session, eventTypeId, false); // can't do anything with unknown types. if (supertypes == null) { return null; } // find the first supertype that matches a known event type. for (int ii = 0; ii < supertypes.Count; ii++) { for (int jj = 0; jj < KnownEventTypes.Length; jj++) { if (KnownEventTypes[jj] == supertypes[ii].NodeId) { knownTypeId = KnownEventTypes[jj]; eventTypeMappings.Add(eventTypeId, knownTypeId); break; } } if (knownTypeId != null) { break; } } } } if (knownTypeId == null) { return null; } // all of the known event types have a UInt32 as identifier. uint? id = knownTypeId.Identifier as uint?; if (id == null) { return null; } // construct the event based on the known event type. BaseEventState e = null; switch (id.Value) { case ObjectTypes.ConditionType: { e = new ConditionState(null); break; } case ObjectTypes.DialogConditionType: { e = new DialogConditionState(null); break; } case ObjectTypes.AlarmConditionType: { e = new AlarmConditionState(null); break; } case ObjectTypes.ExclusiveLimitAlarmType: { e = new ExclusiveLimitAlarmState(null); break; } case ObjectTypes.NonExclusiveLimitAlarmType: { e = new NonExclusiveLimitAlarmState(null); break; } case ObjectTypes.AuditEventType: { e = new AuditEventState(null); break; } case ObjectTypes.AuditUpdateMethodEventType: { e = new AuditUpdateMethodEventState(null); break; } default: { e = new BaseEventState(null); break; } } // get the filter which defines the contents of the notification. EventFilter filter = monitoredItem.Status.Filter as EventFilter; // initialize the event with the values in the notification. e.Update(session.SystemContext, filter.SelectClauses, notification); // save the orginal notification. e.Handle = notification; return e; }