/// <summary> /// Получить тренд минутных данных заданного канала за сутки /// </summary> /// <remarks>Возвращаемый тренд после загрузки не изменяется экземпляром данного класса, /// таким образом, чтение его данных является потокобезопасным. /// Метод всегда возвращает объект, не равный null</remarks> public Trend GetMinTrend(DateTime date, int cnlNum) { Trend trend = new Trend(cnlNum); try { if (serverComm.ReceiveTrend(SrezAdapter.BuildMinTableName(date), date, trend)) { trend.LastFillTime = DateTime.UtcNow; // единообразно с часовыми данными и событиями } else { throw new ScadaException(Localization.UseRussian ? "Не удалось принять тренд." : "Unable to receive trend."); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении тренда минутных данных за {0}" : "Error getting minute data trend for {0}", date.ToLocalizedDateString()); } return(trend); }
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; }
/// <summary> /// Экспортировать текущие данные, загрузив их из файла /// </summary> private void ExportCurDataFromFile(Exporter exporter) { // загрузка текущего среза из файла SrezTableLight srezTable = new SrezTableLight(); SrezAdapter srezAdapter = new SrezAdapter(); srezAdapter.FileName = ServerUtils.BuildCurFileName(Settings.ArcDir); try { srezAdapter.Fill(srezTable); } catch (Exception ex) { log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при загрузке текущего среза из файла {0}: {1}" : "Error loading current data from file {0}: {1}", srezAdapter.FileName, ex.Message)); } // добавление среза в очередь экспорта if (srezTable.SrezList.Count > 0) { SrezTableLight.Srez sourceSrez = srezTable.SrezList.Values[0]; SrezTableLight.Srez srez = new SrezTableLight.Srez(DateTime.Now, sourceSrez.CnlNums, sourceSrez); exporter.EnqueueCurData(srez); log.WriteAction(Localization.UseRussian ? "Текущие данные добавлены в очередь экспорта" : "Current data added to export queue"); } else { log.WriteAction(Localization.UseRussian ? "Отсутствуют текущие данные для экспорта" : "No current data to export"); } }
/// <summary> /// Экспортировать архивные данные, загрузив их из файла /// </summary> private void ExportArcDataFromFile(Exporter exporter, DateTime dateTime) { // загрузка таблицы минутных срезов из файла SrezTableLight srezTable = new SrezTableLight(); SrezAdapter srezAdapter = new SrezAdapter(); srezAdapter.FileName = ServerUtils.BuildMinFileName(Settings.ArcDir, dateTime); try { srezAdapter.Fill(srezTable); } catch (Exception ex) { log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при загрузке таблицы минутных срезов из файла {0}: {1}" : "Error loading minute data table from file {0}: {1}", srezAdapter.FileName, ex.Message)); } // поиск среза на заданное время SrezTableLight.Srez srez = srezTable.GetSrez(dateTime); // добавление среза в очередь экспорта if (srez == null) { log.WriteAction(Localization.UseRussian ? "Отсутствуют архивные данные для экспорта" : "No archive data to export"); } else { exporter.EnqueueArcData(srez); log.WriteAction(Localization.UseRussian ? "Архивные данные добавлены в очередь экспорта" : "Archive data added to export queue"); } }
public RSComparator(XElement xe, Workflow wf) : base(xe, wf) { indata = GetSetting("indata"); cnlNums = GetSettings("cnlnum"); xVars = GetSettings("var"); condition = GetSetting("condition"); outdataTrues = GetSettings("outdataTrue"); outdataFalses = GetSettings("outdataFalses"); sa = new SrezAdapter(); stls = new STLs(); xArgs = new List <Argument> (); Cnls = new List <Cnl> (); CalcArgs = new List <Argument> (); odts = new List <Argument> (); odfs = new List <Argument> (); srvs = wf.RSSrvs; LoadCnls(); LoadVars(); LoadODTs(); }
/// <summary> /// Построить полное имя файла таблицы часовых срезов на основе даты /// </summary> public static string BuildHourFileName(string arcDir, DateTime date) { return((new StringBuilder()) .Append(arcDir).Append("Hour").Append(Path.DirectorySeparatorChar) .Append(SrezAdapter.BuildHourTableName(date)) .ToString()); }
/// <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"); } SrezAdapter srezAdapter = new SrezAdapter(); srezAdapter.Directory = directory; srezAdapter.TableName = tableName; SrezTable srezTable = new SrezTable(); if (LoadSrezTable(srezAdapter, errLog, ref srezTable)) { FrmSrezTableEdit frmSrezTableEdit = new FrmSrezTableEdit(); frmSrezTableEdit.errLog = errLog; frmSrezTableEdit.srezAdapter = srezAdapter; frmSrezTableEdit.srezTable = srezTable; frmSrezTableEdit.editMode = editMode; frmSrezTableEdit.ShowDialog(); } }
/// <summary> /// Get a table of hourly data per day from the cache or from the server /// </summary> /// <remarks>The returned table after loading is not changed by an instance of this class, /// thus, reading its data is thread safe. /// The method always returns a non-null object.</remarks> public SrezTableLight GetHourTable(DateTime date) { try { // getting the table of hourly slices from the cache date = date.Date; var utcNowDT = DateTime.UtcNow; var cacheItem = HourTableCache.GetOrCreateItem(date, utcNowDT); // block access to only one table of hourly slices lock (cacheItem) { var table = cacheItem.Value; // table to get var tableAge = cacheItem.ValueAge; // table file change time bool tableIsNotValid = utcNowDT - cacheItem.ValueRefrDT > DataValidSpan; // the table might be out of date // getting time slice table from server if (table == null || tableIsNotValid) { string tableName = SrezAdapter.BuildHourTableName(date); var newTableAge = serverComm.ReceiveFileAge(ServerComm.Dirs.Hour, tableName); if (newTableAge == DateTime.MinValue) { // the table file does not exist or there is no connection to the server table = null; // do not clog the log //log.WriteError($"Unable to receive modification time of the hourly data table {tableName}"); } else if (newTableAge != tableAge) // table file changed { table = new SrezTableLight(); if (serverComm.ReceiveSrezTable(tableName, table)) { table.FileModTime = newTableAge; table.LastFillTime = utcNowDT; } else { throw new ScadaException("Unable to receive hourly data table."); } } if (table == null) { table = new SrezTableLight(); } // update table in cache HourTableCache.UpdateItem(cacheItem, table, newTableAge, utcNowDT); } return(table); } } catch (Exception ex) { log.WriteException(ex, "Error getting hourly data table for {0} from the cache or from the server", date.ToLocalizedDateString()); return(new SrezTableLight()); } }
/// <summary> /// 构造函数 /// </summary> public SrezTableCache(DateTime date) { AccessDT = DateTime.Now; Date = date; SrezTable = new SrezTable(); SrezTableCopy = new SrezTable(); SrezAdapter = new SrezAdapter(); SrezCopyAdapter = new SrezAdapter(); }
private bool editMode; // режим редактирования /// <summary> /// Конструктор /// </summary> private FrmSrezTableEdit() { InitializeComponent(); errLog = null; srezAdapter = null; srezTable = null; dataTable1 = null; dataTable2 = null; selSrez = null; editMode = false; }
/// <summary> /// Initializes a new instance of the class. /// </summary> public FrmSnapshotTable(Log errLog) : this() { this.errLog = errLog ?? throw new ArgumentNullException("errLog"); srezAdapter = new SrezAdapter(); srezTable = new SrezTable(); dataTable1 = null; dataTable2 = null; selSrez = null; FileName = ""; AllowEdit = false; }
private void btnOpen_Click(object sender, EventArgs e) { try { if (rbSnapshot.Checked) { dataTable = new DataTable("SrezTable"); srezTable = new SrezTable(); SrezAdapter sa = new SrezAdapter(); sa.FileName = txtFileName.Text; sa.Fill(dataTable); sa.Fill(srezTable); dataTable.RowChanged += DataTable_RowChanged; dataTable.Columns["DateTime"].ReadOnly = true; dataTable.Columns["CnlNum"].ReadOnly = true; } else if (rbEvent.Checked) { dataTable = new DataTable("EventTable"); srezTable = null; EventAdapter ea = new EventAdapter(); ea.FileName = txtFileName.Text; ea.Fill(dataTable); } else // rbBase.Checked { dataTable = new DataTable("BaseTable"); srezTable = null; BaseAdapter ba = new BaseAdapter(); ba.FileName = txtFileName.Text; ba.Fill(dataTable, true); } dataTable.DefaultView.AllowNew = !rbSnapshot.Checked; dataTable.DefaultView.AllowEdit = true; dataGridView.DataSource = dataTable; } catch (Exception ex) { dataTable = null; ScadaUiUtils.ShowError(ex.Message); } finally { ShowRecordCount(); } }
/// <summary> /// Download the slices table /// </summary> private static bool LoadSrezTable(SrezAdapter srezAdapter, Log errLog, ref SrezTable srezTable) { try { srezAdapter.Fill(srezTable); return(true); } catch (Exception ex) { string errMsg = AppPhrases.LoadSrezTableError + ":\r\n" + ex.Message; if (errLog != null) { errLog.WriteAction(errMsg, Log.ActTypes.Exception); } ScadaUiUtils.ShowError(errMsg); return(false); } finally { Cursor.Current = Cursors.Default; } }
/// <summary> /// Get the trend of the minute data of the specified channel for the day /// </summary> /// <remarks>Returned trend after loading is not changed by an instance of this class, /// thus, reading its data is thread safe. /// The method always returns a non-null object.</remarks> public Trend GetMinTrend(DateTime date, int cnlNum) { var trend = new Trend(cnlNum); try { if (serverComm.ReceiveTrend(SrezAdapter.BuildMinTableName(date), date, trend)) { trend.LastFillTime = DateTime.UtcNow; // consistent with hourly data and events } else { throw new ScadaException("Unable to receive trend."); } } catch (Exception ex) { log.WriteException(ex, "Error getting minute data trend for {0}", date.ToLocalizedDateString()); } return(trend); }
/// <summary> /// Заполнить таблицу срезов /// </summary> public static void FillSrezTable(SrezTable srezTable, SrezAdapter srezAdapter) { string fileName = srezAdapter.FileName; if (File.Exists(fileName)) { // определение времени последнего изменения файла таблицы срезов DateTime fileModTime = File.GetLastWriteTime(fileName); // загрузка данных, если файл был изменён if (srezTable.FileModTime != fileModTime) { srezAdapter.Fill(srezTable); srezTable.FileModTime = fileModTime; } } else { srezTable.Clear(); } }
/// <summary> /// 填写切片表 /// </summary> public static void FillSrezTable(SrezTable srezTable, SrezAdapter srezAdapter) { string fileName = srezAdapter.FileName; if (File.Exists(fileName)) { // 确定切片表文件的最后修改时间 DateTime fileModTime = File.GetLastWriteTime(fileName); // 如果文件已更改,则加载数据 if (srezTable.FileModTime != fileModTime) { srezAdapter.Fill(srezTable); srezTable.FileModTime = fileModTime; } } else { srezTable.Clear(); } }
public RSSendValues (XElement xe,Workflow wf): base(xe,wf) { srvs = wf.RSSrvs; indata = GetSetting ("indata"); cnlNums = GetSettings ("cnlnum"); xVars = GetSettings ("var"); sendValues = GetSettings("sendValue"); sa = new SrezAdapter (); stls = new STLs (); xArgs = new List<Argument> (); Cnls = new List<Cnl> (); CalcArgs = new List<Argument> (); SendVals = new List<Argument> (); LoadCnls (); LoadVars (); LoadSendValues (); }
/// <summary> /// Requests input channel data from Server. /// </summary> private static Trend GetTrend(DateTime date, int cnlNum, bool chekHours) { string tableName = chekHours ? SrezAdapter.BuildHourTableName(date) : SrezAdapter.BuildMinTableName(date); Trend trend = new Trend(cnlNum); bool dataReceived = serverComm.ReceiveTrend(tableName, date, trend); //serverComm.Close(); if (dataReceived) { trend.LastFillTime = DateTime.UtcNow; } else { Log.WriteError("Unable to receive trend."); } return(trend); }
private void btnSave_Click(object sender, EventArgs e) { try { if (dataTable == null) { ScadaUiUtils.ShowWarning("Table is not initialized."); } else { if (rbSnapshot.Checked) { var sa = new SrezAdapter { FileName = txtFileName.Text }; sa.Update(srezTable); } else if (rbEvent.Checked) { var ea = new EventAdapter { FileName = txtFileName.Text }; ea.Update(dataTable); } else // rbBase.Checked { var ba = new BaseAdapter { FileName = txtFileName.Text }; ba.Update(dataTable); } ScadaUiUtils.ShowInfo("Data saved successfully."); } } catch (Exception ex) { ScadaUiUtils.ShowError(ex.Message); } }
/// <summary> /// Получить таблицу часовых данных за сутки из кэша или от сервера /// </summary> /// <remarks>Возвращаемая таблица после загрузки не изменяется экземпляром данного класса, /// таким образом, чтение её данных является потокобезопасным. /// Метод всегда возвращает объект, не равный null</remarks> public SrezTableLight GetHourTable(DateTime date) { try { // получение таблицы часовых срезов из кэша date = date.Date; DateTime utcNowDT = DateTime.UtcNow; Cache <DateTime, SrezTableLight> .CacheItem cacheItem = HourTableCache.GetOrCreateItem(date, utcNowDT); // блокировка доступа только к одной таблице часовых срезов lock (cacheItem) { SrezTableLight table = cacheItem.Value; // таблица, которую необходимо получить DateTime tableAge = cacheItem.ValueAge; // время изменения файла таблицы bool tableIsNotValid = utcNowDT - cacheItem.ValueRefrDT > DataValidSpan; // таблица могла устареть // получение таблицы часовых срезов от сервера if (table == null || tableIsNotValid) { string tableName = SrezAdapter.BuildHourTableName(date); DateTime newTableAge = serverComm.ReceiveFileAge(ServerComm.Dirs.Hour, tableName); if (newTableAge == DateTime.MinValue) // файл таблицы не существует или нет связи с сервером { table = null; // не засорять лог /*log.WriteError(string.Format(Localization.UseRussian ? * "Не удалось принять время изменения таблицы часовых данных {0}" : * "Unable to receive modification time of the hourly data table {0}", tableName));*/ } else if (newTableAge != tableAge) // файл таблицы изменён { table = new SrezTableLight(); if (serverComm.ReceiveSrezTable(tableName, table)) { table.FileModTime = newTableAge; table.LastFillTime = utcNowDT; } else { throw new ScadaException(Localization.UseRussian ? "Не удалось принять таблицу часовых срезов." : "Unable to receive hourly data table."); } } if (table == null) { table = new SrezTableLight(); } // обновление таблицы в кэше HourTableCache.UpdateItem(cacheItem, table, newTableAge, utcNowDT); } return(table); } } catch (Exception ex) { log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении таблицы часовых данных за {0} из кэша или от сервера" : "Error getting hourly data table for {0} from the cache or from the server", date.ToLocalizedDateString()); return(new SrezTableLight()); } }