/// <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); } }
/// <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); }
/// <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; } }
/// <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); }
/// <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); }