using System.Collections.Generic; using System; using System.Drawing; using System.Diagnostics; using System.Data; using System.Collections; using System.Windows.Forms; using AR; using System.Linq; using vmsnet; using System.IO.Ports; using System.Security.Cryptography.X509Certificates; namespace vmsnet { public partial class Frm_Config { fPleaseWait fw; /* 작성자: 이재웅, 작성일: 2024-09-24, 작성내용: 유닛의 채널설정 ToolTip 선언 */ ToolTip[,] tTip = new ToolTip[4, 2]; public Frm_Config() { InitializeComponent(); this.Controls.Clear(); this.TabControl1.Visible = false; //panbg = new Panel(); //panbg.Dock = DockStyle.Fill; fw = new fPleaseWait(); fw.TopLevel = false; fw.Dock = DockStyle.Fill; fw.Show(); //panbg.Controls.Add(fw); this.Controls.Add(fw); this.Controls.Add(TabControl1); this.Controls.Add(StatusStrip1); this.Controls.Add(ToolStrip1); string[] ports = GetAvailablePorts(); /* 작성자: 이재웅, 작성일: 2024-10-11, 작성내용: PC에 인가된 통신포트들만 표시 */ cmb_plcport.Items.Clear(); cmb_plcport.Items.AddRange(ports); /* 작성자: 이재웅, 작성일: 2024-11-27, 작성내용: KA 인디케이터용 PC에서 인가된 통신포트들만 표시 */ cmbIndiport.Items.Clear(); cmbIndiport.Items.AddRange(ports); /* 작성자: 이재웅, 작성일: 2024-09-24, 작성내용: 유닛의 채널설정 ToolTip 초기화 */ for (int i = 0; i < tTip.GetLength(0); i++) for (int j = 0; j < tTip.GetLength(1); j++) tTip[i, j] = new ToolTip(); nudPri1.ValueChanged += NumericUpDown_ValueChanged; nudPri2.ValueChanged += NumericUpDown_ValueChanged; nudSec1.ValueChanged += NumericUpDown_ValueChanged; nudSec2.ValueChanged += NumericUpDown_ValueChanged; nud3rdp1.ValueChanged += NumericUpDown_ValueChanged; nud3rdp2.ValueChanged += NumericUpDown_ValueChanged; nud4thp1.ValueChanged += NumericUpDown_ValueChanged; nud4thp2.ValueChanged += NumericUpDown_ValueChanged; } private static string[] GetAvailablePorts() { return SerialPort.GetPortNames(); } private void NumericUpDown_ValueChanged(object sender, EventArgs e) { /* 작성자: 이재웅, 작성일: 2024-09-24, 작성내용: 유닛의 채널설정 ToolTip 생성 */ NumericUpDown nud = (NumericUpDown)sender; // NumericUpDown 매핑을 Dictionary로 관리 Dictionary nudMapping = new Dictionary { { nudPri1, (0, 0) }, { nudPri2, (0, 1) }, { nudSec1, (1, 0) }, { nudSec2, (1, 1) }, { nud3rdp1, (2, 0) }, { nud3rdp2, (2, 1) }, { nud4thp1, (3, 0) }, { nud4thp2, (3, 1) } }; // 유닛채널 공통로직 string unitChannelInfo = $"{nud.Value.ToString("000").Substring(0, 1)}번유닛 {nud.Value.ToString("000").Substring(1, 2)}번 채널\n\n※ 유닛채널수 : 60개"; // 컨트롤이 매핑에 존재하는지 확인 if (nudMapping.TryGetValue(nud, out var indices)) { tTip[indices.Item1, indices.Item2].SetToolTip(nud, unitChannelInfo); } } public void Frm_Config_Load(object sender, System.EventArgs e) { this.Show(); Application.DoEvents(); Initializing(); fw.Visible = false; TabControl1.Visible = true; toolStripStatusLabel1.Text = PUB.CONFIG.GetDatabasePath(); } #region NEW DATA ROW private void newrow_window(object sender, System.Data.DataTableNewRowEventArgs e) { var maxnum = this.DocumentElement1.WIN.Any() ? this.DocumentElement1.WIN.Max(t => t.IDX) : 0; e.Row["IDX"] = maxnum + 1; e.Row["USE"] = 0; e.Row["TITLE"] = $"Win{maxnum + 1}"; e.Row["MATRIX"] = "1*2"; e.Row["ALAMH"] = "5"; e.Row["ALAML"] = "0"; } private void newrow_group(object sender, System.Data.DataTableNewRowEventArgs e) { var maxnum = this.DocumentElement1.GRP.Any() ? this.DocumentElement1.GRP.Max(t => t.IDX) : 0; e.Row["IDX"] = maxnum + 1; e.Row["USE"] = 0; e.Row["WINDOW"] = "1"; e.Row["TITLE"] = ""; e.Row["MATRIX"] = "1*1"; e.Row["POS"] = "0/0"; e.Row["SPAN"] = "1/1"; e.Row["FONT"] = "나눔고딕,8,1"; e.Row["ALAMH"] = "5"; e.Row["ALAML"] = "0"; e.Row["AUTOH"] = "1"; e.Row["AUTOL"] = "1"; e.Row["KADEVICE"] = ""; e.Row["ALAMTYPE"] = ""; e.Row["NBOFF"] = "0"; e.Row["NBSEQ"] = "0"; } private void newrow_device(object sender, System.Data.DataTableNewRowEventArgs e) { var maxnum = this.DocumentElement1.DEVICE.Any() ? this.DocumentElement1.DEVICE.Max(t => t.IDX) : -1; e.Row["IDX"] = maxnum + 1; e.Row["USE"] = 0; e.Row["TITLE"] = ""; e.Row["IP"] = ""; e.Row["CHCOUNT"] = ""; e.Row["KACOMMAND"] = ""; e.Row["CHCOMMAND"] = ""; e.Row["SNCOMMAND"] = ""; } private void newrow_channel(object sender, System.Data.DataTableNewRowEventArgs e) { var maxnum = this.DocumentElement1.CHANNEL.Any() ? this.DocumentElement1.CHANNEL.Max(t => t.IDX) : 0; e.Row["IDX"] = maxnum + 1; e.Row["USE"] = 1; e.Row["DECPOS"] = 3; e.Row["UNIT"] = "V"; } #endregion private void Initializing() { int retcnt = 0; this.DS.Tables["machine"].Clear(); this.DS.Tables["alamtype"].Clear(); this.DS.Tables["group"].Clear(); //데이터는 로컬데이터로 복제해서 사용 240809 this.DocumentElement1.Clear();//.DEVICE.Clear(); this.DocumentElement1.Merge(PUB.DS); this.DocumentElement1.AcceptChanges(); this.chk_savebinary.Checked = PUB.CONFIG.binarysave; this.chk_synctime.Checked = PUB.CONFIG.synctime; this.tb_savepath.Text = PUB.CONFIG.databasefolder; this.chk_lsb.Checked = PUB.CONFIG.lsb; this.tb_trashper.Text = PUB.CONFIG.trashper.ToString(); this.tb_saveterm.Text = PUB.CONFIG.saveterm.ToString(); this.chk_2nddata.Checked = PUB.CONFIG.seconddata; this.chk_3rdData.Checked = PUB.CONFIG.thirddata; this.chk_4thData.Checked = PUB.CONFIG.getdata4; this.chk_sound.Checked = PUB.CONFIG.sound; this.tb_viewsize.Text = PUB.CONFIG.viewSize.ToString(); this.tb_plcidx.Value = PUB.CONFIG.plc_addr; this.cmb_plcport.Text = PUB.CONFIG.plc_port; //this.tb_plcport.Text = PUB.CONFIG.plc_port; this.chkEnableKA.Checked = PUB.CONFIG.EnableKA; this.tb_div.Text = PUB.CONFIG.datadiv.ToString(); this.chk_nb.Checked = PUB.CONFIG.nullbalnce; this.chk_sumab.Checked = PUB.CONFIG.Sumab; this.chk_alplc.Checked = PUB.CONFIG.alamplc; this.cmbIndiport.Text = PUB.CONFIG.indicator_port; this.nudSlaveNo.Value = (decimal)PUB.CONFIG.indicator_slaveno; /* 작성자: 이재웅, 작성일: 2024-09-24, 작성내용: 유닛의 채널설정 ToolTip 생성 */ nudPri1.Value = PUB.CONFIG.meas_pri1; nudPri2.Value = PUB.CONFIG.meas_pri2; nudSec1.Value = PUB.CONFIG.meas_sec1; nudSec2.Value = PUB.CONFIG.meas_sec2; nud3rdp1.Value = PUB.CONFIG.meas_3rd1; nud3rdp2.Value = PUB.CONFIG.meas_3rd2; nud4thp1.Value = PUB.CONFIG.meas_4th1; nud4thp2.Value = PUB.CONFIG.meas_4th2; nudMaxCH.Value = PUB.CONFIG.MaxChCount; nudLimit.Value = (decimal)PUB.CONFIG.threadlimit; tb_sangho.Text = PUB.CONFIG.sangho; tb_tel.Text = PUB.CONFIG.tel; DocumentElement1.DEVICE.TableNewRow += newrow_device; ////장치목록으로 DEVICEID를 생성한다. DS.Tables["machine"].Clear(); DS.Tables["kadevice"].Clear(); int idx = 0; foreach (var Dr in DocumentElement1.DEVICE.Where(t => t.USE == 1).OrderBy(t => t.IDX)) { var NAME = Dr.TITLE; var UNITCH = Dr.CHCOUNT; foreach (var UC in UNITCH.Split(",".ToCharArray())) { var ucbuffer = UC.Split(new char[] { '*' }, StringSplitOptions.RemoveEmptyEntries); var unit = int.Parse(ucbuffer[0]);// System.Convert.ToInt32(UC.Split("*".ToCharArray())[0]); var ch = int.Parse(ucbuffer[1]);// System.Convert.ToInt32(UC.Split("*".ToCharArray())[1]); for (int i = 1; i <= ch; i++) { idx++; this.DS.Tables["machine"].Rows.Add(new string[] { "[#" + idx.ToString("000") + "]" + NAME + "-" + unit.ToString("0") + i.ToString("00"), (Dr["IDX"] + "," + System.Convert.ToString(unit) + "," + System.Convert.ToString(i)) }); this.DS.Tables["kadevice"].Rows.Add(new string[] { "[#" + idx.ToString("000") + "]" + NAME + "-" + unit.ToString("0") + i.ToString("00"), (Dr["IDX"] + "," + System.Convert.ToString(unit) + "," + System.Convert.ToString(i)) }); } } } ////알람타입목록생성 DataRow DR2 = this.DS.Tables["alamtype"].NewRow(); DR2["title"] = "그룹알람"; DR2["value"] = "0"; this.DS.Tables["alamtype"].Rows.Add(DR2); DR2 = this.DS.Tables["alamtype"].NewRow(); DR2["title"] = "자동알람"; DR2["value"] = "1"; this.DS.Tables["alamtype"].Rows.Add(DR2); DR2 = this.DS.Tables["alamtype"].NewRow(); DR2["title"] = "개별알람"; DR2["value"] = "2"; this.DS.Tables["alamtype"].Rows.Add(DR2); DR2 = this.DS.Tables["alamtype"].NewRow(); DR2["title"] = "개별알람자동"; DR2["value"] = "3"; this.DS.Tables["alamtype"].Rows.Add(DR2); DR2 = this.DS.Tables["alamtype"].NewRow(); DR2["title"] = "사용안함"; DR2["value"] = "4"; this.DS.Tables["alamtype"].Rows.Add(DR2); this.DS.Tables["alamtype"].AcceptChanges(); retcnt = this.DocumentElement1.WIN.Count; // DAWIN.Fill(DTWIN) '//테이블에 데이터를 채운다. this.DocumentElement1.WIN.TableNewRow += newrow_window; ////WINDOWS목록을 생성 DS.Tables["window"].Clear(); foreach (var dr in this.DocumentElement1.WIN.OrderBy(t => t.IDX)) { string NAME = dr.TITLE; this.DS.Tables["window"].Rows.Add(new string[] { NAME, dr.IDX.ToString() }); } DS.Tables["window"].AcceptChanges(); this.DocumentElement1.GRP.TableNewRow += newrow_group; this.DS.Tables["group"].Rows.Clear(); foreach (var Dr in DocumentElement1.GRP.Where(t => t.USE == 1)) { var GIDX = Dr.IDX;// System.Convert.ToInt32(Dr["IDX"]); var WIDX = Dr.WINDOW;// System.Convert.ToInt32(Dr["WINDOW"]); var GNAME = Dr.TITLE;// System.Convert.ToString(Dr["TITLE"]); var WNAME = PUBC.GetWindowName(WIDX); // DBC.GetScalar("select TITLE from WIN where IDX=" & WIDX) var NAME = $"{WNAME}-{GNAME}"; this.DS.Tables["group"].Rows.Add(new string[] { NAME, $"{GIDX}" }); } this.DS.Tables["group"].AcceptChanges(); this.DocumentElement1.CHANNEL.TableNewRow += newrow_channel; this.DocumentElement1.AcceptChanges(); DS.AcceptChanges(); this.dv_device.AutoResizeColumns(); this.dv_channel.AutoResizeColumns(); this.dv_grp.AutoResizeColumns(); this.dv_win.AutoResizeColumns(); } public void ToolStripButton1_Click(System.Object sender, System.EventArgs e) { // √ 저장 this.Validate(); this.dv_device.EndEdit(); this.dv_channel.EndEdit(); this.dv_grp.EndEdit(); this.dv_win.EndEdit(); this.bs_device.EndEdit(); this.bs_channel.EndEdit(); this.bs_group.EndEdit(); this.bs_normal.EndEdit(); this.bs_win.EndEdit(); if (cmbIndiport.Text.Trim() == cmb_plcport.Text.Trim()) { if (cmbIndiport.Text.Trim().Length > 0 && cmb_plcport.Text.Trim().Length > 0) { // 동일한 통신포트 방지 UTIL.MsgE("「KA 인디케이터」와 「Alarm PLC」의 통신포트는\n\n동일하게 설정할 수 없습니다."); cmbIndiport.Focus(); return; } } if (nudPri1.Value < 1 || nudPri2.Value < 1) { UTIL.MsgE("Primary Data Range 값을 입력하세요"); nudPri1.Focus(); return; } if (chk_2nddata.Checked) { if (nudSec1.Value < 1 || nudSec2.Value < 1) { UTIL.MsgE("Sencodary Data Range 값을 입력하세요"); nudSec1.Focus(); return; } } //// 3rd, 4th Data Range 설정은 필요할 경우 나중에 추가 계획 if (this.nudLimit.Value < 500) { UTIL.MsgE("데이터 요청 주기는 500ms 이상 입력되어야 합니다"); nudLimit.Focus(); return; } //데이터베이스적용 PUB.DS.Clear(); PUB.DS.Merge(this.DocumentElement1); PUB.DS.AcceptChanges(); PUB.CONFIG.meas_pri1 = (short)nudPri1.Value; PUB.CONFIG.meas_pri2 = (short)nudPri2.Value; PUB.CONFIG.meas_sec1 = (short)nudSec1.Value; PUB.CONFIG.meas_sec2 = (short)nudSec2.Value; PUB.CONFIG.meas_3rd1 = (short)nud3rdp1.Value; PUB.CONFIG.meas_3rd2 = (short)nud3rdp2.Value; PUB.CONFIG.meas_4th1 = (short)nud4thp1.Value; PUB.CONFIG.meas_4th2 = (short)nud4thp2.Value; PUB.CONFIG.MaxChCount = (int)nudMaxCH.Value; PUB.CONFIG.binarysave = this.chk_savebinary.Checked; PUB.CONFIG.synctime = this.chk_synctime.Checked; PUB.CONFIG.databasefolder = this.tb_savepath.Text; PUB.CONFIG.lsb = this.chk_lsb.Checked; PUB.CONFIG.trashper = short.Parse(this.tb_trashper.Text); PUB.CONFIG.saveterm = short.Parse(this.tb_saveterm.Text); PUB.CONFIG.seconddata = this.chk_2nddata.Checked; PUB.CONFIG.thirddata = this.chk_3rdData.Checked; PUB.CONFIG.getdata4 = this.chk_4thData.Checked; PUB.CONFIG.sound = chk_sound.Checked; PUB.CONFIG.viewSize = tb_viewsize.Text.toInt(); PUB.CONFIG.nullbalnce = chk_nb.Checked; if (this.tb_div.Text.IsNumeric() == false) this.tb_div.Text = "1"; PUB.CONFIG.datadiv = System.Convert.ToInt32(this.tb_div.Text); PUB.CONFIG.Sumab = chk_sumab.Checked; PUB.CONFIG.plc_port = cmb_plcport.Text; //PUB.CONFIG.plc_port = tb_plcport.Text; PUB.CONFIG.plc_addr = (int)tb_plcidx.Value; PUB.CONFIG.alamplc = chk_alplc.Checked; PUB.CONFIG.EnableKA = chkEnableKA.Checked; PUB.CONFIG.threadlimit = (int)nudLimit.Value; PUB.CONFIG.sangho = tb_sangho.Text; PUB.CONFIG.tel = tb_tel.Text; PUB.CONFIG.indicator_port = cmbIndiport.Text; PUB.CONFIG.indicator_slaveno = (int)nudSlaveNo.Value; ////실제파일에 저장한다. PUB.CONFIG.Save(); ////설정정보를 가져온다. PUB.SaveConfigFile(); //string[] BackTables = new string[] { "DEVICE", "GRP", "NORMAL", "WIN", "VIEWGROUP", "CHANNEL" }; //foreach (string tabname in BackTables) //{ // PUB.DS.Tables[tabname].AcceptChanges(); // System.IO.FileInfo fn = new System.IO.FileInfo(PUB.CONFIG.GetDatabasePath() + "\\Database\\Config\\" + tabname + ".xml"); // if (fn.Directory.Exists == false) // { // fn.Directory.Create(); // } // PUB.DS.Tables[tabname].WriteXml(fn.FullName, XmlWriteMode.IgnoreSchema); //} try { var fi = new System.IO.FileInfo("window1.dat"); fi.Delete(); } catch (Exception) { } try { var fi = new System.IO.FileInfo("window2.dat"); fi.Delete(); } catch (Exception) { } this.DialogResult = System.Windows.Forms.DialogResult.OK; } public void dv_grp_DataError(object sender, System.Windows.Forms.DataGridViewDataErrorEventArgs e) { } public void dv_channel_CellClick(object sender, System.Windows.Forms.DataGridViewCellEventArgs e) { if (dv_channel.Columns[e.ColumnIndex].HeaderText == "색상코드") { string nowcolor = dv_channel.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); if (string.IsNullOrEmpty(nowcolor)) { nowcolor = System.Convert.ToString(0); } ColorDialog C = new ColorDialog(); C.Color = System.Drawing.Color.FromArgb(System.Convert.ToInt32(nowcolor)); if (C.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return; } dv_channel.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = C.Color.ToArgb().ToString(); dv_channel.Refresh(); } } public void dv_channel_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) { string Color = System.Convert.ToString(dv_channel.Rows[e.RowIndex].Cells["C_COLOR"].Value); bool enable = System.Convert.ToBoolean(dv_channel.Rows[e.RowIndex].Cells["C_ENABLE"].Value); if (enable == false) { dv_channel.Rows[e.RowIndex].DefaultCellStyle.BackColor = System.Drawing.Color.LightGray; dv_channel.Rows[e.RowIndex].DefaultCellStyle.ForeColor = System.Drawing.Color.Gray; } else { dv_channel.Rows[e.RowIndex].DefaultCellStyle.BackColor = System.Drawing.Color.Empty; dv_channel.Rows[e.RowIndex].DefaultCellStyle.ForeColor = System.Drawing.Color.Black; if (!string.IsNullOrEmpty(Color) && Color.IsNumeric()) { dv_channel.Rows[e.RowIndex].Cells[2].Style.BackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt32(Color)); dv_channel.Rows[e.RowIndex].Cells[1].Style.BackColor = System.Drawing.Color.FromArgb(System.Convert.ToInt32(Color)); } } } public void dv_channel_DataError(object sender, System.Windows.Forms.DataGridViewDataErrorEventArgs e) { } public void ToolStripButton15_Click(System.Object sender, System.EventArgs e) { if (UTIL.MsgQ("현재 목록을 재구성하시겠습니까?\r\n기존의 목록정보는 삭제됩니다") != DialogResult.Yes) return; this.dv_channel.SuspendLayout(); this.dv_channel.Visible = false; ////현재모든채널을삭제한다. this.DocumentElement1.CHANNEL.Clear(); this.DocumentElement1.CHANNEL.AcceptChanges(); ////재구성 방법 : 각 장비마다 1개의 그룹을 생성 ////그룹내 서브그룹의 해당 그룹의 채널수 / 2 var Dt = this.DocumentElement1.GRP.Where(t => t.USE == 1).OrderBy(t => t.IDX).ToList(); int IDX = 0; int coloridx = 0; List Colormap = new List(0); Colormap.Add(Color.Indigo); Colormap.Add(Color.Red); Colormap.Add(Color.SeaGreen); Colormap.Add(Color.Violet); Colormap.Add(Color.Goldenrod); Colormap.Add(Color.RosyBrown); Colormap.Add(Color.LightCoral); Colormap.Add(Color.SpringGreen); Colormap.Add(Color.Yellow); Colormap.Add(Color.Orchid); Colormap.Add(Color.OrangeRed); Colormap.Add(Color.CadetBlue); Colormap.Add(Color.Lime); Colormap.Add(Color.OliveDrab); Colormap.Add(Color.Aqua); Colormap.Add(Color.SaddleBrown); Colormap.Add(Color.Tomato); Colormap.Add(Color.DarkSlateBlue); Colormap.Add(Color.Green); Colormap.Add(Color.Teal); Colormap.Add(Color.DarkSlateGray); Colormap.Add(Color.RoyalBlue); Colormap.Add(Color.DarkKhaki); Colormap.Add(Color.DarkMagenta); Colormap.Add(Color.Orange); Colormap.Add(Color.LawnGreen); Colormap.Add(Color.SlateGray); Colormap.Add(Color.DarkOrange); Colormap.Add(Color.Blue); Colormap.Add(Color.Firebrick); Colormap.Add(Color.DarkBlue); Colormap.Add(Color.Sienna); Colormap.Add(Color.DimGray); Colormap.Add(Color.SandyBrown); Colormap.Add(Color.DodgerBlue); Colormap.Add(Color.Magenta); Colormap.Add(Color.SkyBlue); Colormap.Add(Color.Chocolate); Colormap.Add(Color.LemonChiffon); Colormap.Add(Color.Crimson); Colormap.Add(Color.DeepSkyBlue); this.prb.Minimum = 0; this.prb.Value = 0; //그룹설정의 아이템배열값을 가지고 전체 채널을 우선 생성한다 //IDX와 그룹번호를 우선 생성한다. Dictionary grpinfo = new Dictionary(); foreach (DocumentElement.GRPRow Dr in Dt) { string Matrix = Dr.MATRIX.Trim();//.["matrix"].ToString().Trim(); Matrix = Matrix.Replace("*", "x").Replace("X", "x").Replace("/", "x").Replace("-", "x"); var matbuf = Matrix.Split("x".ToCharArray()); if (int.TryParse(matbuf[0], out int rowcount) == false) { UTIL.MsgE($"{Dr.TITLE} 의 Matrix 입력값이 올바르지 않습니다\n값:{Dr.MATRIX}\n" + "Matrix 값은 50*4 형태로 입력하세요"); return; } if (int.TryParse(matbuf[1], out int colcount) == false) { UTIL.MsgE($"{Dr.TITLE} 의 Matrix 입력값이 올바르지 않습니다\n값:{Dr.MATRIX}\n" + "Matrix 값은 50*4 형태로 입력하세요"); return; } //전체채널 수량을 체크 this.prb.Maximum = rowcount * colcount; this.prb.Value = 0; // workmsg(rowcount * colcount) lbMsg.Text = $"{Dr.TITLE} 생성 중({prb.Maximum}건)"; ////아이템갯수만큼 돈다. for (int i = 0; i <= (colcount * rowcount - 1); i++) { this.prb.Value++; grpinfo.Add(IDX + 1, Dr.IDX); IDX++; } Application.DoEvents(); } Application.DoEvents(); ////장치의 데이터를 맵핑시킨다. ////모든장치목록을 갱신합니다. 순서대로 맵핑시킨다. //데이터삭제 int cindex = 0; IDX = 0; coloridx = 0; bool idxerr = false; var DTD = this.DocumentElement1.DEVICE.Where(t => t.USE == 1).OrderBy(t => t.IDX); foreach (var DRD in DTD) { var DeviceID = DRD.IDX; var UNITCH = DRD.CHCOUNT.Split(','); // DRD("CHCOUNT") foreach (string UC in UNITCH) { var ucBuf = UC.Split('*'); int unit = int.Parse(ucBuf[0]); ////sub unit no int ch = int.Parse(ucBuf[1]); ////channel no this.prb.Value = 0; this.prb.Maximum = ch; this.lbMsg.Text = $"{DRD.TITLE}/{unit}:{ch}"; Application.DoEvents(); for (int i = 1; i <= ch; i++) //채널은 1번부터 시작한다. { //this.prb.Value++; if (grpinfo.ContainsKey(IDX + 1) == false) { //해당키는 더이상 속하지 않는다. UTIL.MsgE($"번호 {IDX + 1}은 사용자 그룹에 속하지 않는 번호이므로 생성하지 않습니다"); idxerr = true; break; } var newdr = this.DocumentElement1.CHANNEL.NewCHANNELRow(); newdr.IDX = IDX + 1;// ["IDX"] = IDX + 1; newdr.TITLE = $"#{(IDX + 1):000}"; newdr.ENABLE = DRD.USE; newdr.GIDX = grpinfo[IDX + 1];// Dr.IDX; ////이셀의 그룹인덱스 newdr.MACHINE = $"{DeviceID},{unit},{i}"; newdr.IDX_M = DeviceID; newdr.IDX_U = unit; newdr.IDX_C = i - 1; newdr.ALAMTYPE = 0; ////기본알람은그룹알람으로 newdr.ALAMH = 0; newdr.ALAML = 0; newdr.DECPOS = 3; newdr.UNIT = "V"; short mok = (short)(Math.Floor((double)coloridx / Colormap.Count)); short namu = (short)(coloridx % Colormap.Count); Color C = Colormap[namu]; newdr.COLOR = C.ToArgb(); this.DocumentElement1.CHANNEL.Rows.Add(newdr); IDX++; cindex++; coloridx++; } if (idxerr) break; } if (idxerr) break; } this.dv_channel.ResumeLayout(); this.dv_channel.Visible = true; //this.bn_channel.Visible = true; Application.DoEvents(); } private void ToolStripButton2_Click(System.Object sender, System.EventArgs e) { bool retval = false; foreach (GM10 d in PUB.DAQ) { if (UTIL.MsgQ("다음 장치를 재구성하시겠습니까?" + "\r\n" + "장치명:" + d.title) != DialogResult.Yes) return; bool Result = d.Reconstrction(); if (Result) { retval = true; } } if (retval) { UTIL.MsgI("프로그램을 다시 시작 하세요"); } } public void DV_WIN_CellContentClick(System.Object sender, System.Windows.Forms.DataGridViewCellEventArgs e) { } public void DV_WIN_DataError(object sender, System.Windows.Forms.DataGridViewDataErrorEventArgs e) { } public void 장치구조재구성ToolStripMenuItem_Click(System.Object sender, System.EventArgs e) { DataRowView drv = this.bs_device.Current as DataRowView; if (drv == null) return; var drDev = drv.Row as DocumentElement.DEVICERow; if (drDev == null) return; GM10 M = new GM10(drDev.IP, drDev.PORT, "title", "", 99); if (!M.Connect().Result) { UTIL.MsgE("장치를 연결할 수 없습니다" + "\r\n" + "장치의 전원및 연결상태를 확인하세요"); return; } bool retval = M.Reconstrction(); if (retval) { UTIL.MsgI("장치구조재구성 완료" + "\r\n" + "프로그램을 재시작하세요"); } else { UTIL.MsgE("장치구조재구성 실패"); } } public void 장치자동설정ToolStripMenuItem_Click(System.Object sender, System.EventArgs e) { DataRowView drv = this.bs_device.Current as DataRowView; if (drv == null) return; var drDev = drv.Row as DocumentElement.DEVICERow; if (drDev == null) return; GM10 M = new GM10(drDev.IP, drDev.PORT, "title", "", System.Convert.ToInt32(drv["IDX"])); if (!M.Connect().Result) { UTIL.MsgE("장치를 연결할 수 없습니다" + "\r\n" + "장치의 전원및 연결상태를 확인하세요"); return; } string kadevicestr = ""; foreach (DataRow dr in this.DocumentElement1.GRP.Rows) { string kd = dr["KADEVICE"].ToString(); if (kd.Trim() == "") { continue; } if (string.IsNullOrEmpty(kadevicestr)) { kadevicestr = kd; } else { kadevicestr += "/" + kd; } } bool retval = M.ReSetting(kadevicestr, System.Convert.ToString(drv["SNCOMMAND"]), System.Convert.ToString(drv["KACOMMAND"]), System.Convert.ToString(drv["CHCOMMAND"])); if (retval) { UTIL.MsgI("장치자동설정 완료" + "\r\n" + "프로그램을 재시작하세요"); } else { UTIL.MsgE("장치자동설정 실패"); } } public void ToolStripMenuItem1_Click(System.Object sender, System.EventArgs e) { DataRowView drv = this.bs_channel.Current as DataRowView; if (ReferenceEquals(drv, null)) { return; } string MACHINE = System.Convert.ToString(drv["MACHINE"]); string idx = System.Convert.ToString(drv["IDX"]); var offset = UTIL.InputBox("변경할 장치ID를 입력하세요(0,0,1,45) DEVID,UNITID,STARTCH,ACCNUM", "0,0,1,45"); if (offset.Item1 == false) return; short dev = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[0]); short unit = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[1]); short se = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[2]); short ae = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[3]); short acc = (short)0; this.prb.Minimum = 0; this.prb.Maximum = Math.Min(System.Convert.ToInt32(double.Parse(idx) + se), this.DocumentElement1.CHANNEL.Rows.Count); this.prb.Value = 0; this.dv_channel.SuspendLayout(); //1,1,20,반복갯수 for (int i = int.Parse(idx); i <= Math.Min(System.Convert.ToInt32(double.Parse(idx) + ae), this.DocumentElement1.CHANNEL.Rows.Count); i++) { this.prb.Value++; Application.DoEvents(); if (acc > ae) { break; ////반복횟수를 넘기면 빠져나간다. } try { this.DocumentElement1.CHANNEL.Rows[i - 1]["MACHINE"] = dev + "," + System.Convert.ToString(unit) + "," + (se + acc).ToString(); } catch (Exception) { } acc++; } this.dv_channel.ResumeLayout(); this.dv_channel.Refresh(); } public void ToolStrip1_ItemClicked(System.Object sender, System.Windows.Forms.ToolStripItemClickedEventArgs e) { } public void bt_editcell_Click(System.Object sender, System.EventArgs e) { DataRowView drv = this.bs_channel.Current as DataRowView; if (ReferenceEquals(drv, null)) { return; } string MACHINE = System.Convert.ToString(drv["MACHINE"]); string idx = System.Convert.ToString(drv["IDX"]); var offset = UTIL.InputBox("이름규칙을 입력하세요" + "\r\n" + "앞문자,시작번호,끝번호", "A,1,500"); if (offset.Item1 == false) return; string sc = System.Convert.ToString(offset.Item2.Split(",".ToCharArray())[0]); short ss = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[1]); short se = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[2]); this.prb.Minimum = 0; this.prb.Maximum = System.Convert.ToInt32(this.DocumentElement1.CHANNEL.Rows.Count - double.Parse(idx)); this.prb.Value = 0; for (int i = int.Parse(idx); i <= this.DocumentElement1.CHANNEL.Rows.Count; i++) { if (this.prb.Value < this.prb.Maximum) { this.prb.Value++; } try { if (ss > se) { goto endOfForLoop; } this.DocumentElement1.CHANNEL.Rows[i - 1]["TITLE"] = sc + ss.ToString("000"); //// "" '// Me.DTCHANNEL.Rows(i - 1 + CInt(offset))("MACHINE") ss++; } catch (Exception) { } } endOfForLoop: 1.GetHashCode(); //VBConversions note: C# requires an executable line here, so a dummy line was added. } public void 그룹ID변경ToolStripMenuItem_Click(System.Object sender, System.EventArgs e) { DataRowView drv = this.bs_channel.Current as DataRowView; if (ReferenceEquals(drv, null)) { return; } string MACHINE = System.Convert.ToString(drv["MACHINE"]); string idx = System.Convert.ToString(drv["IDX"]); var offset = UTIL.InputBox("그룹규칙을 입력하세요" + "\r\n" + "시작번호,반복갯수", "1,160"); if (offset.Item1 == false) return; short ss = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[0]); short se = System.Convert.ToInt16(offset.Item2.Split(",".ToCharArray())[1]); short acc = (short)0; this.prb.Minimum = 0; this.prb.Maximum = System.Convert.ToInt32(this.DocumentElement1.CHANNEL.Rows.Count - double.Parse(idx)); this.prb.Value = 0; for (int i = int.Parse(idx); i <= this.DocumentElement1.CHANNEL.Rows.Count; i++) { if (this.prb.Value < this.prb.Maximum) { this.prb.Value++; } try { if (acc > se) { return; } this.DocumentElement1.CHANNEL.Rows[i - 1]["GIDX"] = ss; //// "" '// Me.DTCHANNEL.Rows(i - 1 + CInt(offset))("MACHINE") acc++; } catch (Exception) { } } } public void DECPOS변경ToolStripMenuItem_Click(System.Object sender, System.EventArgs e) { DataRowView drv = this.bs_channel.Current as DataRowView; if (ReferenceEquals(drv, null)) { return; } string MACHINE = System.Convert.ToString(drv["MACHINE"]); string idx = System.Convert.ToString(drv["IDX"]); var offset = UTIL.InputBox("DECPOS를 입력하세요", "3"); if (offset.Item1 == false) return; //Dim ss As Short = offset.Split(",")(0) //Dim se As Short = offset.Split(",")(1) //Dim acc As Short = 0 this.prb.Minimum = 0; this.prb.Maximum = System.Convert.ToInt32(this.DocumentElement1.CHANNEL.Rows.Count - double.Parse(idx)); this.prb.Value = 0; for (int i = int.Parse(idx); i <= this.DocumentElement1.CHANNEL.Rows.Count; i++) { if (this.prb.Value < this.prb.Maximum) { this.prb.Value++; } this.DocumentElement1.CHANNEL.Rows[i - 1]["DECPOS"] = offset; //// "" '// Me.DTCHANNEL.Rows(i - 1 + CInt(offset))("MACHINE") } } public void UNIT변경ToolStripMenuItem_Click(System.Object sender, System.EventArgs e) { DataRowView drv = this.bs_channel.Current as DataRowView; if (ReferenceEquals(drv, null)) { return; } string MACHINE = System.Convert.ToString(drv["MACHINE"]); string idx = System.Convert.ToString(drv["IDX"]); var offset = UTIL.InputBox("UNIT를 입력하세요", "V"); if (offset.Item1 == false) return; //Dim ss As Short = offset.Split(",")(0) //Dim se As Short = offset.Split(",")(1) //Dim acc As Short = 0 this.prb.Minimum = 0; this.prb.Maximum = System.Convert.ToInt32(this.DocumentElement1.CHANNEL.Rows.Count - double.Parse(idx)); this.prb.Value = 0; for (int i = int.Parse(idx); i <= this.DocumentElement1.CHANNEL.Rows.Count; i++) { if (this.prb.Value < this.prb.Maximum) { this.prb.Value++; } this.DocumentElement1.CHANNEL.Rows[i - 1]["UNIT"] = offset; //// "" '// Me.DTCHANNEL.Rows(i - 1 + CInt(offset))("MACHINE") } } public void Button1_Click(object sender, EventArgs e) { PUB.masterk.SetOutput((int)tb_plcidx.Value, true); } public void Button2_Click(object sender, EventArgs e) { PUB.masterk.SetOutput((int)tb_plcidx.Value, false); } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { var od = new FolderBrowserDialog(); od.SelectedPath = this.tb_savepath.Text; if (od.ShowDialog() != DialogResult.OK) return; tb_savepath.Text = od.SelectedPath; } private void toolStripButton1_Click_1(object sender, EventArgs e) { if (UTIL.MsgQ("현재 등록된 장비의 로컬 테스트 IP(127.0.1)로 변경할까요?\n동일 IP로 인해 포트번호는 자동 증가 합니다") != DialogResult.Yes) return; var port = 34150; foreach (var dr in this.DocumentElement1.DEVICE) { dr.IP = "127.0.0.1"; dr.PORT = port++; } this.DocumentElement1.DEVICE.AcceptChanges(); } private void toolStripButton2_Click_1(object sender, EventArgs e) { if (UTIL.MsgQ("현재 등록된 장비의 IP(192.168.0.1) 부터 자동 할당 할까요?") != DialogResult.Yes) return; var ip = 1; foreach (var dr in this.DocumentElement1.DEVICE) { dr.IP = $"192.168.0.{ip++}"; dr.PORT = 34150; } this.DocumentElement1.DEVICE.AcceptChanges(); } private void button4_Click(object sender, EventArgs e) { var rlt = PUB.indicator.Open(this.cmbIndiport.Text); if (rlt == false) UTIL.MsgE(PUB.indicator.ErrorMessage); } private void button5_Click(object sender, EventArgs e) { PUB.indicator.Close(); } private void button3_Click(object sender, EventArgs e) { // KA indicator 테스트 var valuebuffer = new ushort[20]; valuebuffer[0] = 100; for (int i = 1; i < valuebuffer.Length; i++) valuebuffer[i] = 0; PUB.indicator.SlaveID = (byte)nudSlaveNo.Value; if (PUB.indicator.WriteValue(valuebuffer) == false) UTIL.MsgE(PUB.indicator.ErrorMessage); } private void toolStripButton15_Click_1(object sender, EventArgs e) { // 셀이름변경 this.bs_channel.EndEdit(); using (var f = new Dialog.fCellNameChange()) if (f.ShowDialog() == DialogResult.OK) { var sv = (int)f.nudSV.Value; var ev = (int)f.nudEV.Value; var rows = this.DocumentElement1.CHANNEL .Where(t => t.RowState != DataRowState.Detached && t.RowState != DataRowState.Deleted && t.IDX >= sv && t.IDX <= ev).OrderBy(t => t.IDX); var fix1 = f.textBox1.Text.Trim(); var fix2 = f.textBox2.Text.Trim(); var fix3 = f.textBox4.Text.Trim(); var fix4 = f.textBox5.Text.Trim(); var maxchno = this.DocumentElement1.CHANNEL.GroupBy(t => t.GIDX).Max(s => s.Count());//.CHANNEL.Max(t => t.IDX).ToString(); var padzerostr = "".PadLeft(maxchno.ToString().Length, '0'); var renameno = f.checkBox1.Checked; this.prb.Value = 0; this.prb.Maximum = rows.Count(); var chno = 1; var cellno = string.Empty; foreach (var dr in rows) { prb.Value += 1; if (renameno) cellno = prb.Value.ToString(padzerostr); else cellno = dr.IDX.ToString(padzerostr); dr.TITLE = $"{fix1}{fix2}{cellno}{fix3}{fix4}"; dr.EndEdit(); chno += 1; } UTIL.MsgI("이름이 변경되었습니다"); } } } }