/// <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); } } }