/// <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); } }
/// <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); } }
/// <summary> /// Clones channels with the specified parameters. /// </summary> private bool CloneChannels(int srcStartNum, int srcEndNum, int destStartNum, int replaceObjNum, int replaceDeviceNum, bool updateFormulas) { try { BaseTable <Cnl> cnlTable = configDatabase.CnlTable; int affectedRows = 0; if (srcStartNum <= srcEndNum) { // create new channels ExtensionUtils.NormalizeIdRange(ConfigDatabase.MinID, ConfigDatabase.MaxID, ref srcStartNum, ref srcEndNum, destStartNum, out int numOffset); List <Cnl> cnlsToAdd = new(srcEndNum - srcStartNum + 1); foreach (Cnl cnl in cnlTable.EnumerateItems()) { if (cnl.CnlNum < srcStartNum) { continue; } else if (cnl.CnlNum > srcEndNum) { break; } else if (!cnlTable.PkExists(cnl.CnlNum + numOffset)) { Cnl newCnl = ScadaUtils.DeepClone(cnl); newCnl.CnlNum = cnl.CnlNum + numOffset; if (replaceObjNum >= 0) { newCnl.ObjNum = replaceObjNum > 0 ? replaceObjNum : null; } if (replaceDeviceNum >= 0) { newCnl.DeviceNum = replaceDeviceNum > 0 ? replaceDeviceNum : null; } if (updateFormulas) { newCnl.InFormula = UpdateFormula(newCnl.InFormula, numOffset); newCnl.OutFormula = UpdateFormula(newCnl.OutFormula, numOffset); } cnlsToAdd.Add(newCnl); } } // add created channels cnlsToAdd.ForEach(cnl => cnlTable.AddItem(cnl)); affectedRows = cnlsToAdd.Count; } if (affectedRows > 0) { cnlTable.Modified = true; } ScadaUiUtils.ShowInfo(string.Format(ExtensionPhrases.CloneChannelsCompleted, affectedRows)); return(true); } catch (Exception ex) { adminContext.ErrLog.HandleError(ex, ExtensionPhrases.CloneChannelsError); return(false); } }