Exemplo n.º 1
0
        /// <summary>
        /// Gets the size in bytes of a <see cref="TagDataType"/> value.
        /// </summary>
        /// <param name="type">The tag type.</param>
        /// <returns>
        /// The size of the value in bytes.
        /// </returns>
        public static int GetSizeInBytes(TagDataType type)
        {
            switch (type)
            {
            case TagDataType.Byte:
            case TagDataType.Ascii:
            case TagDataType.Undefined:
            case TagDataType.SByte:
                return(1);

            case TagDataType.Short:
            case TagDataType.SShort:
                return(2);

            case TagDataType.Long:
            case TagDataType.SLong:
            case TagDataType.Float:
            case TagDataType.IFD:
                return(4);

            case TagDataType.Rational:
            case TagDataType.SRational:
            case TagDataType.Double:
                return(8);

            default:
                return(0);
            }
        }
Exemplo n.º 2
0
 public IFDEntry(ushort tag, TagDataType type, uint count, uint offset)
 {
     Tag    = tag;
     Type   = type;
     Count  = count;
     Offset = offset;
 }
Exemplo n.º 3
0
        /// <summary>
        /// Gets the length, in bytes, of a given TIFF tag datatype.
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        public static int AtomicLength(this TagDataType type)
        {
            switch (type)
            {
            case TagDataType.ASCII:
            case TagDataType.Byte:
            case TagDataType.SByte:
            case TagDataType.Undefined:
                return(1);

            case TagDataType.Short:
            case TagDataType.SShort:
                return(2);

            case TagDataType.Float:
            case TagDataType.Long:
            case TagDataType.SLong:
            case TagDataType.IFD:
                return(4);

            case TagDataType.Double:
            case TagDataType.Rational:
            case TagDataType.SRational:
                return(8);

            default:
                throw new ArgumentException($"Unknown tag datatype {type}");
            }
        }
Exemplo n.º 4
0
        private byte getType(TagDataType type)
        {
            switch (type)
            {
            case TagDataType.Bool:
                return(1);

            case TagDataType.Byte:
                return(3);

            case TagDataType.Word:
                return(4);

            case TagDataType.Int:
                return(5);

            case TagDataType.Dword:
                return(6);

            case TagDataType.Dint:
                return(7);

            case TagDataType.Float:
                return(8);

            case TagDataType.CharArray:
                return(19);

            case TagDataType.LReal:
                return(15);

            default:
                return(0);
            }
        }
Exemplo n.º 5
0
 public IFDEntry(ushort tag, TagDataType type, uint count, uint offset)
 {
     this.Tag    = tag;
     this.Type   = type;
     this.Count  = count;
     this.Offset = offset;
 }
Exemplo n.º 6
0
        private void OK_Click(object sender, EventArgs e)
        {
            byte _bereich = (byte)((pNCK.bereich_u_einheit & 0xE0) >> 5);         // (bereich_u_einheit & 2#11100000) schiebe rechts um 5 Bit
            byte _einheit = (byte)(pNCK.bereich_u_einheit & 0x1F);                // & 2#00011111

            #region TYP
            TagDataType dataType   = new TagDataType();
            int         _ArraySize = 0;
            switch (pNCK.typ)
            {
            case 1:
                dataType = TagDataType.Bool;
                break;

            case 3:
                dataType = TagDataType.Byte;     //eNCK_LE_Int8;
                break;

            case 4:
                dataType = TagDataType.Word;
                break;

            case 5:
                dataType = TagDataType.Int;     //eNCK_LE_Int16;
                break;

            case 6:
                dataType = TagDataType.Dword;     //eNCK_LE_Uint32;
                break;

            case 7:
                dataType = TagDataType.Dint;     //eNCK_LE_Int32;
                break;

            case 8:
                dataType = TagDataType.Float;     //eNCK_LE_Float32;
                break;

            case 15:
                dataType = TagDataType.LReal;     //eNCK_LE_Float64;
                break;

            case 19:
                dataType   = TagDataType.CharArray;   //eNCK_LE_String;
                _ArraySize = pNCK.laenge;
                break;

            default:
                throw new Exception("Unknown Type");
                break;
            }
            #endregion

            _libnodavevalue = new PLCNckTag()
            {
                TagDataType = dataType, NckArea = _bereich, NckUnit = _einheit, NckColumn = (int)pNCK.spalte, NckLine = (int)pNCK.zeile, NckModule = pNCK.bausteintyp, NckLinecount = pNCK.ZEILENANZAHL, ArraySize = _ArraySize
            };

            this.Close();
        }
