public override void OnEventCreating(EventTableLight.Event ev) { // the method executes on event creating, event properties could be changed here // метод выполняется при создании события, свойства события можно изменить здесь }
/// <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; }
/// <summary> /// Заполнить таблицу eventTableLight из файла или потока /// </summary> public void Fill(EventTableLight eventTableLight) { FillObj(eventTableLight); }
/// <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(); }
/// <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; } }
/// <summary> /// Обработать новое событие /// </summary> public bool ProcEvent(EventTableLight.Event ev) { if (serverIsReady) return ev == null ? true : WriteEvent(ev); else return false; }
/// <summary> /// Выполнить действия после создания события и записи на диск /// </summary> public override void OnEventCreated(EventTableLight.Event ev) { // экспорт события в БД if (normalWork) { // добавление события в очередь экспорта foreach (Exporter exporter in exporters) exporter.EnqueueEvent(ev); } }
/// <summary> /// Выполнить действия при создании события /// </summary> /// <remarks>Событие вызывается до записи на диск, поэтому свойства события можно изменить</remarks> public virtual void OnEventCreating(EventTableLight.Event ev) { }
/// <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); } }
/// <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"); } }
/// <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; }
/// <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; }
/// <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; }
/// <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"; } } }
/// <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> /// Отправить событие 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; }
/// <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); } } } }
/// <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); } }
/// <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; }
/// <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; }
/// <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; }
/// <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; }
/// <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(); } } }
/// <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; }
/// <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)); } } }
/// <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; }
public override void OnEventCreated(EventTableLight.Event ev) { // the method executes after event creating // метод выполняется после создания события WriteToLog("Process event creating by the module " + Name, Log.ActTypes.Action); }
/// <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; }