Example #1
0
        /// <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]));
            }
            }
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
            }
        }
Example #5
0
        /// <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);
        }