Exemplo n.º 7
0
        /// <summary>
        /// Determines whether the values fit in the offset field.
        /// </summary>
        /// <param name="type">The type.</param>
        /// <param name="count">The count.</param>
        /// <returns>
        /// <see langword="true"/> if the values fit in the offset field; otherwise, <see langword="false"/>.
        /// </returns>
        public static bool ValueFitsInOffsetField(TagDataType type, uint count)
        {
            switch (type)
            {
            case TagDataType.Byte:
            case TagDataType.Ascii:
            case TagDataType.Undefined:
            case TagDataType.SByte:
                return(count <= 4);

            case TagDataType.Short:
            case TagDataType.SShort:
                return(count <= 2);

            case TagDataType.Long:
            case TagDataType.SLong:
            case TagDataType.Float:
            case TagDataType.IFD:
                return(count == 1);

            case TagDataType.Rational:
            case TagDataType.SRational:
            case TagDataType.Double:
            default:
                return(false);
            }
        }
Exemplo n.º 8
0
 public PLCTag(string address, TagDataType type) : base(address, type)
 {
     this._type = typeof(T);
     if (this._type.IsEnum)
     {
         _underlyingType = Enum.GetUnderlyingType(this._type);
     }
     this._isStructType = this._type.IsValueType && !this._type.IsEnum && !this._type.IsPrimitive && this._type != typeof(decimal);
 }
Exemplo n.º 9
0
 public DeviceTagParam(string tagPKNO, string tagCode, string tagName, string tagAddress, TagDataType tagDataType,
                       DataSimplingMode simplingMode, DeviceManager deviceManager)
 {
     PKNO           = tagPKNO;
     Handel         = PKNO;
     Code           = tagCode;
     Name           = tagName;
     Address        = tagAddress;
     DataType       = tagDataType;
     SimplingMode   = simplingMode;
     _DeviceManager = deviceManager;
 }
