Пример #1
0
 public override void OnEventCreating(EventTableLight.Event ev)
 {
     // the method executes on event creating, event properties could be changed here
     // метод выполняется при создании события, свойства события можно изменить здесь
 }
Пример #2
0
        /// <summary>
        /// Получить события, соответствующие фильтру, из таблицы событий
        /// </summary>
        /// <remarks>Если cnlsFilter равен null, то фильтрация не производится</remarks>
        public List<EventTableLight.Event> GetEvents(EventTableLight eventTable, List<int> cnlsFilter)
        {
            Monitor.Enter(eventLock);
            List<EventTableLight.Event> eventList = null;

            try
            {
                if (eventTable != null)
                {
                    if (cnlsFilter == null)
                    {
                        eventList = eventTable.AllEvents;
                    }
                    else
                    {
                        eventTable.Filters = EventTableLight.EventFilters.Cnls;
                        eventTable.CnlsFilter = cnlsFilter;
                        eventList = eventTable.FilteredEvents;
                    }
                }
            }
            catch (Exception ex)
            {
                AppData.Log.WriteAction((Localization.UseRussian ? "Ошибка при получении событий: " : 
                    "Error getting events: ") + ex.Message, Log.ActTypes.Exception);
            }
            finally
            {
                Monitor.Exit(eventLock);
            }

            return eventList;
        }
Пример #3
0
 /// <summary>
 /// Заполнить таблицу eventTableLight из файла или потока
 /// </summary>
 public void Fill(EventTableLight eventTableLight)
 {
     FillObj(eventTableLight);
 }
Пример #4
0
 /// <summary>
 /// Экспортировать событие
 /// </summary>
 private void ExportEvent(DbCommand cmd, EventTableLight.Event ev)
 {
     DataSource.SetCmdParam(cmd, "dateTime", ev.DateTime);
     DataSource.SetCmdParam(cmd, "objNum", ev.ObjNum);
     DataSource.SetCmdParam(cmd, "kpNum", ev.KPNum);
     DataSource.SetCmdParam(cmd, "paramID", ev.ParamID);
     DataSource.SetCmdParam(cmd, "cnlNum", ev.CnlNum);
     DataSource.SetCmdParam(cmd, "oldCnlVal", ev.OldCnlVal);
     DataSource.SetCmdParam(cmd, "oldCnlStat", ev.OldCnlStat);
     DataSource.SetCmdParam(cmd, "newCnlVal", ev.NewCnlVal);
     DataSource.SetCmdParam(cmd, "newCnlStat", ev.NewCnlStat);
     DataSource.SetCmdParam(cmd, "checked", ev.Checked);
     DataSource.SetCmdParam(cmd, "userID", ev.UserID);
     DataSource.SetCmdParam(cmd, "descr", ev.Descr);
     DataSource.SetCmdParam(cmd, "data", ev.Data);
     cmd.ExecuteNonQuery();
 }
