コード例 #1
0
ファイル: MainLogic.cs プロジェクト: NoExceptions/scada
        /// <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);
                }
            }
        }