/// <summary> /// Converts a UA value to an HDA attribute value. /// </summary> /// <param name="session">The session.</param> /// <param name="attributeId">The attribute id.</param> /// <param name="values">The values.</param> /// <param name="index">The index.</param> /// <returns></returns> private DaValue GetAttributeValue(Session session, uint attributeId, DataValueCollection values, int index) { switch (attributeId) { case Constants.OPCHDA_DATA_TYPE: { DaValue result = new DaValue(); DataValue value = values[index]; // check for valid node. if (StatusCode.IsBad(value.StatusCode)) { result.Error = ResultIds.E_UNKNOWNITEMID; return(result); } // covert to var type. NodeId dataTypeId = value.GetValue <NodeId>(DataTypeIds.BaseDataType); int valueRank = values[index + 1].GetValue <int>(ValueRanks.Scalar); BuiltInType builtInType = DataTypes.GetBuiltInType(dataTypeId, session.TypeTree); TypeInfo typeInfo = new TypeInfo(builtInType, valueRank); short varType = (short)ComUtils.GetVarType(typeInfo); result.Value = varType; result.Quality = ComUtils.GetQualityCode(value.StatusCode); result.Timestamp = value.ServerTimestamp; result.Error = ResultIds.S_OK; return(result); } case Constants.OPCHDA_DESCRIPTION: { DataValue value = values[index]; if (value.StatusCode == StatusCodes.BadAttributeIdInvalid) { DaValue result = new DaValue(); result.Error = ResultIds.E_INVALIDATTRID; return(result); } return(m_mapper.GetLocalDataValue(value)); } default: { return(ComHdaProxy.GetAttributeValue(session, m_mapper, attributeId, values[index])); } } }
/// <summary> /// Gets the item value. /// </summary> /// <param name="daValue">The da value.</param> /// <param name="uaValue">The ua value.</param> /// <param name="diagnosticsMasks">The diagnostics masks.</param> /// <returns></returns> public static ServiceResult GetItemValue(DaValue daValue, DataValue uaValue, DiagnosticsMasks diagnosticsMasks) { ServiceResult result = null; uaValue.Value = null; if (daValue == null) { result = uaValue.StatusCode = StatusCodes.BadOutOfService; return(result); } if (daValue.Timestamp.Kind == DateTimeKind.Unspecified) { uaValue.SourceTimestamp = DateTime.SpecifyKind(daValue.Timestamp, DateTimeKind.Utc); } else { throw new System.Exception(string.Format("The type of data from OPC server is not known: {0}", daValue.Timestamp.Kind.ToString())); } if (daValue.Error < 0) { result = MapReadErrorToServiceResult(daValue.Error, diagnosticsMasks); uaValue.StatusCode = result.StatusCode; return(result); } if (daValue.Quality != OpcRcw.Da.Qualities.OPC_QUALITY_GOOD) { uaValue.StatusCode = ComUtils.GetQualityCode(daValue.Quality); } if (StatusCode.IsBad(uaValue.StatusCode)) { result = uaValue.StatusCode; return(result); } uaValue.Value = daValue.Value; return(result); }
/// <summary> /// Gets the item value. /// </summary> /// <param name="daValue">The da value.</param> /// <param name="uaValue">The ua value.</param> /// <param name="diagnosticsMasks">The diagnostics masks.</param> /// <returns></returns> public static ServiceResult GetItemValue(DaValue daValue, DataValue uaValue, DiagnosticsMasks diagnosticsMasks) { ServiceResult result = null; uaValue.Value = null; if (daValue == null) { result = uaValue.StatusCode = StatusCodes.BadOutOfService; return(result); } uaValue.SourceTimestamp = daValue.Timestamp; if (daValue.Error < 0) { result = MapReadErrorToServiceResult(daValue.Error, diagnosticsMasks); uaValue.StatusCode = result.StatusCode; return(result); } if (daValue.Quality != OpcRcw.Da.Qualities.OPC_QUALITY_GOOD) { uaValue.StatusCode = ComUtils.GetQualityCode(daValue.Quality); } if (StatusCode.IsBad(uaValue.StatusCode)) { result = uaValue.StatusCode; return(result); } uaValue.Value = daValue.Value; return(result); }
/// <summary> /// Updates the condition event. /// </summary> private void UpdateAlarm(AlarmConditionState instance, EventType eventType, ONEVENTSTRUCT e) { instance.NodeId = AeParsedNodeId.ConstructIdForCondition(e.szSource, e.dwEventCategory, e.szConditionName, m_namespaceIndex); // find the condition class. NodeId classId = AeParsedNodeId.Construct(e.dwEventType, e.dwEventCategory, null, m_namespaceIndex); AeEventTypeState conditionClassType = m_cache.FindType(m_defaultContext, classId); if (conditionClassType != null) { instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassId, classId, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassName, conditionClassType.EventType.Description, false); } else { instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassId, Opc.Ua.ObjectTypeIds.BaseConditionClassType, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionClassName, "BaseConditionClass", false); } instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ConditionName, e.szConditionName, false);; instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.ClientUserId, e.szActorID, false); instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Quality, ComUtils.GetQualityCode(e.wQuality), false); bool acknowledged = (e.wNewState & Constants.CONDITION_ACKED) != 0; bool active = (e.wNewState & Constants.CONDITION_ACTIVE) != 0; bool enabled = (e.wNewState & Constants.CONDITION_ENABLED) != 0; bool retain = enabled & (active || !acknowledged); LocalizedText effectiveDisplayName = ConditionStateNames.Inactive; if (!enabled) { effectiveDisplayName = ConditionStateNames.Disabled; } else if (!acknowledged) { effectiveDisplayName = ConditionStateNames.Unacknowledged; } else if (active) { effectiveDisplayName = ConditionStateNames.Active; } instance.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Retain, true, false); instance.EnabledState = new TwoStateVariableState(instance); instance.EnabledState.BrowseName = Opc.Ua.BrowseNames.EnabledState; instance.EnabledState.Value = new LocalizedText((enabled) ? ConditionStateNames.Enabled : ConditionStateNames.Disabled); instance.EnabledState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Id, enabled, false); instance.EnabledState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.EffectiveDisplayName, effectiveDisplayName, false); instance.AckedState = new TwoStateVariableState(instance); instance.AckedState.BrowseName = Opc.Ua.BrowseNames.AckedState; instance.AckedState.Value = new LocalizedText((acknowledged) ? ConditionStateNames.Acknowledged : ConditionStateNames.Unacknowledged); instance.AckedState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Id, acknowledged, false); instance.ActiveState = new TwoStateVariableState(instance); instance.ActiveState.BrowseName = Opc.Ua.BrowseNames.ActiveState; instance.ActiveState.Value = new LocalizedText((active) ? ConditionStateNames.Active : ConditionStateNames.Inactive); instance.ActiveState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.Id, active, false); instance.ActiveState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.TransitionTime, ComUtils.GetDateTime(e.ftActiveTime), false); if (!String.IsNullOrEmpty(e.szSubconditionName)) { instance.ActiveState.SetChildValue(m_defaultContext, Opc.Ua.BrowseNames.EffectiveDisplayName, e.szSubconditionName, false); } }
/// <summary> /// Marshals an event for return to the client. /// </summary> private OpcRcw.Ae.ONEVENTSTRUCT Translate(AeEvent e) { OpcRcw.Ae.ONEVENTSTRUCT e2 = new ONEVENTSTRUCT(); e2.wNewState = 0; e2.wChangeMask = 0xFF; e2.szSource = e.SourceName; e2.wQuality = ComUtils.GetQualityCode(e.Quality); e2.dwEventType = e.Category.EventType; e2.dwEventCategory = (int)e.Category.LocalId; e2.bAckRequired = 0; e2.dwSeverity = e.Severity; e2.ftTime = ComUtils.GetFILETIME(e.Time); e2.szMessage = (e.Message != null) ? e.Message.Text : null; e2.szActorID = e.AuditUserId; e2.dwCookie = e.Cookie; if (e.AttributeValues != null && e.AttributeValues.Length > 0) { e2.dwNumEventAttrs = e.AttributeValues.Length; e2.pEventAttributes = ComUtils.GetVARIANTs(e.AttributeValues, true); } if ((e2.dwEventType & OpcRcw.Ae.Constants.CONDITION_EVENT) != 0) { e2.szConditionName = e.ConditionName; e2.ftActiveTime = ComUtils.GetFILETIME(e.ActiveTime); e2.bAckRequired = (e.AckedState)?0:1; // set the condition state. e2.wNewState = 0; if (e.EnabledState) { e2.wNewState |= OpcRcw.Ae.Constants.CONDITION_ENABLED; } if (e.AckedState) { e2.wNewState |= OpcRcw.Ae.Constants.CONDITION_ACKED; } if (e.ActiveState) { e2.wNewState |= OpcRcw.Ae.Constants.CONDITION_ACTIVE; } // set the subcondition if available. if (!LocalizedText.IsNullOrEmpty(e.LowState)) { e2.szSubconditionName = e.LowState.Text; } if (!LocalizedText.IsNullOrEmpty(e.HighState)) { e2.szSubconditionName = e.HighState.Text; } if (!LocalizedText.IsNullOrEmpty(e.LowLowState)) { e2.szSubconditionName = e.LowLowState.Text; } if (!LocalizedText.IsNullOrEmpty(e.HighHighState)) { e2.szSubconditionName = e.HighHighState.Text; } if (!LocalizedText.IsNullOrEmpty(e.LimitState)) { e2.szSubconditionName = e.LimitState.Text; } } if (e2.szMessage == null) { e2.szMessage = String.Empty; } if (e2.szSource == null) { e2.szSource = String.Empty; } if (e2.szConditionName == null) { e2.szConditionName = String.Empty; } if (e2.szSubconditionName == null) { e2.szSubconditionName = String.Empty; } if (e2.szActorID == null) { e2.szActorID = String.Empty; } return(e2); }