/// <summary> /// 添加时间到列表,重载datetime /// </summary> /// <param name="list"></param> /// <param name="time"></param> public static void AddTimeToList(List <byte> list, DateTime time) { long _time1 = TimerTick.TimeSpanToSecond(time); byte[] _time2 = ByteStruct.StructToBytes(_time1); list.Add(_time2[0]); list.Add(_time2[1]); list.Add(_time2[2]); list.Add(_time2[3]); list.Add(_time2[4]); list.Add(_time2[5]); list.Add(_time2[6]); list.Add(_time2[7]); }
/// <summary> /// 组包中获取数据域字节数组 /// </summary> /// <param name="para">发送摘要</param> /// <param name="subtype">包子类型,用于区分getdata调用哪些</param> /// <returns></returns> public static byte[] GetData(GetFileInfo.Parameter para, byte subtype) { byte[] tempdata; List <byte> _tempdata = new List <byte>(); switch (subtype) { //按日期范围查询数据文件名及文件大小 case (byte)MSGEncoding.GetFileInfo.GetFileByRange: { long start = TimerTick.TimeSpanToSecond(para.starttime); long stop = TimerTick.TimeSpanToSecond(para.endtime); WriteUnit.AddTimeToList(_tempdata, start); WriteUnit.AddTimeToList(_tempdata, stop); break; } //查询离指定日期最近的x个数据文件名及文件大小 case (byte)MSGEncoding.GetFileInfo.GetXFileByLately: { long time = TimerTick.TimeSpanToSecond(para.timepoint); WriteUnit.AddTimeToList(_tempdata, time); WriteUnit.AddUshortToList(_tempdata, para.filenum); break; } //取得配置文件名称(=更新时间)及文件大小 case (byte)MSGEncoding.GetFileInfo.GetcfgFile: { //发送内容为空,通过包类型及子类型截取 break; } default: { //MessageBox.Show("文件信息查询子类消息编号超出范围!"); break; } } tempdata = _tempdata.ToArray <byte>(); return(tempdata); }
/// <summary> /// 获取下设帧数据域内容 /// 数据字典的键需要拆分成标志和类型(以空格隔开),方便组织 /// !注意:dictionary的可以通过参数传递或者共享同步变量得来 /// </summary> /// <param name="unitvalue"> web端传来的消息</param> /// <returns>数据域</returns> public static byte[] GetData(Dictionary <string, string> unitvalue) { byte [] data; string [] collect; string flag; ushort unit; string value; //方便动态组织数据 List <byte> datalist = new List <byte>(); for (int i = 0; i < unitvalue.Count; i++) { collect = unitvalue.ElementAt(i).Key.Split(' '); flag = collect[0]; unit = (ushort)Convert.ToUInt16(collect[1]); value = unitvalue.ElementAt(i).Value; //单数据类型处理 if ("o" == flag) { //collect[]: collect[0]=大类数据类型 collect[1] = 操作单元 switch (unit) { //uchar处理 case 0: { //每次循环中只会操作一次unit,下次循环unit会被更新(所以忽略这里的修改) //datalist.Add((byte)unit); //datalist.Add((byte)(unit>>8)); AddUnitToList(datalist, unit); datalist.Add((byte)Convert.ToUInt16(value)); } break; //ushort处理 case 1: { AddUnitToList(datalist, unit); AddUshortToList(datalist, Convert.ToUInt16(value)); //datalist.Add((byte)unit); //datalist.Add((byte)(unit>>8)); //ushort temp = Convert.ToUInt16(value); //datalist.Add((byte)temp); //datalist.Add((byte)(temp >> 8)); } break; //float处理 case 2: { //float转换为字节数组 //float temp = Convert.ToSingle(value); //byte[] arrtemp = ByteStruct.StructToBytes(temp); AddUnitToList(datalist, unit); AddFloatToList(datalist, Convert.ToSingle(value)); //datalist.Add((byte)unit); //datalist.Add((byte)(unit >> 8)); //datalist.Add(arrtemp[0]); //datalist.Add(arrtemp[1]); //datalist.Add(arrtemp[2]); //datalist.Add(arrtemp[3]); } break; //datetime处理 case 3: { //datalist.Add((byte)unit); //datalist.Add((byte)(unit >> 8)); //datetime转换成long来移位保存 AddUnitToList(datalist, unit); long date = TimerTick.TimeSpanToSecond(Convert.ToDateTime(collect[2])); datalist.Add((byte)date); datalist.Add((byte)(date >> 8)); datalist.Add((byte)(date >> 16)); datalist.Add((byte)(date >> 24)); datalist.Add((byte)(date >> 32)); datalist.Add((byte)(date >> 40)); datalist.Add((byte)(date >> 48)); datalist.Add((byte)(date >> 56)); } break; default: //MessageBox.Show("在解析为单类型数据后没有对应的类型"); break; } } //单类型数组处理 else if ("s" == flag) { switch (unit) { #region //组织变电站名和网络地址 //这里在解析相对数据的时候过滤字符串结束符 //case 4: // { // //datalist.Add((byte)unit); // //datalist.Add((byte)(unit >> 8)); // if (16 == MyDictionary.unitlendict[unit]) // { // AddUnitToList(datalist, unit); // byte []temp_16 = new byte[16]; // Encoding.Unicode.GetBytes(value).CopyTo(temp_16 , 0); // for (int j = 0; j < 16; j++) // { // datalist.Add(temp_16[j]); // } // } // else // if (80 == MyDictionary.unitlendict[unit]) // { // AddUnitToList(datalist, unit); // byte []temp_80 = new byte[80]; // Encoding.Unicode.GetBytes(value).CopyTo(temp_80 , 0); // for (int j = 0; j < 80; j++) // { // datalist.Add(temp_80[j]); // } // } // else // MessageBox.Show("变电站名和软件版本类超出范围"); // } // break; //组织网络通信地址 //传来为ip地址字符串形式,这里不需要对数据点表中给定的uchar数组类型进行分治处理 //case 5: // { // //datalist.Add((byte)unit); // //datalist.Add((byte)(unit >> 8)); // AddUnitToList(datalist , unit); // byte []iparray = IPAddress.Parse(value).GetAddressBytes(); // datalist.Add(iparray[0]); // datalist.Add(iparray[1]); // datalist.Add(iparray[2]); // datalist.Add(iparray[3]); // } // break; //ushort[]数组处理,只有ushort[4]类型 //数据字典中这类数据的组织: //(A) 118+ushort (B) 118+ushort (C) 118+ushort (D) 118+ushort 括号中不存在 //一个数组的四个数据连续组织,装包是检测到第一个顺序装入 //解析的时候做同样处理 #endregion case 5: { //两个ushort元素数组处理 if (2 == MyDictionary.unitlendict[unit]) { //给出开头顺序后去一个ushort AddUnitToList(datalist, unit); AddUshortToList(datalist, Convert.ToUInt16(value)); AddUshortToList(datalist, Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); ///datalist.Add((byte)unit); ///datalist.Add((byte)(unit >> 8)); ///ushort temp1 = Convert.ToUInt16(value); ///datalist.Add((byte)temp1); ///datalist.Add((byte)(temp1 >> 8)); ///i++; ///temp1 = Convert.ToUInt16(unitvalue.ElementAt(i).Value); ///datalist.Add((byte)temp1); ///datalist.Add((byte)(temp1 >> 8)); } //四个ushort元素数组处理 else if (4 == MyDictionary.unitlendict[unit]) { AddUnitToList(datalist, unit); AddUshortToList(datalist, Convert.ToUInt16(value)); AddUshortToList(datalist, Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); AddUshortToList(datalist, Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); AddUshortToList(datalist, Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); //datalist.Add((byte)unit); //datalist.Add((byte)(unit >> 8)); //ushort temp2 = Convert.ToUInt16(value); //datalist.Add((byte)temp2); //datalist.Add((byte)(unit >> 8)); //for (int j = 0; j < 3; j++) //{ // i++; // temp2 = Convert.ToUInt16(unitvalue.ElementAt(i).Value); // datalist.Add((byte)temp2); // datalist.Add((byte)(temp2 >> 8)); //} } else { //MessageBox.Show("writeunit_getdata:ushort类型单数组格式出现范围之外数组"); } } break; //float类数组处理 case 6: { if (MyDictionary.unitlendict[unit] == 2) { AddUnitToList(datalist, unit); AddFloatToList(datalist, Convert.ToSingle(value)); AddFloatToList(datalist, Convert.ToSingle(unitvalue.ElementAt(++i).Value)); } else if (MyDictionary.unitlendict[unit] == 3) { AddUnitToList(datalist, unit); AddFloatToList(datalist, Convert.ToSingle(unitvalue.ElementAt(++i).Value)); AddFloatToList(datalist, Convert.ToSingle(unitvalue.ElementAt(++i).Value)); } else if (MyDictionary.unitlendict[unit] == 5) { AddUnitToList(datalist, unit); AddFloatToList(datalist, Convert.ToSingle(unitvalue.ElementAt(++i).Value)); AddFloatToList(datalist, Convert.ToSingle(unitvalue.ElementAt(++i).Value)); AddFloatToList(datalist, Convert.ToSingle(unitvalue.ElementAt(++i).Value)); AddFloatToList(datalist, Convert.ToSingle(unitvalue.ElementAt(++i).Value)); } else { //MessageBox.Show("float类型单数组格式出现范围之外的数组"); } } break; default: { //MessageBox.Show("单类型数组处理错误!"); break; } } } #region //混合类型处理 //都是数据传输接口相关参数,暂时忽略 //else if ("x" == flag) //{ // if (157 == unit || 160 == unit) // { // AddUnitToList(datalist , unit); // AddIPToList(datalist , value); // AddUshortToList(datalist , Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); // } // else // if (158 == unit || 161 == unit) // { // AddUnitToList(datalist, unit); // AddUshortToList(datalist, Convert.ToUInt16(value)); // datalist.Add((byte)Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); // datalist.Add((byte)Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); // datalist.Add((byte)Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); // } // else // if (159 == unit || 162 == unit) // { // AddUnitToList(datalist, unit); // AddIPToList(datalist, value); // AddUshortToList(datalist, Convert.ToUInt16(unitvalue.ElementAt(++i).Value)); // AddIPToList(datalist, unitvalue.ElementAt(++i).Value); // AddIPToList(datalist, unitvalue.ElementAt(++i).Value); // } // else // { // MessageBox.Show("混合类型处理超出可行范围"); // } //} #endregion else { //MessageBox.Show("解析完成字符串数据大类标志报错"); } } data = datalist.ToArray <byte>(); return(data); }