Пример #5
0
        /// <summary>
        /// Записать событие в таблицу событий
        /// </summary>
        private bool WriteEvent(string tableName, EventAdapter eventAdapter, EventTableLight.Event ev)
        {
            string fileName = "";

            try
            {
                lock (eventAdapter)
                {
                    eventAdapter.TableName = tableName;
                    fileName = eventAdapter.FileName;
                    eventAdapter.AppendEvent(ev);

                    if (Settings.DetailedLog)
                    {
                        string tableDescr = eventAdapter == this.eventAdapter ?
                            (Localization.UseRussian ? "событий" : "event") :
                            (Localization.UseRussian ? "копий событий" : "event copy");
                        AppLog.WriteAction(string.Format(Localization.UseRussian ?
                            "Запись события в таблицу {0} завершена" : "Writing event 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 in the event table: {0}{1}",
                    ex.Message, fileNameStr), Log.ActTypes.Exception);
                return false;
            }
        }
Пример #6
0
 /// <summary>
 /// Обработать новое событие
 /// </summary>
 public bool ProcEvent(EventTableLight.Event ev)
 {
     if (serverIsReady)
         return ev == null ? true : WriteEvent(ev);
     else
         return false;
 }
Пример #7
0
 /// <summary>
 /// Выполнить действия после создания события и записи на диск
 /// </summary>
 public override void OnEventCreated(EventTableLight.Event ev)
 {
     // экспорт события в БД
     if (normalWork)
     {
         // добавление события в очередь экспорта
         foreach (Exporter exporter in exporters)
             exporter.EnqueueEvent(ev);
     }
 }
Пример #8
0
 /// <summary>
 /// Выполнить действия при создании события
 /// </summary>
 /// <remarks>Событие вызывается до записи на диск, поэтому свойства события можно изменить</remarks>
 public virtual void OnEventCreating(EventTableLight.Event ev)
 {
 }
Пример #9
0
        /// <summary>
        /// Обновить таблицы базы конфигурации и событий, если они изменились
        /// </summary>
        /// <param name="reqDate">Дата запрашиваемых событий</param>
        /// <param name="eventTable">Таблица событий</param>
        public void RefreshEvents(DateTime reqDate, out EventTableLight eventTable)
        {
            RefreshBase();
            Monitor.Enter(refrLock);

            try
            {
                // обновление таблицы событий
                string eventTableName = "e" + reqDate.ToString("yyMMdd") + ".dat";
                eventTable = null;

                // поиск индекса таблицы событий в кэше
                int tableIndex = -1;
                for (int i = 0; i < EventCacheSize; i++)
                {
                    eventTable = eventTableCache[i];
                    if (eventTable != null && eventTable.TableName == eventTableName)
                    {
                        tableIndex = i;
                        break;
                    }
                }

                if (tableIndex < 0 || (DateTime.Now - eventTable.LastFillTime).TotalSeconds > EventValidTime /*данные устарели*/)
                {
                    DateTime fileModTime = serverComm.ReceiveFileAge(ServerComm.Dirs.Events, eventTableName);

                    if (tableIndex < 0)
                    {
                        eventTable = null;

                        // определение места в кэше для новой таблицы событий
                        tableIndex = eventTableIndex;
                        if (++eventTableIndex == EventCacheSize)
                            eventTableIndex = 0;
                    }

                    if (eventTable == null || fileModTime != eventTable.FileModTime /*файл событий изменён*/)
                    {
                        // создание новой таблицы событий
                        eventTable = new EventTableLight();
                        eventTableCache[tableIndex] = eventTable;

                        // загрузка таблицы часовых срезов
                        if (serverComm.ReceiveEventTable(eventTableName, eventTable))
                            eventTable.FileModTime = fileModTime;
                    }
                }
            }
            finally
            {
                Monitor.Exit(refrLock);
            }
        }
Пример #10
0
        /// <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");
            }
        }
Пример #11
0
        /// <summary>
        /// Преобразовать событие в удобную для отображения форму
        /// </summary>
        private EventView ConvEvent(EventTableLight.Event ev)
        {
            EventView eventView = new EventView();

            eventView.Num = ev.Number.ToString();
            eventView.Date = ev.DateTime.ToString("d", Localization.Culture);
            eventView.Time = ev.DateTime.ToString("T", Localization.Culture);
            eventView.Text = ev.Descr;

            // получение свойств канала события
            InCnlProps cnlProps = GetCnlProps(ev.CnlNum);

            // определение наименования объекта
            if (cnlProps == null || cnlProps.ObjNum != ev.ObjNum)
            {
                tblObj.DefaultView.RowFilter = "ObjNum = " + ev.ObjNum;
                if (tblObj.DefaultView.Count > 0)
                    eventView.Obj = (string)tblObj.DefaultView[0]["Name"];
            }
            else
            {
                eventView.Obj = cnlProps.ObjName;
            }

            // определение наименования КП
            if (cnlProps == null || cnlProps.KPNum != ev.KPNum)
            {
                tblKP.DefaultView.RowFilter = "KPNum = " + ev.KPNum;
                if (tblKP.DefaultView.Count > 0)
                    eventView.KP = (string)tblKP.DefaultView[0]["Name"];
            }
            else
            {
                eventView.KP = cnlProps.KPName;
            }

            if (cnlProps != null)
            {
                // определение наименования канала и признака звука
                eventView.Cnl = cnlProps.CnlName;
                eventView.Sound = cnlProps.EvSound;

                // проверка нового статуса канала
                int newCnlStat = ev.NewCnlStat;
                bool newValIsUndef = newCnlStat <= BaseValues.CnlStatuses.Undefined ||
                    newCnlStat == BaseValues.CnlStatuses.FormulaError || 
                    newCnlStat == BaseValues.CnlStatuses.Unreliable;

                // определение цвета
                if (!cnlProps.ShowNumber && cnlProps.UnitArr != null && cnlProps.UnitArr.Length == 2)
                {
                    if (!newValIsUndef)
                        eventView.Color = ev.NewCnlVal > 0 ? "green" : "red";
                }
                else
                {
                    string color;
                    if (GetColorByStat(newCnlStat, out color))
                        eventView.Color = color;
                }

                // определение текста события, если не задано его описание
                if (eventView.Text == "")
                {
                    // получение типа события
                    tblEvType.DefaultView.RowFilter = "CnlStatus = " + newCnlStat;
                    string evTypeName = tblEvType.DefaultView.Count > 0 ? 
                        (string)tblEvType.DefaultView[0]["Name"] : "";

                    if (newValIsUndef)
                    {
                        eventView.Text = evTypeName;
                    }
                    else if (cnlProps.ShowNumber)
                    {
                        // добавление типа события
                        if (evTypeName != "")
                            eventView.Text = evTypeName + ": ";
                        // добавление значения канала
                        nfi.NumberDecimalDigits = cnlProps.DecDigits;
                        nfi.NumberDecimalSeparator = defDecSep;
                        nfi.NumberGroupSeparator = defGrSep;
                        eventView.Text += ev.NewCnlVal.ToString("N", nfi);
                        // добавление размерности
                        if (cnlProps.UnitArr != null)
                            eventView.Text += " " + cnlProps.UnitArr[0];
                    }
                    else if (cnlProps.UnitArr != null)
                    {
                        int unitInd = (int)ev.NewCnlVal;
                        if (unitInd < 0) 
                            unitInd = 0;
                        else if (unitInd >= cnlProps.UnitArr.Length) 
                            unitInd = cnlProps.UnitArr.Length - 1;
                        eventView.Text = cnlProps.UnitArr[unitInd];
                    }
                }
            }

            // определение свойств квитирования
            eventView.Check = ev.Checked;

            if (ev.Checked)
            {
                tblUser.DefaultView.RowFilter = "UserID = " + ev.UserID;
                eventView.User = tblUser.DefaultView.Count > 0 ? (string)tblUser.DefaultView[0]["Name"] : WebPhrases.EventChecked;
            }
            else
            {
                eventView.User = WebPhrases.EventUnchecked;
            }

            return eventView;
        }
