// 생성자

        public ClsMultiReadPacketData(byte invokeId, ClsBACnetDevice device)
        {
            if (invokeId > MAX_INVOKE_ID)
            {
                throw new ArgumentException("InvokeId 가 사용가능한 범위를 벗어났습니다", "invokeId");
            }
            else if (device == null)
            {
                throw new ArgumentNullException("Device 가 null 입니다", "device");
            }
            else
            {
                this.m_InvokeId = invokeId;
                this.m_RemoteEP = device.RemoteEP;
                this.m_Device   = device;

                this.m_Items = new List <ClsRequestItemData>(50);
            }
        }
        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;
            }
        }
        // 생성자

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