/// <summary> /// Установить значение для сигнала группы, по ключу, за указанный час /// </summary> /// <param name="indx">Индекс группы сигналов</param> /// <param name="keySgnl">Ключ сигнала</param> /// <param name="iHour">Индекс часа в сутках</param> /// <param name="value">Устанавливаемое значение</param> public void SetValue(INDEX_DATA indx,SIGNAL.KEY keySgnl,int iHour,double value) { MethodBase methodBase = MethodBase.GetCurrentMethod(); string errMsg = string.Format(@"{0}.{1}::{2} () - ",methodBase.Module,methodBase.DeclaringType,methodBase.Name); if (m_dictData.ContainsKey(indx) == true) { if (m_dictData[indx].ContainsKey(keySgnl) == true) { m_dictData[indx][keySgnl].m_data[iHour] = value; } else { Logging.Logg().Error(string.Format(@"{0}в словаре c INDEX={1} не инициализирован сигнал key={2}" ,errMsg,indx.ToString(),keySgnl.ToString()) ,Logging.INDEX_MESSAGE.NOT_SET); } } else { Logging.Logg().Error(string.Format(@"{0}в словаре не инициализирована группа сигналов INDEX={1}..." ,errMsg,indx.ToString()) ,Logging.INDEX_MESSAGE.NOT_SET); } }
/// <summary> /// Привести полученные значения к часовому формату (из полу-часового) /// </summary> public void parseTableResult(DateTime dtStart,DateTime dtEnd,INDEX_DATA indx,out int err) { err = 0; TableResult table; List <RecordResult> rowsDate; VALUES_DATE valuesDate; table = m_arTableResult[(int)indx]; for (DateTime dtRec = dtStart; dtRec < dtEnd; dtRec += TimeSpan.FromDays(1)) { // = (DateTime)r[@"DATA_DATE"]; valuesDate = m_listValuesDate.Find(item => { return(item.m_dataDate == dtRec); }); rowsDate = table.FindAll(item => { return((item.m_dtRec > dtRec) && (!(item.m_dtRec > dtRec.AddDays(1)))); }); if (valuesDate.m_dataDate.Equals(DateTime.MinValue) == true) { m_listValuesDate.Add(new VALUES_DATE(dtRec,indx,m_arListSgnls[(int)indx],rowsDate)); } else { //valuesDate.InitSignals(indx, m_arListSgnls[(int)indx]); valuesDate.SetValues(indx,m_arListSgnls[(int)indx],rowsDate); } } }
/// <summary> /// Конструктор - дополнительный (с парметрами) /// </summary> /// <param name="dt">Дата - метка времени для набора значений</param> /// <param name="indx">Индекс группы сигналов</param> /// <param name="listRecRes">Список значений в наборе</param> public VALUES_DATE(DateTime dt,INDEX_DATA indx,List <SIGNAL> listSgnls,List <RecordResult> listRecRes) { m_dataDate = dt; m_dictData = new Dictionary <INDEX_DATA,VALUES_GROUP>(); SetValues(indx,listSgnls,listRecRes); }
/// <summary> /// Инициализировать список доступных сигналов в группе /// не вызывается при отсутствии сигналов /// </summary> /// <param name="indx">Индекс-идентификатор группы сигналов</param> /// <param name="listSgnls">Список доступных сигналов</param> private void initSignals(INDEX_DATA indx,List <SIGNAL> listSgnls) { if (m_dictData.ContainsKey(indx) == false) { // с VIII-ой группой произойдет вызов только при наличии сигналов m_dictData.Add(indx,new VALUES_GROUP( listSgnls ,(!(indx == INDEX_DATA.GRVIII)) ? VALUES_GROUP.MODE.STANDARD : VALUES_GROUP.MODE.EPOTERI)); } else { m_dictData[indx].InitSignals(listSgnls); } }
/// <summary> /// Очистить значения /// </summary> /// <param name="dtReq">Дата за которую требуется очистить значения</param> /// <param name="indx">Индекс группы сигналов</param> public void ClearValues(DateTime dtReq,INDEX_DATA indx) { VALUES_DATE valuesDate; valuesDate = m_listValuesDate.Find(item => { return(item.m_dataDate == dtReq); }); // проверить успешность поиска объекта if ((valuesDate.m_dataDate > DateTime.MinValue) && (!(valuesDate.m_dictData == null)) && (valuesDate.m_dictData.ContainsKey(indx) == true)) { // объект найден и содержит необходимый ключ - индекс группы сигналов valuesDate.m_dictData[indx].ClearValues(); } else { ; // объект не найден } }
/// <summary> /// Установить значения для группы сигналов по индексу группы /// </summary> /// <param name="indx">Индекс группы сигналов</param> /// <param name="listRecRes">Список значений</param> public void SetValues(INDEX_DATA indx,List <RecordResult> listRecRes) { SIGNAL.KEY keySgnl; // ключ для сигнала int iHour = -1; // индекс часа MethodBase methodBase = MethodBase.GetCurrentMethod(); string errMsg = string.Format(@"{0}.{1}::{2} () - ",methodBase.Module,methodBase.DeclaringType,methodBase.Name); if (m_dictData.ContainsKey(indx) == true) { foreach (RecordResult r in listRecRes) { keySgnl = new SIGNAL.KEY(r.m_key); if (m_dictData[indx].ContainsKey(keySgnl) == true) { // дата всегда одна и та же за исключением одной записи iHour = r.m_dtRec.Hour > 0 ? r.m_dtRec.Hour - 1 : 23; m_dictData[indx].SetValue(keySgnl,iHour,r.m_value); } else { Logging.Logg().Error(string.Format(@"{0}в словаре c INDEX={1} не инициализирован сигнал key={2}" ,errMsg,indx.ToString(),keySgnl.ToString()) ,Logging.INDEX_MESSAGE.NOT_SET); } } m_dictData[indx].CompleteSetValues(); } else { Logging.Logg().Error(string.Format(@"{0}в словаре не инициализирована группа сигналов INDEX={1}..." ,errMsg,indx.ToString()) ,Logging.INDEX_MESSAGE.NOT_SET); } }
/// <summary> /// Установить значения для группы сигналов по индексу группы /// </summary> /// <param name="indx">Индекс группы сигналов</param> /// <param name="listSgnls">Список сигналов</param> /// <param name="listRecRes">Список значений</param> public void SetValues(INDEX_DATA indx,List <SIGNAL> listSgnls,List <RecordResult> listRecRes) { initSignals(indx,listSgnls); SetValues(indx,listRecRes); }
/// <summary> /// Возвратить строку с идентификаторами сигналов для указанного списка /// </summary> /// <param name="listSgnls">Список сигналов для которых требуется возвратить строку</param> /// <returns>Строка с идентификаторами сигналов</returns> private string getSensors(INDEX_DATA indx,List <SIGNAL> listSgnls) { string strRes = string.Empty; List <int> listIdUSPD = new List <int>(); List <string> sensorsUSPD = new List <string>(); string strOR = @" OR "; Action <string,Logging.INDEX_MESSAGE,bool> delegateLogging; if ((!(listSgnls == null)) && (listSgnls.Count > 0)) { foreach (SIGNAL s in listSgnls) { if (listIdUSPD.IndexOf(s.m_key.m_object) < 0) { listIdUSPD.Add(s.m_key.m_object); sensorsUSPD.Add(@"([OBJECT] = " + s.m_key.m_object + @" AND [ITEM] IN (" + s.m_key.m_item); } else { sensorsUSPD[listIdUSPD.IndexOf(s.m_key.m_object)] += (@"," + s.m_key.m_item); } } foreach (string s in sensorsUSPD) { //Добавить завершающие скобки (1-я для IN, 2-я для [OBJECT]) strRes += s + @"))"; strRes += strOR; } if (strRes.Equals(string.Empty) == false) { strRes = strRes.Substring(0,strRes.Length - strOR.Length); } else { Logging.Logg().Error($"TEC::getSensors () - не распознан ни один сигнал для ТЭЦ ID={m_Id}, группа={indx.ToString ()}..." ,Logging.INDEX_MESSAGE.NOT_SET); } } else { if (_requiredSignals[(int)indx] == true) { // ошибка только в случае обязательного наличия сигналов delegateLogging = Logging.Logg().Error; } else { // иначе - предупреждение delegateLogging = Logging.Logg().Warning; } delegateLogging?.Invoke($"TEC::getSensors () - не определен ни один сигнал для ТЭЦ ID={m_Id}, группа={indx.ToString()}..." ,Logging.INDEX_MESSAGE.NOT_SET,true); } return(strRes); }