Пример #12
0
        /// <summary>
        /// Преобразовать событие в удобную для отображения форму
        /// </summary>
        public EventView ConvertEvent(EventTableLight.Event ev)
        {
            Monitor.Enter(baseLock);
            EventView eventView = null;

            try 
            {
                if (ev != null)
                    eventView = ConvEvent(ev);
            }
            catch (Exception ex)
            {
                AppData.Log.WriteAction((Localization.UseRussian ? 
                    "Ошибка при преобразовании события в удобную для отображения форму: " :
                    "Error converting event to a suitable view") + ex.Message, Log.ActTypes.Exception);
            }
            finally 
            {
                Monitor.Exit(baseLock); 
            }

            return eventView;
        }
Пример #13
0
        /// <summary>
        /// Получить события, соответствующие фильтру, из таблицы событий, начиная с заданного номера события
        /// </summary>
        /// <remarks>Если cnlsFilter равен null, то фильтрация не производится</remarks>
        public List<EventTableLight.Event> GetEvents(EventTableLight eventTable, List<int> cnlsFilter, 
            int startEvNum)
        {
            Monitor.Enter(eventLock);
            List<EventTableLight.Event> eventList = null;

            try
            {
                if (eventTable != null)
                {
                    eventTable.Filters = cnlsFilter == null ?
                        EventTableLight.EventFilters.None : EventTableLight.EventFilters.Cnls;
                    eventTable.CnlsFilter = cnlsFilter;
                    eventList = eventTable.GetEvents(startEvNum);
                }
            }
            catch (Exception ex)
            {
                AppData.Log.WriteAction((Localization.UseRussian ? 
                    "Ошибка при получении событий, начиная с заданного номера: " :
                    "Error getting events starting from the specified number: ") + ex.Message, Log.ActTypes.Exception);
            }
            finally
            {
                Monitor.Exit(eventLock);
            }

            return eventList;
        }
