private void btnOpen_Click(object sender, EventArgs e) { if (rbSrez.Checked) { dataTable = new DataTable("SrezTable"); SrezAdapter sa = new SrezAdapter(); sa.FileName = txtFileName.Text; sa.Fill(dataTable); } else if (rbEvent.Checked) { dataTable = new DataTable("EventTable"); EventAdapter ea = new EventAdapter(); ea.FileName = txtFileName.Text; ea.Fill(dataTable); } else // rbBase.Checked { dataTable = new DataTable("BaseTable"); BaseAdapter ba = new BaseAdapter(); ba.FileName = txtFileName.Text; ba.Fill(dataTable, true); } dataGridView.DataSource = dataTable; }
private EventAdapter eventAdapter; // адаптер таблицы событий #endregion Fields #region Constructors /// <summary> /// Конструктор /// </summary> private FrmEventTableEdit() { InitializeComponent(); errLog = null; eventAdapter = null; dataTable = null; editMode = false; }
/// <summary> /// Отобразить форму редактирования или просмотра таблицы срезов /// </summary> public static void Show(string directory, string tableName, bool editMode, Log errLog) { if (string.IsNullOrEmpty(directory)) throw new ArgumentException("directory"); if (string.IsNullOrEmpty(tableName)) throw new ArgumentException("tableName"); if (errLog == null) throw new ArgumentNullException("errLog"); EventAdapter eventAdapter = new EventAdapter(); eventAdapter.Directory = directory; eventAdapter.TableName = tableName; DataTable dataTable = new DataTable(); if (LoadDataTable(eventAdapter, errLog, ref dataTable)) { FrmEventTableEdit frmEventTableEdit = new FrmEventTableEdit(); frmEventTableEdit.errLog = errLog; frmEventTableEdit.eventAdapter = eventAdapter; frmEventTableEdit.dataTable = dataTable; frmEventTableEdit.editMode = editMode; frmEventTableEdit.ShowDialog(); } }
/// <summary> /// Записать квитирование события в таблицу событий /// </summary> private bool WriteEventCheck(string tableName, EventAdapter eventAdapter, int evNum, int userID) { string fileName = ""; try { lock (eventAdapter) { eventAdapter.TableName = tableName; fileName = eventAdapter.FileName; eventAdapter.CheckEvent(evNum, userID); if (Settings.DetailedLog) { string tableDescr = eventAdapter == this.eventAdapter ? (Localization.UseRussian ? "событий" : "event") : (Localization.UseRussian ? "копий событий" : "event copy"); AppLog.WriteAction(string.Format(Localization.UseRussian ? "Запись квитирования события в таблицу {0} завершена" : "Writing event check in the {0} table is completed", tableDescr), Log.ActTypes.Action); } return true; } } catch (Exception ex) { string fileNameStr = string.IsNullOrEmpty(fileName) ? "" : Environment.NewLine + (Localization.UseRussian ? "Имя файла: " : "Filename: ") + fileName; AppLog.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при записи квитирования события в таблицу событий: {0}{1}" : "Error writing event check in the event table: {0}{1}", ex.Message, fileNameStr), Log.ActTypes.Exception); return false; } }
private string workState; // состояние работы #endregion Fields #region Constructors /// <summary> /// Конструктор /// </summary> public MainLogic() { AppDirs = new AppDirs(); AppLog = new Log(Log.Formats.Full); AppLog.Encoding = Encoding.UTF8; Settings = new Settings(); infoFileName = ""; thread = null; terminated = false; serverIsReady = false; startDT = DateTime.MinValue; workState = ""; comm = new Comm(this); calculator = new Calculator(this); inCnls = new SortedList<int, InCnl>(); drCnls = null; drmCnls = null; drhCnls = null; drCnlNums = null; drmCnlNums = null; drhCnlNums = null; avgCnlInds = null; ctrlCnls = new SortedList<int, CtrlCnl>(); users = new SortedList<string, User>(); formulas = new List<string>(); curSrez = null; curSrezMod = false; srezDescr = null; minAvgData = null; hrAvgData = null; activeDTs = null; curSrezAdapter = null; curSrezCopyAdapter = null; eventAdapter = null; eventCopyAdapter = null; minSrezTableCache = null; hrSrezTableCache = null; modules = new List<ModLogic>(); }
/// <summary> /// Цикл работы сервера (метод вызывается в отдельном потоке) /// </summary> private void Execute() { try { // запись информации о работе приложения workState = WorkStateNames.Normal; WriteInfo(); // выполнение действий модулей RaiseOnServerStart(); // инициализация адаптеров таблиц текущего среза и событий curSrezAdapter = new SrezAdapter(); curSrezCopyAdapter = new SrezAdapter(); eventAdapter = new EventAdapter(); eventCopyAdapter = new EventAdapter(); curSrezAdapter.FileName = ServerUtils.BuildCurFileName(Settings.ArcDir); curSrezCopyAdapter.FileName = ServerUtils.BuildCurFileName(Settings.ArcCopyDir); eventAdapter.Directory = Settings.ArcDir + "Events" + Path.DirectorySeparatorChar; eventCopyAdapter.Directory = Settings.ArcCopyDir + "Events" + Path.DirectorySeparatorChar; // инициализация кэша таблиц минутных и часовых срезов minSrezTableCache = new SortedList<DateTime, SrezTableCache>(); hrSrezTableCache = new SortedList<DateTime, SrezTableCache>(); // инициализация описания создаваемых срезов int cnlCnt = inCnls.Count; srezDescr = new SrezTable.SrezDescr(cnlCnt); for (int i = 0; i < cnlCnt; i++) srezDescr.CnlNums[i] = inCnls.Values[i].CnlNum; srezDescr.CalcCS(); // загрузка исходного текущего среза из файла SrezTableLight.Srez curSrezSrc = null; SrezTableLight tblCurSrezScr = new SrezTableLight(); try { if (File.Exists(curSrezAdapter.FileName)) { curSrezAdapter.Fill(tblCurSrezScr); if (tblCurSrezScr.SrezList.Count > 0) curSrezSrc = tblCurSrezScr.SrezList.Values[0]; } if (curSrezSrc == null) AppLog.WriteAction(Localization.UseRussian ? "Текущий срез не загружен" : "Current data are not loaded", Log.ActTypes.Action); else AppLog.WriteAction(Localization.UseRussian ? "Текущий срез загружен" : "Current data are loaded", Log.ActTypes.Action); } catch (Exception ex) { AppLog.WriteAction((Localization.UseRussian ? "Ошибка при загрузке текущего среза: " : "Error loading current data: ") + ex.Message, Log.ActTypes.Exception); } // инициализация текущего среза, предназначенного для формироваться данных сервера curSrez = new SrezTable.Srez(DateTime.MinValue, srezDescr, curSrezSrc); // инициализация данных для усреднения и времени активности каналов minAvgData = new AvgData[cnlCnt]; hrAvgData = new AvgData[cnlCnt]; activeDTs = new DateTime[cnlCnt]; DateTime nowDT = DateTime.Now; for (int i = 0; i < cnlCnt; i++) { minAvgData[i] = new AvgData() { Sum = 0.0, Cnt = 0 }; hrAvgData[i] = new AvgData() { Sum = 0.0, Cnt = 0 }; activeDTs[i] = nowDT; } // цикл работы сервера nowDT = DateTime.MaxValue; DateTime today = nowDT.Date; DateTime prevDT; DateTime writeCurSrezDT = DateTime.MinValue; DateTime writeMinSrezDT = DateTime.MinValue; DateTime writeHrSrezDT = DateTime.MinValue; DateTime calcMinDT = DateTime.MinValue; DateTime calcHrDT = DateTime.MinValue; DateTime clearCacheDT = nowDT; bool writeCur = Settings.WriteCur || Settings.WriteCurCopy; bool writeCurOnMod = Settings.WriteCurPer <= 0; bool writeMin = (Settings.WriteMin || Settings.WriteMinCopy) && Settings.WriteMinPer > 0; bool writeHr = (Settings.WriteHr || Settings.WriteHrCopy) && Settings.WriteHrPer > 0; curSrezMod = false; serverIsReady = true; while (!terminated) { prevDT = nowDT; nowDT = DateTime.Now; today = nowDT.Date; // расчёт времени записи срезов и вычисления значений дорасчётных каналов // при переводе времени назад или при первом проходе цикла if (prevDT > nowDT) { writeCurSrezDT = nowDT; writeMinSrezDT = CalcNextTime(nowDT, Settings.WriteMinPer); writeHrSrezDT = CalcNextTime(nowDT, Settings.WriteHrPer); calcMinDT = drmCnls.Count > 0 ? CalcNextTime(nowDT, 60) : DateTime.MaxValue; calcHrDT = drhCnls.Count > 0 ? CalcNextTime(nowDT, 3600) : DateTime.MaxValue; } // удаление устаревших файлов срезов и событий при изменении даты или при первом проходе цикла if (prevDT.Date != today) { ClearArchive(Settings.ArcDir + "Min", "m*.dat", today.AddDays(-Settings.StoreMinPer)); ClearArchive(Settings.ArcDir + "Hour", "h*.dat", today.AddDays(-Settings.StoreHrPer)); ClearArchive(Settings.ArcDir + "Events", "e*.dat", today.AddDays(-Settings.StoreEvPer)); ClearArchive(Settings.ArcCopyDir + "Min", "m*.dat", today.AddDays(-Settings.StoreMinPer)); ClearArchive(Settings.ArcCopyDir + "Hour", "h*.dat", today.AddDays(-Settings.StoreHrPer)); ClearArchive(Settings.ArcCopyDir + "Events", "e*.dat", today.AddDays(-Settings.StoreEvPer)); } lock (curSrez) { // установка недостоверности неактивных каналов SetUnreliable(); // вычисление дорасчётных каналов и выполнение действий модулей CalcDRCnls(drCnls, curSrez, true); RaiseOnCurDataCalculated(drCnlNums, curSrez); // вычисление минутных каналов и выполнение действий модулей if (calcMinDT <= nowDT) { CalcDRCnls(drmCnls, curSrez, true); RaiseOnCurDataCalculated(drmCnlNums, curSrez); calcMinDT = CalcNextTime(nowDT, 60); curSrezMod = true; } // вычисление часовых каналов и выполнение действий модулей if (calcHrDT <= nowDT) { CalcDRCnls(drhCnls, curSrez, true); RaiseOnCurDataCalculated(drhCnlNums, curSrez); calcHrDT = CalcNextTime(nowDT, 3600); curSrezMod = true; } // запись текущего среза if ((writeCurSrezDT <= nowDT || writeCurOnMod && curSrezMod) && writeCur) { if (writeCurOnMod) { WriteSrez(SrezTypes.Cur, nowDT); curSrezMod = false; writeCurSrezDT = DateTime.MaxValue; } else { WriteSrez(SrezTypes.Cur, writeCurSrezDT); writeCurSrezDT = CalcNextTime(nowDT, Settings.WriteCurPer); } } // запись минутного среза if (writeMinSrezDT <= nowDT && writeMin) { WriteSrez(SrezTypes.Min, writeMinSrezDT); writeMinSrezDT = CalcNextTime(nowDT, Settings.WriteMinPer); } // запись часового среза if (writeHrSrezDT <= nowDT && writeHr) { WriteSrez(SrezTypes.Hour, writeHrSrezDT); writeHrSrezDT = CalcNextTime(nowDT, Settings.WriteHrPer); } } // очистка устаревших данных кэша if (nowDT - clearCacheDT > CacheClearSpan || nowDT < clearCacheDT /*время переведено назад*/) { clearCacheDT = nowDT; ClearSrezTableCache(minSrezTableCache, MinCacheStorePer, MinCacheCapacity); ClearSrezTableCache(hrSrezTableCache, HourCacheStorePer, HourCacheCapacity); } // запись информации о работе приложения WriteInfo(); // задержка для экономиии ресурсов процессора Thread.Sleep(100); } } finally { // выполнение действий модулей RaiseOnServerStop(); // запись информации о работе приложения workState = WorkStateNames.Stopped; WriteInfo(); } }
/// <summary> /// Принять таблицу событий от SCADA-Сервера /// </summary> public bool ReceiveEventTable(string tableName, EventTableLight eventTableLight) { Monitor.Enter(tcpLock); bool result = false; errMsg = ""; try { try { if (RestoreConnection()) { using (MemoryStream memStream = new MemoryStream()) { if (ReceiveFile(Dirs.Events, tableName, memStream)) { EventAdapter adapter = new EventAdapter(); adapter.Stream = memStream; adapter.TableName = tableName; adapter.Fill(eventTableLight); result = true; } } } } finally { // очистка таблицы, если не удалось получить новые данные if (!result) { eventTableLight.Clear(); eventTableLight.TableName = tableName; } } } catch (Exception ex) { errMsg = (Localization.UseRussian ? "Ошибка при приёме таблицы событий от SCADA-Сервера: " : "Error receiving event table from SCADA-Server: ") + ex.Message; WriteAction(errMsg, Log.ActTypes.Exception); } finally { Monitor.Exit(tcpLock); } return result; }
/// <summary> /// Загрузить таблицу событий /// </summary> private static bool LoadDataTable(EventAdapter eventAdapter, Log errLog, ref DataTable dataTable) { try { eventAdapter.Fill(dataTable); return true; } catch (Exception ex) { string errMsg = AppPhrases.LoadEventTableError + ":\r\n" + ex.Message; if (errLog != null) errLog.WriteAction(errMsg, Log.ActTypes.Exception); ScadaUtils.ShowError(errMsg); return false; } }
/// <summary> /// Экспортировать события, загрузив их из файла /// </summary> private void ExportEventsFromFile(Exporter exporter, DateTime date) { // загрузка таблицы событий из файла EventTableLight eventTable = new EventTableLight(); EventAdapter eventAdapter = new EventAdapter(); eventAdapter.FileName = ServerUtils.BuildEvFileName(Settings.ArcDir, date); try { eventAdapter.Fill(eventTable); } catch (Exception ex) { log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при загрузке таблицы событий из файла {0}: {1}" : "Error loading event table from file {0}: {1}", eventAdapter.FileName, ex.Message)); } // добавление событий в очередь экспорта if (eventTable.AllEvents.Count > 0) { foreach (EventTableLight.Event ev in eventTable.AllEvents) exporter.EnqueueEvent(ev); log.WriteAction(Localization.UseRussian ? "События добавлены в очередь экспорта" : "Events added to export queue"); } else { log.WriteAction(Localization.UseRussian ? "Отсутствуют события для экспорта" : "No events to export"); } }