/// <summary> /// 设备实时数据查询 /// </summary> /// <param name="where"></param> /// <returns></returns> public List <M_BS_Realdata_Spt> GetNewList(string type, M_MT_TagDefine model = null) { var sql = string.Format(@"select c.*,b.TagCode from {0}T_BS_TagDefine a inner join {0}T_BS_TagDefine b on a.TagGroupID='-1' and a.TagType='{1}' and b.TagGroupID=a.ID AND b.IsUse=1 inner join {0}T_BS_Realdata_Spt c on c.TagID=b.ID", prefixName, type); if (model != null) { sql += string.Format(" where a.ID ='{0}'", model.ID); } return(GetList(sql, null)); }
/// <summary> /// 耐奇数据 /// </summary> private void OneDeal_NQ(M_MT_TagDefine info) { DataTable dtStore = null; //var dtTags = dsTags.Tables["T_BS_TagDefine"]; DataTableHelper.CreateDataTable(ref dtStore, "T_BS_Realdata"); try { if (BasePublic.mySqlConnection == null) { } var lst = BLLFactory <B_NQ_Monitordata> .Instance.GetNewList(null, BasePublic.mySqlConnection);//string.Format(" DeviceID='{0}'", info.ID), BasePublic.mySqlConnection); dtStore = DataConvert.FormateNQ2BS(lst, info.lstTags); if (dtStore != null && dtStore.Rows != null) { Console.WriteLine(string.Format("{0} 获取到耐奇数据,共{1}条", DateTime.Now.ToString(BasePublic.strTimeFormat), dtStore.Rows.Count)); } InsertToServer(dtStore, "T_BS_Realdata"); } catch (Exception ex) { Console.WriteLine(string.Format("{0}获取耐奇数据出错", DateTime.Now.ToString(BasePublic.strTimeFormat))); return; } lock (BasePublic.lockerConfig) { var dtSpt = dsRealdata_Spt.Tables["T_BS_Realdata_Spt"]; try { foreach (DataRow item in dtStore.Rows) { var drSpt = dtSpt.Select(string.Format("TagID='{0}'", item["TagID"])).FirstOrDefault(); if (drSpt != null) { drSpt["RealTime"] = item["RealTime"]; drSpt["RealValue"] = item["RealValue"]; //drSpt.AcceptChanges(); } } UpdateToServer(); } catch (Exception ex) { Console.WriteLine(string.Format("{0} 更新耐奇数据出错 ", DateTime.Now.ToString(BasePublic.strTimeFormat))); return; } } }
/// <summary> /// 发送至客户端 /// </summary> private void SendToClient(object ob) { object[] obs = ob as object[]; string type = ""; M_MT_TagDefine info = null; string strIds = ""; if (obs == null) { return; } if (obs.Length == 1) { type = obs[0].ToString(); } if (obs.Length == 2) { type = obs[0].ToString(); info = obs[1] as M_MT_TagDefine; } lock (BasePublic.lockerConfig) { if (server.ClientAll != null && server.ClientAll.Count == 0) { var msg = "服务端无连接,不发送"; Console.WriteLine(msg); } var lst = new List <M_BS_Realdata_Spt>(); try { lst = BLLFactory <B_BS_Realdata_Spt> .Instance.GetNewList(type, info); if (lst == null) { return; } if (type.ToString() != "0") { //lst=(from li in lst where li.TagCode=="Epi" select li).ToList(); } } catch (Exception e) { var msg = string.Format("{0} {1} {2}", DateTime.Now.ToString(BasePublic.strTimeFormat), "查询实时数据spt出错", e.Message); Console.WriteLine(string.Format(msg)); BasePublic.ExceptionDeal(BaseEnum.Socket, msg); return; } DataTable dt = GetSendTable(lst, type); #region 发送到客户端 //string strJson = BaseFunction.DataTable2Json(dt); var strJson = BaseFunction.DataTableToJson(dt); var byteLen = Encoding.Default.GetByteCount(strJson); var strMsg = string.Format("\n\n{0}向端口发送【非电量】数据:" + "*****************************", DateTime.Now.ToString(BasePublic.strTimeFormat)); if (type != "0") { strMsg = string.Format("\n\n{0}向端口发送【电量】数据:" + "*****************************", DateTime.Now.ToString(BasePublic.strTimeFormat)); } if (strJson == null || strJson.Trim().Length == 0) { strMsg += string.Format("\n{0}字符串长度为0,数据不发送", DateTime.Now.ToString(BasePublic.strTimeFormat)); return; } if (server.ClientAll == null) { strMsg += string.Format("\n{0}", "无客户端连接,数据未发送"); Console.WriteLine(strMsg); return; } strMsg += string.Format("\n允许最大在线人数:{0}\n当前连接数为:{1}", server.ClientMax, server.ClientAll.Count); foreach (var item in server.ClientAll) { if (!server.clientCheck(item)) { strMsg += string.Format("\n客户端{0}{1}", item.Address + ":" + item.Port, "不在线"); break; } Console.WriteLine(strMsg); var sendData = Encoding.UTF8.GetBytes(strJson); var aaa = sendData[sendData.Length - 1]; if (strJson == null || strJson.Trim(']').Length < 1) { strMsg += string.Format("\n{0}字符串长度为0,客户端{1}{2}", DateTime.Now.ToString(BasePublic.strTimeFormat), item.Address + ":" + item.Port, "发送信息不成功"); return; } strMsg += string.Format("\n{0}客户端{1}{2}", DateTime.Now.ToString(BasePublic.strTimeFormat), item.Address + ":" + item.Port, "发送信息成功"); Console.WriteLine(strMsg); server.sendMessage(item, strJson); } #endregion } }
public List <M_BS_Realdata_Spt> GetNewList(string type, M_MT_TagDefine model = null) { return(dal.GetNewList(type, model)); }
/// <summary> /// 单个PLC取数据 /// </summary> /// <param name="item"></param> private void OneDeal(M_MT_TagDefine info) { dtS = DateTime.Now; Thread.Sleep(1); if (info == null) { return; } #region 创建socket连接 var socketIP = info.TagAddr; if (string.IsNullOrEmpty(socketIP)) { return; } var arrSendOrder = info.SendOrder.Split(','); var barrySendOrder = new byte[arrSendOrder.Length]; for (var i = 0; i < arrSendOrder.Length; i++) { barrySendOrder[i] = Convert.ToByte(arrSendOrder[i], 16); var a = string.Format("0x{0:X}", barrySendOrder[i]); } var threadID = Thread.CurrentThread.ManagedThreadId; //获取当前线程的ID标识 var dt = DateTime.Now; var Port = 502; //访问的端口号 IPAddress IP = null; try { IP = IPAddress.Parse(socketIP); } catch (Exception e) { var msg = string.Format("{0} {1} {2} {3}", dt, info.ID + "转换地址时出错", threadID, e.Message); Console.WriteLine(string.Format(msg)); BasePublic.ExceptionDeal(BaseEnum.Collect, msg); return; } var ipe = new IPEndPoint(IP, Port); //把ip和端口转化为IPEndPoint的实例 var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建socket实例 socket.SendTimeout = 1000; socket.ReceiveTimeout = 1000; socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.AcceptConnection, true); #endregion //socket连接建立及连接异常处理 try { if (!socket.Connected) { socket.Connect(ipe); } } catch (Exception e) { var msg = string.Format("{0} 模块<{1}>连接失败,{2},{3}", dt, info.ID, threadID, e.Message); Console.WriteLine(string.Format(msg)); BasePublic.ExceptionDeal(BaseEnum.Collect, msg); socket.Close(); socket.Dispose(); return; } //Console.WriteLine(string.Format("{0} 模块<{1}({2})>连接成功,{3}", dt, info.TagName, info.ID, threadID)); try { socket.Send(barrySendOrder, barrySendOrder.Length, 0); //modbusTCP套接字命令发送 } catch (Exception e) { var msg = string.Format("{0} 模块<{1}>通讯失败,{2},{3}", dt, info.ID, threadID, e.Message); Console.WriteLine(string.Format(msg)); BasePublic.ExceptionDeal(BaseEnum.Collect, msg); socket.Close(); socket.Dispose(); return; } // Console.WriteLine(string.Format("{0} 模块<{1}({2})>通讯成功,{3}", dt, info.TagName, info.ID, threadID)); int n = barrySendOrder[11]; var m = 10 + 2 * n - 1; var recData = new byte[m]; try { socket.Receive(recData, recData.Length, 0); //套接字读取 //校验前缀 / 地址和数据长度 var result_tag = true; for (var i = 6; i < 8; i++) { result_tag = result_tag && (recData[i] == Convert.ToByte(arrSendOrder[i], 16)); } if (result_tag && n == recData[8] / 2) { recData = recData.Skip(9).ToArray(); } else { var msg = string.Format("{0} 模块<{1}>校验失败,{2}", dt, info.ID, threadID); Console.WriteLine(string.Format(msg)); BasePublic.ExceptionDeal(BaseEnum.Collect, msg); return; } } catch (Exception e) { var msg = string.Format("{0} 模块<{1}>接收失败,{2},{3}", dt, info.ID, threadID, e.Message); Console.WriteLine(string.Format(msg)); BasePublic.ExceptionDeal(BaseEnum.Collect, msg); socket.Close(); socket.Dispose(); return; } //Console.WriteLine(string.Format("{0} 模块<{1}({2})>接收成功,{3}", dt, info.TagName, info.ID, threadID)); //string tttt = String.Join(",", recData); //string st = DataConvert.ByteArrayToHexStr(recData); var dtStore = new DataTable(); lock (BasePublic.lockerConfig) { #region 数据转化到datatable var dtTags = dsTags.Tables["T_BS_TagDefine"]; DataTableHelper.CreateDataTable(ref dtStore, "T_BS_Realdata"); var dtSpt = dsRealdata_Spt.Tables["T_BS_Realdata_Spt"]; //CreateDataTable(ref dtSpt); var dtAlarm = new DataTable(); DataTableHelper.CreateDataTable(ref dtAlarm, "T_EP_EquipWarning"); var fs = new object[n / 2]; var analysis_index = 0; //recData第一个数据的0索引位置 for (var i = 0; i < info.lstTags.Count; i++) { var current_analysis = info.lstTags.Find(delegate(M_BS_TagDefine temp) { return(temp.DataIndex == i); }); #region 数据解析 /*0orNull default(float) * 1 char * 2 int16 * 3 int32 * 4 int64 * 5 uint16 * 6 uint32 * 7 uint64 * 8 float * 9 double * */ #region 数据解析(过期) //switch (current_analysis.DataType) //{ // case 1://char // { // byte[] aa = new byte[sizeof(char)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(char)); // aa=aa.Reverse().ToArray(); // fs[i] = BitConverter.ToChar(aa, 0); // analysis_index += sizeof(char); // } // break; // case 2://int16 // { // byte[] aa = new byte[sizeof(Int16)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(Int16)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToInt16(aa, 0); // analysis_index += sizeof(Int16); // } // break; // case 3://int32 // { // byte[] aa = new byte[sizeof(Int32)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(Int32)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToInt32(aa, 0); // analysis_index += sizeof(Int32); // } // break; // case 4://int64 // { // byte[] aa = new byte[sizeof(Int64)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(Int64)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToInt64(aa, 0); // analysis_index += sizeof(Int64); // } // break; // case 5://uint16 // { // byte[] aa = new byte[sizeof( UInt16)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(UInt16)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToUInt16(aa, 0); // analysis_index += sizeof(UInt16); // } // break; // case 6://uint32 // { // byte[] aa = new byte[sizeof(UInt32)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(UInt32)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToUInt32(aa, 0); // analysis_index += sizeof(UInt32); // } // break; // case 7://uint64 // { // byte[] aa = new byte[sizeof(Int64)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(Int64)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToUInt64(aa, 0); // analysis_index += sizeof(Int64); // } // break; // case 8://float // { // byte[] aa = new byte[sizeof(float)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(float)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToSingle(aa, 0); // analysis_index += sizeof(float); // } // break; // case 9: // { // byte[] aa = new byte[sizeof(double)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(double)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToDouble(aa, 0); // analysis_index += sizeof(double); // } // break; // default://float // { // byte[] aa = new byte[sizeof(float)]; // Array.Copy(recData, analysis_index, aa, 0, sizeof(float)); // aa = aa.Reverse().ToArray(); // fs[i] = BitConverter.ToSingle(aa, 0); // analysis_index += sizeof(float); // } // break; //} #endregion //正确的转换顺序 #region 数据解析 switch (current_analysis.DataType) { case 1: //char { var aa = new byte[sizeof(char)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(char)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToChar(aa, 0); analysis_index += sizeof(char); } break; case 2: //int16 { var aa = new byte[sizeof(Int16)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(Int16)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToInt16(aa, 0); analysis_index += sizeof(Int16); } break; case 3: //int32 { var aa = new byte[sizeof(Int32)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(Int32)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToInt32(new[] { aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(Int32); } break; case 4: //int64 { var aa = new byte[sizeof(Int64)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(Int64)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToInt64(new[] { aa[4], aa[5], aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(Int64); } break; case 5: //uint16 { var aa = new byte[sizeof(UInt16)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(UInt16)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToUInt16(aa, 0); analysis_index += sizeof(UInt16); } break; case 6: //uint32 { var aa = new byte[sizeof(UInt32)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(UInt32)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToUInt32(new[] { aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(UInt32); } break; case 7: //uint64 { var aa = new byte[sizeof(Int64)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(Int64)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToUInt64(new[] { aa[4], aa[5], aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(Int64); } break; case 8: //float { var aa = new byte[sizeof(float)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(float)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToSingle(new[] { aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(float); } break; case 9: { //byte[] aa = new byte[sizeof(double)]; //Array.Copy(recData, analysis_index, aa, 0, sizeof(double)); //aa = aa.Reverse().ToArray(); //fs[i] = BitConverter.ToDouble(new byte[] { aa[6],aa[7],aa[4],aa[5],aa[2], aa[3], aa[0], aa[1] }, 0); //analysis_index += sizeof(double); var aa = new byte[sizeof(UInt32)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(UInt32)); aa = aa.Reverse().ToArray(); double dd = BitConverter.ToUInt32(new[] { aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(UInt32); var bb = new byte[sizeof(UInt32)]; Array.Copy(recData, analysis_index, bb, 0, sizeof(UInt32)); bb = bb.Reverse().ToArray(); double de = BitConverter.ToUInt32(new[] { bb[2], bb[3], bb[0], bb[1] }, 0); analysis_index += sizeof(UInt32); var df = (dd * Math.Pow(10, 6) + de / 100) / 100; fs[i] = df; } break; case 10: { //byte[] aa = new byte[sizeof(double)]; //Array.Copy(recData, analysis_index, aa, 0, sizeof(double)); //aa = aa.Reverse().ToArray(); //fs[i] = BitConverter.ToDouble(new byte[] { aa[6],aa[7],aa[4],aa[5],aa[2], aa[3], aa[0], aa[1] }, 0); //analysis_index += sizeof(double); var aa = new byte[sizeof(UInt32)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(UInt32)); aa = aa.Reverse().ToArray(); double dd = BitConverter.ToSingle(new[] { aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(UInt32); var bb = new byte[sizeof(UInt32)]; Array.Copy(recData, analysis_index, bb, 0, sizeof(UInt32)); bb = bb.Reverse().ToArray(); double de = BitConverter.ToSingle(new[] { bb[2], bb[3], bb[0], bb[1] }, 0); analysis_index += sizeof(UInt32); var df = (dd * Math.Pow(10, 2) + de); fs[i] = df; } break; default: //float { var aa = new byte[sizeof(float)]; Array.Copy(recData, analysis_index, aa, 0, sizeof(float)); aa = aa.Reverse().ToArray(); fs[i] = BitConverter.ToSingle(new[] { aa[2], aa[3], aa[0], aa[1] }, 0); analysis_index += sizeof(float); } break; } #endregion } #endregion #region 数据操作 foreach (var model in info.lstTags) { var drTag = dtTags.Select(string.Format("ID='{0}'", model.ID)).FirstOrDefault(); if (drTag != null) { var drSpt = dtSpt.Select(string.Format("TagID='{0}'", model.ID)).FirstOrDefault(); var drStore = dtStore.NewRow(); var dValue = Convert.ToDouble(fs[model.DataIndex]); drStore["TagID"] = model.ID; decimal dValue3 = 0; decimal.TryParse(dValue.ToString("#.000"), out dValue3); if (model.CompensateRatio > 0) { dValue3 = dValue3 * model.CompensateRatio; } dValue3 = (Math.Abs(dValue3) > (decimal)(Math.Pow(10, 15) - 1)) ? 0 : dValue3; lock (BasePublic.lockerConfig) { drStore["RealValue"] = dValue3; drStore["RealTime"] = dtS.ToString(BasePublic.strTimeFormat); drStore["RecordTime"] = dtS.ToString(BasePublic.strTimeFormat); } //dtSpt.Rows.Add(drSpt); var period = 0; if (drTag["StorePeriod"] != null) { int.TryParse(drTag["StorePeriod"].ToString(), out period); } DateTime dt00; if (!DateTime.TryParse(drTag["LastTime"].ToString(), out dt00)) { dt00 = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd 00:00")); } var dt11 = dtS.AddSeconds(-period); if (dt00 <= dt11) { dtStore.Rows.Add(drStore); lock (BasePublic.lockerConfig) { drTag["LastTime"] = dtS; drTag.AcceptChanges(); } } try { drSpt["RealTime"] = dtS.ToString(BasePublic.strTimeFormat); drSpt["RealValue"] = dValue3; } catch (Exception ex) { } } #endregion } //VerfyAlarm(BasePublic.lstTagsAll, dtStore, mtTemp, ref dtAlarm); #endregion } UpdateToServer(); InsertToServer(dtStore, "T_BS_Realdata"); //manualReset_Config.Set(); }
/// <summary> /// 更新配置信息 /// </summary> private static void CheckAndUpdateConfig() { lock (lockerConfig) { Console.WriteLine(string.Format("获取配置信息中...")); lstPLC.Clear(); lstNQ.Clear(); //查找所有PLC var lst = BLLFactory <B_BS_TagDefine> .Instance.Find("1=1 and IsUse=1 and TagGroupID='-1' and TagType<>'NQ' ") .OrderBy(p => p.ID) .ToList(); var lst2 = BLLFactory <B_BS_TagDefine> .Instance.Find("1=1 and IsUse=1 and TagGroupID='-1' and TagType='NQ' ") .OrderBy(p => p.ID) .ToList(); //查找所有位号 lstTagsAll = BLLFactory <B_BS_TagDefine> .Instance.Find( string.Format("1=1 and TagGroupID<>'-1' and IsVirtual<1 and TagGroupID<>'NQ001' "), "order by ID"); //查找NQ所有位号 lstTagsAllNQ = BLLFactory <B_BS_TagDefine> .Instance.Find( string.Format("1=1 and TagGroupID<>'-1' and IsVirtual<1 and TagGroupID='NQ001' "), "order by ID"); if (lst == null || lst.Count == 0) { var msg = string.Format("{0} 查询到的PLC数量为0,请检查数据", DateTime.Now.ToString(strTimeFormat)); //ExceptionDeal(msg); return; } //把PLC和其下的所有位号整合都在一起 foreach (var item in lst) { var model = new M_MT_TagDefine(); model.ID = item.ID; model.TagAddr = item.TagAddr; model.TagName = item.TagName; model.SendOrder = item.SendOrder; model.lstTags = (from li in lstTagsAll where li.TagGroupID == item.ID select li).OrderBy(p => p.DataIndex) .ToList(); model.TagType = item.TagType; lstPLC.Add(model); } //将NQ位号分组 var lstStr = (from li in lstTagsAllNQ select li.TagAddr).Distinct().ToList(); var modelNQ = new M_MT_TagDefine(); modelNQ.ID = "NQ001"; modelNQ.TagType = "NQ"; foreach (var item in lstStr) { M_MT_TagDefine model = new M_MT_TagDefine(); model.ID = item; model.TagAddr = item; model.TagType = "NQ"; var lst00 = (from li in lstTagsAllNQ where li.TagAddr == item select li).OrderBy(p => p.ID).ToList(); model.lstTags = lst00; lstNQ.Add(model); } //foreach (var item in lst2) //{ // var model = new M_MT_TagDefine(); // model.ID = item.ID; // model.TagAddr = item.TagAddr; // model.TagName = item.TagName; // model.SendOrder = item.SendOrder; // model.lstTags = // (from li in lstTagsAll_NQ where li.TagGroupID == item.ID select li).OrderBy(p => p.DataIndex) // .ToList(); // model.TagType = item.TagType; // model.CollectPeriod = item.CollectPeriod; // lstNQ2.Add(model); //} lstTagsEnergy = BLLFactory <B_EM_EnergyTag> .Instance.GetEnergyTagList(null); Console.WriteLine("{0} 共查询到共有{1}个PLC", DateTime.Now.ToString(strTimeFormat), lstPLC.Count); } }