Пример #14
0
        /// <summary>
        /// Заполнить объект dest из файла событий FileName
        /// </summary>
        protected void FillObj(object dest)
        {
            Stream       stream   = null;
            BinaryReader reader   = null;
            DateTime     fillTime = DateTime.Now;

            EventTableLight eventTableLight = null;
            DataTable       dataTable       = null;

            try
            {
                if (dest is EventTableLight)
                {
                    eventTableLight = dest as EventTableLight;
                }
                else if (dest is DataTable)
                {
                    dataTable = dest as DataTable;
                }
                else
                {
                    throw new ScadaException("Destination object is invalid.");
                }

                // определение даты событий в таблице
                DateTime date = Arithmetic.ExtractDate(tableName);

                // подготовка объекта для хранения данных
                if (eventTableLight != null)
                {
                    eventTableLight.Clear();
                    eventTableLight.TableName = tableName;
                }
                else // dataTable != null
                {
                    // формирование структуры таблицы
                    dataTable.BeginLoadData();
                    dataTable.DefaultView.Sort = "";

                    if (dataTable.Columns.Count == 0)
                    {
                        dataTable.Columns.Add("Number", typeof(int));
                        dataTable.Columns.Add("DateTime", typeof(DateTime)).DefaultValue = date;
                        dataTable.Columns.Add("ObjNum", typeof(int)).DefaultValue        = 0;
                        dataTable.Columns.Add("KPNum", typeof(int)).DefaultValue         = 0;
                        dataTable.Columns.Add("ParamID", typeof(int)).DefaultValue       = 0;
                        dataTable.Columns.Add("CnlNum", typeof(int)).DefaultValue        = 0;
                        dataTable.Columns.Add("OldCnlVal", typeof(double)).DefaultValue  = 0.0;
                        dataTable.Columns.Add("OldCnlStat", typeof(int)).DefaultValue    = 0;
                        dataTable.Columns.Add("NewCnlVal", typeof(double)).DefaultValue  = 0.0;
                        dataTable.Columns.Add("NewCnlStat", typeof(int)).DefaultValue    = 0;
                        dataTable.Columns.Add("Checked", typeof(bool)).DefaultValue      = false;
                        dataTable.Columns.Add("UserID", typeof(int)).DefaultValue        = 0;
                        dataTable.Columns.Add("Descr", typeof(string));
                        dataTable.Columns.Add("Data", typeof(string));
                        dataTable.DefaultView.AllowNew    = false;
                        dataTable.DefaultView.AllowEdit   = false;
                        dataTable.DefaultView.AllowDelete = false;
                    }
                    else
                    {
                        DataColumn colDateTime = dataTable.Columns["DateTime"];
                        if (colDateTime != null)
                        {
                            colDateTime.DefaultValue = date;
                        }
                        dataTable.Rows.Clear();
                    }
                }

                // заполнение таблицы из файла
                stream = ioStream == null ?
                         new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) :
                         ioStream;
                reader = new BinaryReader(stream);

                Byte[] eventBuf = new byte[EventDataSize]; // буфер данных события
                int    evNum    = 1;                       // порядковый номер события

                while (stream.Position < stream.Length)
                {
                    int readSize = reader.Read(eventBuf, 0, EventDataSize);
                    if (readSize == EventDataSize)
                    {
                        // создание события на основе считанных данных
                        EventTableLight.Event ev = new EventTableLight.Event();
                        ev.Number = evNum;
                        evNum++;

                        double time = BitConverter.ToDouble(eventBuf, 0);
                        int    hour, min, sec;
                        Arithmetic.DecodeTime(time, out hour, out min, out sec);
                        ev.DateTime = new DateTime(date.Year, date.Month, date.Day, hour, min, sec);

                        ev.ObjNum     = BitConverter.ToUInt16(eventBuf, 8);
                        ev.KPNum      = BitConverter.ToUInt16(eventBuf, 10);
                        ev.ParamID    = BitConverter.ToUInt16(eventBuf, 12);
                        ev.CnlNum     = BitConverter.ToUInt16(eventBuf, 14);
                        ev.OldCnlVal  = BitConverter.ToDouble(eventBuf, 16);
                        ev.OldCnlStat = eventBuf[24];
                        ev.NewCnlVal  = BitConverter.ToDouble(eventBuf, 25);
                        ev.NewCnlStat = eventBuf[33];
                        ev.Checked    = eventBuf[34] > 0;
                        ev.UserID     = BitConverter.ToUInt16(eventBuf, 35);
                        ev.Descr      = BytesToStr(eventBuf, 37);
                        ev.Data       = BytesToStr(eventBuf, 138);

                        // создание строки заполняемой таблицы
                        if (eventTableLight != null)
                        {
                            eventTableLight.AllEvents.Add(ev); // быстрее, чем eventTableLight.AddEvent(ev)
                        }
                        else // dataTable != null
                        {
                            DataRow row = dataTable.NewRow();
                            row["Number"]     = ev.Number;
                            row["DateTime"]   = ev.DateTime;
                            row["ObjNum"]     = ev.ObjNum;
                            row["KPNum"]      = ev.KPNum;
                            row["ParamID"]    = ev.ParamID;
                            row["CnlNum"]     = ev.CnlNum;
                            row["OldCnlVal"]  = ev.OldCnlVal;
                            row["OldCnlStat"] = ev.OldCnlStat;
                            row["NewCnlVal"]  = ev.NewCnlVal;
                            row["NewCnlStat"] = ev.NewCnlStat;
                            row["Checked"]    = ev.Checked;
                            row["UserID"]     = ev.UserID;
                            row["Descr"]      = ev.Descr;
                            row["Data"]       = ev.Data;
                            dataTable.Rows.Add(row);
                        }
                    }
                }
            }
            catch (EndOfStreamException)
            {
                // нормальная ситуация окончания файла
            }
            catch
            {
                fillTime = DateTime.MinValue;
                throw;
            }
            finally
            {
                if (fileMode)
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }
                    if (stream != null)
                    {
                        stream.Close();
                    }
                }

                if (eventTableLight != null)
                {
                    eventTableLight.LastFillTime = fillTime;
                }
                else if (dataTable != null)
                {
                    dataTable.EndLoadData();
                    dataTable.AcceptChanges();
                    dataTable.DefaultView.Sort = "Number";
                }
            }
        }
