/// <summary>
        /// 响应获取充电状态请求
        /// </summary>
        /// <returns></returns>
        public string UP0010(string cp_code, string bodyData)
        {
            string sendData = "";
            Dictionary <string, object> tcpClientDic = Config.g_cimTcpClientDic[cp_code];
            Client_ChargePile_Data_DC   data         = (Client_ChargePile_Data_DC)tcpClientDic["data"];

            MatchCollection arr  = Regex.Matches(bodyData, @"(?<=\[)[^\]]*(?=\])");
            string          UP_0 = arr[0].Value; //枪编号
            string          UP_1 = arr[1].Value; //用户名
            string          UP_2 = arr[2].Value; //已充电量
            string          UP_3 = arr[3].Value; //剩余时间
            string          UP_4 = arr[4].Value; //单价,元/度
            string          UP_5 = arr[5].Value; //充电模式,1按时间、2按金额、3按电量、4自动充满
            string          UP_6 = arr[6].Value; //数值(当2为4时,此值为0)

            if (int.Parse(UP_0) > 0)
            {
                //更新枪状态
                data.gundata[int.Parse(UP_0)].useruname = long.Parse(UP_1);
                data.gundata[int.Parse(UP_0)].kwh       = double.Parse(UP_2);
                data.gundata[int.Parse(UP_0)].timeleft  = TimeSpan.FromSeconds(double.Parse(UP_3));
                data.unitmoney = decimal.Parse(UP_4);
                data.gundata[int.Parse(UP_0)].chargemod        = int.Parse(UP_5);
                data.gundata[int.Parse(UP_0)].chargemodcontent = long.Parse(UP_6);
                data.gundata[int.Parse(UP_0)].guncondition     = true;
                //更新充电桩状态
                data.condition = GetCondition(data);
            }

            return(sendData);
        }
        /// <summary>
        /// 获取充电桩充电状态
        /// </summary>
        /// <returns></returns>
        int GetCondition(Client_ChargePile_Data_DC data)
        {
            int condition = 1;

            bool?[] bArr = data.gundata.Select(a => a.guncondition).ToArray();
            for (int i = 0; i < bArr.Length; i++)
            {
                if ((bool)bArr[i])
                {
                    condition = 2;
                    break;
                }
            }
            return(condition);
        }
        /// <summary>
        /// 窗口载入完成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            m_mod            = (Client_ChargePile_Data_DC)this.Tag;
            this.DataContext = m_mod;
            //确定枪数
            Border border = (Border)this.FindName("border_cim");

            switch (m_mod.gunnum)
            {
            case 1:
            {
                CIMShowPile1Gun cimdp = new CIMShowPile1Gun();
                cimdp.DataContext = m_mod;
                border.Child      = cimdp;
            }
            break;

            case 2:
            {
                CIMShowPile2Gun cimdp = new CIMShowPile2Gun();
                cimdp.DataContext = m_mod;
                border.Child      = cimdp;
            }
            break;

            case 4:
            {
                CIMShowPile4Gun cimdp = new CIMShowPile4Gun();
                cimdp.DataContext = m_mod;
                border.Child      = cimdp;
            }
            break;
            }
            StackPanel sp = (StackPanel)FindName("guns");
            //获取枪数据
            ObservableCollection <Client_ChargePile_GunData_DC> gunlist = m_mod.gundata;

            for (int i = 1; i <= m_mod.gunnum; i++)
            {
                CIMShowGun_DC cimsdg = new CIMShowGun_DC();
                ObservableCollection <Client_ChargePile_GunData_DC> oc = new ObservableCollection <Client_ChargePile_GunData_DC>();
                Client_ChargePile_GunData_DC mod = gunlist[i];
                oc.Add(mod);
                cimsdg.DataContext = oc;
                cimsdg.Margin      = new Thickness(0, 15, 0, 0);
                sp.Children.Add(cimsdg);
            }
        }
        /// <summary>
        /// 设置断线
        /// </summary>
        /// <returns></returns>
        public string UP0004(string cp_code, string bodyData)
        {
            string sendData = "";
            Dictionary <string, object> tcpClientDic = Config.g_cimTcpClientDic[cp_code];
            Client_ChargePile_Data_DC   data         = (Client_ChargePile_Data_DC)tcpClientDic["data"];

            //更新充电桩状态
            data.condition = 0;
            //更新枪状态
            for (int i = 1; i < data.gundata.Count; i++)
            {
                data.gundata[i].guncondition = false;
            }

            return(sendData);
        }
        /// <summary>
        /// 结束充电命令
        /// </summary>
        /// <returns></returns>
        public string UP0009(string cp_code, string bodyData)
        {
            string sendData = "";
            Dictionary <string, object> tcpClientDic = Config.g_cimTcpClientDic[cp_code];
            Client_ChargePile_Data_DC   data         = (Client_ChargePile_Data_DC)tcpClientDic["data"];

            MatchCollection arr  = Regex.Matches(bodyData, @"(?<=\[)[^\]]*(?=\])");
            string          UP_0 = arr[0].Value; //枪编号
            string          UP_1 = arr[1].Value; //用户名
            string          UP_2 = arr[2].Value; //已充电量
            string          UP_3 = arr[3].Value; //充电开始时间

            //更新枪状态
            data.gundata[int.Parse(UP_0)].guncondition = false;
            //更新充电桩状态
            data.condition = GetCondition(data);

            return(sendData);
        }
        /// <summary>
        /// 心跳
        /// </summary>
        /// <returns></returns>
        public string UP0001(string cp_code, string cb_code, string bodyData)
        {
            string sendData = "";
            Dictionary <string, object> tcpClientDic = Config.g_cimTcpClientDic[cp_code];
            Client_ChargePile_Data_DC   data         = (Client_ChargePile_Data_DC)tcpClientDic["data"];

            MatchCollection arr  = Regex.Matches(bodyData, @"(?<=\[)[^\]]*(?=\])");
            string          UP_0 = arr[0].Value;                   //是否在充电
            string          UP_1 = arr[1].Value;                   //枪编号

            string[] UP_2 = arr[2].Value.Split('|');               //电压
            string[] UP_3 = arr[3].Value.Split('|');               //电流
            string   UP_4 = arr[4].Value;                          //有功功率
            string   UP_5 = arr[5].Value;                          //无功功率
            string   UP_6 = arr[6].Value;                          //功率因数
            string   UP_7 = double.Parse(arr[7].Value).ToString(); //电度
            string   UP_8 = arr[8].Value;                          //充电剩余时间
            string   UP_9 = arr[9].Value;                          //用户名

            if (int.Parse(UP_1) > 0)
            {
                data.gundata[int.Parse(UP_1)].cb_code  = cb_code;
                data.gundata[int.Parse(UP_1)].guncode  = int.Parse(UP_1);
                data.gundata[int.Parse(UP_1)].uab      = double.Parse(UP_2[0]);
                data.gundata[int.Parse(UP_1)].ubc      = double.Parse(UP_2[1]);
                data.gundata[int.Parse(UP_1)].uca      = double.Parse(UP_2[2]);
                data.gundata[int.Parse(UP_1)].ia       = double.Parse(UP_3[0]);
                data.gundata[int.Parse(UP_1)].ib       = double.Parse(UP_3[1]);
                data.gundata[int.Parse(UP_1)].ic       = double.Parse(UP_3[2]);
                data.gundata[int.Parse(UP_1)].pw       = double.Parse(UP_4);
                data.gundata[int.Parse(UP_1)].qw       = double.Parse(UP_5);
                data.gundata[int.Parse(UP_1)].cos      = double.Parse(UP_6);
                data.gundata[int.Parse(UP_1)].kwh      = double.Parse(UP_7);
                data.gundata[int.Parse(UP_1)].timeleft = TimeSpan.FromSeconds(double.Parse(UP_8));
            }

            //更新充电桩状态
            data.condition = GetCondition(data);

            return(sendData);
        }
        /// <summary>
        /// 报警
        /// </summary>
        /// <returns></returns>
        public string UP0003(string cp_code, string bodyData)
        {
            string sendData = "";
            Dictionary <string, object> tcpClientDic = Config.g_cimTcpClientDic[cp_code];
            Client_ChargePile_Data_DC   data         = (Client_ChargePile_Data_DC)tcpClientDic["data"];
            ObservableCollection <Client_ChargePile_GunData_DC> gunDataList = data.gundata;

            MatchCollection arr  = Regex.Matches(bodyData, @"(?<=\[)[^\]]*(?=\])");
            string          UP_0 = arr[0].Value; //枪编号
            string          UP_1 = arr[1].Value; //报警码

            //更新充电桩报警状态
            if (int.Parse(UP_1) != 255)
            {
                data.gundata[int.Parse(UP_0)].ispolice   = true;
                data.gundata[int.Parse(UP_0)].police     = Config.g_police[int.Parse(UP_1)];
                data.gundata[int.Parse(UP_0)].policecode = int.Parse(UP_1);
            }
            else
            {
                /*data.ispolice = false;
                 * data.gundata[int.Parse(UP_0)].ispolice = false;
                 * data.gundata[int.Parse(UP_0)].police = "";
                 * data.gundata[int.Parse(UP_0)].policecode = 0;*/
            }
            bool b = false;

            for (int i = 1; i < data.gundata.Count; i++)
            {
                if ((bool)data.gundata[int.Parse(UP_0)].ispolice)
                {
                    b = true;
                    break;
                }
            }
            data.ispolice = b;

            return(sendData);
        }
        /// <summary>
        /// 获取充电桩列表
        /// </summary>
        void GetChargePileList()
        {
            List <Models> list = m_incHTTPSend.UP001(Config.cs_id);
            Dictionary <long, ObservableCollection <Client_ChargePile_Data_AC> > dicAC = new Dictionary <long, ObservableCollection <Client_ChargePile_Data_AC> >();
            Dictionary <long, ObservableCollection <Client_ChargePile_Data_DC> > dicDC = new Dictionary <long, ObservableCollection <Client_ChargePile_Data_DC> >();

            for (int i = 0; i < list.Count; i++)
            {
                switch ((int)list[i].G_ChargePile.cp_chargemod)
                {
                //交流
                case 1:
                {
                    Client_ChargePile_Data_AC cp = new Client_ChargePile_Data_AC();
                    cp.t_name    = list[i].G_Type.t_name;
                    cp.v_name    = list[i].G_Version.v_name;
                    cp.cp_name   = list[i].G_ChargePile.cp_name;
                    cp.gunnum    = (int)list[i].G_ChargePile.cp_gunnum;
                    cp.cs_id     = (long)list[i].G_ChargePile.cs_id;
                    cp.cp_id     = (long)list[i].G_ChargePile.cp_id;
                    cp.cp_code   = list[i].G_ChargePile.cp_code;
                    cp.condition = 0;
                    cp.gunnum    = (int)list[i].G_ChargePile.cp_gunnum;
                    cp.chargemod = (int)list[i].G_ChargePile.cp_chargemod;
                    cp.unitmoney = (decimal)list[i].G_ChargePile.cp_money;
                    cp.gundata   = new ObservableCollection <Client_ChargePile_GunData_AC>();
                    for (int j = 0; j < cp.gunnum + 1; j++)
                    {
                        cp.gundata.Add(new Client_ChargePile_GunData_AC());
                    }
                    if (!dicAC.ContainsKey(cp.cs_id))
                    {
                        dicAC.Add(cp.cs_id, new ObservableCollection <Client_ChargePile_Data_AC>());
                    }
                    dicAC[cp.cs_id].Add(cp);

                    Dictionary <string, object> dic = new Dictionary <string, object>();
                    dic.Add("cp_code", list[i].G_ChargePile.cp_code);
                    dic.Add("chargemod", list[i].G_ChargePile.cp_chargemod);
                    dic.Add("data", cp);
                    m_tcpClientDic.Add(list[i].G_ChargePile.cp_code, dic);
                }
                break;

                //直流
                case 2:
                {
                    Client_ChargePile_Data_DC cp = new Client_ChargePile_Data_DC();
                    cp.t_name    = list[i].G_Type.t_name;
                    cp.v_name    = list[i].G_Version.v_name;
                    cp.cp_name   = list[i].G_ChargePile.cp_name;
                    cp.gunnum    = (int)list[i].G_ChargePile.cp_gunnum;
                    cp.cs_id     = (long)list[i].G_ChargePile.cs_id;
                    cp.cp_id     = (long)list[i].G_ChargePile.cp_id;
                    cp.cp_code   = list[i].G_ChargePile.cp_code;
                    cp.condition = 0;
                    cp.gunnum    = (int)list[i].G_ChargePile.cp_gunnum;
                    cp.chargemod = (int)list[i].G_ChargePile.cp_chargemod;
                    cp.unitmoney = (decimal)list[i].G_ChargePile.cp_money;
                    cp.gundata   = new ObservableCollection <Client_ChargePile_GunData_DC>();
                    for (int j = 0; j < cp.gunnum + 1; j++)
                    {
                        cp.gundata.Add(new Client_ChargePile_GunData_DC());
                    }
                    if (!dicDC.ContainsKey(cp.cs_id))
                    {
                        dicDC.Add(cp.cs_id, new ObservableCollection <Client_ChargePile_Data_DC>());
                    }
                    dicDC[cp.cs_id].Add(cp);

                    Dictionary <string, object> dic = new Dictionary <string, object>();
                    dic.Add("cp_code", list[i].G_ChargePile.cp_code);
                    dic.Add("chargemod", list[i].G_ChargePile.cp_chargemod);
                    dic.Add("data", cp);
                    m_tcpClientDic.Add(list[i].G_ChargePile.cp_code, dic);
                }
                break;
                }
            }
            //所有充电站编号
            List <long> csidList = new List <long>();
            //设置充电桩数据源
            int ac_count = 0;

            foreach (long key in dicAC.Keys)
            {
                ObservableCollection <Client_ChargePile_Data_AC> ac = dicAC[key];
                CIMShowPileList_AC cimdpl_ac_pilelist = new CIMShowPileList_AC();
                cimdpl_ac_pilelist.InternalElementMargin   = new Thickness(0, 0, 38, 38);
                cimdpl_ac_pilelist.InternalElementMouseUp += cimdpl_ac_pilelist_InternalElementMouseUp;
                cimdpl_ac_pilelist.DataContext             = ac;
                if (dicAC.Count > 1)
                {
                    TextBlock text = new TextBlock();
                    text.Text       = "充电站编号:" + key;
                    text.FontSize   = 16;
                    text.Foreground = Brushes.White;
                    text.Margin     = new Thickness(0, 0, 0, 38);
                    sp_ac.Children.Add(text);
                }
                sp_ac.Children.Add(cimdpl_ac_pilelist);
                ac_count += ac.Count;

                csidList.Add(key);
            }
            text_acNum.Text = ac_count.ToString();
            int dc_count = 0;

            foreach (long key in dicDC.Keys)
            {
                ObservableCollection <Client_ChargePile_Data_DC> dc = dicDC[key];
                CIMShowPileList_DC cimdpl_dc_pilelist = new CIMShowPileList_DC();
                cimdpl_dc_pilelist.InternalElementMargin   = new Thickness(0, 0, 38, 38);
                cimdpl_dc_pilelist.InternalElementMouseUp += cimdpl_dc_pilelist_InternalElementMouseUp;
                cimdpl_dc_pilelist.DataContext             = dc;
                if (dicDC.Count > 1)
                {
                    TextBlock text = new TextBlock();
                    text.Text       = "充电站编号:" + key;
                    text.FontSize   = 16;
                    text.Foreground = Brushes.White;
                    text.Margin     = new Thickness(0, 0, 0, 38);
                    sp_dc.Children.Add(text);
                }
                sp_dc.Children.Add(cimdpl_dc_pilelist);
                dc_count += dc.Count;

                csidList.Add(key);
            }
            text_dcNum.Text = dc_count.ToString();

            //设置报警状态
            if (m_tcpClientDic.Count > 0)
            {
                long[] csidArr            = csidList.Distinct().ToArray();
                List <AM_CIMPolice> list2 = new List <AM_CIMPolice>();
                for (int i = 0; i < csidArr.Length; i++)
                {
                    list2.AddRange(m_incHTTPSend.UP006(csidArr[i], 0, false));
                }
                for (int i = 0; i < list2.Count; i++)
                {
                    if (m_tcpClientDic.ContainsKey(list2[i].cp_code))
                    {
                        Dictionary <string, object> tcpClientDic = m_tcpClientDic[list2[i].cp_code];
                        int chargemod = (int)tcpClientDic["chargemod"];
                        switch (chargemod)
                        {
                        case 1:
                        {
                            Client_ChargePile_Data_AC data = (Client_ChargePile_Data_AC)tcpClientDic["data"];
                            data.gundata[(int)list2[i].cp_guncode].ispolice = true;
                            data.ispolice = true;
                        }
                        break;

                        case 2:
                        {
                            Client_ChargePile_Data_DC data = (Client_ChargePile_Data_DC)tcpClientDic["data"];
                            data.gundata[(int)list2[i].cp_guncode].ispolice = true;
                            data.ispolice = true;
                        }
                        break;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 运行tcp获取客户端数据统计
        /// </summary>
        void TCPGetClientDicCountRun()
        {
            this.Dispatcher.Invoke(new Action(delegate()
            {
                Dictionary <string, int> m_pileinformation = new Dictionary <string, int>()
                {
                    { "text_pilesum", 0 },    //充电桩总数
                    { "text_pileiscd", 0 },   //已连接已充电
                    { "text_pilenocd", 0 },   //已连接未充电
                    { "text_pilenolink", 0 }, //未连接未充电
                    { "text_pilepolice", 0 }//异常
                };
                Dictionary <string, Dictionary <string, object> > tcpClientDic = null;
                lock (m_tcpClientDic)
                {
                    tcpClientDic = new Dictionary <string, Dictionary <string, object> >(m_tcpClientDic);
                }
                if (tcpClientDic != null)
                {
                    m_pileinformation["text_pilesum"] = tcpClientDic.Count;
                    foreach (Dictionary <string, object> dic in tcpClientDic.Values)
                    {
                        int chargemod = (int)dic["chargemod"];
                        int condition = 0;
                        bool ispolice = false;
                        switch (chargemod)
                        {
                        case 1:
                            {
                                Client_ChargePile_Data_AC mod = (Client_ChargePile_Data_AC)dic["data"];
                                condition = mod.condition;
                                ispolice  = mod.ispolice;
                            }
                            break;

                        case 2:
                            {
                                Client_ChargePile_Data_DC mod = (Client_ChargePile_Data_DC)dic["data"];
                                condition = mod.condition;
                                ispolice  = mod.ispolice;
                            }
                            break;
                        }
                        switch (condition)
                        {
                        case 0:
                            {
                                ++m_pileinformation["text_pilenolink"];
                                break;
                            }

                        case 1:
                            {
                                ++m_pileinformation["text_pilenocd"];
                                break;
                            }

                        case 2:
                            {
                                ++m_pileinformation["text_pileiscd"];
                                break;
                            }
                        }
                        if (ispolice)
                        {
                            ++m_pileinformation["text_pilepolice"];
                        }
                    }
                }
                text_pilesum.Text    = m_pileinformation["text_pilesum"].ToString();
                text_pileiscd.Text   = m_pileinformation["text_pileiscd"].ToString();
                text_pilenocd.Text   = m_pileinformation["text_pilenocd"].ToString();
                text_pilenolink.Text = m_pileinformation["text_pilenolink"].ToString();
                text_pilepolice.Text = m_pileinformation["text_pilepolice"].ToString();
            }));
        }
        /// <summary>
        /// 协议3的处理方法
        /// </summary>
        public void TCPRun003(string receiveData)
        {
            try
            {
                //取得充电站编号
                string cs_id = Regex.Match(receiveData, "(?<=^.{3}).{10}").ToString();
                //取得充电桩编码
                string cp_code = Regex.Match(receiveData, "(?<=^.{13}).{29}").ToString();
                //取得电池编码
                string cb_code = Regex.Match(receiveData, "(?<=^.{42}).{32}").ToString();
                //校验位
                string parity = Regex.Match(receiveData, "(?<=^.{74}).{4}").ToString();
                //取得命令字
                string number = Regex.Match(receiveData, "(?<=^.{78}).{6}").ToString();
                //取得消息体
                string bodyData = Regex.Match(receiveData, "(?<=^.{84}).*").ToString();
                //校验
                if (parity == CRC16.GetString(number + bodyData))
                {
                    //只要充电桩存在就更新字典,每次都会执行
                    if (m_tcpClientDic.ContainsKey(cp_code) && m_tcpClientDic[cp_code].ContainsKey("data"))
                    {
                        //解析消息体
                        Client_ChargePile_Data_DC cimdplMod = (Client_ChargePile_Data_DC)m_tcpClientDic[cp_code]["data"];
                        try
                        {
                            if (cimdplMod != null)
                            {
                                switch (number)
                                {
                                case "UP0001":
                                {
                                    //心跳
                                    string sendData = "";
                                    sendData = m_incCIMTCPReceive003.UP0001(cp_code, cb_code, bodyData);
                                }
                                break;

                                case "UP0003":
                                {
                                    //报警
                                    string sendData = "";
                                    sendData = m_incCIMTCPReceive003.UP0003(cp_code, bodyData);
                                }
                                break;

                                case "UP0004":
                                {
                                    //设置断线
                                    string sendData = "";
                                    sendData = m_incCIMTCPReceive003.UP0004(cp_code, bodyData);
                                }
                                break;

                                case "UP0009":
                                {
                                    //结束充电命令
                                    string sendData = "";
                                    sendData = m_incCIMTCPReceive003.UP0009(cp_code, bodyData);
                                }
                                break;

                                case "UP0010":
                                {
                                    //响应获取充电状态请求
                                    string sendData = "";
                                    sendData = m_incCIMTCPReceive003.UP0010(cp_code, bodyData);
                                }
                                break;

                                default:
                                    break;
                                }
                            }
                        }
                        catch
                        {
                            //将充电桩标示为断开连接
                            if (cimdplMod != null)
                            {
                                try
                                {
                                    cimdplMod.condition = 0;
                                    cimdplMod.ispolice  = false;
                                }
                                catch { }
                            }
                        }
                    }
                }
            }
            catch
            {
            }
        }