Exemple #1
0
        /// <summary>
        /// Returns a snapshot of the tags belonging to the block.
        /// </summary>
        /// <returns>The list of tags. Null if the block does not exist.</returns>
        public IList <UnderlyingSystemTag> GetTags()
        {
            lock (_tags) {
                // create snapshots of the tags.
                var tags = new UnderlyingSystemTag[_tags.Count];

                for (var ii = 0; ii < _tags.Count; ii++)
                {
                    tags[ii] = _tags[ii].CreateSnapshot();
                }

                return(tags);
            }
        }
Exemple #2
0
        /// <summary>
        /// Updates the metadata for a tag.
        /// </summary>
        private bool UpdateTagMetadata(
            UnderlyingSystemTag tag,
            Opc.Ua.Test.DataGenerator generator)
        {
            switch (tag.TagType)
            {
            case UnderlyingSystemTagType.Analog: {
                if (tag.EuRange != null)
                {
                    var range = new double[tag.EuRange.Length];

                    for (var ii = 0; ii < tag.EuRange.Length; ii++)
                    {
                        range[ii] = tag.EuRange[ii] + 1;
                    }

                    tag.EuRange = range;
                }

                break;
            }

            case UnderlyingSystemTagType.Digital:
            case UnderlyingSystemTagType.Enumerated: {
                if (tag.Labels != null)
                {
                    var labels = new string[tag.Labels.Length];

                    for (var ii = 0; ii < tag.Labels.Length; ii++)
                    {
                        labels[ii] = generator.GetRandomString();
                    }

                    tag.Labels = labels;
                }

                break;
            }

            default: {
                return(false);
            }
            }

            return(true);
        }
Exemple #3
0
        /// <summary>
        /// Creates the tag.
        /// </summary>
        /// <param name="tagName">Name of the tag.</param>
        /// <param name="dataType">Type of the data.</param>
        /// <param name="tagType">Type of the tag.</param>
        /// <param name="engineeringUnits">The engineering units.</param>
        /// <param name="writeable">if set to <c>true</c> the tag is writeable.</param>
        public void CreateTag(
            string tagName,
            UnderlyingSystemDataType dataType,
            UnderlyingSystemTagType tagType,
            string engineeringUnits,
            bool writeable)
        {
            // create tag.
            var tag = new UnderlyingSystemTag {
                Block            = this,
                Name             = tagName,
                Description      = null,
                EngineeringUnits = engineeringUnits,
                DataType         = dataType,
                TagType          = tagType,
                IsWriteable      = writeable,
                Labels           = null,
                EuRange          = null
            };

            switch (tagType)
            {
            case UnderlyingSystemTagType.Analog: {
                tag.Description = "An analog value.";
                tag.TagType     = UnderlyingSystemTagType.Analog;
                tag.EuRange     = new double[] { 100, 0 };
                break;
            }

            case UnderlyingSystemTagType.Digital: {
                tag.Description = "A digital value.";
                tag.TagType     = UnderlyingSystemTagType.Digital;
                tag.Labels      = new string[] { "Online", "Offline" };
                break;
            }

            case UnderlyingSystemTagType.Enumerated: {
                tag.Description = "An enumerated value.";
                tag.TagType     = UnderlyingSystemTagType.Enumerated;
                tag.Labels      = new string[] { "Red", "Yellow", "Green" };
                break;
            }

            default: {
                tag.Description = "A generic value.";
                break;
            }
            }

            // set an initial value.
            switch (tag.DataType)
            {
            case UnderlyingSystemDataType.Integer1: { tag.Value = (sbyte)0; break; }

            case UnderlyingSystemDataType.Integer2: { tag.Value = (short)0; break; }

            case UnderlyingSystemDataType.Integer4: { tag.Value = 0; break; }

            case UnderlyingSystemDataType.Real4: { tag.Value = (float)0; break; }

            case UnderlyingSystemDataType.String: { tag.Value = string.Empty; break; }
            }

            lock (_tags) {
                _tags.Add(tag);
                Timestamp = DateTime.UtcNow;
            }
        }