Пример #15
0
        /// <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;
        }
Пример #16
0
 /// <summary>
 /// Заполнить таблицу eventTableLight из файла или потока
 /// </summary>
 public void Fill(EventTableLight eventTableLight)
 {
     FillObj(eventTableLight);
 }
Пример #17
0
        /// <summary>
        /// Отправить событие SCADA-Серверу
        /// </summary>
        public bool SendEvent(EventTableLight.Event aEvent, out bool result)
        {
            Monitor.Enter(tcpLock);
            bool complete = false;
            result = false;
            errMsg = "";

            try
            {
                if (RestoreConnection())
                {
                    commState = CommStates.WaitResponse;
                    tcpClient.ReceiveTimeout = commSettings.ServerTimeout;

                    // отправка команды записи события
                    byte descrLen = (byte)aEvent.Descr.Length;
                    byte dataLen = (byte)aEvent.Data.Length;
                    int cmdLen = 46 + descrLen + dataLen;
                    byte[] buf = new byte[cmdLen];
                    buf[0] = (byte)(cmdLen % 256);
                    buf[1] = (byte)(cmdLen / 256);
                    buf[2] = 0x05;

                    double evDT = Arithmetic.EncodeDateTime(aEvent.DateTime);
                    byte[] bytes = BitConverter.GetBytes(evDT);
                    Array.Copy(bytes, 0, buf, 3, 8);

                    buf[11] = (byte)(aEvent.ObjNum % 256);
                    buf[12] = (byte)(aEvent.ObjNum / 256);
                    buf[13] = (byte)(aEvent.KPNum % 256);
                    buf[14] = (byte)(aEvent.KPNum / 256);
                    buf[15] = (byte)(aEvent.ParamID % 256);
                    buf[16] = (byte)(aEvent.ParamID / 256);

                    bytes = BitConverter.GetBytes(aEvent.CnlNum);
                    Array.Copy(bytes, 0, buf, 17, 4);
                    bytes = BitConverter.GetBytes(aEvent.OldCnlVal);
                    Array.Copy(bytes, 0, buf, 21, 8);
                    bytes = BitConverter.GetBytes(aEvent.OldCnlStat);
                    Array.Copy(bytes, 0, buf, 29, 2);
                    bytes = BitConverter.GetBytes(aEvent.NewCnlVal);
                    Array.Copy(bytes, 0, buf, 31, 8);
                    bytes = BitConverter.GetBytes(aEvent.NewCnlStat);
                    Array.Copy(bytes, 0, buf, 39, 2);

                    buf[41] = aEvent.Checked ? (byte)0x01 : (byte)0x00;
                    buf[42] = (byte)(aEvent.UserID % 256);
                    buf[43] = (byte)(aEvent.UserID / 256);

                    buf[44] = descrLen;
                    Array.Copy(Encoding.Default.GetBytes(aEvent.Descr), 0, buf, 45, descrLen);
                    buf[45 + descrLen] = dataLen;
                    Array.Copy(Encoding.Default.GetBytes(aEvent.Data), 0, buf, 46 + descrLen, dataLen);

                    netStream.Write(buf, 0, cmdLen);

                    // приём результата
                    buf = new byte[4];
                    int bytesRead = netStream.Read(buf, 0, 4);

                    // обработка полученных данных
                    if (bytesRead == buf.Length && CheckDataFormat(buf, 0x05))
                    {
                        result = buf[3] > 0;
                        commState = result ? CommStates.Authorized : CommStates.NotReady;
                        complete = true;
                    }
                    else
                    {
                        errMsg = Localization.UseRussian ?
                            "Неверный формат ответа SCADA-Сервера на команду отправки события" :
                            "Incorrect SCADA-Server response to sending event command";
                        WriteAction(errMsg, Log.ActTypes.Error);
                        commState = CommStates.Error;
                    }
                }
            }
            catch (Exception ex)
            {
                errMsg = (Localization.UseRussian ? "Ошибка при отправке события SCADA-Серверу: " :
                    "Error sending event to SCADA-Server: ") + ex.Message;
                WriteAction(errMsg, Log.ActTypes.Exception);
                Disconnect();
            }
            finally
            {
                RestoreReceiveTimeout();
                Monitor.Exit(tcpLock);
            }

            return complete;
        }
Пример #18
0
 /// <summary>
 /// Вызвать событие OnEventCreating для модулей
 /// </summary>
 private void RaiseOnEventCreating(EventTableLight.Event ev)
 {
     lock (modules)
     {
         foreach (ModLogic modLogic in modules)
         {
             try
             {
                 modLogic.OnEventCreating(ev);
             }
             catch (Exception ex)
             {
                 AppLog.WriteAction(string.Format(Localization.UseRussian ?
                     "Ошибка при выполнении действий при создании события в модуле {0}: {1}" :
                     "Error executing actions on event creating in module {0}: {1}",
                     modLogic.Name, ex.Message), Log.ActTypes.Exception);
             }
         }
     }
 }
