/// <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_AC data = (Client_ChargePile_Data_AC)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> /// <param name="sender"></param> /// <param name="e"></param> private void Solve(CIMPoliceShow control, AM_CIMPolice mod) { MessageBoxResult mbr = MessageBox.Show("是否处理该故障?", "消息提示", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.OK); if (mbr == MessageBoxResult.OK) { try { HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(Config.g_httpUrl + string.Format("?type=UP0007&cs_id={0}&cp_id={1}&am_cimp_id={2}&am_cimp_examine=true", m_cs_id, m_cp_id, mod.am_cimp_id)); hwr.Method = "get"; WebResponse wr = hwr.GetResponse(); using (StreamReader sr = new StreamReader(wr.GetResponseStream())) { bool b = bool.Parse(sr.ReadToEnd()); if (b) { MessageBox.Show("处理成功!", "error", MessageBoxButton.OK, MessageBoxImage.Information); m_list.Remove(mod); control.Visibility = System.Windows.Visibility.Collapsed; //判断该枪是否所有报警都已处理 AM_CIMPolice[] arr = m_list.Where(a => a.cp_guncode == mod.cp_guncode).ToArray(); if (arr.Length <= 0) { //设置该枪的报警状态为false Dictionary <string, object> tcpClientDic = Config.g_cimTcpClientDic[m_cp_code]; Client_ChargePile_Data_AC data = (Client_ChargePile_Data_AC)tcpClientDic["data"]; data.gundata[(int)mod.cp_guncode].ispolice = false; data.gundata[(int)mod.cp_guncode].police = ""; data.gundata[(int)mod.cp_guncode].policecode = 0; //判断桩的报警状态 bool b2 = false; for (int i = 1; i < data.gundata.Count; i++) { if ((bool)data.gundata[(int)mod.cp_guncode].ispolice) { b2 = true; break; } } data.ispolice = b2; } } else { MessageBox.Show("处理失败!", "error", MessageBoxButton.OK, MessageBoxImage.Error); } } wr.Close(); } catch { MessageBox.Show("网络错误,处理失败!", "error", MessageBoxButton.OK, MessageBoxImage.Error); } } }
/// <summary> /// 获取充电桩充电状态 /// </summary> /// <returns></returns> int GetCondition(Client_ChargePile_Data_AC 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_AC)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_AC> gunlist = m_mod.gundata; for (int i = 1; i <= m_mod.gunnum; i++) { CIMShowGun_AC cimsdg = new CIMShowGun_AC(); ObservableCollection <Client_ChargePile_GunData_AC> oc = new ObservableCollection <Client_ChargePile_GunData_AC>(); Client_ChargePile_GunData_AC 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_AC data = (Client_ChargePile_Data_AC)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_AC data = (Client_ChargePile_Data_AC)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_AC data = (Client_ChargePile_Data_AC)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_AC data = (Client_ChargePile_Data_AC)tcpClientDic["data"]; ObservableCollection <Client_ChargePile_GunData_AC> 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> /// 协议2的处理方法 /// </summary> public void TCPRun002(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_AC cimdplMod = (Client_ChargePile_Data_AC)m_tcpClientDic[cp_code]["data"]; try { if (cimdplMod != null) { switch (number) { case "UP0001": { //心跳 string sendData = ""; sendData = m_incCIMTCPReceive002.UP0001(cp_code, cb_code, bodyData); } break; case "UP0003": { //报警 string sendData = ""; sendData = m_incCIMTCPReceive002.UP0003(cp_code, bodyData); } break; case "UP0004": { //设置断线 string sendData = ""; sendData = m_incCIMTCPReceive002.UP0004(cp_code, bodyData); } break; case "UP0009": { //结束充电命令 string sendData = ""; sendData = m_incCIMTCPReceive002.UP0009(cp_code, bodyData); } break; case "UP0010": { //响应获取充电状态请求 string sendData = ""; sendData = m_incCIMTCPReceive002.UP0010(cp_code, bodyData); } break; default: break; } } } catch { //将充电桩标示为断开连接 if (cimdplMod != null) { try { cimdplMod.condition = 0; cimdplMod.ispolice = false; } catch { } } } } } } catch { } }