Exemplo n.º 10
0
        public MetadataEntry(MetadataSection section, ushort tagId, TagDataType type, byte[] data)
        {
            if (data is null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            Section   = section;
            TagId     = tagId;
            Type      = type;
            this.data = (byte[])data.Clone();
        }
Exemplo n.º 11
0
        /// <summary>
        /// Gets the default format corresponding to the tag data type.
        /// </summary>
        public static TagFormat GetDefault(TagDataType dataType)
        {
            switch (dataType)
            {
            case TagDataType.Int64:
                return(IntNumber);

            case TagDataType.ASCII:
            case TagDataType.Unicode:
                return(String);

            default:
                return(FloatNumber);
            }
        }
Exemplo n.º 12
0
        /// <summary>
        /// Determines whether the <see cref="TagDataType"/> is known to GDI+.
        /// </summary>
        /// <param name="type">The tag type.</param>
        /// <returns>
        /// <see langword="true"/> if the tag type is known to GDI+; otherwise, <see langword="false"/>.
        /// </returns>
        public static bool IsKnownToGDIPlus(TagDataType type)
        {
            switch (type)
            {
            case TagDataType.Byte:
            case TagDataType.Ascii:
            case TagDataType.Short:
            case TagDataType.Long:
            case TagDataType.Rational:
            case TagDataType.Undefined:
            case TagDataType.SLong:
            case TagDataType.SRational:
                return(true);

            default:
                return(false);
            }
        }
        public static byte GetNckType(TagDataType type)
        {
            switch (type)
            {
            case TagDataType.Bool:
                return(1);

            case TagDataType.Byte:
                return(3);

            case TagDataType.Word:
                return(4);

            case TagDataType.Int:
                return(5);

            case TagDataType.Dword:
                return(6);

            case TagDataType.Dint:
                return(7);

            case TagDataType.Float:
                return(8);

            case TagDataType.DateTime:
                return(14);

            case TagDataType.LReal:
                return(15);

            case TagDataType.LInt:
                return(18);

            case TagDataType.String:
            case TagDataType.CharArray:
                return(19);

            default:
                return(0);
            }
        }
Exemplo n.º 14
0
        public PLCNckTag GetNckTag(int unit, int rowOffset)
        {
            //byte SYNTAX_ID = 0x82;
            byte bereich_u_einheit = (byte)(this.Bereich_u_einheit + unit);
            byte _bereich          = (byte)((bereich_u_einheit & 0xE0) >> 5); // (bereich_u_einheit & 2#11100000) schiebe rechts um 5 Bit
            byte _einheit          = (byte)(bereich_u_einheit & 0x1F);        // & 2#00011111

            #region TYP
            TagDataType dataType   = new TagDataType();
            int         _ArraySize = 0;
            switch (this.Typ)
            {
            case 1:
                dataType = TagDataType.Bool;
                break;

            case 3:
                dataType = TagDataType.Byte;     //eNCK_LE_Int8;
                break;

            case 4:
                dataType = TagDataType.Word;
                break;

            case 5:
                dataType = TagDataType.Int;     //eNCK_LE_Int16;
                break;

            case 6:
                dataType = TagDataType.Dword;     //eNCK_LE_Uint32;
                break;

            case 7:
                dataType = TagDataType.Dint;     //eNCK_LE_Int32;
                break;

            case 8:
                dataType = TagDataType.Float;     //eNCK_LE_Float32;
                break;

            case 15:
                dataType = TagDataType.LReal;     //eNCK_LE_Float64;
                break;

            case 18:
                dataType = TagDataType.LInt;     //eNCK_LE_Int64;
                break;

            case 19:
                //if (_bereich == 2)// && NC_Var.bausteintyp == 0x7f)
                //    dataType = TagDataType.String; //eNCK_LE_String;
                //else
                dataType = TagDataType.CharArray;         //eNCK_LE_String;

                _ArraySize = this.Laenge;
                break;

            default:
                throw new Exception("Unknown Type");
                break;
            }
            #endregion

            return(new PLCNckTag()
            {
                TagDataType = dataType, NckArea = _bereich, NckUnit = _einheit, NckColumn = (int)this.Spalte, NckLine = (int)this.Zeile + rowOffset, NckModule = this.Bausteintyp, NckLinecount = this.ZEILENANZAHL, ArraySize = _ArraySize
            });
        }
Exemplo n.º 15
0
 /// <summary>
 /// Sets the tag data type.
 /// </summary>
 public DeviceTag SetDataType(TagDataType dataType)
 {
     DataType = dataType;
     return(this);
 }
Exemplo n.º 16
0
        /// <summary>
        /// Loads a tag definition from the Redis database.
        /// </summary>
        /// <param name="historian">The Redis historian to load the tag from.</param>
        /// <param name="tagId">The ID of the tag to load.</param>
        /// <param name="cancellationToken">The cancellation token for the request.</param>
        /// <returns>
        /// A task that will return the loaded tag definition.
        /// </returns>
        internal static async Task <RedisTagDefinition> Load(RedisHistorian historian, string tagId, CancellationToken cancellationToken)
        {
            var values = await historian.Connection.GetDatabase().HashGetAllAsync(historian.GetKeyForTagDefinition(tagId)).ConfigureAwait(false);

            cancellationToken.ThrowIfCancellationRequested();

            string      name        = null;
            string      description = null;
            string      units       = null;
            TagDataType dataType    = default(TagDataType);
            string      stateSet    = null;

            bool exceptionFilterEnabled = false;
            TagValueFilterDeviationType exceptionFilterLimitType = default(TagValueFilterDeviationType);
            double   exceptionFilterLimit      = 0;
            TimeSpan exceptionFilterWindowSize = default(TimeSpan);

            bool compressionFilterEnabled = false;
            TagValueFilterDeviationType compressionFilterLimitType = default(TagValueFilterDeviationType);
            double   compressionFilterLimit      = 0;
            TimeSpan compressionFilterWindowSize = default(TimeSpan);

            DateTime createdAt  = DateTime.MinValue;
            string   creator    = null;
            DateTime modifiedAt = DateTime.MinValue;
            string   modifiedBy = null;

            foreach (var item in values)
            {
                switch (item.Name.ToString())
                {
                case "NAME":
                    name = item.Value;
                    break;

                case "DESC":
                    description = item.Value;
                    break;

                case "UNITS":
                    units = item.Value;
                    break;

                case "TYPE":
                    dataType = (TagDataType)((int)item.Value);
                    break;

                case "SSET":
                    stateSet = item.Value;
                    break;

                case "EXC_ENABLED":
                    exceptionFilterEnabled = Convert.ToBoolean((int)item.Value);
                    break;

                case "EXC_LIMIT_TYPE":
                    exceptionFilterLimitType = (TagValueFilterDeviationType)((int)item.Value);
                    break;

                case "EXC_LIMIT":
                    exceptionFilterLimit = (double)item.Value;
                    break;

                case "EXC_WINDOW":
                    exceptionFilterWindowSize = TimeSpan.Parse(item.Value);
                    break;

                case "COM_ENABLED":
                    compressionFilterEnabled = Convert.ToBoolean((int)item.Value);
                    break;

                case "COM_LIMIT_TYPE":
                    compressionFilterLimitType = (TagValueFilterDeviationType)((int)item.Value);
                    break;

                case "COM_LIMIT":
                    compressionFilterLimit = (double)item.Value;
                    break;

                case "COM_WINDOW":
                    compressionFilterWindowSize = TimeSpan.Parse(item.Value);
                    break;

                case "MD_CREATEDAT":
                    createdAt = new DateTime((long)item.Value, DateTimeKind.Utc);
                    break;

                case "MD_CREATEDBY":
                    creator = item.Value;
                    break;

                case "MD_MODIFIEDAT":
                    modifiedAt = new DateTime((long)item.Value, DateTimeKind.Utc);
                    break;

                case "MD_MODIFIEDBY":
                    modifiedBy = item.Value;
                    break;
                }
            }

            if (String.IsNullOrWhiteSpace(name))
            {
                name = tagId;
            }

            var settings = new TagSettings()
            {
                Name                    = name,
                Description             = description,
                Units                   = units,
                DataType                = dataType,
                StateSet                = stateSet,
                ExceptionFilterSettings = new TagValueFilterSettingsUpdate()
                {
                    IsEnabled  = exceptionFilterEnabled,
                    LimitType  = exceptionFilterLimitType,
                    Limit      = exceptionFilterLimit,
                    WindowSize = exceptionFilterWindowSize
                },
                CompressionFilterSettings = new TagValueFilterSettingsUpdate()
                {
                    IsEnabled  = compressionFilterEnabled,
                    LimitType  = compressionFilterLimitType,
                    Limit      = compressionFilterLimit,
                    WindowSize = compressionFilterWindowSize
                }
            };

            var metadata = new TagMetadata(createdAt, creator, modifiedAt, modifiedBy);

            var snapshotTask         = LoadSnapshotValue(historian, tagId, cancellationToken);
            var lastArchivedTask     = LoadLastArchivedValue(historian, tagId, cancellationToken);
            var archiveCandidateTask = LoadArchiveCandidateValue(historian, tagId, cancellationToken);

            await Task.WhenAll(snapshotTask, lastArchivedTask, archiveCandidateTask).ConfigureAwait(false);

            cancellationToken.ThrowIfCancellationRequested();

            var initialValues = new InitialTagValues(snapshotTask.Result, lastArchivedTask.Result, archiveCandidateTask.Result.Value, archiveCandidateTask.Result.CompressionAngleMinimum, archiveCandidateTask.Result.CompressionAngleMaximum);

            var result = new RedisTagDefinition(historian,
                                                tagId,
                                                settings,
                                                metadata,
                                                initialValues,
                                                null);

            return(result);
        }
Exemplo n.º 17
0
 public MetadataEntry(MetadataKey key, TagDataType type, byte[] data)
     : this(key.Section, key.TagId, type, data)
 {
 }
 public TagData(TagDataType type, decimal value)
 {
     this._type = type;
     this._value = value;
 }
Exemplo n.º 19
0
            private string GetValueStringFromOffset()
            {
                string valueString;

                TagDataType type   = entry.Type;
                uint        count  = entry.Count;
                uint        offset = entry.Offset;

                int typeSizeInBytes = TagDataTypeUtil.GetSizeInBytes(type);

                if (typeSizeInBytes == 1)
                {
                    byte[] bytes = new byte[count];

                    if (offsetIsBigEndian)
                    {
                        switch (count)
                        {
                        case 1:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            break;

                        case 2:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            bytes[1] = (byte)((offset >> 16) & 0x000000ff);
                            break;

                        case 3:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            bytes[1] = (byte)((offset >> 16) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 8) & 0x000000ff);
                            break;

                        case 4:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            bytes[1] = (byte)((offset >> 16) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 8) & 0x000000ff);
                            bytes[3] = (byte)(offset & 0x000000ff);
                            break;
                        }
                    }
                    else
                    {
                        switch (count)
                        {
                        case 1:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            break;

                        case 2:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            bytes[1] = (byte)((offset >> 8) & 0x000000ff);
                            break;

                        case 3:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            bytes[1] = (byte)((offset >> 8) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 16) & 0x000000ff);
                            break;

                        case 4:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            bytes[1] = (byte)((offset >> 8) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 16) & 0x000000ff);
                            bytes[3] = (byte)((offset >> 24) & 0x000000ff);
                            break;
                        }
                    }

                    if (type == TagDataType.Ascii)
                    {
                        valueString = Encoding.ASCII.GetString(bytes).TrimEnd('\0');
                    }
                    else if (count == 1)
                    {
                        valueString = bytes[0].ToString(CultureInfo.InvariantCulture);
                    }
                    else
                    {
                        StringBuilder builder = new StringBuilder();

                        uint lastItemIndex = count - 1;

                        for (int i = 0; i < count; i++)
                        {
                            builder.Append(bytes[i].ToString(CultureInfo.InvariantCulture));

                            if (i < lastItemIndex)
                            {
                                builder.Append(",");
                            }
                        }

                        valueString = builder.ToString();
                    }
                }
                else if (typeSizeInBytes == 2)
                {
                    ushort[] values = new ushort[count];
                    if (offsetIsBigEndian)
                    {
                        switch (count)
                        {
                        case 1:
                            values[0] = (ushort)((offset >> 16) & 0x0000ffff);
                            break;

                        case 2:
                            values[0] = (ushort)((offset >> 16) & 0x0000ffff);
                            values[1] = (ushort)(offset & 0x0000ffff);
                            break;
                        }
                    }
                    else
                    {
                        switch (count)
                        {
                        case 1:
                            values[0] = (ushort)(offset & 0x0000ffff);
                            break;

                        case 2:
                            values[0] = (ushort)(offset & 0x0000ffff);
                            values[1] = (ushort)((offset >> 16) & 0x0000ffff);
                            break;
                        }
                    }

                    if (count == 1)
                    {
                        switch (type)
                        {
                        case TagDataType.SShort:
                            valueString = ((short)values[0]).ToString(CultureInfo.InvariantCulture);
                            break;

                        case TagDataType.Short:
                        default:
                            valueString = values[0].ToString(CultureInfo.InvariantCulture);
                            break;
                        }
                    }
                    else
                    {
                        switch (type)
                        {
                        case TagDataType.SShort:
                            valueString = ((short)values[0]).ToString(CultureInfo.InvariantCulture) + "," +
                                          ((short)values[1]).ToString(CultureInfo.InvariantCulture);
                            break;

                        case TagDataType.Short:
                        default:
                            valueString = values[0].ToString(CultureInfo.InvariantCulture) + "," +
                                          values[1].ToString(CultureInfo.InvariantCulture);
                            break;
                        }
                    }
                }
                else
                {
                    valueString = offset.ToString(CultureInfo.InvariantCulture);
                }

                return(valueString);
            }