Пример #19
0
        /// <summary>
        /// �������� ������� ���� ������������ � �������, ���� ��� ����������
        /// </summary>
        /// <param name="reqDate">���� ������������� �������</param>
        /// <param name="eventTable">������� �������</param>
        public void RefreshEvents(DateTime reqDate, out EventTableLight eventTable)
        {
            RefreshBase();
            Monitor.Enter(refrLock);

            try
            {
                // ���������� ������� �������
                string eventTableName = "e" + reqDate.ToString("yyMMdd") + ".dat";
                eventTable = null;

                // ����� ������� ������� ������� � ����
                int tableIndex = -1;
                for (int i = 0; i < EventCacheSize; i++)
                {
                    eventTable = eventTableCache[i];
                    if (eventTable != null && eventTable.TableName == eventTableName)
                    {
                        tableIndex = i;
                        break;
                    }
                }

                if (tableIndex < 0 || (DateTime.Now - eventTable.LastFillTime).TotalSeconds > EventValidTime /*������ ��������*/)
                {
                    DateTime fileModTime = serverComm.ReceiveFileAge(ServerComm.Dirs.Events, eventTableName);

                    if (tableIndex < 0)
                    {
                        eventTable = null;

                        // ����������� ����� � ���� ��� ����� ������� �������
                        tableIndex = eventTableIndex;
                        if (++eventTableIndex == EventCacheSize)
                            eventTableIndex = 0;
                    }

                    if (eventTable == null || fileModTime != eventTable.FileModTime /*���� ������� ������*/)
                    {
                        // �������� ����� ������� �������
                        eventTable = new EventTableLight();
                        eventTableCache[tableIndex] = eventTable;

                        // �������� ������� ������� ������
                        if (serverComm.ReceiveEventTable(eventTableName, eventTable))
                            eventTable.FileModTime = fileModTime;
                    }
                }
            }
            finally
            {
                Monitor.Exit(refrLock);
            }
        }
Пример #20
0
        /// <summary>
        /// Записать событие в таблицы событий в соответствии с настройками, выполнить действия модулей
        /// </summary>
        private bool WriteEvent(EventTableLight.Event ev)
        {
            // выполнение действий модулей до записи
            RaiseOnEventCreating(ev);

            // запись событий
            string tableName = "e" + ev.DateTime.ToString("yyMMdd") + ".dat";
            bool writeOk1 = Settings.WriteEv ? WriteEvent(tableName, eventAdapter, ev) : true;
            bool writeOk2 = Settings.WriteEvCopy ? WriteEvent(tableName, eventCopyAdapter, ev) : true;

            // выполнение действий модулей после записи
            RaiseOnEventCreated(ev);

            return writeOk1 && writeOk2;
        }