Exemple #4
0
        /// <summary>
        /// Updates the value of an tag.
        /// </summary>
        private bool UpdateTagValue(
            UnderlyingSystemTag tag,
            Opc.Ua.Test.DataGenerator generator)
        {
            // don't update writeable tags.
            if (tag.IsWriteable)
            {
                return(false);
            }

            // check if a range applies to the value.
            var high = 0;
            var low  = 0;

            switch (tag.TagType)
            {
            case UnderlyingSystemTagType.Analog: {
                if (tag.EuRange != null && tag.EuRange.Length >= 2)
                {
                    high = (int)tag.EuRange[0];
                    low  = (int)tag.EuRange[1];
                }

                break;
            }

            case UnderlyingSystemTagType.Digital: {
                high = 1;
                low  = 0;
                break;
            }

            case UnderlyingSystemTagType.Enumerated: {
                if (tag.Labels != null && tag.Labels.Length > 0)
                {
                    high = tag.Labels.Length - 1;
                    low  = 0;
                }

                break;
            }
            }

            // select a value in the range.
            var value = -1;

            if (high > low)
            {
                value = (generator.GetRandomUInt16() % (high - low + 1)) + low;
            }

            // cast value to correct type or generate a random value.
            switch (tag.DataType)
            {
            case UnderlyingSystemDataType.Integer1: {
                if (value == -1)
                {
                    tag.Value = generator.GetRandomSByte();
                }
                else
                {
                    tag.Value = (sbyte)value;
                }

                break;
            }

            case UnderlyingSystemDataType.Integer2: {
                if (value == -1)
                {
                    tag.Value = generator.GetRandomInt16();
                }
                else
                {
                    tag.Value = (short)value;
                }

                break;
            }

            case UnderlyingSystemDataType.Integer4: {
                if (value == -1)
                {
                    tag.Value = generator.GetRandomInt32();
                }
                else
                {
                    tag.Value = value;
                }

                break;
            }

            case UnderlyingSystemDataType.Real4: {
                if (value == -1)
                {
                    tag.Value = generator.GetRandomFloat();
                }
                else
                {
                    tag.Value = (float)value;
                }

                break;
            }

            case UnderlyingSystemDataType.String: {
                tag.Value = generator.GetRandomString();
                break;
            }
            }

            tag.Timestamp = DateTime.UtcNow;
            return(true);
        }
Exemple #5
0
        /// <summary>
        /// Writes the tag value.
        /// </summary>
        /// <param name="tagName">Name of the tag.</param>
        /// <param name="value">The value.</param>
        /// <returns>The status code for the operation.</returns>
        public uint WriteTagValue(string tagName, object value)
        {
            UnderlyingSystemTag     tag           = null;
            TagsChangedEventHandler onTagsChanged = null;

            lock (_tags) {
                onTagsChanged = OnTagsChanged;

                // find the tag.
                tag = FindTag(tagName);

                if (tag == null)
                {
                    return(StatusCodes.BadNodeIdUnknown);
                }

                // cast value to correct type.
                try {
                    switch (tag.DataType)
                    {
                    case UnderlyingSystemDataType.Integer1: {
                        tag.Value = (sbyte)value;
                        break;
                    }

                    case UnderlyingSystemDataType.Integer2: {
                        tag.Value = (short)value;
                        break;
                    }

                    case UnderlyingSystemDataType.Integer4: {
                        tag.Value = (int)value;
                        break;
                    }

                    case UnderlyingSystemDataType.Real4: {
                        tag.Value = (float)value;
                        break;
                    }

                    case UnderlyingSystemDataType.String: {
                        tag.Value = (string)value;
                        break;
                    }
                    }
                }
                catch {
                    return(StatusCodes.BadTypeMismatch);
                }

                // updated the timestamp.
                tag.Timestamp = DateTime.UtcNow;
            }

            // raise notification.
            if (tag != null && onTagsChanged != null)
            {
                onTagsChanged(new UnderlyingSystemTag[] { tag });
            }

            return(StatusCodes.Good);
        }