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[]; }
public int getObjectSize() { int size = 0; size += Qualifier.getIndexSize(); size += Object_Library.getSize(this.ObjectGroup, this.ObjectVariation); if (size == 0x81) { size = 1; } return(size); }
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; } }