Пример #21
0
        /// <summary>
        /// ������������� ������� � ������� ��� ����������� �����
        /// </summary>
        private EventView ConvEvent(EventTableLight.Event ev)
        {
            EventView eventView = new EventView();

            eventView.Num = ev.Number.ToString();
            eventView.Date = ev.DateTime.ToString("d", Localization.Culture);
            eventView.Time = ev.DateTime.ToString("T", Localization.Culture);
            eventView.Text = ev.Descr;

            // ��������� ������� ������ �������
            CnlProps cnlProps = GetCnlProps(ev.CnlNum);

            // ����������� ������������ �������
            if (cnlProps == null || cnlProps.ObjNum != ev.ObjNum)
            {
                tblObj.DefaultView.RowFilter = "ObjNum = " + ev.ObjNum;
                if (tblObj.DefaultView.Count > 0)
                    eventView.Obj = (string)tblObj.DefaultView[0]["Name"];
            }
            else
            {
                eventView.Obj = cnlProps.ObjName;
            }

            // ����������� ������������ ��
            if (cnlProps == null || cnlProps.KPNum != ev.KPNum)
            {
                tblKP.DefaultView.RowFilter = "KPNum = " + ev.KPNum;
                if (tblKP.DefaultView.Count > 0)
                    eventView.KP = (string)tblKP.DefaultView[0]["Name"];
            }
            else
            {
                eventView.KP = cnlProps.KPName;
            }

            if (cnlProps != null)
            {
                // ����������� ������������ ������ � �������� �����
                eventView.Cnl = cnlProps.CnlName;
                eventView.Sound = cnlProps.EvSound;

                // �������� ������ ������� ������
                int newCnlStat = ev.NewCnlStat;
                bool newValIsUndef = newCnlStat <= BaseValues.ParamStat.Undefined ||
                    newCnlStat == BaseValues.ParamStat.FormulaError || newCnlStat == BaseValues.ParamStat.Unreliable;

                // ����������� �����
                if (!cnlProps.ShowNumber && cnlProps.UnitArr != null && cnlProps.UnitArr.Length == 2)
                {
                    if (!newValIsUndef)
                        eventView.Color = ev.NewCnlVal > 0 ? "green" : "red";
                }
                else
                {
                    string color;
                    if (GetColorByStat(newCnlStat, out color))
                        eventView.Color = color;
                }

                // ����������� ������ �������, ���� �� ������ ��� ��������
                if (eventView.Text == "")
                {
                    // ��������� ���� �������
                    tblEvType.DefaultView.RowFilter = "CnlStatus = " + newCnlStat;
                    string evTypeName = tblEvType.DefaultView.Count > 0 ?
                        (string)tblEvType.DefaultView[0]["Name"] : "";

                    if (newValIsUndef)
                    {
                        eventView.Text = evTypeName;
                    }
                    else if (cnlProps.ShowNumber)
                    {
                        // ���������� ���� �������
                        if (evTypeName != "")
                            eventView.Text = evTypeName + ": ";
                        // ���������� �������� ������
                        nfi.NumberDecimalDigits = cnlProps.DecDigits;
                        nfi.NumberDecimalSeparator = defDecSep;
                        nfi.NumberGroupSeparator = defGrSep;
                        eventView.Text += ev.NewCnlVal.ToString("N", nfi);
                        // ���������� �����������
                        if (cnlProps.UnitArr != null)
                            eventView.Text += " " + cnlProps.UnitArr[0];
                    }
                    else if (cnlProps.UnitArr != null)
                    {
                        int unitInd = (int)ev.NewCnlVal;
                        if (unitInd < 0)
                            unitInd = 0;
                        else if (unitInd >= cnlProps.UnitArr.Length)
                            unitInd = cnlProps.UnitArr.Length - 1;
                        eventView.Text = cnlProps.UnitArr[unitInd];
                    }
                }
            }

            // ����������� ������� ������������
            eventView.Check = ev.Checked;

            if (ev.Checked)
            {
                tblUser.DefaultView.RowFilter = "UserID = " + ev.UserID;
                eventView.User = tblUser.DefaultView.Count > 0 ? (string)tblUser.DefaultView[0]["Name"] : WebPhrases.EventChecked;
            }
            else
            {
                eventView.User = WebPhrases.EventUnchecked;
            }

            return eventView;
        }
Пример #22
0
 /// <summary>
 /// Создать буфер для записи события
 /// </summary>
 protected byte[] CreateEventBuffer(EventTableLight.Event ev)
 {
     byte[] evBuf = new byte[EventDataSize];
     Array.Copy(BitConverter.GetBytes(Arithmetic.EncodeDateTime(ev.DateTime)), 0, evBuf, 0, 8);
     evBuf[8] = (byte)(ev.ObjNum % 256);
     evBuf[9] = (byte)(ev.ObjNum / 256);
     evBuf[10] = (byte)(ev.KPNum % 256);
     evBuf[11] = (byte)(ev.KPNum / 256);
     evBuf[12] = (byte)(ev.ParamID % 256);
     evBuf[13] = (byte)(ev.ParamID / 256);
     evBuf[14] = (byte)(ev.CnlNum % 256);
     evBuf[15] = (byte)(ev.CnlNum / 256);
     Array.Copy(BitConverter.GetBytes(ev.OldCnlVal), 0, evBuf, 16, 8);
     evBuf[24] = (byte)ev.OldCnlStat;
     Array.Copy(BitConverter.GetBytes(ev.NewCnlVal), 0, evBuf, 25, 8);
     evBuf[33] = (byte)ev.NewCnlStat;
     evBuf[34] = ev.Checked ? (byte)1 : (byte)0;
     evBuf[35] = (byte)(ev.UserID % 256);
     evBuf[36] = (byte)(ev.UserID / 256);
     string descr = ev.Descr ?? "";
     if (descr.Length > MaxDescrLen)
         descr = descr.Substring(0, MaxDescrLen);
     evBuf[37] = (byte)descr.Length;
     Array.Copy(Encoding.Default.GetBytes(descr), 0, evBuf, 38, descr.Length);
     string data = ev.Data ?? "";
     if (data.Length > MaxDataLen)
         data = data.Substring(0, MaxDataLen);
     evBuf[138] = (byte)data.Length;
     Array.Copy(Encoding.Default.GetBytes(data), 0, evBuf, 139, data.Length);
     return evBuf;
 }
