/// <summary> /// 解析PF,Fr参数 /// </summary> /// <param name="data"></param> /// <returns></returns> public static List<BaseElecData> GetBaseElecData(MeterList data) { List<BaseElecData> baseElecDataList = new List<BaseElecData>(); foreach (var item in data.Meters) { BaseElecData baseElec = new BaseElecData(); baseElec.BuildID = data.BuildId; baseElec.MeterCode = item.MeterId; baseElec.Time = data.CollectTime; MeterParam pf = item.MeterParams.Find(m => m.ParamName.ToLower() == "PF".ToLower()); MeterParam fr = item.MeterParams.Find(m => m.ParamName.ToLower() == "Fr".ToLower()); if (pf != null) baseElec.PF = pf.ParamValue; if (fr != null) baseElec.Fr = fr.ParamValue; baseElecDataList.Add(baseElec); } return baseElecDataList; }
/// <summary> /// 获取能耗值List /// </summary> /// <param name="data"></param> /// <returns></returns> public static List<OriginEnergyData> GetEnergyData(MeterList data) { List<OriginEnergyData> energyDataList = new List<OriginEnergyData>(); foreach (var item in data.Meters) { MeterParam param = item.MeterParams.Find(meterParam => meterParam.ParamName.ToLower() == "EPI".ToLower() || meterParam.ParamName == "LJLL".ToLower() || meterParam.ParamName.ToLower() == "LLHeat".ToLower()); if (param == null) continue; //判断param.ParamError是否为错误状态,如果为错误状态则表示当前仪表通讯中断 energyDataList.Add(new OriginEnergyData() { BuildID = data.BuildId, MeterCode = item.MeterId, Time = data.CollectTime, Value = param.ParamValue, Calced = false }); } return energyDataList; }
/// <summary> /// 获取电流数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public static List<CurrentData> GetCurrentData(MeterList data) { List<CurrentData> currentDataList = new List<CurrentData>(); foreach (var item in data.Meters) { CurrentData current = new CurrentData(); current.BuildID = data.BuildId; current.MeterCode = item.MeterId; current.Time = data.CollectTime; MeterParam i = item.MeterParams.Find(m => m.ParamName.ToLower() == "I".ToLower()); MeterParam ia = item.MeterParams.Find(m => m.ParamName.ToLower() == "Ia".ToLower()); MeterParam ib = item.MeterParams.Find(m => m.ParamName.ToLower() == "Ib".ToLower()); MeterParam ic = item.MeterParams.Find(m => m.ParamName.ToLower() == "Ic".ToLower()); if (i != null) current.I = i.ParamValue; if (ia != null) current.Ia = ia.ParamValue; if (ib != null) current.Ib = ib.ParamValue; if (ic != null) current.Ic = ic.ParamValue; currentDataList.Add(current); } return currentDataList; }
/// <summary> /// 解析功率数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public static List<PowerData> GetPowerData(MeterList data) { List<PowerData> powerDataList = new List<PowerData>(); foreach (var item in data.Meters) { PowerData power = new PowerData(); power.BuildID = data.BuildId; power.MeterCode = item.MeterId; power.Time = data.CollectTime; MeterParam p = item.MeterParams.Find(m => m.ParamName.ToLower() == "P".ToLower()); MeterParam pa = item.MeterParams.Find(m => m.ParamName.ToLower() == "Pa".ToLower()); MeterParam pb = item.MeterParams.Find(m => m.ParamName.ToLower() == "Pb".ToLower()); MeterParam pc = item.MeterParams.Find(m => m.ParamName.ToLower() == "Pc".ToLower()); MeterParam q = item.MeterParams.Find(m => m.ParamName.ToLower() == "Q".ToLower()); MeterParam qa = item.MeterParams.Find(m => m.ParamName.ToLower() == "Qa".ToLower()); MeterParam qb = item.MeterParams.Find(m => m.ParamName.ToLower() == "Qb".ToLower()); MeterParam qc = item.MeterParams.Find(m => m.ParamName.ToLower() == "Qc".ToLower()); MeterParam s = item.MeterParams.Find(m => m.ParamName.ToLower() == "S".ToLower()); MeterParam sa = item.MeterParams.Find(m => m.ParamName.ToLower() == "Sa".ToLower()); MeterParam sb = item.MeterParams.Find(m => m.ParamName.ToLower() == "Sb".ToLower()); MeterParam sc = item.MeterParams.Find(m => m.ParamName.ToLower() == "Sc".ToLower()); if (p != null) power.P = p.ParamValue; if (pa != null) power.Pa = pa.ParamValue; if (pb != null) power.Pb = pb.ParamValue; if (pc != null) power.Pc = pc.ParamValue; if (q != null) power.Q = q.ParamValue; if (qa != null) power.Qa = qa.ParamValue; if (qb != null) power.Qb = qb.ParamValue; if (qc != null) power.Qc = qc.ParamValue; if (s != null) power.S = s.ParamValue; if (sa != null) power.Sa = sa.ParamValue; if (sb != null) power.Sb = sb.ParamValue; if (sc != null) power.Sc = sc.ParamValue; powerDataList.Add(power); } return powerDataList; }
/// <summary> /// 一直运行,将有新的数据存储到MySql数据库中 /// </summary> private static void SaveDataToMysql() { ShowLog("数据转存线程启动,线程ID:{0}.", Thread.CurrentThread.ManagedThreadId.ToString()); Runtime.m_Logger.Info("数据转存线程启动,线程ID:{0}.", Thread.CurrentThread.ManagedThreadId.ToString()); while (true) { if (DateTime.Now.Minute % 5 == 1) { ShowLog("检查是否有需要存储的数据?"); Runtime.m_Logger.Info("检查是否有需要存储的数据?"); List <SourceDataHeader> headerList = Energy.Common.DAL.SQLiteHelper.GetUnStoreList(); if (headerList.Count < 1000 && headerList.Count >= 0) { ShowLog("共有{0}个报文需要存储到数据中.", headerList.Count.ToString()); Runtime.m_Logger.Info("共有{0}个报文需要存储到数据中.", headerList.Count.ToString()); } else { ShowLog("当前需要存储1000个报文."); Runtime.m_Logger.Info("当前需要存储1000个报文."); } ShowLog("开始存储文件..."); Runtime.m_Logger.Info("开始存储文件..."); foreach (SourceDataHeader header in headerList) { SourceData source = SQLiteHelper.GetSourceByHeader(header); MeterList meterList = JsonConvert.DeserializeObject <MeterList>(source.JsonData); try { SaveDataFromSqliteToMySql.ExecuteInsertTransactions(meterList, header); } catch (Exception e) { ShowLog("错误信息:{0}", e.Message); Runtime.m_Logger.Error("错误信息:{0}", e.Message); } } ShowLog("完成当前周期文件的存储。"); Runtime.m_Logger.Info("完成当前周期文件的存储。"); Thread.Sleep(1000 * 60); } else { ShowLog("当前无数据需要处理,进行下一个周期的数据扫描..."); Runtime.m_Logger.Info("当前无数据需要处理,进行下一个周期的数据扫描..."); Thread.Sleep(1000 * 60); } } }
/// <summary> /// Callback in the event of a successful file received operation from a MeterBoard32 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Client_OnFileReceived(object sender, FileReceivedEventArgs e) { if (e.Result == FileOperationResult.Success) { string jsonString = Encoding.UTF8.GetString(e.Data); meters.Clear(); MeterList meterList = (MeterList)JsonConvert.DeserializeObject(jsonString, typeof(MeterList)); meters.AddRange(meterList); Invoke((MethodInvoker) delegate { ShowInfo(string.Format("File '{0}' ({1} bytes) received successfully", e.Name, e.Data.Count())); updateGUI(); }); } }
/// <summary> /// 事务:将实时数据按照要求存入mysql数据库中,存储成功,则更新原始数据 /// </summary> /// <param name="meters"></param> /// <param name="header"></param> public static void ExecuteInsertTransactions(MeterList meters,SourceDataHeader header) { List<string> insertSqls = Energy.Common.DAL.MySQLHelper.GetInsertSqls(GetEnergyData(meters),GetVoltageData(meters), GetCurrentData(meters),GetPowerData(meters),GetBaseElecData(meters)); int count = 0; MySqlConnection connection = new MySqlConnection(Runtime.MySqlConnectString); SQLiteConnection sqliteConnection = new SQLiteConnection("Data Source=TempData;Version=3;"); SQLiteCommand sQLiteCommand = new SQLiteCommand(SQLiteHelper.GetUpdateStatusSQL(header),sqliteConnection); connection.Open(); sqliteConnection.Open(); SQLiteTransaction sqliteTrans = sqliteConnection.BeginTransaction(); MySqlTransaction mySqlTrans = connection.BeginTransaction(); try { foreach (var sql in insertSqls) { MySqlCommand mySqlCommand = new MySqlCommand(sql, connection, mySqlTrans); count += mySqlCommand.ExecuteNonQuery(); } count += sQLiteCommand.ExecuteNonQuery(); sqliteTrans.Commit(); mySqlTrans.Commit(); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "<" + Thread.CurrentThread.ManagedThreadId.ToString() + "> -> " + "事务执行成功,共影响{0}条数据。",count); } catch (Exception e) { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "<" + Thread.CurrentThread.ManagedThreadId.ToString() + "> -> " + "事务执行失败,正在回滚操作,失败内容为:{0}。",e.Message); sqliteTrans.Rollback(); mySqlTrans.Rollback(); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "<" + Thread.CurrentThread.ManagedThreadId.ToString() + "> -> " + "事务回滚成功!"); } finally { sQLiteCommand.Connection.Close(); connection.Close(); Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "<" + Thread.CurrentThread.ManagedThreadId.ToString() + "> -> " + "已关闭数据库连接!"); } }
/// <summary> /// 获取电压数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public static List<VoltageData> GetVoltageData(MeterList data) { List<VoltageData> voltageDataList = new List<VoltageData>(); foreach (var item in data.Meters) { VoltageData voltage = new VoltageData(); voltage.BuildID = data.BuildId; voltage.MeterCode = item.MeterId; voltage.Time = data.CollectTime; MeterParam u = item.MeterParams.Find(m=>m.ParamName.ToLower() == "U".ToLower()); MeterParam ua = item.MeterParams.Find(m => m.ParamName.ToLower() == "Ua".ToLower()); MeterParam ub = item.MeterParams.Find(m => m.ParamName.ToLower() == "Ub".ToLower()); MeterParam uc = item.MeterParams.Find(m => m.ParamName.ToLower() == "Uc".ToLower()); MeterParam uab = item.MeterParams.Find(m => m.ParamName.ToLower() == "Uab".ToLower()); MeterParam ubc = item.MeterParams.Find(m => m.ParamName.ToLower() == "Ubc".ToLower()); MeterParam uca = item.MeterParams.Find(m => m.ParamName.ToLower() == "Uca".ToLower()); if (u != null) voltage.U = u.ParamValue; if (ua != null) voltage.Ua = ua.ParamValue; if (ub != null) voltage.Ub = ub.ParamValue; if (uc != null) voltage.Uc = uc.ParamValue; if (uab != null) voltage.Uab = uab.ParamValue; if (ubc != null) voltage.Ubc = ubc.ParamValue; if (uca != null) voltage.Uca = uca.ParamValue; voltageDataList.Add(voltage); } return voltageDataList; }
private IEnumerable <InfluxDbEntry> ProcessMeterList(Site site, MeterList meterList, string measurement) { foreach (var dateGroup in from m in meterList.Meters from v in m.Values group new { m.Type, v.Value } by v.Date into groupByDate select groupByDate) { var fields = dateGroup.ToLookup(x => x.Type); yield return(new InfluxDbEntry { Time = TimeZoneInfo.ConvertTimeToUtc(dateGroup.Key, site.Location.TimeZoneInfo), Fields = fields.Select(x => new InfluxDbEntryField { Name = x.Key, Value = x.FirstOrDefault().Value }).ToArray(), Tags = new[] { new InfluxDbEntryField { Name = "Site", Value = site.Id }, new InfluxDbEntryField { Name = "SiteName", Value = site.Name }, new InfluxDbEntryField { Name = "Unit", Value = meterList.Unit }, new InfluxDbEntryField { Name = "TimeUnit", Value = meterList.TimeUnit }, }, Measurement = measurement }); } }
protected override bool Execute(CodeActivityContext context) { DataTable TempTable = null; string sql = @"set nocount on;set transaction isolation level read uncommitted;select Meter_ID from Hard_MetersE422_Links where E422_ID=" + E422_ID.Get(context).ToString(); try { var serverData = ARM_Service.REP_Query_Report( sql, new List <QueryParameter>()); if (!string.IsNullOrEmpty(serverData.Value)) { Error.Set(context, serverData.Value); } else if (serverData.Key != null) { TempTable = serverData.Key; var result = new List <int>(); foreach (DataRow r in TempTable.Rows) { if (r.ItemArray != null && r.ItemArray.Length > 0) { result.Add((int)r.ItemArray[0]); } } MeterList.Set(context, result); } } catch (Exception ex) { Error.Set(context, ex.Message); if (!HideException.Get(context)) { throw ex; } } return(string.IsNullOrEmpty(Error.Get(context))); }
/// <summary> /// Loads a configuration from disc /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnLoadConfiguration_Click(object sender, EventArgs e) { OpenFileDialog loadFileDialog = new OpenFileDialog { Filter = "Meter Configuration File|*.meter", Title = "Load Meter Configuration" }; string fileName = loadFileDialog.FileName; if (loadFileDialog.ShowDialog() == DialogResult.OK) { ShowInfo(string.Format("Loading configuration file {0} from disc..", fileName)); StreamReader sr = new StreamReader(fileName); string json = sr.ReadToEnd(); sr.Close(); ShowInfo(string.Format("Configuration file {0} successfully loaded from disc", fileName)); meters.Clear(); MeterList meterList = (MeterList)JsonConvert.DeserializeObject(json, typeof(MeterList)); meters.AddRange(meterList); updateGUI(); } }