Exemplo n.º 20
0
            public unsafe byte[] GetValueBytesFromOffset()
            {
                if (!OffsetFieldContainsValue)
                {
                    return(null);
                }

                TagDataType type   = entry.Type;
                uint        count  = entry.Count;
                uint        offset = entry.Offset;

                // Paint.NET always stores data in little-endian byte order.
                byte[] bytes;
                if (type == TagDataType.Byte ||
                    type == TagDataType.Ascii ||
                    type == TagDataType.SByte ||
                    type == TagDataType.Undefined)
                {
                    bytes = new byte[count];

                    if (offsetIsBigEndian)
                    {
                        switch (count)
                        {
                        case 1:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            break;

                        case 2:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            bytes[1] = (byte)((offset >> 16) & 0x000000ff);
                            break;

                        case 3:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            bytes[1] = (byte)((offset >> 16) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 8) & 0x000000ff);
                            break;

                        case 4:
                            bytes[0] = (byte)((offset >> 24) & 0x000000ff);
                            bytes[1] = (byte)((offset >> 16) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 8) & 0x000000ff);
                            bytes[3] = (byte)(offset & 0x000000ff);
                            break;
                        }
                    }
                    else
                    {
                        switch (count)
                        {
                        case 1:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            break;

                        case 2:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            bytes[1] = (byte)((offset >> 8) & 0x000000ff);
                            break;

                        case 3:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            bytes[1] = (byte)((offset >> 8) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 16) & 0x000000ff);
                            break;

                        case 4:
                            bytes[0] = (byte)(offset & 0x000000ff);
                            bytes[1] = (byte)((offset >> 8) & 0x000000ff);
                            bytes[2] = (byte)((offset >> 16) & 0x000000ff);
                            bytes[3] = (byte)((offset >> 24) & 0x000000ff);
                            break;
                        }
                    }
                }
                else if (type == TagDataType.Short || type == TagDataType.SShort)
                {
                    int byteArrayLength = unchecked ((int)count) * sizeof(ushort);
                    bytes = new byte[byteArrayLength];

                    fixed(byte *ptr = bytes)
                    {
                        ushort *ushortPtr = (ushort *)ptr;

                        if (offsetIsBigEndian)
                        {
                            switch (count)
                            {
                            case 1:
                                ushortPtr[0] = (ushort)((offset >> 16) & 0x0000ffff);
                                break;

                            case 2:
                                ushortPtr[0] = (ushort)((offset >> 16) & 0x0000ffff);
                                ushortPtr[1] = (ushort)(offset & 0x0000ffff);
                                break;
                            }
                        }
                        else
                        {
                            switch (count)
                            {
                            case 1:
                                ushortPtr[0] = (ushort)(offset & 0x0000ffff);
                                break;

                            case 2:
                                ushortPtr[0] = (ushort)(offset & 0x0000ffff);
                                ushortPtr[1] = (ushort)((offset >> 16) & 0x0000ffff);
                                break;
                            }
                        }
                    }
                }
                else
                {
                    bytes = new byte[4];

                    fixed(byte *ptr = bytes)
                    {
                        // The offset is stored as little-endian in memory.
                        *(uint *)ptr = offset;
                    }
                }

                return(bytes);
            }
Exemplo n.º 21
0
 /// <summary>
 /// インスタンスを初期化します。
 /// </summary>
 /// <param name="type">データ型。</param>
 /// <param name="canEdit">編集可能な値ならば true。それ以外は false。</param>
 internal TagInfo( TagDataType type, bool canEdit )
 {
     this.Type = type;
     this.CanEdit = canEdit;
 }
Exemplo n.º 22
0
 public PLCTag(string address, TagDataType type)
 {
     this.ChangeAddressFromString(address);
     this.TagDataType = type;
 }