using IStation.CalcModel; using System; using System.Collections.Generic; using System.Linq; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace IStation.WinFrmUI.CalcErQu { /// /// 调度方案 /// public class ConnectHelper { /// /// 提交调度项目 /// /// /// /// /// public static async Task SubmitPrj(AnaPrj currentViewPrj,Action cbSuccess,Action cbFail) { if (currentViewPrj == null) { return false; } IStation.WinFrmUI.Dto.SubmitPrj dto_prj = new Dto.SubmitPrj(); dto_prj.Day = currentViewPrj.StartTime.ToString("yyyy-MM-dd"); dto_prj.Items = new List(); foreach (var bt in currentViewPrj.BlockTimes) { if (bt.OpenPumpCount == 0) continue; Dto.SubmitPrjItem dto_item = new Dto.SubmitPrjItem(); dto_item.StartTime = bt.StartTime; dto_item.EndTime = bt.EndTime; dto_item.OpenPumpCount = bt.OpenPumpCount; dto_prj.Items.Add(dto_item); } var ws = new ClientWebSocket(); try { await ws.ConnectAsync(new Uri("ws://192.168.201.17:40001"), CancellationToken.None); if (ws.State != WebSocketState.Open) { return default; } var inputJson = JsonHelper.Object2Json(dto_prj); var inputBytes = Encoding.UTF8.GetBytes(inputJson); await ws.SendAsync(new ArraySegment(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None); //关闭WebSocket await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None); } catch (Exception ex) { cbFail.Invoke(ex.Message); ws.Abort(); ws.Dispose(); return false ; } ws.Abort(); ws.Dispose(); cbSuccess.Invoke(); return true; } /// /// 获取实时水位 /// /// public static async Task GetWaterLevel() { var tagDict = new Dictionary { //{ "_0402010204089903001", "长江水位" }, //{ "_0402010204089904009", "二取水前池液位" }, { "_0402010201030103006", "陈行水库水位" } }; var input = new { search = "real", tablename = "陈行智能调度" }; var tags= tagDict.Keys.ToList(); var realScadaRecordList = await GetRealScadaResult(tags,input); if (realScadaRecordList != null && realScadaRecordList.Any()) { var f = realScadaRecordList.Last().Value; } return -1; } /// /// 获取供水总量 /// /// 开始时间 /// 结束时间 /// 时间步长,默认300秒 /// public static async Task GetTotalWaterSupplyByTimeRange(DateTime startTime, DateTime endTime, string resolution = "300") { var tagDict = new Dictionary { { "_0402010204012103002", "二取水1号泵累计流量" }, { "_0402010204012203002", "二取水2号泵累计流量" }, { "_0402010204012303002", "二取水3号泵累计流量" }, { "_0402010204012403002", "二取水4号泵累计流量" }, { "_0402010204012503002", "二取水5号泵累计流量" }, }; var input = new ScadaDispatchInput { search = "history", starttime = startTime.ToString("G"), endtime = endTime.ToString("G"), Resolution = resolution, taglist = tagDict.Select(x => x.Key).ToArray() }; double totalWaterSupply = 0; var realScadaDataList = await GetRealScadaResult(input); if (realScadaDataList != null && realScadaDataList.Any()) { foreach (var r in realScadaDataList) { if (r.MonitorRecords == null || !r.MonitorRecords.Any()) continue; var rrr = r.MonitorRecords.Where(x => x.Value != null).Select(x => x.Value.Value).ToList(); if (rrr == null || !rrr.Any()) continue; totalWaterSupply += (rrr.Last() - rrr.First()); } } return totalWaterSupply; } /// /// 获取供水总量 /// /// 开始时间 /// 结束时间 /// 时间步长,默认300秒 /// public static async Task GetTotalWaterSupplyByTimeRange_Out(DateTime startTime, DateTime endTime, string resolution = "300") { var tagDict = new Dictionary { { "_0402010201030191002", "一输水嘉定1线累计流量" }, { "_0402010201090199012", "一输水嘉定2线累计流量" }, { "_0402010201090199312", "一输水嘉定3线累计流量" }, { "_0402010201090194444", "二输水2700管累计流量" }, { "_0402010201090103018", "二输水2400管累计流量" }, }; var input = new ScadaDispatchInput { search = "history", starttime = startTime.ToString("G"), endtime = endTime.ToString("G"), Resolution = resolution, taglist = tagDict.Select(x => x.Key).ToArray() }; double totalWaterSupply = 0; var realScadaDataList = await GetRealScadaResult(input); if (realScadaDataList != null && realScadaDataList.Any()) { foreach (var r in realScadaDataList) { if (r.MonitorRecords == null || !r.MonitorRecords.Any()) continue; var rrr = r.MonitorRecords.Where(x => x.Value != null).Select(x => x.Value.Value).ToList(); if (rrr == null || !rrr.Any()) continue; totalWaterSupply += (rrr.Last() - rrr.First()); } } return totalWaterSupply; } /// /// 获取供水总量 /// /// 开始时间 /// 结束时间 /// 时间步长,默认300秒 /// public static async Task GetTotalWaterSupplyByDay(DateTime day, string resolution = "300") { var tagDict = new Dictionary { { "_0402010204012103002", "二取水1号泵累计流量" }, { "_0402010204012203002", "二取水2号泵累计流量" }, { "_0402010204012303002", "二取水3号泵累计流量" }, { "_0402010204012403002", "二取水4号泵累计流量" }, { "_0402010204012503002", "二取水5号泵累计流量" }, }; var input = new ScadaDispatchInput { search = "history", starttime = new DateTime(day.Year, day.Month, day.Day, 0, 0, 0).ToString("G"), endtime = new DateTime(day.Year, day.Month,day.Day,23,59,59).ToString("G"), Resolution = resolution, taglist = tagDict.Select(x => x.Key).ToArray() }; double totalWaterSupply = 0; var realScadaDataList = await GetRealScadaResult(input); if (realScadaDataList != null && realScadaDataList.Any()) { foreach (var r in realScadaDataList) { if (r.MonitorRecords == null || !r.MonitorRecords.Any()) continue; var rrr = r.MonitorRecords.Where(x=>x.Value!=null).Select(x=>x.Value.Value).ToList(); //var rrr = (from x in r.MonitorRecords where x.Value != null orderby x select x.Value.Value)?.ToList(); if (rrr == null || !rrr.Any()) continue; totalWaterSupply += (rrr.Last() - rrr.First()); } } return totalWaterSupply; } /// /// 获取供水总量 /// /// 开始时间 /// 结束时间 /// 时间步长,默认300秒 /// public static async Task GetTotalWaterSupplyByDayRange(DateTime startTime, DateTime endTime, string resolution = "300") { var tagDict = new Dictionary { { "_0402010204012103002", "二取水1号泵累计流量" }, { "_0402010204012203002", "二取水2号泵累计流量" }, { "_0402010204012303002", "二取水3号泵累计流量" }, { "_0402010204012403002", "二取水4号泵累计流量" }, { "_0402010204012503002", "二取水5号泵累计流量" }, }; var input = new ScadaDispatchInput { search = "history", starttime = new DateTime(startTime.Year, startTime.Month, startTime.Day, 0, 0, 0).ToString("G"), endtime = new DateTime(endTime.Year, endTime.Month, endTime.Day, 23, 59, 59).ToString("G"), Resolution = resolution, taglist = tagDict.Select(x => x.Key).ToArray() }; double totalWaterSupply = 0; var realScadaDataList = await GetRealScadaResult(input); if (realScadaDataList != null && realScadaDataList.Any()) { foreach (var r in realScadaDataList) { if (r.MonitorRecords == null || !r.MonitorRecords.Any()) continue; var rrr = r.MonitorRecords.Where(x => x.Value != null).Select(x => x.Value.Value).ToList(); if (rrr == null || !rrr.Any()) continue; totalWaterSupply += (rrr.Last() - rrr.First()); } } return totalWaterSupply; } /// /// 获取长江水位数据 /// /// 开始时间 /// 结束时间 /// 时间步长,默认300秒 /// public static async Task> GetWaterLevelData(DateTime startTime, DateTime endTime, string resolution = "300") { var tag = "_0402010204089903001"; var input = new ScadaDispatchInput { search = "history", starttime = startTime.ToString("G"), endtime = endTime.ToString("G"), Resolution = resolution, taglist = new string[] { tag } }; var realScadaDataList = await GetRealScadaResult(input); var monitorRecords = realScadaDataList?.Find(x => x.TagName == tag)?.MonitorRecords; return monitorRecords; } private class KeyValue { public string keys { get; set; } public string vals { get; set; } } /// /// 获取实时数据字典 /// /// public static async Task> GetRealScadaResult(List tags,object input) { if (tags == null || !tags.Any()) return default; if (input == null) return default; var ws = new ClientWebSocket(); await ws.ConnectAsync(new Uri("ws://192.168.201.17:40001"), CancellationToken.None); if (ws.State != WebSocketState.Open) { return default; } var realScadaRecordList = new List(); var inputJson = JsonHelper.Object2Json(input); var inputBytes = Encoding.UTF8.GetBytes(inputJson); await ws.SendAsync(new ArraySegment(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None); try { List outputBytes = new List();//全部消息容器 var buffer = new byte[1024 * 4];//缓冲区 var result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); //监听Socket信息 while (!result.CloseStatus.HasValue) //是否关闭 { if (result.MessageType == WebSocketMessageType.Text)//文本消息 { outputBytes.AddRange(buffer.Take(result.Count)); if (result.EndOfMessage)//消息是否已接收完全 { //发送过来的消息 string outputJson = Encoding.UTF8.GetString(outputBytes.ToArray(), 0, outputBytes.Count); var scadaDict = JsonHelper.Json2Object>(outputJson); if (scadaDict != null && scadaDict.Any()) { foreach (var dict in scadaDict) { var tag = dict.Value.keys.Trim(); if (tags.Contains(tag)) { var data = new RealScadaRecord(); data.TagName = tag; if (double.TryParse(dict.Value.vals, out double value)) data.Value = value; realScadaRecordList.Add(data); } } } break; } } result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);//继续监听Socket信息 } } catch (Exception ex) { throw ex; } finally { try { //关闭WebSocket await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None); } catch (Exception ex) { throw ex; } ws.Abort(); ws.Dispose(); } return realScadaRecordList; } /// /// 获取实时数据字典 /// /// 开始时间 /// 结束时间 /// 时间步长,默认300秒 /// public static async Task> GetRealScadaResult(ScadaDispatchInput input) { if (input == null) return default; var ws = new ClientWebSocket(); await ws.ConnectAsync(new Uri("ws://192.168.201.17:40001"), CancellationToken.None); if (ws.State != WebSocketState.Open) { return default; } var realScadaDataList = new List(); var inputJson = JsonHelper.Object2Json(input); var inputBytes = Encoding.UTF8.GetBytes(inputJson); await ws.SendAsync(new ArraySegment(inputBytes), WebSocketMessageType.Text, true, CancellationToken.None); try { List outputBytes = new List();//全部消息容器 var buffer = new byte[1024 * 4];//缓冲区 var result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); //监听Socket信息 while (!result.CloseStatus.HasValue) //是否关闭 { if (result.MessageType == WebSocketMessageType.Text)//文本消息 { outputBytes.AddRange(buffer.Take(result.Count)); if (result.EndOfMessage)//消息是否已接收完全 { //发送过来的消息 string outputJson = Encoding.UTF8.GetString(outputBytes.ToArray(), 0, outputBytes.Count); var scadaDict = JsonHelper.Json2Object>>(outputJson); if (scadaDict != null && scadaDict.Any()) { foreach (var dict in scadaDict) { var data = new RealScadaData(); data.TagName = dict.Key; data.MonitorRecords = new List(); foreach (var item in dict.Value) { var record = new MonitorRecord(); record.Time = item.Key; if (double.TryParse(item.Value, out double value)) { record.Value = value; } data.MonitorRecords.Add(record); } realScadaDataList.Add(data); } } break; } } result = await ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);//继续监听Socket信息 } } catch (Exception ex) { throw ex; } finally { try { //关闭WebSocket await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "AcknowledgeCloseframe", CancellationToken.None); } catch (Exception ex) { throw ex; } ws.Abort(); ws.Dispose(); } return realScadaDataList; } /// /// bak /// /// /// /// /// public static ScadaDispatchInput GetScadaDispatchInput_bak(DateTime startTime, DateTime endTime, double resolution = 300) { var tagDict = new Dictionary { //{ "_0402010204089903001", "长江水位" }, //{ "_0402010204089904009", "二取水前池液位" }, //{ "_0402010201030103006", "陈行水库水位" }, //{ "_0402010204012101001", "二取水1号泵状态" }, //{ "_0402010204012201001", "二取水2号泵状态" }, //{ "_0402010204012301001", "二取水3号泵状态" }, //{ "_0402010204012401001", "二取水4号泵状态" }, //{ "_0402010204012501001", "二取水5号泵状态" }, //{ "_0402010204012103002", "二取水1号泵累计流量" }, //{ "_0402010204012203002", "二取水2号泵累计流量" }, //{ "_0402010204012303002", "二取水3号泵累计流量" }, //{ "_0402010204012403002", "二取水4号泵累计流量" }, //{ "_0402010204012503002", "二取水5号泵累计流量" }, //{ "_0402010204040193046", "二取水1号泵有功电能" }, //{ "_0402010204040193047", "二取水2号泵有功电能" }, //{ "_0402010204012308007", "二取水3号泵有功电能" }, //{ "_0402010204012408007", "二取水4号泵有功电能" }, //{ "_0402010204012508007", "二取水5号泵有功电能" }, { "_0402010201090105774", "一输水11号出口压力" }, { "_0402010201040502031", "一输水11号有功功率" }, { "_0402010201040502044", "一输水11号有功电度" }, { "_0402010201011195062", "一输水11号泵转速" }, { "_0402010201011101001", "一输水11号泵运行状态" }, { "_0402010201011194012", "一输水11号泵频率" }, { "_0402010201090105005", "一输水12号出口压力" }, { "_0402010201041402031", "一输水12号有功功率" }, { "_0402010201041402044", "一输水12号有功电度" }, { "_0402010201011295062", "一输水12号泵转速" }, { "_0402010201011201001", "一输水12号泵运行状态" }, { "_0402010201011294012", "一输水12号泵频率" }, { "_0402010201090105776", "一输水13号出口压力" }, { "_0402010201040602031", "一输水13号有功功率" }, { "_0402010201040602044", "一输水13号有功电度" }, { "_0402010201011395062", "一输水13号泵转速" }, { "_0402010201011301001", "一输水13号泵运行状态" }, { "_0402010201011394012", "一输水13号泵频率" }, { "_0402010201090105007", "一输水14号出口压力" }, { "_0402010201041302031", "一输水14号有功功率" }, { "_0402010201041302044", "一输水14号有功电度" }, { "_0402010201011495062", "一输水14号泵转速" }, { "_0402010201011401001", "一输水14号泵运行状态" }, { "_0402010201011494012", "一输水14号泵频率" }, { "_0402010201090105008", "一输水15号出口压力" }, { "_0402010201040702031", "一输水15号有功功率" }, { "_0402010201040702044", "一输水15号有功电度" }, { "_0402010201011595062", "一输水15号泵转速" }, { "_0402010201011501003", "一输水15号泵运行状态" }, { "_0402010201090105016", "一输水16号出口压力" }, { "_0402010201041202031", "一输水16号有功功率" }, { "_0402010201041202044", "一输水16号有功电度" }, { "_0402010201011695062", "一输水16号泵转速" }, { "_0402010201011601003", "一输水16号泵运行状态" }, { "_0402010201090105017", "一输水17号出口压力" }, { "_0402010201040802031", "一输水17号有功功率" }, { "_0402010201040802044", "一输水17号有功电度" }, { "_0402010201011795062", "一输水17号泵转速" }, { "_0402010201011795056", "一输水17号泵运行状态" }, { "_0402010201090105018", "一输水18号出口压力" }, { "_0402010201041102031", "一输水18号有功功率" }, { "_0402010201041102044", "一输水18号有功电度" }, { "_0402010201011895062", "一输水18号泵转速" }, { "_0402010201011895056", "一输水18号泵运行状态" }, { "_0402010201090104011", "一输水前池液位1" }, { "_0402010201091104123", "一输水前池液位2" }, { "_0402010201091104122", "一输水前池液位3" }, { "_0402010201090105002", "一输水嘉定1线压力" }, { "_0402010201030191001", "一输水嘉定1线瞬时流量" }, { "_0402010201030191002", "一输水嘉定1线累计流量" }, { "_0402010201090105011", "一输水嘉定2线压力" }, { "_0402010201090199011", "一输水嘉定2线瞬时流量" }, { "_0402010201090199012", "一输水嘉定2线累计流量" }, { "_0402010201090105784", "一输水嘉定3线压力" }, { "_0402010201090199311", "一输水嘉定3线瞬时流量" }, { "_0402010201090199312", "一输水嘉定3线累计流量" }, { "_0402010204012105001", "二取水一号机泵出口压力" }, { "_0402010204012101001", "二取水一号机泵开停状态" }, { "_0402010204040193004", "二取水一号机泵有功功率" }, { "_0402010204040193046", "二取水一号机泵有功电度" }, { "_0402010204012103001", "二取水一号机泵瞬时流量" }, { "_0402010204012103002", "二取水一号机泵累计流量" }, { "_0402010204012305001", "二取水三号机泵出口压力" }, { "_0402010204012301001", "二取水三号机泵开停状态" }, { "_0402010204012308008", "二取水三号机泵有功功率" }, { "_0402010204012308007", "二取水三号机泵有功电度" }, { "_0402010204012303001", "二取水三号机泵瞬时流量" }, { "_0402010204012303002", "二取水三号机泵累计流量" }, { "_0402010204012205001", "二取水二号机泵出口压力" }, { "_0402010204012201001", "二取水二号机泵开停状态" }, { "_0402010204040193005", "二取水二号机泵有功功率" }, { "_0402010204040193047", "二取水二号机泵有功电度" }, { "_0402010204012203001", "二取水二号机泵瞬时流量" }, { "_0402010204012203002", "二取水二号机泵累计流量" }, { "_0402010204012505001", "二取水五号机泵出口压力" }, { "_0402010204012501001", "二取水五号机泵开停状态" }, { "_0402010204012508008", "二取水五号机泵有功功率" }, { "_0402010204012508007", "二取水五号机泵有功电度" }, { "_0402010204012503001", "二取水五号机泵瞬时流量" }, { "_0402010204012503002", "二取水五号机泵累计流量" }, { "_0402010204089904009", "二取水前池液位" }, { "_0402010204012405001", "二取水四号机泵出口压力" }, { "_0402010204012401001", "二取水四号机泵开停状态" }, { "_0402010204012408008", "二取水四号机泵有功功率" }, { "_0402010204012408007", "二取水四号机泵有功电度" }, { "_0402010204012403001", "二取水四号机泵瞬时流量" }, { "_0402010204012403002", "二取水四号机泵累计流量" }, { "_0402010201012105001", "二输水21号泵出口压力" }, { "_0402010201040102049", "二输水21号泵有功功率" }, { "_0402010201040102187", "二输水21号泵有功电度" }, { "_0402010201090103901", "二输水21号泵瞬时流量" }, { "_0402010201010294045", "二输水21号泵累计流量" }, { "_0402010201012199001", "二输水21号泵转速" }, { "_0402010201012193021", "二输水21号泵运行状态" }, { "_0402010201040102178", "二输水21号泵频率" }, { "_0402010201012205001", "二输水22号泵出口压力" }, { "_0402010201040102053", "二输水22号泵有功功率" }, { "_0402010201040102213", "二输水22号泵有功电度" }, { "_0402010201090103001", "二输水22号泵瞬时流量" }, { "_0402010201090103002", "二输水22号泵累计流量" }, { "_0402010201012299001", "二输水22号泵转速" }, { "_0402010201012201001", "二输水22号泵运行状态" }, { "_0402010201040102204", "二输水22号泵频率" }, { "_0402010201012305001", "二输水23号泵出口压力" }, { "_0402010201040102055", "二输水23号泵有功功率" }, { "_0402010201040102136", "二输水23号泵有功电度" }, { "_0402010201040102054", "二输水23号泵电流" }, { "_0402010201090103003", "二输水23号泵瞬时流量" }, { "_0402010201090103004", "二输水23号泵累计流量" }, { "_0402010201012399001", "二输水23号泵转速" }, { "_0402010201010194135", "二输水23号泵运行状态" }, { "_0402010201040102217", "二输水23号泵频率" }, { "_0402010201090105003", "二输水2400管压力" }, { "_0402010201090103017", "二输水2400管瞬时流量" }, { "_0402010201090103018", "二输水2400管累计流量" }, { "_0402010201012405001", "二输水24号泵出口压力" }, { "_0402010201040102057", "二输水24号泵有功功率" }, { "_0402010201040102149", "二输水24号泵有功电度" }, { "_0402010201090103005", "二输水24号泵瞬时流量" }, { "_0402010201090103006", "二输水24号泵累计流量" }, { "_0402010201012499001", "二输水24号泵转速" }, { "_0402010201012401001", "二输水24号泵运行状态" }, { "_0402010201040102140", "二输水24号泵频率" }, { "_0402010201012505001", "二输水25号泵出口压力" }, { "_0402010201040202004", "二输水25号泵有功功率" }, { "_0402010201040202141", "二输水25号泵有功电度" }, { "_0402010201090103007", "二输水25号泵瞬时流量" }, { "_0402010201090103008", "二输水25号泵累计流量" }, { "_0402010201012599001", "二输水25号泵转速" }, { "_0402010201012501001", "二输水25号泵运行状态" }, { "_0402010201040202132", "二输水25号泵频率" }, { "_0402010201012605001", "二输水26号泵出口压力" }, { "_0402010201040202006", "二输水26号泵有功功率" }, { "_0402010201040202028", "二输水26号泵有功电度" }, { "_0402010201090103009", "二输水26号泵瞬时流量" }, { "_0402010201090103010", "二输水26号泵累计流量" }, { "_0402010201012699001", "二输水26号泵转速" }, { "_0402010201010194152", "二输水26号泵运行状态" }, { "_0402010201040202145", "二输水26号泵频率" }, { "_0402010201090105004", "二输水2700管压力" }, { "_0402010201090194002", "二输水2700管瞬时流量" }, { "_0402010201090194444", "二输水2700管累计流量" }, { "_0402010201012705001", "二输水27号泵出口压力" }, { "_0402010201040202012", "二输水27号泵有功功率" }, { "_0402010201040202193", "二输水27号泵有功电度" }, { "_0402010201090103903", "二输水27号泵瞬时流量" }, { "_0402010201090194001", "二输水27号泵累计流量" }, { "_0402010201012799001", "二输水27号泵转速" }, { "_0402010201012793021", "二输水27号泵运行状态" }, { "_0402010201040202184", "二输水27号泵频率" }, { "_0402010204089903001", "陈行取水口长江液位" }, { "_0402010201030103006", "陈行水库液位" }, }; var input = new ScadaDispatchInput(); input.search = "history"; input.starttime = startTime.ToString("G"); input.endtime = endTime.ToString("G"); input.Resolution = resolution.ToString(); //input.taglist = tagDict.Select(x => x.Key).ToArray(); input.taglist = new string[] { "_0402010201030103006" }; return input; } public class RealScadaData { public string TagName { get; set; } public List MonitorRecords { get; set; } } public class RealScadaRecord { public string TagName { get; set; } public double Value { get; set; } } } }