Esempio n. 1
0
        /// <summary>
        /// Clones output channels.
        /// </summary>
        private bool CloneCtrlCnls(int srcStartNum, int srcEndNum, int destStartNum,
                                   int replaceObjNum, int replaceKpNum, bool updateFormulas)
        {
            try
            {
                BaseTable <CtrlCnl> ctrlCnlTable = configBase.CtrlCnlTable;
                int affectedRows = 0;

                if (srcStartNum <= srcEndNum)
                {
                    // create new channels
                    int            shiftNum  = destStartNum - srcStartNum;
                    List <CtrlCnl> cnlsToAdd = new List <CtrlCnl>(srcEndNum - srcStartNum + 1);

                    foreach (CtrlCnl ctrlCnl in ctrlCnlTable.Items.Values)
                    {
                        int ctrlCnlNum = ctrlCnl.CtrlCnlNum;

                        if (srcStartNum <= ctrlCnlNum && ctrlCnlNum <= srcEndNum)
                        {
                            int newCnlNum = ctrlCnlNum + shiftNum;

                            if (newCnlNum <= AdminUtils.MaxCnlNum && !ctrlCnlTable.PkExists(newCnlNum))
                            {
                                CtrlCnl newCtrlCnl = ScadaUtils.DeepClone(ctrlCnl);
                                newCtrlCnl.CtrlCnlNum = newCnlNum;

                                if (replaceObjNum >= 0)
                                {
                                    newCtrlCnl.ObjNum = replaceObjNum > 0 ? replaceObjNum : (int?)null;
                                }

                                if (replaceKpNum >= 0)
                                {
                                    newCtrlCnl.KPNum = replaceKpNum > 0 ? replaceKpNum : (int?)null;
                                }

                                if (updateFormulas)
                                {
                                    newCtrlCnl.Formula = UpdateFormula(newCtrlCnl.Formula, shiftNum);
                                }

                                cnlsToAdd.Add(newCtrlCnl);
                            }
                        }
                        else if (ctrlCnlNum > srcEndNum)
                        {
                            break;
                        }
                    }

                    // add the created channels
                    foreach (CtrlCnl ctrlCnl in cnlsToAdd)
                    {
                        ctrlCnlTable.AddItem(ctrlCnl);
                    }

                    affectedRows = cnlsToAdd.Count;
                }

                if (affectedRows > 0)
                {
                    ctrlCnlTable.Modified = true;
                }

                ScadaUiUtils.ShowInfo(string.Format(AppPhrases.CloneCnlsComplete, affectedRows));
                return(true);
            }
            catch (Exception ex)
            {
                appData.ProcError(ex, AppPhrases.CloneCtrlCnlsError);
                return(false);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Считать каналы управления из базы конфигурации
        /// </summary>
        private bool ReadCtrlCnls()
        {
            try
            {
                lock (ctrlCnls)
                {
                    ctrlCnls.Clear();
                    DataTable tblCtrlCnl = new DataTable();
                    BaseAdapter adapter = new BaseAdapter();
                    adapter.FileName = Settings.BaseDATDir + "ctrlcnl.dat";
                    adapter.Fill(tblCtrlCnl, false);

                    foreach (DataRow dataRow in tblCtrlCnl.Rows)
                    {
                        if ((bool)dataRow["Active"])
                        {
                            // заполняются только свойства, используемые приложением
                            CtrlCnl ctrlCnl = new CtrlCnl();
                            ctrlCnl.CtrlCnlNum = (int)dataRow["CtrlCnlNum"];
                            ctrlCnl.CmdTypeID = (int)dataRow["CmdTypeID"];
                            ctrlCnl.ObjNum = (int)dataRow["ObjNum"];
                            ctrlCnl.KPNum = (int)dataRow["KPNum"];
                            ctrlCnl.CmdNum = (int)dataRow["CmdNum"];
                            ctrlCnl.FormulaUsed = (bool)dataRow["FormulaUsed"];
                            ctrlCnl.Formula = (string)dataRow["Formula"];
                            ctrlCnl.EvEnabled = (bool)dataRow["EvEnabled"];
                            ctrlCnls.Add(ctrlCnl.CtrlCnlNum, ctrlCnl);
                        }
                    }
                }

                AppLog.WriteAction(Localization.UseRussian ? "Каналы управления считаны из базы конфигурации" :
                    "Ouput channels are read from the configuration database", Log.ActTypes.Action);
                return true;
            }
            catch (Exception ex)
            {
                AppLog.WriteAction((Localization.UseRussian ?
                    "Ошибка при считывании каналов управления из базы конфигурации: " :
                    "Error reading ouput channels from the configuration database: ") +
                    ex.Message, Log.ActTypes.Exception);
                return false;
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Обработать команду ТУ
        /// </summary>
        public void ProcCommand(CtrlCnl ctrlCnl, Command cmd, int userID, out bool passToClients)
        {
            passToClients = false;

            if (serverIsReady && ctrlCnl != null)
            {
                int ctrlCnlNum = ctrlCnl.CtrlCnlNum;

                // вычисление значения или данных команды по формуле канала управления
                if (ctrlCnl.CalcCmdVal != null)
                {
                    // вычисление значения стандартной команды
                    lock (curSrez) lock (calculator)
                    {
                        try
                        {
                            procSrez = curSrez; // необходимо для работы формул Val(n) и Stat(n)
                            double cmdVal = cmd.CmdVal;
                            ctrlCnl.CalcCmdVal(ref cmdVal);
                            cmd.CmdVal = cmdVal;
                            passToClients = !double.IsNaN(cmdVal);
                        }
                        catch (Exception ex)
                        {
                            AppLog.WriteAction(string.Format(Localization.UseRussian ?
                                "Ошибка при вычислении значения стандартной команды для канала управления {0}: {1}" :
                                "Error calculating standard command value for the output channel {0}: {1}",
                                ctrlCnlNum, ex.Message), Log.ActTypes.Error);
                            cmd.CmdVal = double.NaN;
                        }
                        finally
                        {
                            procSrez = null;
                        }
                    }
                }
                else if (ctrlCnl.CalcCmdData != null)
                {
                    // вычисление данных бинарной команды
                    lock (curSrez) lock (calculator)
                    {
                        try
                        {
                            procSrez = curSrez;
                            byte[] cmdData = cmd.CmdData;
                            ctrlCnl.CalcCmdData(ref cmdData);
                            cmd.CmdData = cmdData;
                            passToClients = cmdData != null;
                        }
                        catch (Exception ex)
                        {
                            AppLog.WriteAction(string.Format(Localization.UseRussian ?
                                "Ошибка при вычислении данных бинарной команды для канала управления {0}: {1}" :
                                "Error calculating binary command data for the output channel {0}: {1}",
                                ctrlCnlNum, ex.Message), Log.ActTypes.Error);
                            cmd.CmdVal = double.NaN;
                        }
                        finally
                        {
                            procSrez = null;
                        }
                    }
                }
                else
                {
                    passToClients = true;
                }

                // выполнение действий модулей после приёма команды
                RaiseOnCommandReceived(ctrlCnlNum, cmd, userID, ref passToClients);

                // создание события
                if (passToClients && ctrlCnl.EvEnabled)
                {
                    EventTableLight.Event ev = new EventTableLight.Event();
                    ev.DateTime = DateTime.Now;
                    ev.ObjNum = ctrlCnl.ObjNum;
                    ev.KPNum = ctrlCnl.KPNum;
                    ev.Descr = cmd.GetCmdDescr(ctrlCnlNum, userID);

                    // запись события и выполнение действий модулей
                    WriteEvent(ev);
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Creates channels based on the prototypes.
        /// </summary>
        private bool CreateChannels()
        {
            try
            {
                List <KPView.InCnlPrototype>   inCnlPrototypes   = ctrlCnlCreate1.CnlPrototypes.InCnls;
                List <KPView.CtrlCnlPrototype> ctrlCnlPrototypes = ctrlCnlCreate1.CnlPrototypes.CtrlCnls;
                int?                objNum        = ctrlCnlCreate2.ObjNum;
                int                 kpNum         = ctrlCnlCreate1.SelectedDevice.KPNum;
                string              cnlPrefix     = ctrlCnlCreate1.SelectedDevice.Name + " - ";
                int                 inCnlNum      = ctrlCnlCreate3.StartInCnl;
                int                 ctrlCnlNum    = ctrlCnlCreate3.StartOutCnl;
                int                 inCnlsAdded   = 0;
                int                 ctrlCnlsAdded = 0;
                BaseTable <InCnl>   inCnlTable    = project.ConfigBase.InCnlTable;
                BaseTable <CtrlCnl> ctrlCnlTable  = project.ConfigBase.CtrlCnlTable;
                BaseTable <Format>  formatTable   = project.ConfigBase.FormatTable;
                DictIndexes         dictIndexes   = new DictIndexes(project.ConfigBase);

                // create output channels
                foreach (KPView.CtrlCnlPrototype ctrlCnlPrototype in ctrlCnlPrototypes)
                {
                    ctrlCnlPrototype.CtrlCnlNum = ctrlCnlNum;

                    CtrlCnl ctrlCnl = new CtrlCnl
                    {
                        CtrlCnlNum  = ctrlCnlNum++,
                        Active      = ctrlCnlPrototype.Active,
                        Name        = cnlPrefix + ctrlCnlPrototype.CtrlCnlName,
                        CmdTypeID   = ctrlCnlPrototype.CmdTypeID,
                        ObjNum      = objNum,
                        KPNum       = kpNum,
                        CmdNum      = ctrlCnlPrototype.CmdNum > 0 ? (int?)ctrlCnlPrototype.CmdNum : null,
                        CmdValID    = dictIndexes.GetID(dictIndexes.CmdValByName, ctrlCnlPrototype.CmdVal),
                        FormulaUsed = ctrlCnlPrototype.FormulaUsed,
                        Formula     = ctrlCnlPrototype.Formula,
                        EvEnabled   = ctrlCnlPrototype.EvEnabled
                    };

                    if (ctrlCnl.Name.Length > ColumnLength.Name)
                    {
                        ctrlCnl.Name = ctrlCnl.Name.Substring(0, ColumnLength.Name);
                    }

                    ctrlCnlTable.AddItem(ctrlCnl);
                    ctrlCnlsAdded++;

                    if (ctrlCnlNum > ushort.MaxValue)
                    {
                        break;
                    }
                }

                if (ctrlCnlsAdded > 0)
                {
                    ctrlCnlTable.Modified = true;
                }

                // create input channels
                foreach (KPView.InCnlPrototype inCnlPrototype in inCnlPrototypes)
                {
                    int formatID = inCnlPrototype.ShowNumber ?
                                   Math.Min(inCnlPrototype.DecDigits, BaseValues.Formats.MaxFixedID) :
                                   BaseValues.Formats.EnumText;

                    InCnl inCnl = new InCnl
                    {
                        CnlNum      = inCnlNum++,
                        Active      = inCnlPrototype.Active,
                        Name        = cnlPrefix + inCnlPrototype.CnlName,
                        CnlTypeID   = inCnlPrototype.CnlTypeID,
                        ObjNum      = objNum,
                        KPNum       = kpNum,
                        Signal      = inCnlPrototype.Signal > 0 ? (int?)inCnlPrototype.Signal : null,
                        FormulaUsed = inCnlPrototype.FormulaUsed,
                        Formula     = inCnlPrototype.Formula,
                        Averaging   = inCnlPrototype.Averaging,
                        ParamID     = dictIndexes.GetID(dictIndexes.ParamByName, inCnlPrototype.ParamName),
                        FormatID    = formatTable.PkExists(formatID) ? (int?)formatID : null,
                        UnitID      = dictIndexes.GetID(dictIndexes.UnitByName, inCnlPrototype.UnitName),
                        CtrlCnlNum  = inCnlPrototype.CtrlCnlProps?.CtrlCnlNum,
                        EvEnabled   = inCnlPrototype.EvEnabled,
                        EvSound     = inCnlPrototype.EvSound,
                        EvOnChange  = inCnlPrototype.EvOnChange,
                        EvOnUndef   = inCnlPrototype.EvOnUndef,
                        LimLowCrash = double.IsNaN(inCnlPrototype.LimLowCrash) ?
                                      null : (double?)inCnlPrototype.LimLowCrash,
                        LimLow = double.IsNaN(inCnlPrototype.LimLow) ?
                                 null : (double?)inCnlPrototype.LimLow,
                        LimHigh = double.IsNaN(inCnlPrototype.LimHigh) ?
                                  null : (double?)inCnlPrototype.LimHigh,
                        LimHighCrash = double.IsNaN(inCnlPrototype.LimHighCrash) ?
                                       null : (double?)inCnlPrototype.LimHighCrash
                    };

                    if (inCnl.Name.Length > ColumnLength.Name)
                    {
                        inCnl.Name = inCnl.Name.Substring(0, ColumnLength.Name);
                    }

                    inCnlTable.AddItem(inCnl);
                    inCnlsAdded++;

                    if (inCnlNum > ushort.MaxValue)
                    {
                        break;
                    }
                }

                if (inCnlsAdded > 0)
                {
                    inCnlTable.Modified = true;
                }

                ScadaUiUtils.ShowInfo(string.Format(AppPhrases.CreateCnlsComplete, inCnlsAdded, ctrlCnlsAdded));
                return(true);
            }
            catch (Exception ex)
            {
                appData.ProcError(ex, AppPhrases.CreateCnlsError);
                return(false);
            }
        }