/// <summary> /// Привязать свойства входных каналов к элементам представления /// </summary> public virtual void BindCnlProps(InCnlProps[] cnlPropsArr) { }
/// <summary> /// Форматировать значение входного канала /// </summary> public void FormatCnlVal(double val, int stat, InCnlProps cnlProps, string decSep, string grSep, out string text, out string textWithUnit, out bool textIsNumber, bool throwOnError = false) { bool cnlPropsIsNull = cnlProps == null; try { if (stat <= 0) { text = textWithUnit = EmptyVal; textIsNumber = false; } else { text = textWithUnit = NoVal; textIsNumber = false; int formatID = cnlPropsIsNull ? 0 : cnlProps.FormatID; int unitArrLen = cnlPropsIsNull || cnlProps.UnitArr == null ? 0 : cnlProps.UnitArr.Length; if (cnlPropsIsNull || cnlProps.ShowNumber) { string unit = unitArrLen > 0 ? " " + cnlProps.UnitArr[0] : ""; nfi.NumberDecimalDigits = cnlPropsIsNull ? DefDecDig : cnlProps.DecDigits; nfi.NumberDecimalSeparator = decSep == null ? defDecSep : decSep; nfi.NumberGroupSeparator = grSep == null ? defGrSep : grSep; text = val.ToString("N", nfi); textWithUnit = text + unit; textIsNumber = true; } else if (formatID == BaseValues.Formats.EnumText) { if (unitArrLen > 0) { int unitInd = (int)val; if (unitInd < 0) { unitInd = 0; } else if (unitInd >= unitArrLen) { unitInd = unitArrLen - 1; } text = textWithUnit = cnlProps.UnitArr[unitInd]; } } else if (formatID == BaseValues.Formats.AsciiText) { byte[] buf = BitConverter.GetBytes(val); text = textWithUnit = Encoding.ASCII.GetString(buf).TrimEnd((char)0); } else if (formatID == BaseValues.Formats.UnicodeText) { byte[] buf = BitConverter.GetBytes(val); text = textWithUnit = Encoding.Unicode.GetString(buf).TrimEnd((char)0); } else if (formatID == BaseValues.Formats.DateTime) { text = textWithUnit = ScadaUtils.DecodeDateTime(val).ToLocalizedString(); } else if (formatID == BaseValues.Formats.Date) { text = textWithUnit = ScadaUtils.DecodeDateTime(val).ToLocalizedDateString(); } else if (formatID == BaseValues.Formats.Time) { text = textWithUnit = ScadaUtils.DecodeDateTime(val).ToLocalizedTimeString(); } } } catch (Exception ex) { if (throwOnError) { string cnlNumStr = cnlPropsIsNull ? "?" : cnlProps.CnlNum.ToString(); throw new ScadaException(string.Format(Localization.UseRussian ? "Ошибка при форматировании значения входного канала {0}" : "Error formatting value of input channel {0}", cnlNumStr), ex); } else { text = textWithUnit = FrmtErrVal; textIsNumber = false; } } }
/// <summary> /// Привязать свойства входных каналов к элементам представления /// </summary> public override void BindCnlProps(InCnlProps[] cnlPropsArr) { base.BindCnlProps(cnlPropsArr); if (cnlPropsArr != null) { foreach (Item item in Items) { int ind = Array.BinarySearch(cnlPropsArr, item.CnlNum, InCnlProps.IntComp); if (ind >= 0) { InCnlProps cnlProps = cnlPropsArr[ind]; item.CnlProps = cnlProps; if (cnlProps.CtrlCnlNum > 0) { item.CtrlCnlNum = cnlProps.CtrlCnlNum; AddCtrlCnlNum(cnlProps.CtrlCnlNum); } } else { item.CnlProps = null; } } } }
/// <summary> /// Заполнить свойства входных каналов /// </summary> protected void FillCnlProps() { try { log.WriteAction(Localization.UseRussian ? "Заполнение свойств входных каналов" : "Fill input channels properties"); DataTable tblInCnl = BaseTables.InCnlTable; DataView viewObj = BaseTables.ObjTable.DefaultView; DataView viewKP = BaseTables.KPTable.DefaultView; DataView viewParam = BaseTables.ParamTable.DefaultView; DataView viewFormat = BaseTables.FormatTable.DefaultView; DataView viewUnit = BaseTables.UnitTable.DefaultView; // установка сортировки для последующего поиска строк viewObj.Sort = "ObjNum"; viewKP.Sort = "KPNum"; viewParam.Sort = "ParamID"; viewFormat.Sort = "FormatID"; viewUnit.Sort = "UnitID"; int inCnlCnt = tblInCnl.Rows.Count; // количество входных каналов InCnlProps[] newCnlProps = new InCnlProps[inCnlCnt]; for (int i = 0; i < inCnlCnt; i++) { DataRow inCnlRow = tblInCnl.Rows[i]; InCnlProps cnlProps = new InCnlProps(); // определение свойств, не использующих внешних ключей cnlProps.CnlNum = (int)inCnlRow["CnlNum"]; cnlProps.CnlName = (string)inCnlRow["Name"]; cnlProps.CnlTypeID = (int)inCnlRow["CnlTypeID"]; cnlProps.ObjNum = (int)inCnlRow["ObjNum"]; cnlProps.KPNum = (int)inCnlRow["KPNum"]; cnlProps.Signal = (int)inCnlRow["Signal"]; cnlProps.FormulaUsed = (bool)inCnlRow["FormulaUsed"]; cnlProps.Formula = (string)inCnlRow["Formula"]; cnlProps.Averaging = (bool)inCnlRow["Averaging"]; cnlProps.ParamID = (int)inCnlRow["ParamID"]; cnlProps.UnitID = (int)inCnlRow["UnitID"]; cnlProps.CtrlCnlNum = (int)inCnlRow["CtrlCnlNum"]; cnlProps.EvEnabled = (bool)inCnlRow["EvEnabled"]; cnlProps.EvSound = (bool)inCnlRow["EvSound"]; cnlProps.EvOnChange = (bool)inCnlRow["EvOnChange"]; cnlProps.EvOnUndef = (bool)inCnlRow["EvOnUndef"]; cnlProps.LimLowCrash = (double)inCnlRow["LimLowCrash"]; cnlProps.LimLow = (double)inCnlRow["LimLow"]; cnlProps.LimHigh = (double)inCnlRow["LimHigh"]; cnlProps.LimHighCrash = (double)inCnlRow["LimHighCrash"]; // определение наименования объекта int objRowInd = viewObj.Find(cnlProps.ObjNum); if (objRowInd >= 0) { cnlProps.ObjName = (string)viewObj[objRowInd]["Name"]; } // определение наименования КП int kpRowInd = viewKP.Find(cnlProps.KPNum); if (kpRowInd >= 0) { cnlProps.KPName = (string)viewKP[kpRowInd]["Name"]; } // определение наименования параметра и имени файла значка int paramRowInd = viewParam.Find(cnlProps.ParamID); if (paramRowInd >= 0) { DataRowView paramRowView = viewParam[paramRowInd]; cnlProps.ParamName = (string)paramRowView["Name"]; cnlProps.IconFileName = (string)paramRowView["IconFileName"]; } // определение формата вывода int formatRowInd = viewFormat.Find(inCnlRow["FormatID"]); if (formatRowInd >= 0) { DataRowView formatRowView = viewFormat[formatRowInd]; cnlProps.ShowNumber = (bool)formatRowView["ShowNumber"]; cnlProps.DecDigits = (int)formatRowView["DecDigits"]; } // определение размерностей int unitRowInd = viewUnit.Find(cnlProps.UnitID); if (unitRowInd >= 0) { DataRowView unitRowView = viewUnit[unitRowInd]; cnlProps.UnitName = (string)unitRowView["Name"]; cnlProps.UnitSign = (string)unitRowView["Sign"]; string[] unitArr = cnlProps.UnitArr = cnlProps.UnitSign.Split(FieldSeparator, StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < unitArr.Length; j++) { unitArr[j] = unitArr[j].Trim(); } if (unitArr.Length == 1 && unitArr[0] == "") { cnlProps.UnitArr = null; } } newCnlProps[i] = cnlProps; } CnlProps = newCnlProps; } catch (Exception ex) { log.WriteException(ex, (Localization.UseRussian ? "Ошибка при заполнении свойств входных каналов: " : "Error filling input channels properties")); } }
protected void Page_Load(object sender, EventArgs e) { // отключение кэширования страницы ScadaUtils.DisablePageCache(Response); // получение данных пользователя UserData userData = UserData.GetUserData(); // проверка входа в систему userData.CheckLoggedOn(Context, false); if (!userData.LoggedOn) { throw new Exception(WebPhrases.NotLoggedOn); } // перевод веб-страницы Localization.TranslatePage(this, "Scada.Web.WFrmTableView"); // определение индексов выбранного представления int viewSetIndex, viewIndex; if (!int.TryParse(Request["viewSet"], out viewSetIndex)) { viewSetIndex = -1; } if (!int.TryParse(Request["view"], out viewIndex)) { viewIndex = -1; } // получение табличного представления и прав пользователя на него BaseView baseView; MainData.Right right; TableView tableView = userData.GetView(typeof(TableView), viewSetIndex, viewIndex, out baseView, out right) ? (TableView)baseView : null; // проверка загрузки представления и прав на просмотр информации if (tableView == null) { throw new Exception(WebPhrases.UnableLoadView); } else if (!right.ViewRight) { throw new Exception(CommonPhrases.NoRights); } // определение параметров запроса int year, month, day, stage; int.TryParse(Request["year"], out year); int.TryParse(Request["month"], out month); int.TryParse(Request["day"], out day); int.TryParse(Request["stage"], out stage); DateTime reqDate; try { reqDate = new DateTime(year, month, day); } catch { throw new Exception(WebPhrases.IncorrectDate); } // формирование таблицы отображаемых элементов представления int itemCnt = tableView.VisibleCount; int itemLastInd = itemCnt - 1; if (itemCnt > 0) { // формирование таблицы обозначений элементов представления TableRow row = new TableRow(); row.CssClass = "hdr"; NewCell(row, WebPhrases.ItemColumn); tblCap.Rows.Add(row); const string textHtmlTempl = "<table class=\"cap\" cellpadding=\"0\" cellspacing=\"0\"><tr>" + "<td>{0}</td><td>{1}</td><td>{2}</td></tr></table>"; const string hintHtmlTempl = "<div class=\"hint\">{0}</div>"; const string iconHtmlTempl = "<img src=\"images/paramIcons/{0}\" alt=\"\" />"; const string capHtmlTempl = "<span>{0}</span>"; const string diagHtmlTempl = "<a href=\"javascript:ShowDiag({0}, {1}, {2}, {3}, {4}, {5})\">"; const string cmdHtmlTempl = "<a href=\"javascript:SendCmd({0}, {1}, {2})\">" + "<img src=\"images/cmd.gif\" alt=\"\" /></a>"; bool canSendCmd = AppData.WebSettings.CmdEnabled && right.CtrlRight; for (int itemInd = 0; itemInd < itemCnt; itemInd++) { TableView.Item item = tableView.VisibleItems[itemInd]; int cnlNum = item.CnlNum; int cntrlCnlNum = item.CtrlCnlNum; string text; if (cnlNum > 0 || cntrlCnlNum > 0) { InCnlProps cnlProps = item.CnlProps; List <string> hintLines = new List <string>(); if (cnlNum > 0) { hintLines.Add(WebPhrases.InCnlNumHint + cnlNum); } if (cntrlCnlNum > 0) { hintLines.Add(WebPhrases.OutCnlNumHint + cntrlCnlNum); } if (cnlProps != null) { hintLines.Add(WebPhrases.ObjectHint + cnlProps.ObjName); hintLines.Add(WebPhrases.KPHint + cnlProps.KPName); hintLines.Add(WebPhrases.ParamHint + cnlProps.ParamName); if (cnlProps.ShowNumber && cnlProps.UnitArr != null && cnlProps.UnitArr.Length > 0) { hintLines.Add(WebPhrases.UnitHint + cnlProps.UnitArr[0]); } } string hint = string.Join("<br />", hintLines.ToArray()); string hintHtml = string.Format(hintHtmlTempl, hint); string iconFileName = cnlProps == null || cnlProps.IconFileName == "" ? "undef.gif" : cnlProps.IconFileName; string iconHtml = string.Format(iconHtmlTempl, iconFileName); string capHtml = string.Format(capHtmlTempl, item.Caption); string cmdHtml = canSendCmd && cntrlCnlNum > 0 ? string.Format(cmdHtmlTempl, viewSetIndex, viewIndex, cntrlCnlNum) : ""; if (cnlNum > 0) { string diagHtml = string.Format(diagHtmlTempl, viewSetIndex, viewIndex, year, month, day, cnlNum); iconHtml = diagHtml + iconHtml + "</a>"; capHtml = diagHtml + capHtml + "</a>"; } text = string.Format(textHtmlTempl, iconHtml + hintHtml, capHtml, cmdHtml); } else { text = item.Caption == "" ? "<p> </p>" : "<p>" + item.Caption + "</p>"; } row = new TableRow(); SetCssClass(row, itemInd % 3 == 2, itemInd == itemLastInd); NewCell(row, text); tblCap.Rows.Add(row); } // получение обновлённых данных часовых срезов SrezTableLight hourTable; AppData.MainData.RefreshData(reqDate, out hourTable); // формирование ячейки текущего среза row = new TableRow(); row.CssClass = "hdr"; NewCell(row, WebPhrases.CurColumn); tblCur.Rows.Add(row); row = new TableRow(); NewCell(row, "<iframe id=\"frameCurVal\" src=\"" + "CurVals.aspx?viewSet=" + viewSetIndex + "&view=" + viewIndex + "&year=" + year + "&month=" + month + "&day=" + day + "&hourStamp=" + hourTable.FileModTime.Ticks + "\" frameborder=\"0\" scrolling=\"no\"></iframe>"); tblCur.Rows.Add(row); // формирование заголовка таблицы часовых значений int firstHour = stage == 2 ? 12 : 0; int lastHour = stage == 1 ? 11 : 23; row = new TableRow(); row.CssClass = "hdr"; tblHour.Rows.Add(row); for (int hour = firstHour; hour <= lastHour; hour++) { NewCell(row, hour.ToString()); } // формирование содержимого таблицы часовых значений // для оптимизации доступа к данным порядок заполнения следующий: по часам, по элементам for (int hour = firstHour; hour <= lastHour; hour++) { bool isFirstHour = hour == firstHour; DateTime dateTime = new DateTime(year, month, day, hour, 0, 0); int rowInd = 1; for (int itemInd = 0; itemInd < itemCnt; itemInd++) { TableView.Item item = tableView.VisibleItems[itemInd]; string text; string color; if (item.CnlNum > 0) { text = AppData.MainData.GetCnlVal(hourTable, item.CnlNum, dateTime, false, out color); } else { text = ""; color = ""; } if (isFirstHour) { row = new TableRow(); SetCssClass(row, itemInd % 3 == 2, itemInd == itemLastInd); tblHour.Rows.Add(row); text = text == "" ? "<p> </p>" : "<p>" + text + "</p>"; } else { row = tblHour.Rows[rowInd++]; } TableCell cell = NewCell(row, text); if (!(color == "" || color.ToLower() == "black")) { cell.ForeColor = Color.FromName(color); } } } } else { tblCap.Visible = false; tblCur.Visible = false; tblHour.Visible = false; lblNoData.Visible = true; } }
/// <summary> /// Bind input channel properties to the elements of the view /// <para>Привязать свойства входных каналов к элементам представления</para> /// </summary> public override void BindCnlProps(InCnlProps[] cnlPropsArr) { // вызов метода базового класса base.BindCnlProps(cnlPropsArr); }
/// <summary> /// Очистить объекты данных /// </summary> private void ClearDataObjects() { procCnlRow = false; cnlPropsArr = null; curCnlProps = null; }
public IEnumerable <TrendData> GetDataForGrafana([FromBody] GrafanaArg grafanaArg) { if (grafanaArg == null) { return(GetEmptyTrend()); } else { if (grafanaArg.targets == null) { Log.WriteError("It is not possible to receive data"); return(GetEmptyTrend()); } else { List <double?[]> points = new List <double?[]>(); SelectArcType(grafanaArg, out bool isHour, out int timeCoef); TrendData[] trends = new TrendData[grafanaArg.targets.Length]; for (int i = 0; i < grafanaArg.targets.Length; i++) { points = new List <double?[]>(); if (!int.TryParse(grafanaArg.targets[i].target.Trim(), out int cnlNum)) { Log.WriteError("It is not possible to read the dates for the channel " + cnlNum); trends[i] = new TrendData { target = "-1", datapoints = null }; } else { foreach (DateTime date in EachDay(grafanaArg.range.from, grafanaArg.range.to)) { Trend trend = GetTrend(date, cnlNum, isHour); for (int i1 = 0; i1 < trend.Points.Count; i1++) { long ofsVal = GetUnixTimeMs(trend.Points[i1].DateTime); if (i1 > 0) { long ofsValP = GetUnixTimeMs(trend.Points[i1 - 1].DateTime); if (ofsVal - ofsValP > timeCoef * 60000) { points.Add(new double?[] { null, ofsValP + timeCoef * 60000 }); } else { if (trend.Points[i1].Stat > 0) { points.Add(new double?[] { trend.Points[i1].Val, ofsVal }); } else { points.Add(new double?[] { null, ofsVal }); } } } else { if (trend.Points[i1].Stat > 0) { points.Add(new double?[] { trend.Points[i1].Val, ofsVal }); } else { points.Add(new double?[] { null, ofsVal }); } } } } InCnlProps inCnlProps = dataAccess.GetCnlProps(cnlNum); string cnlName = inCnlProps == null ? "" : inCnlProps.CnlName; trends[i] = new TrendData { target = "[" + cnlNum + "] " + cnlName, datapoints = points }; Log.WriteAction("Channel data received " + cnlNum); } } return(trends); } } }
/// <summary> /// Генерировать HTML-код табличного представления /// </summary> private string GenerateTableViewHtml(TableView tableView, bool cmdEnabled, int timeFrom, int timeTo) { const int FirstHour = -24; const int LastHour = 23; string[] hourStrings = new string[LastHour - FirstHour + 1]; for (int hour = FirstHour, hourInd = 0; hour <= LastHour; hour++, hourInd++) { hourStrings[hourInd] = hour.ToString(); } StringBuilder sbHtml = new StringBuilder(); sbHtml.AppendLine("<table>"); // заголовок таблицы sbHtml.AppendLine("<tr class='hdr'>"); AppendCell(sbHtml, "cap", "<span>" + PlgPhrases.ItemCol + "</span>"); AppendCell(sbHtml, "cur", "<span>" + PlgPhrases.CurCol + "</span>"); for (int hour = FirstHour, hourInd = 0; hour <= LastHour; hour++, hourInd++) { AppendCell(sbHtml, timeFrom <= hour && hour <= timeTo ? "hour" : "hour hidden", "<span>" + GetLocalizedHour(hour) + "</span>", hourStrings[hourInd]); } sbHtml.AppendLine().AppendLine("</tr>"); // строки таблицы bool altRow = false; foreach (TableView.Item item in tableView.VisibleItems) { InCnlProps cnlProps = item.CnlProps; int cnlNum = item.CnlNum; int ctrlCnlNum = item.CtrlCnlNum; // тег начала строки sbHtml.Append(altRow ? "<tr class='item alt'" : "<tr class='item'"); if (cnlNum > 0) { sbHtml.Append(" data-cnl='").Append(cnlNum).Append("'"); } if (ctrlCnlNum > 0) { sbHtml.Append(" data-ctrl='").Append(ctrlCnlNum).Append("'"); } sbHtml.AppendLine(">"); // ячейка наименования string caption = string.IsNullOrEmpty(item.Caption) ? " " : HttpUtility.HtmlEncode(item.Caption); if (cnlNum > 0 || ctrlCnlNum > 0) { StringBuilder sbCapHtml = new StringBuilder(); // иконка и обозначение string iconFileName = cnlProps == null || cnlProps.IconFileName == "" ? DefQuantityIcon : cnlProps.IconFileName; sbCapHtml.Append("<img src='" + QuantityIconsPath + iconFileName + "' class='icon' alt='' />") .Append("<a href='' class='lbl'>").Append(caption).Append("</a>"); // команда if (ctrlCnlNum > 0 && cmdEnabled) { sbCapHtml.Append("<span class='cmd' title='Send Command'></span>"); } // всплывающая подсказка sbCapHtml.Append("<span class='hint'>"); if (cnlNum > 0) { AppendHint(sbCapHtml, false, PlgPhrases.InCnlHint, cnlNum, cnlProps == null ? "" : cnlProps.CnlName); } if (ctrlCnlNum > 0) { AppendHint(sbCapHtml, cnlNum > 0, PlgPhrases.CtrlCnlHint, ctrlCnlNum, item.CtrlCnlProps == null ? "" : item.CtrlCnlProps.CtrlCnlName); } if (cnlProps != null) { if (cnlProps.ObjNum > 0) { AppendHint(sbCapHtml, true, PlgPhrases.ObjectHint, cnlProps.ObjNum, cnlProps.ObjName); } if (cnlProps.KPNum > 0) { AppendHint(sbCapHtml, true, PlgPhrases.DeviceHint, cnlProps.KPNum, cnlProps.KPName); } if (cnlProps.ParamID > 0) { AppendHint(sbCapHtml, true, PlgPhrases.QuantityHint, 0, cnlProps.ParamName); } if (cnlProps.UnitID > 0 && cnlProps.ShowNumber) { AppendHint(sbCapHtml, true, PlgPhrases.UnitHint, 0, cnlProps.UnitSign); } } sbCapHtml.Append("</span>"); AppendCell(sbHtml, "cap", sbCapHtml.ToString()); } else { AppendCell(sbHtml, "cap", caption); } // ячейки текущих и часовых данных AppendCell(sbHtml, "cur", ""); for (int hour = FirstHour, hourInd = 0; hour <= LastHour; hour++, hourInd++) { AppendCell(sbHtml, timeFrom <= hour && hour <= timeTo ? "hour" : "hour hidden", "", hourStrings[hourInd]); } // тег окончания строки sbHtml.AppendLine().AppendLine("</tr>"); altRow = !altRow; } sbHtml.AppendLine("</table>"); return(sbHtml.ToString()); }
/// <summary> /// Форматировать значение входного канала /// </summary> public void FormatCnlVal(double val, int stat, InCnlProps cnlProps, string decSep, string grSep, out string text, out string textWithUnit, out bool textIsNumber) { try { if (stat <= 0) { text = textWithUnit = EmptyVal; textIsNumber = false; return; } else { int unitArrLen = cnlProps == null || cnlProps.UnitArr == null ? 0 : cnlProps.UnitArr.Length; if (cnlProps == null || cnlProps.ShowNumber) { string unit = unitArrLen > 0 ? " " + cnlProps.UnitArr[0] : ""; nfi.NumberDecimalDigits = cnlProps == null ? DefDecDig : cnlProps.DecDigits; nfi.NumberDecimalSeparator = decSep == null ? defDecSep : decSep; nfi.NumberGroupSeparator = grSep == null ? defGrSep : grSep; text = val.ToString("N", nfi); textWithUnit = text + unit; textIsNumber = true; return; } else if (unitArrLen > 0) { int unitInd = (int)val; if (unitInd < 0) { unitInd = 0; } else if (unitInd >= unitArrLen) { unitInd = unitArrLen - 1; } text = textWithUnit = cnlProps.UnitArr[unitInd]; textIsNumber = false; return; } else { text = textWithUnit = NoVal; textIsNumber = false; return; } } } catch (Exception ex) { string cnlNumStr = cnlProps == null?cnlProps.CnlNum.ToString() : "?"; throw new ScadaException(string.Format(Localization.UseRussian ? "Ошибка при форматировании значения входного канала {0}" : "Error formatting value of input channel {0}", cnlNumStr), ex); } }
/// <summary> /// Форматировать значение входного канала /// </summary> public void FormatCnlVal(double val, int stat, InCnlProps cnlProps, string decSep, string grSep, out string text, out string textWithUnit, out bool textIsNumber, bool throwOnError = false) { bool cnlPropsIsNull = cnlProps == null; try { if (stat <= 0) { text = textWithUnit = EmptyVal; textIsNumber = false; } else { text = textWithUnit = NoVal; textIsNumber = false; int formatID = cnlPropsIsNull ? 0 : cnlProps.FormatID; int unitArrLen = cnlPropsIsNull || cnlProps.UnitArr == null ? 0 : cnlProps.UnitArr.Length; if (cnlPropsIsNull || cnlProps.ShowNumber) { // получение размерности string unit = unitArrLen > 0 ? " " + cnlProps.UnitArr[0] : ""; // определение формата числа NumberFormatInfo nfi; bool sepDefined = !(decSep == null && grSep == null); if (cnlPropsIsNull || sepDefined) { nfi = sepDefined ? CreateFormatInfo(DefDecDig, decSep, grSep) : defNfi; } else if (cnlProps.FormatInfo == null) { nfi = cnlProps.FormatInfo = CreateFormatInfo(cnlProps.DecDigits, decSep, grSep); } else { nfi = cnlProps.FormatInfo; } // форматирование значения text = val.ToString("N", nfi); textWithUnit = text + unit; textIsNumber = true; } else if (formatID == BaseValues.Formats.EnumText) { if (unitArrLen > 0) { int unitInd = (int)val; if (unitInd < 0) { unitInd = 0; } else if (unitInd >= unitArrLen) { unitInd = unitArrLen - 1; } text = textWithUnit = cnlProps.UnitArr[unitInd]; } } else if (formatID == BaseValues.Formats.AsciiText) { text = textWithUnit = ScadaUtils.DecodeAscii(val); } else if (formatID == BaseValues.Formats.UnicodeText) { text = textWithUnit = ScadaUtils.DecodeUnicode(val); } else if (formatID == BaseValues.Formats.DateTime) { text = textWithUnit = ScadaUtils.DecodeDateTime(val).ToLocalizedString(); } else if (formatID == BaseValues.Formats.Date) { text = textWithUnit = ScadaUtils.DecodeDateTime(val).ToLocalizedDateString(); } else if (formatID == BaseValues.Formats.Time) { text = textWithUnit = ScadaUtils.DecodeDateTime(val).ToLocalizedTimeString(); } } } catch (Exception ex) { if (throwOnError) { string cnlNumStr = cnlPropsIsNull ? "?" : cnlProps.CnlNum.ToString(); throw new ScadaException(string.Format(Localization.UseRussian ? "Ошибка при форматировании значения входного канала {0}" : "Error formatting value of input channel {0}", cnlNumStr), ex); } else { text = textWithUnit = FrmtErrVal; textIsNumber = false; } } }
/// <summary> /// Заполнить свойства входных каналов /// </summary> private void FillCnlProps() { Monitor.Enter(baseLock); AppData.Log.WriteAction(Localization.UseRussian ? "Заполнение свойств входных каналов" : "Fill input channels properties", Log.ActTypes.Action); try { int inCnlCnt = tblInCnl.Rows.Count; // количество входных каналов if (inCnlCnt == 0) { cnlPropsArr = null; } else { if (0 < maxCnlCnt && maxCnlCnt < inCnlCnt) inCnlCnt = maxCnlCnt; InCnlProps[] newCnlPropsArr = new InCnlProps[inCnlCnt]; for (int i = 0; i < inCnlCnt; i++) { DataRowView rowView = tblInCnl.DefaultView[i]; int cnlNum = (int)rowView["CnlNum"]; InCnlProps cnlProps = GetCnlProps(cnlNum); if (cnlProps == null) cnlProps = new InCnlProps(cnlNum, "", 0); // определение свойств, не использующих внешних ключей cnlProps.CnlName = (string)rowView["Name"]; cnlProps.CtrlCnlNum = (int)rowView["CtrlCnlNum"]; cnlProps.EvSound = (bool)rowView["EvSound"]; // определение номера и наименования объекта cnlProps.ObjNum = (int)rowView["ObjNum"]; tblObj.DefaultView.RowFilter = "ObjNum = " + cnlProps.ObjNum; cnlProps.ObjName = tblObj.DefaultView.Count > 0 ? (string)tblObj.DefaultView[0]["Name"] : ""; // определение номера и наименования КП cnlProps.KPNum = (int)rowView["KPNum"]; tblKP.DefaultView.RowFilter = "KPNum = " + cnlProps.KPNum; cnlProps.KPName = tblKP.DefaultView.Count > 0 ? (string)tblKP.DefaultView[0]["Name"] : ""; // определение наименования параметра и имени файла значка tblParam.DefaultView.RowFilter = "ParamID = " + rowView["ParamID"]; if (tblParam.DefaultView.Count > 0) { DataRowView paramRowView = tblParam.DefaultView[0]; cnlProps.ParamName = (string)paramRowView["Name"]; object iconFileName = paramRowView["IconFileName"]; cnlProps.IconFileName = iconFileName == DBNull.Value ? "" : iconFileName.ToString(); } else { cnlProps.ParamName = ""; cnlProps.IconFileName = ""; } // определение формата вывода tblFormat.DefaultView.RowFilter = "FormatID = " + rowView["FormatID"]; if (tblFormat.DefaultView.Count > 0) { DataRowView formatRowView = tblFormat.DefaultView[0]; cnlProps.ShowNumber = (bool)formatRowView["ShowNumber"]; cnlProps.DecDigits = (int)formatRowView["DecDigits"]; } // определение размерностей tblUnit.DefaultView.RowFilter = "UnitID = " + rowView["UnitID"]; if (tblUnit.DefaultView.Count > 0) { string sign = (string)tblUnit.DefaultView[0]["Sign"]; cnlProps.UnitArr = sign.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < cnlProps.UnitArr.Length; j++) cnlProps.UnitArr[j] = cnlProps.UnitArr[j].Trim(); if (cnlProps.UnitArr.Length == 1 && cnlProps.UnitArr[0] == "") cnlProps.UnitArr = null; } else { cnlProps.UnitArr = null; } newCnlPropsArr[i] = cnlProps; } cnlPropsArr = newCnlPropsArr; } } catch (Exception ex) { AppData.Log.WriteAction((Localization.UseRussian ? "Ошибка при заполнении свойств входных каналов: " : "Error filling input channels properties: ") + ex.Message, Log.ActTypes.Exception); } finally { Monitor.Exit(baseLock); } }
/// <summary> /// Форматировать значение входного канала /// </summary> /// <remarks>Для текущего значения dataDT равно DateTime.MinValue</remarks> public string FormatCnlVal(double val, int stat, InCnlProps cnlProps, bool showUnit, bool getColor, DateTime dataDT, DateTime nowDT, out bool isNumber, out string color, string decSep = null, string grSep = null) { string result = ""; isNumber = false; color = "black"; try { // определение длины массива размерностей канала int unitArrLen = cnlProps == null || cnlProps.UnitArr == null ? 0 : cnlProps.UnitArr.Length; // определение цвета if (cnlProps != null && getColor) { if (!cnlProps.ShowNumber && unitArrLen == 2 && stat > 0 && stat != BaseValues.CnlStatuses.FormulaError && stat != BaseValues.CnlStatuses.Unreliable) { color = val > 0 ? "green" : "red"; } else { Monitor.Enter(baseLock); try { string colorByStat; if (GetColorByStat(stat, out colorByStat)) color = colorByStat; } finally { Monitor.Exit(baseLock); } } } // определение результата метода if (cnlProps == null || cnlProps.ShowNumber) { string unit = showUnit && unitArrLen > 0 ? " " + cnlProps.UnitArr[0] : ""; isNumber = unit == ""; nfi.NumberDecimalDigits = cnlProps == null ? 3 : cnlProps.DecDigits; nfi.NumberDecimalSeparator = decSep == null ? defDecSep : decSep; nfi.NumberGroupSeparator = grSep == null ? defGrSep : grSep; result = val.ToString("N", nfi) + unit; } else if (unitArrLen > 0) { int unitInd = (int)val; if (unitInd < 0) unitInd = 0; else if (unitInd >= unitArrLen) unitInd = unitArrLen - 1; result = cnlProps.UnitArr[unitInd]; } // изменение результата метода, если значение канала не определено if (dataDT == DateTime.MinValue) { if ((nowDT - tblCur.FileModTime).TotalMinutes > CurSrezShowTime) // текущий срез устарел { result = ""; isNumber = false; } else if (stat == 0) { result = "---"; isNumber = false; } } else if (stat == 0) { result = "---"; isNumber = false; if (dataDT.Date > nowDT.Date) { result = ""; } else if (dataDT.Date == nowDT.Date) { if (dataDT.Hour > nowDT.Hour + 1) result = ""; else if (dataDT.Hour == nowDT.Hour + 1) { result = "***"; color = "green"; } } } } catch (Exception ex) { string cnlNumStr = cnlProps == null ? "" : " " + cnlProps.CnlNum; AppData.Log.WriteAction(string.Format(Localization.UseRussian ? "Ошибка при форматировании значения входного канала{0}: {1}" : "Error formatting input channel{0} value: {1}", cnlNumStr, ex.Message), Log.ActTypes.Exception); } return result; }
/// <summary> /// Обработка директивы, изменяющей значение элемента /// </summary> /// <param name="xmlNode">XML-узел, содержащий директиву</param> /// <param name="valName">Имя элемента, заданное директивой</param> protected override void ProcVal(Cell cell, string valName) { XmlNode dataNode = cell.DataNode; if (valName == "HourDataPage") { dataNode.InnerText = WebPhrases.HourDataPage; } else if (valName == "HourDataTitle") { dataNode.InnerText = string.Format(WebPhrases.HourDataTitle, date.ToString("d", Localization.Culture), baseView.Title, genDT.ToString("d", Localization.Culture)); } else if (valName == "ItemCol") { dataNode.InnerText = WebPhrases.ItemColumn; } else if (valName == "EventsPage") { dataNode.InnerText = WebPhrases.EventsPage; } else if (valName == "EventsTitle") { string dateStr = date.ToString("d", Localization.Culture); string genDTStr = genDT.ToString("d", Localization.Culture); dataNode.InnerText = eventOut <= 1 ? string.Format(WebPhrases.AllEventsTitle, dateStr, genDTStr) : string.Format(WebPhrases.EventsByViewTitle, dateStr, baseView.Title, genDTStr); } else if (valName == "NumCol") { dataNode.InnerText = WebPhrases.NumColumn; } else if (valName == "DateCol") { dataNode.InnerText = WebPhrases.DateColumn; } else if (valName == "TimeCol") { dataNode.InnerText = WebPhrases.TimeColumn; } else if (valName == "ObjCol") { dataNode.InnerText = WebPhrases.ObjColumn; } else if (valName == "KPCol") { dataNode.InnerText = WebPhrases.KPColumn; } else if (valName == "CnlCol") { dataNode.InnerText = WebPhrases.CnlColumn; } else if (valName == "EvCol") { dataNode.InnerText = WebPhrases.EventColumn; } else if (valName == "ChkCol") { dataNode.InnerText = WebPhrases.CheckColumn; } else if (item != null) { if (valName == "Name") { dataNode.InnerText = item.Caption; } else if (valName.Length >= 2 && valName[0] == 'h') { int hour = -1; try { hour = int.Parse(valName.Substring(1)); } catch { } int cnlNum = item.CnlNum; if (hour >= 0 && cnlNum > 0) { DateTime dateTime = date.AddHours(hour); double val; int stat; bool isNumber; string color; AppData.MainData.GetHourData(hourTable, cnlNum, dateTime, out val, out stat); InCnlProps cnlProps = AppData.MainData.GetCnlProps(cnlNum); dataNode.InnerText = AppData.MainData.FormatCnlVal(val, stat, cnlProps, false, false, dateTime, genDT, out isNumber, out color, ".", ""); if (isNumber) { dataNode.Attributes["ss:Type"].Value = "Number"; } } else { dataNode.InnerText = ""; } } } else if (eventView != null) { if (valName == "Num") { dataNode.InnerText = eventView.Num; dataNode.Attributes["ss:Type"].Value = "Number"; } else if (valName == "Date") { dataNode.InnerText = eventView.Date; } else if (valName == "Time") { dataNode.InnerText = eventView.Time; } else if (valName == "Obj") { dataNode.InnerText = eventView.Obj; } else if (valName == "KP") { dataNode.InnerText = eventView.KP; } else if (valName == "Cnl") { dataNode.InnerText = eventView.Cnl; } else if (valName == "Ev") { dataNode.InnerText = eventView.Text; } else if (valName == "Chk") { dataNode.InnerText = eventView.User; } else { dataNode.InnerText = ""; } } }