Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        /// <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");
            }
        }
Esempio n. 4
0
        /// <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");
            }
        }
Esempio n. 5
0
        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();
        }
Esempio n. 6
0
 /// <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());
 }
Esempio n. 7
0
        /// <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();
            }
        }
Esempio n. 8
0
        /// <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());
            }
        }
Esempio n. 9
0
 /// <summary>
 /// 构造函数
 /// </summary>
 public SrezTableCache(DateTime date)
 {
     AccessDT        = DateTime.Now;
     Date            = date;
     SrezTable       = new SrezTable();
     SrezTableCopy   = new SrezTable();
     SrezAdapter     = new SrezAdapter();
     SrezCopyAdapter = new SrezAdapter();
 }
Esempio n. 10
0
        private bool editMode;           // режим редактирования


        /// <summary>
        /// Конструктор
        /// </summary>
        private FrmSrezTableEdit()
        {
            InitializeComponent();
            errLog      = null;
            srezAdapter = null;
            srezTable   = null;
            dataTable1  = null;
            dataTable2  = null;
            selSrez     = null;
            editMode    = false;
        }
Esempio n. 11
0
        /// <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;
        }
Esempio n. 12
0
        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();
            }
        }
Esempio n. 13
0
 /// <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;
     }
 }
Esempio n. 14
0
        /// <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);
        }
Esempio n. 15
0
            /// <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();
                }
            }
Esempio n. 16
0
            /// <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();
                }
            }
Esempio n. 17
0
		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 ();

		}
Esempio n. 18
0
        /// <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);
        }
Esempio n. 19
0
        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);
            }
        }
Esempio n. 20
0
        /// <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());
            }
        }