Exemple #1
0
        /// <summary>
		/// Привязать свойства входных каналов к элементам представления
		/// </summary>
        public virtual void BindCnlProps(InCnlProps[] cnlPropsArr)
        {
        }
Exemple #2
0
        /// <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;
                }
            }
        }
Exemple #3
0
        /// <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;
                    }
                }
            }
        }
Exemple #4
0
        /// <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"));
            }
        }
Exemple #5
0
        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>&nbsp;</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>&nbsp;</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;
            }
        }
Exemple #6
0
 /// <summary>
 /// Bind input channel properties to the elements of the view
 /// <para>Привязать свойства входных каналов к элементам представления</para>
 /// </summary>
 public override void BindCnlProps(InCnlProps[] cnlPropsArr)
 {
     // вызов метода базового класса
     base.BindCnlProps(cnlPropsArr);
 }
Exemple #7
0
 /// <summary>
 /// Очистить объекты данных
 /// </summary>
 private void ClearDataObjects()
 {
     procCnlRow  = false;
     cnlPropsArr = null;
     curCnlProps = null;
 }
Exemple #8
0
        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);
                }
            }
        }
Exemple #9
0
        /// <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) ? "&nbsp;" : 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());
        }
Exemple #10
0
        /// <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);
            }
        }
Exemple #11
0
        /// <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;
                }
            }
        }
Exemple #12
0
		/// <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);
            }
        }
Exemple #13
0
        /// <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;
        }
Exemple #14
0
        /// <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 = "";
                }
            }
        }