internal EditPanel(DistNet distNet) { distnet = distNet; dbdesc = distnet.dbdesc; dnobjdesc = distnet.DNObjectDesces; InitializeComponent(); }
///<summary>开始读取规划运行数据</summary> public static void PlanningRunDataRead(DistNet dn, int instanceID) { initPlanningRunData(dn); //逐项填写运行数据 //载入潮流 List <PowerBasicObject> objs = dn.dbdesc["基础数据"].DictSQLS["线路"].batchLoadRunData(dn, false, instanceID); foreach (var item in objs) { DNACLine obj = item as DNACLine; obj.isInverse = obj.thisRunData.activePower < 0; //校验方向 } //载入变电站 objs = dn.dbdesc["基础数据"].DictSQLS["变电站"].batchLoadRunData(dn, false, instanceID); //载入配电室 //注:配电无功率数据 objs = dn.dbdesc["基础数据"].DictSQLS["配电室"].batchLoadRunData(dn, false, instanceID); //载入主变压器 objs = dn.dbdesc["基础数据"].DictSQLS["主变2卷"].batchLoadRunData(dn, false, instanceID); //载入配变压器 objs = dn.dbdesc["基础数据"].DictSQLS["配变"].batchLoadRunData(dn, false, instanceID); //断路器状态 objs = dn.dbdesc["基础数据"].DictSQLS["断路器"].batchLoadRunData(dn, false, instanceID); //网格数据 objs = dn.dbdesc["基础数据"].DictSQLS["网格"].batchLoadRunData(dn, false, instanceID); }
///<summary>清理实时运行数据,包括停止计时器,清除事件列表, 清理模板和内容指向</summary> static void clearRealData(DistNet dn) { tmrreal.Stop(); clearAll(dn); tmrreal.Tag = null; events.Clear(); }
///<summary>方法将创建rundata对象设置模板,并开始计时读取实时运行数据</summary> public static void RealDataReadStart(DistNet dn) { initRealRunData(dn); readrealdata(); tmrreal.Start(); }
static void genplant(DistNet dn) { foreach (DNPlantBase item in dn.getAllObjListByCategory(EObjectCategory.电厂设施类)) { RunDataPlantBase rundata = item.busiRunData as RunDataPlantBase; AcntPlantBase acnt = item.busiAccount as AcntPlantBase; rundata.rateOfLoad = 0.8 + 0.2 * rd.NextDouble(); rundata.power = rundata.rateOfLoad * acnt.cap; } }
///<summary>清理所有对象的运行数据,模板,内容</summary> static void clearAll(DistNet dn) { foreach (var layer in dn.scene.objManager.zLayers.Values) { foreach (var item in layer.pModels.Values) { item.busiRunData = item.tooltipMoveContent = item.tooltipMoveTemplate = null; } } }
///<summary> ///根据dbopkey取得的数据库描述定义,批量载入运行数据。 ///isRealRun参数:ture载入实时运行数据,false载入规划模拟运行数据 ///返回设置了运行数据的对象列表 ///</summary> public List <PowerBasicObject> batchLoadRunData(DistNet distnet, bool isRealRun) { DataLayer.DataProvider.curDataSourceName = dbdesc.datasourceName; List <PowerBasicObject> result = new List <PowerBasicObject>(); string sql = isRealRun ? this.rundataSelectAll : this.planningSelectAll; string sim = isRealRun ? this.rundataSimAll : this.planningSimAll; //若为模拟数据,需预填对象id KeyValuePair <DataLayer.EReadMode, DataTable> kvp; if (DataLayer.DataProvider.dataStatus == DataLayer.EDataStatus.模拟 && (simRunDataDataTable == null || simPlanningDataTable == null)) { DataTable dtids = DataLayer.DataProvider.getDataTableFromSQL(acntSelectAllID, false); if (dtids == null || dtids.Rows.Count == 0) { System.Windows.MessageBox.Show("模拟对象序列来源于台账页面的acntSelectAllID语句,但查询为空导致模拟失败,请检查!"); } List <string> ids = dtids.AsEnumerable().Select(p => p[0].ToString()).ToList(); kvp = DataLayer.DataProvider.getDataTable(null, sim, ids, DataLayer.EReadMode.模拟); } else { kvp = DataLayer.DataProvider.getDataTable(sql, sim, isRealRun ? this.simRunDataDataTable : this.simPlanningDataTable); } if (kvp.Key == DataLayer.EReadMode.模拟) { if (isRealRun) { this.simRunDataDataTable = kvp.Value; } else { this.simPlanningDataTable = kvp.Value; } } foreach (DataRow dr in kvp.Value.Rows) { string id; if (kvp.Key == DataLayer.EReadMode.数据库读取) { id = dr[(isRealRun ? rundataTableRelation : planningTableRelation).mainTable.keyFieldName].ToString(); } else { id = dr[0].ToString(); //模拟数据固定为第一字段为ID字段 } PowerBasicObject obj = distnet.findObj(id); if (obj != null) { loadRundata(dr, obj, kvp.Key, isRealRun); result.Add(obj); } } return(result); }
///<summary>产生开关数据</summary> static void genswitch(DistNet dn) { //暂取常态 foreach (PowerBasicObject item in dn.getAllObjListByCategory(EObjectCategory.开关类)) { RunDataSwitchBase rundata = item.busiRunData as RunDataSwitchBase; AcntSwitchBase acnt = item.busiAccount as AcntSwitchBase; rundata.isClose = acnt.switchStatus == ESwitchStatus.闭合; } }
///<summary>初始化运行数据类</summary> public static void initRunData(DistNet dn, bool isForce = false) { if (!isRunDataInit || isForce) { //变电设施类 foreach (DNTransformFacilityBase item in dn.getAllObjListByCategory(EObjectCategory.变电设施类)) { item.createRunData(); item.tooltipMoveTemplate = "RunDataSubsationTemplate"; item.tooltipMoveContent = item.busiRunData; } //变压器类 foreach (DNTransformerBase item in dn.getAllObjListByCategory(EObjectCategory.变压器类)) { item.createRunData(); item.tooltipMoveTemplate = "RunDataTransformerTemplate"; item.tooltipMoveContent = item.busiRunData; } //导线类 foreach (DNACLineBase item in dn.getAllObjListByCategory(EObjectCategory.导线类)) { item.createRunData(); if (item is DNACLine) //仅输电线路tooltip { item.tooltipMoveTemplate = "RunDataACLineTemplate"; item.tooltipMoveContent = item.busiRunData; } } //开关类 foreach (PowerBasicObject item in dn.getAllObjListByCategory(EObjectCategory.开关类)) { item.createRunData(); } //节点 foreach (DNNode item in dn.getAllObjListByObjType(EObjectType.节点)) { item.createRunData(); } //电厂 foreach (DNPlantBase item in dn.getAllObjListByCategory(EObjectCategory.电厂设施类)) { item.createRunData(); } } tmr.Tag = dn; isRunDataInit = true; }
///<summary>产生线路数据</summary> static void genline(DistNet dn) { foreach (DNACLineBase item in dn.getAllObjListByObjType(EObjectType.输电线路)) { RunDataACLineBase rundata = item.busiRunData as RunDataACLineBase; AcntACLineBase acnt = item.busiAccount as AcntACLineBase; if (acnt.cap == 0) { acnt.cap = rd.Next(50); } rundata.activePower = acnt.cap * (0.4 + 0.5 * rd.NextDouble()); //rundata.powerFactor = 0.8 + 0.2 * rd.NextDouble(); //rundata.apparentPower = rundata.activePower / rundata.powerFactor; rundata.reactivePower = Math.Sqrt(Math.Pow(rundata.apparentPower, 2) - Math.Pow(rundata.activePower, 2)); //rundata.rateOfLoad = rundata.apparentPower / acnt.cap; if (rd.NextDouble() < 0.01) { if (events.Count > 50) { events.Remove(events.Last()); } events.Insert(0, new EventData() { eObjID = item.id, startTime = DateTime.Now, eType = (EventData.EEventType)rd.Next(2), eTitle = item.name + "事件.", eContent = DateTime.Now.ToShortDateString() + item.name + "事件描述......" }); } if (item is DNACLine) { if (rundata.lstApparentPower.Count == 0) //初始模拟50条 { for (int i = 50; i > 0; i--) { rundata.lstApparentPower.Add(new MyClassLibrary.DevShare.ChartDataPoint() { argudate = DateTime.Now.AddMinutes(i), value = acnt.cap * (0.4 + 0.5 * rd.NextDouble()) }); } } //rundata.addApparentPower(rundata.apparentPower); rundata.refresh(); } } }
///<summary>初始化规划模拟运行数据类并设置相应tooltipmove模板</summary> static void initPlanningRunData(DistNet dn) { //变电设施类 foreach (DNTransformFacilityBase item in dn.getAllObjListByCategory(EObjectCategory.变电设施类)) { item.createRunData(); item.tooltipMoveTemplate = "PlanningSubstationTemplate"; item.tooltipMoveContent = item.busiRunData; } //变压器类 foreach (DNTransformerBase item in dn.getAllObjListByCategory(EObjectCategory.变压器类)) { item.createRunData(); item.tooltipMoveTemplate = "PlanningSubstationTemplate"; item.tooltipMoveContent = item.busiRunData; } //导线类 foreach (DNACLineBase item in dn.getAllObjListByCategory(EObjectCategory.导线类)) { item.createRunData(); if (item is DNACLine) //仅输电线路tooltip { item.tooltipMoveTemplate = "PlanningLineTemplate"; item.tooltipMoveContent = item.busiRunData; } } //开关类 foreach (PowerBasicObject item in dn.getAllObjListByCategory(EObjectCategory.开关类)) { item.createRunData(); } //节点 foreach (DNNode item in dn.getAllObjListByObjType(EObjectType.节点)) { item.createRunData(); } //电厂 foreach (DNPlantBase item in dn.getAllObjListByCategory(EObjectCategory.电厂设施类)) { item.createRunData(); } }
public static void StartGenData(DistNet dn) { genline(dn); gentranform(dn); genswitch(dn); genplant(dn); tmr.Start(); }
///<summary>产生变电数据</summary> static void gentranform(DistNet dn) { foreach (DNTransformFacilityBase item in dn.getAllObjListByCategory(EObjectCategory.变电设施类)) { RunDataTransformFacilityBase rundata = item.busiRunData as RunDataTransformFacilityBase; AcntTransformFacilityBase acnt = item.busiAccount as AcntTransformFacilityBase; rundata.activePower = acnt.cap * (0.4 + 0.5 * rd.NextDouble()); //rundata.powerFactor = 0.8 + 0.2 * rd.NextDouble(); //rundata.apparentPower = rundata.activePower / rundata.powerFactor; rundata.reactivePower = Math.Sqrt(Math.Pow(rundata.apparentPower, 2) - Math.Pow(rundata.activePower, 2)); //rundata.rateOfLoad = rundata.apparentPower / acnt.cap; //rundata.HVoltPUV = 0.85 + 0.3 * rd.NextDouble(); rundata.HVL = acnt.hnvl * rundata.HVoltPUV; if (rundata.lstApparentPower.Count == 0) //初始模拟50条 { for (int i = 50; i > 0; i--) { rundata.lstApparentPower.Add(new MyClassLibrary.DevShare.ChartDataPoint() { argudate = DateTime.Now.AddMinutes(i), value = acnt.cap * (0.4 + 0.5 * rd.NextDouble()) }); } } //rundata.addApparentPower(rundata.apparentPower); rundata.refresh(); } foreach (DNTransformerBase item in dn.getAllObjListByCategory(EObjectCategory.变压器类)) { RunDataTransformerBase rundata = item.busiRunData as RunDataTransformerBase; AcntTransformBase acnt = item.busiAccount as AcntTransformBase; rundata.activePower = acnt.cap * (0.4 + 0.5 * rd.NextDouble()); //rundata.powerFactor = 0.8 + 0.2 * rd.NextDouble(); //rundata.apparentPower = rundata.activePower / rundata.powerFactor; rundata.reactivePower = Math.Sqrt(Math.Pow(rundata.apparentPower, 2) - Math.Pow(rundata.activePower, 2)); //rundata.rateOfLoad = rundata.apparentPower / acnt.cap; //rundata.HVoltPUV = 0.85 + 0.3 * rd.NextDouble(); rundata.HVL = acnt.hnvl * rundata.HVoltPUV; if (rundata.lstApparentPower.Count == 0) //初始模拟50条 { for (int i = 50; i > 0; i--) { rundata.lstApparentPower.Add(new MyClassLibrary.DevShare.ChartDataPoint() { argudate = DateTime.Now.AddMinutes(i), value = acnt.cap * (0.4 + 0.5 * rd.NextDouble()) }); } } //rundata.addApparentPower(rundata.apparentPower); rundata.refresh(); } foreach (var item in dn.getAllObjListByObjType(EObjectType.节点)) { RunDataNode rundata = item.busiRunData as RunDataNode; rundata.vl = 110; //rundata.voltPUV = 0.9 + 0.2 * rd.NextDouble(); rundata.volt = rundata.voltPUV * rundata.vl; } }
///<summary> ///根据dbopkey取得的数据库描述定义,批量创建对象载入到distnet中,同时读入台账数据和拓扑数据。 ///以对象的大类名为层名 ///若同层同ID对象已存在,则忽略 ///addwhere为附加到selectAll的附加过滤语句 ///layername为创建对象时可指定层名称,若为空则以对象所属大类为类名称 ///返回创建对象列表,供附加其它设置 ///</summary> public List <PowerBasicObject> batchCreateDNObjects(DistNet distnet, string addwhere = "", string layername = null) { MyBaseControls.Screen.ScreenProgress.info = string.Format("载入{0}...", this.key); DataLayer.DataProvider.curDataSourceName = dbdesc.datasourceName; List <PowerBasicObject> result = new List <PowerBasicObject>(); PowerBasicObject obj; pLayer player; string s = acntSelectAll + " " + addwhere; DataTable dt = DataLayer.DataProvider.getDataTableFromSQL(s); if (dt.Rows.Count > 0) { if (string.IsNullOrWhiteSpace(layername)) { pLayer tmplayer = new pLayer(null); obj = createDNObject(tmplayer); player = distnet.addLayer((obj.busiDesc as DescData).objCategory.ToString()); } else { player = distnet.addLayer(layername); } //批量创建对象 foreach (DataRow dr in dt.Rows) { //string zid = dr.getString(this.acntTableRelation.mainTable.keyFieldName); string zid = dr.getString(this.keypdesces.FirstOrDefault(p => p.propertyname == "ID").fieldname); if (string.IsNullOrWhiteSpace(zid)) { MyBaseControls.StatusBarTool.StatusBarTool.reportInfo.showInfo("存在设备ID为空的对象,这些对象未被创建,请检查数据来源!", 30); MyBaseControls.LogTool.Log.addLog(string.Format("{1}存在设备ID为空的对象,这些对象未被创建。({0})", this, this.key), MyBaseControls.LogTool.ELogType.告警); continue; //若设备id为空,不创建对象 } bool isExist = false; foreach (pLayer lay in player.parent.zLayers.Values) { isExist = lay.pModels.ContainsKey(zid); if (isExist) { MyBaseControls.StatusBarTool.StatusBarTool.reportInfo.showInfo("存在相同ID的对象,只创建第一个对象,请检查数据来源!", 30); MyBaseControls.LogTool.Log.addLog(string.Format("{1}存在相同ID的对象,只创建第一个对象,请检查数据来源。({0})", this, this.key), MyBaseControls.LogTool.ELogType.告警); break; } } if (!isExist) //没有同ID对象,才创建 { obj = createDNObject(player); obj.DBOPKey = key; loadKeyAcnt(dr, obj); player.AddObject(obj); result.Add(obj); } } loadExTopo(result); //载入扩展拓扑 } return(result); }
///<summary>清理rundata对象、模板、内容</summary> public static void PlanningRunDataClear(DistNet dn) { clearAll(dn); }
///<summary>停止读取实时运行数据, 并清理相关对象</summary> public static void RealDataReadStop(DistNet dn) { tmrreal.Stop(); clearRealData(dn); }