/// <summary> /// Starts the input channel data calculation /// <para>Начать вычисление данных входного канала</para> /// </summary> private void BeginCalcCnlData(int cnlNum, SrezTableLight.CnlData initalCnlData) { curCnlNum = cnlNum; this.initalCnlData = initalCnlData; this.initalCmdVal = 0.0; calcInCnl = true; }
/// <summary> /// Установить данные тега среза /// </summary> public void SetTagData(int tagIndex, SrezTableLight.CnlData newData) { if (0 <= tagIndex && tagIndex < TagData.Length) { TagData[tagIndex] = newData; } }
/// <summary> /// Starts the command value or data calculation /// <para>Начать вычисление значения или данных команды</para> /// </summary> protected void BeginCalcCmdData(int ctrlCnlNum, double initialCmdVal, byte[] initialCmdData) { curCnlNum = ctrlCnlNum; this.initialCnlData = SrezTableLight.CnlData.Empty; this.initialCmdVal = initialCmdVal; this.initialCmdData = initialCmdData; }
/// <summary> /// Starts the input channel data calculation /// <para>Начать вычисление данных входного канала</para> /// </summary> protected void BeginCalcCnlData(int cnlNum, SrezTableLight.CnlData initialCnlData) { curCnlNum = cnlNum; this.initialCnlData = initialCnlData; initialCmdVal = 0.0; initialCmdData = null; calcInCnl = true; }
/// <summary> /// Initializes a new instance of the class /// <para>Конструктор</para> /// </summary> public CalcEngine() { curCnlNum = -1; initalCnlData = SrezTableLight.CnlData.Empty; initalCmdVal = 0.0; calcInCnl = false; getCnlData = null; }
/// <summary> /// Initializes a new instance of the class /// <para>Конструктор</para> /// </summary> public CalcEngine() { curCnlNum = -1; initialCnlData = SrezTableLight.CnlData.Empty; initialCmdVal = 0.0; initialCmdData = null; calcInCnl = false; getCnlData = null; }
/// <summary> /// Преобразовать данные тега КП в строку /// </summary> protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0 && !floatSignals.Contains(signal)) { return(tagData.Val.ToString("F0")); } else { return(base.ConvertTagDataToStr(signal, tagData)); } }
private void dataTable2_RowChanged(object sender, DataRowChangeEventArgs e) { // transfer the changes to the snapshot table if (e.Action == DataRowAction.Change && selSrez != null) { DataRow row = e.Row; int cnlNum = (int)row["CnlNum"]; SrezTable.CnlData cnlData = new SrezTableLight.CnlData((double)row["Val"], (int)row["Stat"]); selSrez.SetCnlData(cnlNum, cnlData); srezTable.MarkSrezAsModified(selSrez); } }
/// <summary> /// Преобразовать данные тега КП в строку /// </summary> protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0) { if (signal == 1) { return(tagData.Val.ToString("N0")); } } return(base.ConvertTagDataToStr(signal, tagData)); }
private void dataTable2_RowChanged(object sender, DataRowChangeEventArgs e) { // перенос изменений в таблицу срезов if (e.Action == DataRowAction.Change && selSrez != null) { DataRow row = e.Row; int cnlNum = (int)row["CnlNum"]; SrezTable.CnlData cnlData = new SrezTableLight.CnlData((double)row["Val"], (int)row["Stat"]); selSrez.SetCnlData(cnlNum, cnlData); srezTable.MarkSrezAsModified(selSrez); } }
/// <summary> /// Потокобезопасно установить текущие данные тега КП и признак их изменения /// </summary> protected void SetCurData(int tagIndex, SrezTableLight.CnlData newData) { lock (curData) { if (0 <= tagIndex && tagIndex < curData.Length) { SrezTableLight.CnlData curTagData = curData[tagIndex]; curDataModified[tagIndex] |= curTagData.Val != newData.Val || curTagData.Stat != newData.Stat; curData[tagIndex] = newData; } } }
/// <summary> /// Конструктор /// </summary> public TagSrez(int tagCnt) { if (tagCnt <= 0) { throw new ArgumentException("Tag count must be positive.", "tagCnt"); } DateTime = DateTime.MinValue; KPTags = new KPTag[tagCnt]; TagData = new SrezTableLight.CnlData[tagCnt]; Descr = ""; }
/// <summary> /// Потокобезопасно увеличить текущее значение тега КП без изменения статуса /// </summary> protected void IncCurData(int tagIndex, double number) { lock (curData) { if (0 <= tagIndex && tagIndex < curData.Length) { SrezTableLight.CnlData curTagData = curData[tagIndex]; double newVal = curTagData.Val + number; curDataModified[tagIndex] |= number != 0; curData[tagIndex] = new SrezTableLight.CnlData(newVal, curTagData.Stat); } } }
private List <ActiveCnlList> ActiveCnl = new List <ActiveCnlList>(); // Создание списка Активных сигналов, где ActiveCnl.Cnl - номер сигнала, ActiveCnl.Name - Имя сигнала, // ActiveCnl.Fotmat - Тип активной переменной, ActiveCnl.IdxTag индекс сигнала в KPTags, ActiveCnl.IdxValue - Индекс группы, // в которую входит сигнал, ActiveCnl.MenuName - Имя меню, которому принадлежит сигнал /// <summary> /// Преобразовать данные тега КП в строку /// </summary> protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData) // Необходимо продумать как передать сюда список типов переменных - текст, время, цифровое и т.д. { string strval = ""; bool readstr = myTagId.TryGetValue(signal, out strval); // Чтение типа переменной, привязанной к сигналу if (tagData.Stat > 0) { if (strval == "DateTime") // Проверка сигнала на тип данных Время для отображения в текстовом виде в таблице Коммуникатора { return(ScadaUtils.DecodeDateTime(tagData.Val).ToString()); } } return(base.ConvertTagDataToStr(signal, tagData)); }
/// <summary> /// Потокобезопасно установить текущие данные как недостоверные /// </summary> protected void InvalidateCurData(int tagIndex, int tagCount) { lock (curData) { SrezTableLight.CnlData newData = SrezTableLight.CnlData.Empty; for (int i = 0; i < tagCount; i++) { SrezTableLight.CnlData curTagData = curData[tagIndex]; curDataModified[tagIndex] |= curTagData.Val != newData.Val || curTagData.Stat != newData.Stat; curData[tagIndex] = newData; tagIndex++; } } }
/// <summary> /// Преобразовать данные тега КП в строку /// </summary> protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData) { if (strVals[signal - 1] != null) { return(strVals[signal - 1]); } else if (tagData.Stat > 0 && isBitsArr[signal - 1]) { return("0x" + ((long)tagData.Val).ToString("X")); } else { return(base.ConvertTagDataToStr(signal, tagData)); } }
/// <summary> /// Converts the tag data to string. /// </summary> protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0) { switch (tagTypes[signal - 1]) { case TagType.String: return(ScadaUtils.DecodeAscii(tagData.Val)); case TagType.DateTime: return(ScadaUtils.DecodeDateTime(tagData.Val).ToLocalizedString()); } } return(base.ConvertTagDataToStr(signal, tagData)); }
/// <summary> /// Converts the tag data to string. /// </summary> protected override string ConvertTagDataToStr(KPTag kpTag, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0 && kpTag.Aux is TagType tagType) { switch (tagType) { case TagType.String: return(ScadaUtils.DecodeAscii(tagData.Val)); case TagType.DateTime: return(ScadaUtils.DecodeDateTime(tagData.Val).ToLocalizedString()); } } return(base.ConvertTagDataToStr(kpTag, tagData)); }
private void DataTable_RowChanged(object sender, DataRowChangeEventArgs e) { // pass row changes from dataTable to srezTable if (e.Action == DataRowAction.Change) { DataRow row = e.Row; SrezTableLight.Srez srez; if (srezTable.SrezList.TryGetValue((DateTime)row["DateTime"], out srez)) { SrezTable.CnlData cnlData = new SrezTableLight.CnlData((double)row["Val"], (int)row["Stat"]); srez.SetCnlData((int)row["CnlNum"], cnlData); srezTable.MarkSrezAsModified(srez as SrezTable.Srez); } } }
/// <summary> /// Установить текущие данные как недостоверные /// </summary> /// <remarks>Метод вызывается при обрыве соединения, если ConnRequired равно true</remarks> public virtual void InvalidateCurData() { lock (curData) { SrezTableLight.CnlData newData = SrezTableLight.CnlData.Empty; int tagCnt = curData.Length; for (int tagInd = 0; tagInd < tagCnt; tagInd++) { SrezTableLight.CnlData curTagData = curData[tagInd]; curDataModified[tagInd] |= curTagData.Val != newData.Val || curTagData.Stat != newData.Stat; curData[tagInd] = newData; } } WorkState = WorkStates.Error; }
public string GetCurCnlData(int cnlNum) { try { AppData.CheckLoggedOn(); SrezTableLight.CnlData cnlData = AppData.DataAccess.GetCurCnlData(cnlNum); return(JsSerializer.Serialize(new DataTransferObject(cnlData))); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении текущих данных входного канала {0}" : "Error getting current data of the input channel {0}", cnlNum); return(GetErrorDtoJs(ex)); } }
/// <summary> /// Converts the tag data to string. /// </summary> protected override string ConvertTagDataToStr(KPTag kpTag, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0) { if (kpTag.Index == TagIndex.NotifCounter) { return(tagData.Val.ToString("N0")); } else if (kpTag.Index == TagIndex.ResponseStatus) { return(tagData.Val.ToString("N0") + " (" + (HttpStatusCode)tagData.Val + ")"); } } return(base.ConvertTagDataToStr(kpTag, tagData)); }
/// <summary> /// Потокобезопасно установить текущие данные как недостоверные /// </summary> protected void InvalidateCurData(int tagIndex, int tagCount) { lock (curData) { SrezTableLight.CnlData newData = SrezTableLight.CnlData.Empty; for (int i = 0, len = curData.Length; i < tagCount && tagIndex < len; i++) { if (tagIndex >= 0) { SrezTableLight.CnlData curTagData = curData[tagIndex]; curDataModified[tagIndex] |= curTagData.Val != newData.Val || curTagData.Stat != newData.Stat; curData[tagIndex] = newData; } tagIndex++; } } }
/// <summary> /// Преобразовать данные тега КП в строку /// </summary> protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0) { if (signal == 1) { return(tagData.Val > 0 ? (Localization.UseRussian ? "Есть" : "Yes") : (Localization.UseRussian ? "Нет" : "No")); } else if (signal == 2) { return(((int)tagData.Val).ToString()); } } return(base.ConvertTagDataToStr(signal, tagData)); }
/// <summary> /// Получить точки связки трендов в виде JavaScript /// </summary> protected string GetTrendPointsJs(TrendBundle trendBundle, int trendInd) { StringBuilder sbTrendPoints = new StringBuilder("["); InCnlProps cnlProps = cnlPropsArr[trendInd]; if (trendBundle != null) { foreach (TrendBundle.Point point in trendBundle.Series) { SrezTableLight.CnlData cnlData = point.CnlData[trendInd]; sbTrendPoints .Append(TrendPointToJs(cnlData.Val, cnlData.Stat, cnlProps)) .Append(", "); } } sbTrendPoints.Append("]"); return(sbTrendPoints.ToString()); }
protected override string ConvertTagDataToStr(int signal, SrezTableLight.CnlData tagData) { if (tagData.Stat > 0) { if (signal == CONNECT_SIGNAL) { return(tagData.Val > 0 ? "Yes" : "No"); } else if (signal == RECORD_SIGNAL) { return(tagData.Val > 0 ? "On" : "Off"); } else if (signal <= FAILED_MSG_SIGNAL && signal < TELEMETRY_START_SIGNAL) { return(tagData.Val.ToString("N0")); } } return(base.ConvertTagDataToStr(signal, tagData)); }
public string GetCurCnlDataExt(int cnlNum) { try { AppData.CheckLoggedOn(); CnlDataExtDTO cnlDataExtDTO = new CnlDataExtDTO(cnlNum); DataAccess dataAccess = AppData.DataAccess; DateTime dataAge; SrezTableLight.CnlData cnlData = dataAccess.GetCurCnlData(cnlNum, out dataAge); cnlDataExtDTO.Val = cnlData.Val; cnlDataExtDTO.Stat = cnlData.Stat; string emptyVal; if (DataFormatter.CurDataVisible(dataAge, DateTime.Now, out emptyVal)) { InCnlProps cnlProps = dataAccess.GetCnlProps(cnlNum); string text; string textWithUnit; DataFormatter.FormatCnlVal(cnlData.Val, cnlData.Stat, cnlProps, out text, out textWithUnit); cnlDataExtDTO.Text = text; cnlDataExtDTO.TextWithUnit = textWithUnit; cnlDataExtDTO.Color = DataFormatter.GetCnlValColor(cnlData.Val, cnlData.Stat, cnlProps, dataAccess.GetColorByStat); } else { cnlDataExtDTO.Text = emptyVal; cnlDataExtDTO.TextWithUnit = emptyVal; } return(JsSerializer.Serialize(cnlDataExtDTO)); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении расширенных текущих данных входного канала {0}" : "Error getting extended current data of the input channel {0}", cnlNum); return(""); } }
public string GetCurCnlData(int cnlNum) { try { UserRights userRights; AppData.CheckLoggedOn(out userRights); if (!userRights.ViewAllRight) { throw new ScadaException(CommonPhrases.NoRights); } SrezTableLight.CnlData cnlData = AppData.DataAccess.GetCurCnlData(cnlNum); return(JsSerializer.Serialize(new DataTransferObject(cnlData))); } catch (Exception ex) { AppData.Log.WriteException(ex, Localization.UseRussian ? "Ошибка при получении текущих данных входного канала {0}" : "Error getting current data of the input channel {0}", cnlNum); return(GetErrorDtoJs(ex)); } }
/// <summary> /// Преобразовать среза параметров в срез входных каналов /// </summary> private SrezTableLight.Srez ConvertSrez(KPLogic.ParamSrez paramSrez) { List <int> bindedIndexes; int cnlCnt; if (paramSrez == null) { bindedIndexes = null; cnlCnt = 0; } else { bindedIndexes = paramSrez.GetBindedParamIndexes(); cnlCnt = bindedIndexes.Count; } if (cnlCnt == 0) { return(null); } else { SrezTableLight.Srez srez = new SrezTableLight.Srez(paramSrez.DateTime, cnlCnt); for (int i = 0; i < cnlCnt; i++) { int paramInd = bindedIndexes[i]; srez.CnlNums[i] = paramSrez.KPParams[paramInd].CnlNum; KPLogic.ParamData paramData = paramSrez.Data[paramInd]; SrezTableLight.CnlData cnlData = new SrezTableLight.CnlData(paramData.Val, paramData.Stat); srez.CnlData[i] = cnlData; } return(srez); } }
/// <summary> /// Ends the input channel data calculation /// <para>Завершить вычисление данных входного канала</para> /// </summary> private void EndCalcCnlData() { curCnlNum = -1; initialCnlData = SrezTableLight.CnlData.Empty; calcInCnl = false; }
/// <summary> /// Конструктор /// </summary> public TagSrez(int tagCnt) { if (tagCnt <= 0) throw new ArgumentException("Tag count must be positive.", "tagCnt"); DateTime = DateTime.MinValue; KPTags = new KPTag[tagCnt]; TagData = new SrezTableLight.CnlData[tagCnt]; Descr = ""; }
/// <summary> /// Вычислить дорасчётные каналы /// </summary> private void CalcDRCnls(List<InCnl> inCnls, SrezTableLight.Srez srez, bool genEvents) { lock (calculator) { try { procSrez = srez; foreach (InCnl inCnl in inCnls) { int cnlInd = srez.GetCnlIndex(inCnl.CnlNum); if (cnlInd >= 0) { // вычисление новых данных входного канала SrezTableLight.CnlData oldCnlData = srez.CnlData[cnlInd]; SrezTableLight.CnlData newCnlData = new SrezTableLight.CnlData(oldCnlData.Val, BaseValues.CnlStatuses.Defined); CalcCnlData(inCnl, oldCnlData, ref newCnlData); // запись новых данных в срез srez.CnlData[cnlInd] = newCnlData; // генерация события if (genEvents) GenEvent(inCnl, oldCnlData, newCnlData); } } } catch (Exception ex) { AppLog.WriteAction((Localization.UseRussian ? "Ошибка при вычислении дорасчётных каналов: " : "Error calculating channels: ") + ex.Message, Log.ActTypes.Exception); } finally { procSrez = null; } } }
/// <summary> /// Starts the input channel data calculation /// <para>Начать вычисление данных входного канала</para> /// </summary> private void BeginCalcCnlData(int cnlNum, SrezTableLight.CnlData initialCnlData) { curCnlNum = cnlNum; this.initialCnlData = initialCnlData; initialCmdVal = 0.0; initialCmdData = null; calcInCnl = true; }
/// <summary> /// Set the current input channel of the formula and its data /// <para>Установить текущий входной канал формулы и его данные</para> /// </summary> public void SetCurCnl(int cnlNum, SrezTableLight.CnlData cnlData) { BeginCalcCnlData(cnlNum, cnlData); }
/// <summary> /// Преобразовать среза параметров в срез входных каналов /// </summary> private SrezTableLight.Srez ConvertSrez(KPLogic.ParamSrez paramSrez) { List<int> bindedIndexes; int cnlCnt; if (paramSrez == null) { bindedIndexes = null; cnlCnt = 0; } else { bindedIndexes = paramSrez.GetBindedParamIndexes(); cnlCnt = bindedIndexes.Count; } if (cnlCnt == 0) { return null; } else { SrezTableLight.Srez srez = new SrezTableLight.Srez(paramSrez.DateTime, cnlCnt); for (int i = 0; i < cnlCnt; i++) { int paramInd = bindedIndexes[i]; srez.CnlNums[i] = paramSrez.KPParams[paramInd].CnlNum; KPLogic.ParamData paramData = paramSrez.Data[paramInd]; SrezTableLight.CnlData cnlData = new SrezTableLight.CnlData(paramData.Val, paramData.Stat); srez.CnlData[i] = cnlData; } return srez; } }
/// <summary> /// Установить недостоверность неактивных каналов /// </summary> private void SetUnreliable() { if (Settings.InactUnrelTime > 0) { TimeSpan inactUnrelSpan = TimeSpan.FromMinutes(Settings.InactUnrelTime); DateTime nowDT = DateTime.Now; int cnlCnt = srezDescr.CnlNums.Length; for (int i = 0; i < cnlCnt; i++) { InCnl inCnl = inCnls.Values[i]; int cnlTypeID = inCnl.CnlTypeID; if ((cnlTypeID == BaseValues.CnlTypes.TS || cnlTypeID == BaseValues.CnlTypes.TI) && curSrez.CnlData[i].Stat > BaseValues.CnlStatuses.Undefined && nowDT - activeDTs[i] > inactUnrelSpan) { // установка недостоверного статуса SrezTableLight.CnlData oldCnlData = curSrez.CnlData[i]; SrezTableLight.CnlData newCnlData = new SrezTableLight.CnlData(oldCnlData.Val, BaseValues.CnlStatuses.Unreliable); curSrez.CnlData[i] = newCnlData; curSrezMod = true; // генерация события GenEvent(inCnl, oldCnlData, newCnlData); } } } }
/// <summary> /// Starts the command value or data calculation /// <para>Начать вычисление значения или данных команды</para> /// </summary> private void BeginCalcCmdData(int ctrlCnlNum, double initialCmdVal, byte[] initialCmdData) { curCnlNum = ctrlCnlNum; this.initialCnlData = SrezTableLight.CnlData.Empty; this.initialCmdVal = initialCmdVal; this.initialCmdData = initialCmdData; }
/// <summary> /// Converts the tag data to string. /// </summary> protected override string ConvertTagDataToStr(KPTag kpTag, SrezTableLight.CnlData tagData) { return(tagData.Stat > 0 && (kpTag.Signal == 2 || kpTag.Signal == 4) ? tagData.Val > 0 ? CommPhrases.On : CommPhrases.Off : base.ConvertTagDataToStr(kpTag, tagData)); }
/// <summary> /// Starts the command value calculation /// <para>Начать вычисление значения команды</para> /// </summary> private void BeginCalcCmdVal(int ctrlCnlNum, double initalCmdVal) { curCnlNum = ctrlCnlNum; this.initalCnlData = SrezTableLight.CnlData.Empty; this.initalCmdVal = initalCmdVal; }