Пример #23
0
        /// <summary>
        /// ������������� ������� � ������� ��� ����������� �����
        /// </summary>
        public EventView ConvertEvent(EventTableLight.Event ev)
        {
            Monitor.Enter(baseLock);
            EventView eventView = null;

            try
            {
                if (ev != null)
                    eventView = ConvEvent(ev);
            }
            catch (Exception ex)
            {
                AppData.Log.WriteAction((Localization.UseRussian ?
                    "������ ��� �������������� ������� � ������� ��� ����������� �����: " :
                    "Error converting event to a suitable view") + ex.Message, Log.ActTypes.Exception);
            }
            finally
            {
                Monitor.Exit(baseLock);
            }

            return eventView;
        }
Пример #24
0
        /// <summary>
        /// Добавить событие в файл или поток
        /// </summary>
        public void AppendEvent(EventTableLight.Event ev)
        {
            if (ev == null)
                throw new ArgumentNullException("ev");

            Stream stream = null;
            BinaryWriter writer = null;

            try
            {
                stream = ioStream == null ?
                   new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite) :
                   ioStream;
                writer = new BinaryWriter(stream);

                // установка позиции записи кратной размеру данных события
                stream.Seek(0, SeekOrigin.End);
                long offset = stream.Position / EventDataSize * EventDataSize;
                stream.Seek(offset, SeekOrigin.Begin);

                // запись события
                writer.Write(CreateEventBuffer(ev));
            }
            finally
            {
                if (fileMode)
                {
                    if (writer != null)
                        writer.Close();
                    if (stream != null)
                        stream.Close();
                }
            }
        }
Пример #25
0
        /// <summary>
        /// �������� ������� �� ������� ������� �� ������
        /// </summary>
        public EventTableLight.Event GetEventByNum(EventTableLight eventTable, int evNum)
        {
            Monitor.Enter(eventLock);
            EventTableLight.Event ev = null;

            try
            {
                if (1 <= evNum && evNum <= eventTable.AllEvents.Count &&
                    eventTable.AllEvents[evNum - 1].Number == evNum)
                    ev = eventTable.AllEvents[evNum - 1];
            }
            catch (Exception ex)
            {
                AppData.Log.WriteAction((Localization.UseRussian ? "������ ��� ��������� ������� �� ������: " :
                    "Error getting event by number: ") + ex.Message, Log.ActTypes.Exception);
            }
            finally
            {
                Monitor.Exit(eventLock);
            }

            return ev;
        }
Пример #26
0
 /// <summary>
 /// Добавить событие в очередь экспорта
 /// </summary>
 public void EnqueueEvent(EventTableLight.Event ev)
 {
     lock (evQueue)
     {
         if (evQueue.Count < MaxQueueSize)
         {
             evQueue.Enqueue(ev);
         }
         else
         {
             skipEvCnt++;
             log.WriteAction(string.Format(Localization.UseRussian ?
                 "Невозможно добавить в очередь событие. Максимальный размер очереди {0} превышен" :
                 "Unable to enqueue an event. The maximum size of the queue {0} is exceeded",
                 MaxQueueSize));
         }
     }
 }
Пример #27
0
        /// <summary>
        /// �������� �������� ���������� ��������� �������, ��������������� �������
        /// </summary>
        /// <remarks>���� cnlsFilter ����� null, �� ���������� �� ������������</remarks>
        public List<EventTableLight.Event> GetLastEvents(EventTableLight eventTable, List<int> cnlsFilter, 
            int count)
        {
            Monitor.Enter(eventLock);
            List<EventTableLight.Event> eventList = null;

            try
            {
                if (eventTable != null)
                {
                    eventTable.Filters = cnlsFilter == null ?
                        EventTableLight.EventFilters.None : EventTableLight.EventFilters.Cnls;
                    eventTable.CnlsFilter = cnlsFilter;
                    eventList = eventTable.GetLastEvents(count);
                }
            }
            catch (Exception ex)
            {
                AppData.Log.WriteAction((Localization.UseRussian ? "������ ��� ��������� ��������� �������: " :
                    "Error getting last events: ") + ex.Message, Log.ActTypes.Exception);
            }
            finally
            {
                Monitor.Exit(eventLock);
            }

            return eventList;
        }
Пример #28
0
 public override void OnEventCreated(EventTableLight.Event ev)
 {
     // the method executes after event creating
     // метод выполняется после создания события
     WriteToLog("Process event creating by the module " + Name, Log.ActTypes.Action);
 }
Пример #29
0
        /// <summary>
        /// Начальная обработка дерева XML-документа
        /// </summary>
        protected override void StartXmlDocProc()
        {
            genDT = DateTime.Now;

            if (tableView == null)
                hourTable = null;
            else
                AppData.MainData.RefreshData(date, out hourTable);

            if (eventOut <= 0)
                eventTable = null;
            else
                AppData.MainData.RefreshEvents(date, out eventTable);

            templItemRow = null;
            templEventRow = null;
            item = null;
            eventView = null;
        }