Ejemplo n.º 1
0
        public Application_Header(DataLink_Header DL, Transport_Header TH, byte [] rawdata)
        {
            this.DataLink  = DL;
            this.Transport = TH;
            this.rawdata   = rawdata;
            this.pullCRC();

            this.ApplicationControl = new ApplicationControl(this.Userdata[0]);
            this.FunctionCode       = this.Userdata[1];
            this.FunctionName       = getFunctionName(this.FunctionCode);

            int userdataindex = 2;                 // index for the next data that have to manage

            if (this.DataLink.Control.DIR == true) //REQ HEADER
            {
                userdataindex = 2;
            }
            else if (this.FunctionCode != 0)                       //RES HEADER
            {
                this.IIN      = new IIN(Userdata[2], Userdata[3]); // IIN data |--MSB--||--LSB--|
                userdataindex = 4;
            }

            //still have data
            while (userdataindex < this.Userdata.Length)
            {
                byte      objtemp = Userdata[userdataindex];
                byte      vartemp = Userdata[userdataindex + 1];
                Qualifier qtemp   = new Qualifier(Userdata[userdataindex + 2]);
                userdataindex += 3;  //  for Object + Var + Qualifier total 3 bytes
                int    rangesizetemp = qtemp.getRangeSize();
                byte[] rangetemp     = new byte[rangesizetemp];
                for (int i = 0; i < rangetemp.Length; i++)
                {
                    rangetemp[i] = Userdata[userdataindex];
                    userdataindex++;
                }

                // Construct Object Header
                Object_Header OH        = new Object_Header(objtemp, vartemp, qtemp, rangetemp);
                int           osizetemp = OH.getTotalSize();
                byte []       datatemp  = new byte[osizetemp];
                for (int i = 0; i < datatemp.Length; i++)
                {
                    datatemp[i] = Userdata[userdataindex];
                    userdataindex++;
                }

                //Construct Object Field
                Object_Field otemp = new Object_Field(OH, datatemp);
                ObjectList.Add(otemp);
                //this.Object[objectindex] = new Object_Field(OH, datatemp);
            }
            this.Object = new Object_Field[ObjectList.Count];
            this.Object = ObjectList.ToArray(typeof(Object_Field)) as Object_Field[];
        }
Ejemplo n.º 2
0
        public int getObjectSize()
        {
            int size = 0;

            size += Qualifier.getIndexSize();
            size += Object_Library.getSize(this.ObjectGroup, this.ObjectVariation);
            if (size == 0x81)
            {
                size = 1;
            }
            return(size);
        }
Ejemplo n.º 3
0
        public Object_Header(byte Object, byte Var, Qualifier qualifier, byte [] Range)
        {
            this.ObjectGroup     = Object;
            this.ObjectVariation = Var;
            this.ObjectName      = Object_Library.getName(this.ObjectGroup, this.ObjectVariation);

            this.Qualifier    = qualifier;
            this.rawrangedata = Range;
            // construct Range by array of byte due to Q-code
            switch (this.Qualifier.Qcode)
            {
            case 0:     //Q-code 8 bit Start Stop bit
                this.Start = Range[0];
                this.Stop  = Range[1];
                isQuantity = false;
                break;

            case 1:     //Q-code 16 bit Start Stop bit
                this.Start = (uint)(Range[1] << 8) + Range[0];
                this.Stop  = (uint)(Range[3] << 8) + Range[2];
                isQuantity = false;
                break;

            case 2:     //Q-code 32 bit Start Stop bit
                this.Start = (uint)(Range[3] << 24) + (uint)(Range[2] << 16)
                             + (uint)(Range[1] << 8) + Range[0];
                this.Stop = (uint)(Range[7] << 24) + (uint)(Range[6] << 16)
                            + (uint)(Range[5] << 8) + Range[4];
                isQuantity = false;
                break;

            case 3:     //Q-code 8 bit Start Stop bit absolute
                this.Start = Range[0];
                this.Stop  = Range[1];
                isQuantity = false;
                break;

            case 4:     //Q-code 16 bit Start Stop bit absolute
                this.Start = (uint)(Range[1] << 8) + Range[0];
                this.Stop  = (uint)(Range[3] << 8) + Range[2];
                isQuantity = false;
                break;

            case 5:     //Q-code 32 bit Start Stop bit absolute
                this.Start = (uint)(Range[3] << 24) + (uint)(Range[2] << 16)
                             + (uint)(Range[1] << 8) + Range[0];
                this.Stop = (uint)(Range[7] << 24) + (uint)(Range[6] << 16)
                            + (uint)(Range[5] << 8) + Range[4];
                isQuantity = false;
                break;

            case 6:     // Q-code = 6 all poll all Object in the class
                this.Start = 0;
                this.Stop  = 0;
                this.Count = 0;     // message end here
                break;

            case 7:     // range = 8 bit Quantity indicator
                this.Count = Range[0];
                isQuantity = true;
                break;

            case 8:     // range = 16 bit Quantity indicator
                this.Count = (uint)(Range[1] << 8) + Range[0];
                isQuantity = true;
                break;

            case 9:     // range = 16 bit Quantity indicator
                this.Count = (uint)(Range[3] << 24) + (uint)(Range[2] << 16)
                             + (uint)(Range[1] << 8) + Range[0];
                isQuantity = true;
                break;

            case 11:     // do not supported yet
                break;
            }
        }