public ClsTagItem(int tagId, BACnetObjectType objectType, int objectInstance, ClsBACnetDevice device, double gain, double bias)
        {
            this.m_TagId = tagId;

            if (Enum.IsDefined(typeof(BACnetObjectType), objectType) != true)
            {
                throw new ArgumentException("BACnet Object의 ObjectType 이 처리 가능한 타입이 아닙니다", "objectType");
            }
            else if (objectInstance < 0 | objectInstance >= 0x400000)
            {
                throw new ArgumentException("BACnet Object의 ObjectInstance 가 범위를 벗어났습니다", "objectInstance");
            }
            else if (gain == 0)
            {
                throw new ArgumentException("GAIN 이 0 입니다", "gain");
            }
            else
            {
                this.m_ObjectType       = objectType;
                this.m_ObjectInstance   = objectInstance;
                this.m_ObjectIdentifier = (Convert.ToUInt32(this.m_ObjectType) << 22) | Convert.ToUInt32(objectInstance);

                #region ObjectType 에 따라, IsWriteable, ValueTypeTag 설정

                switch (objectType)
                {
                case BACnetObjectType.AI:
                    this.m_IsWriteable  = false;
                    this.m_ValueTypeTag = 0x44;
                    break;

                case BACnetObjectType.BI:
                    this.m_IsWriteable  = false;
                    this.m_ValueTypeTag = 0x91;
                    break;

                case BACnetObjectType.MSI:
                    this.m_IsWriteable  = false;
                    this.m_ValueTypeTag = 0x21;
                    break;

                case BACnetObjectType.AO:
                    this.m_IsWriteable  = true;
                    this.m_ValueTypeTag = 0x44;
                    break;

                case BACnetObjectType.AV:
                    this.m_IsWriteable  = true;
                    this.m_ValueTypeTag = 0x44;
                    break;

                case BACnetObjectType.BO:
                    this.m_IsWriteable  = true;
                    this.m_ValueTypeTag = 0x91;
                    break;

                case BACnetObjectType.BV:
                    this.m_IsWriteable  = true;
                    this.m_ValueTypeTag = 0x91;
                    break;

                case BACnetObjectType.MSO:
                    this.m_IsWriteable  = true;
                    this.m_ValueTypeTag = 0x21;
                    break;

                case BACnetObjectType.MSV:
                    this.m_IsWriteable  = true;
                    this.m_ValueTypeTag = 0x21;
                    break;
                }

                #endregion

                this.m_Device = new WeakReference(device);

                this.m_GAIN = gain;
                this.m_BIAS = bias;
            }
        }
        // H.5.2.1 Object_Identifier, pg 841
        // 20.2.14 Encoding of an Object Identifier Value, pg 632
        // BACnetObjectIdentifier ::= [APPLICATION 12] OCTET STRING (SIZE(4)) -- see 20.2.14
        // BACnetObjectIdentifiers value of 4194303 to indicate that the property is not initialized
        // Table 12-63 – Datatype Coercion Rules

        public void Decode(UInt32 v)
        {
            rawValue       = v;
            objectType     = (BACnetObjectType)((rawValue >> 22) & 0x3ff);
            instanceNumber = (rawValue & 0x03FFFFF);
        }
        // 생성자

        public ClsTagItem(int tagId, BACnetObjectType objectType, int objectInstance, ClsBACnetDevice device)
            : this(tagId, objectType, objectInstance, device, 1, 0)
        {
        }