예제 #1
0
파일: WriteUnit.cs 프로젝트: athree/YSP
        /// <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]);
        }
예제 #2
0
파일: GetFileInfo.cs 프로젝트: athree/YSP
        /// <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);
        }
예제 #3
0
파일: WriteUnit.cs 프로젝트: athree/YSP
        /// <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);
        }