using AR; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Project.Dialog { public partial class Motion_MoveToGroup : Form { int axisX, axisY, axisZ; DataSet1 ds; int pidx = -1;/// = string.Empty; public Motion_MoveToGroup(DataSet1 dt_, int targetidx) { InitializeComponent(); // this.Size = new Size(800, 500); this.WindowState = FormWindowState.Maximized; btXNeg.Tag = "X-"; btXPos.Tag = "X+"; btYNeg.Tag = "Y-"; btYPos.Tag = "Y+"; this.ds = dt_; pidx = targetidx; //this.lvF.FullRowSelect = true; //this.lvF.GridLines = true; //arDatagridView1.DataSource = dt_.MCModel; var dr = dt_.MCModel.Where(t => t.idx == targetidx).FirstOrDefault(); if (dr == null) this.Text = "위치 기준 이동"; else this.Text = $"위치 기준 이동(모델명:{dr.Title})"; } private void Motion_MoveToGroup_Load(object sender, EventArgs e) { refreshData(); tmDisplay.Start(); } void refreshData() { //목록을 추출한다 //this.lvF.Items.Clear(); //this.listView1.Columns[0].Width = 120; //this.listView1.Columns[1].Width = 300; //this.lvF.Font = new Font("맑은 고딕", 15); var ctgrp = this.ds.MCModel.Where(t => t.pidx == this.pidx && string.IsNullOrEmpty(t.Category) == false).GroupBy(t => t.Category); var rawGrplist = ctgrp.Select(t => t.Key).ToList(); Dictionary> grpList = new Dictionary>(); foreach (var dr in ctgrp.OrderBy(t => t.Key)) { var rawgrplist = dr.Key.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); foreach (var grpname in rawgrplist) { var keybuf = grpname.Split('|'); //그룹과 위치명은 | 로구분되어있다 if (keybuf.Length == 1) { Array.Resize(ref keybuf, 2); keybuf[1] = keybuf[0]; keybuf[0] = "Normal"; } var newgrpname = string.Join("|", keybuf); var motlist = dr.GroupBy(t => t.idx).Select(t => t.Key).ToList(); if (grpList.ContainsKey(newgrpname) == false) { grpList.Add(newgrpname, motlist); } else { //동일그룹이 등록되어있다 var oldlist = grpList[newgrpname]; foreach (var drindex in motlist) if (oldlist.Contains(drindex) == false) oldlist.Add(drindex); grpList[newgrpname] = oldlist; } } } tvFront.Nodes.Clear(); tvFront.Font = new Font("맑은 고딕", 10, FontStyle.Bold); tvRear.Nodes.Clear(); tvRear.Font = new Font("맑은 고딕", 10, FontStyle.Bold); tvOther.Nodes.Clear(); tvOther.Font = new Font("맑은 고딕", 10, FontStyle.Bold); tvOther2.Nodes.Clear(); tvOther2.Font = new Font("맑은 고딕", 10, FontStyle.Bold); //목록을 취합햇으니 표시한다 foreach (var item in grpList) { var motlist = new List(); foreach (var drindex in item.Value) { var dr = this.ds.MCModel.Where(t => t.idx == drindex).First(); motlist.Add(dr.MotIndex); } if (motlist.Count < 1) continue; var buf = item.Key.Split('|'); var cate = buf[0]; var itemname = buf[1]; if (cate.Contains("_MANAGE")) { if (tvOther2.Nodes.ContainsKey(cate) == false) { var nd = tvOther2.Nodes.Add(cate, cate); var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } else { var nd = tvOther2.Nodes[cate]; var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } } else if (itemname.StartsWith("R") || (itemname.StartsWith("F") == false && itemname.ToUpper().Contains("REAR"))) { itemname = itemname.Replace("RSHUTTLE", "R"); if (tvRear.Nodes.ContainsKey(cate) == false) { var nd = tvRear.Nodes.Add(cate, cate); var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } else { var nd = tvRear.Nodes[cate]; var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } } else if (itemname.StartsWith("F") || (itemname.StartsWith("R") == false && itemname.ToUpper().Contains("FRONT"))) { itemname = itemname.Replace("FSHUTTLE", "F"); if (tvFront.Nodes.ContainsKey(cate) == false) { var nd = tvFront.Nodes.Add(cate, cate); var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } else { var nd = tvFront.Nodes[cate]; var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } } else { if (tvOther.Nodes.ContainsKey(cate) == false) { var nd = tvOther.Nodes.Add(cate, cate); var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } else { var nd = tvOther.Nodes[cate]; var snd = nd.Nodes.Add(itemname, itemname + " ▶ (" + string.Join(",", motlist.OrderBy(t => t).Select(t => (eAxis)t)) + ")"); snd.Tag = item.Value; if (itemname.Contains("PICKOFF")) snd.ForeColor = Color.Blue; else if (itemname.Contains("PICKON")) snd.ForeColor = Color.DarkGreen; else if (itemname.StartsWith("T")) snd.ForeColor = Color.Magenta; else snd.ForeColor = Color.Black; } } //var lv = this.lvF.Items.Add(buf[0]); //lv.SubItems.Add(buf[1]); //lv.SubItems.Add(string.Join(",", motlist.OrderBy(t => t))); //if (buf[1].StartsWith("R")) // lv.ForeColor = Color.Blue; //else if (buf[1].StartsWith("T")) // lv.ForeColor = Color.Magenta; //lv.Tag = item.Value; //datarowindex 를 가진다 } tvFront.ExpandAll(); tvRear.ExpandAll(); tvOther.ExpandAll(); tvOther2.ExpandAll(); } private void toolStripButton1_Click(object sender, EventArgs e) { refreshData(); } Task MoveMotion = null; List GetCurrentList() { if (seltv == null) { UTIL.MsgE("먼저 이동할 위치를 선택하세요"); return null; } var tn = seltv.SelectedNode; if (tn == null) return null; if (tn.Level < 1) return null; return (List)tn.Tag; } private void toolStripButton2_Click(object sender, EventArgs e) { //지정된 축중에 Z축을 가진 대상이 있다면 그것을 우선 0으로 이동시킨다. List idxlist = GetCurrentList(); if (idxlist == null) return; List zlist = new List(); List nlist = new List(); List zplist = new List(); List nplist = new List(); System.Text.StringBuilder sb = new StringBuilder(); foreach (var dridx in idxlist) { var dr = this.ds.MCModel.Where(t => t.idx == dridx).First(); var ax = (eAxis)dr.MotIndex; var cate = ax.CategoryAttr(); if (cate.StartsWith("Z")) { zlist.Add(ax); zplist.Add(dr); } else { //나머지축에 인터락이 있으면 처리하지 않는다. if (PUB.iLock[dr.MotIndex].IsEmpty() == false) { if (sb.Length < 1) sb.AppendLine("모션에 인터락이 설정되어 있습니다\n"); var locklist = MOT.GetActiveLockList(ax, PUB.iLock[dr.MotIndex]); sb.AppendLine($"축 : {ax}({dr.MotIndex}) 대상:{string.Join(",", locklist)}"); } nlist.Add(ax); nplist.Add(dr); } } if (sb.Length > 0) { UTIL.MsgE(sb.ToString(), true); return; } Queue> poslist = new Queue>(); sb.AppendLine("축 이동을 시작할까요?\nZ축은 안전을 위해 0으로 이동 후 이동 됩니다"); int idx = 0; for (int i = 0; i < zlist.Count; i++) { var ax = zlist[i]; var dr = zplist[i]; sb.AppendLine($"[{++idx:000}] 원점(0)으로 이동 : " + ax.ToString()); var p = new Tuple(ax, new sPositionData { Axis = (short)ax, Position = 0, Speed = Math.Max(100, dr.Speed), Acc = dr.SpeedAcc, Dcc = dr.SpeedDcc, }, true); poslist.Enqueue(p); } for (int i = 0; i < nlist.Count; i++) { var ax = nlist[i]; var dr = nplist[i]; sb.AppendLine($"[{++idx:000}] {ax} 위치 이동 : {dr.Position}mm({dr.Speed}ms)"); var p = new Tuple(ax, new sPositionData { Axis = (short)ax, Position = dr.Position, Speed = Math.Max(100, dr.Speed), Acc = dr.SpeedAcc, Dcc = dr.SpeedDcc, }, false); poslist.Enqueue(p); } //x,y완료될떄까지 기다림 for (int i = 0; i < nlist.Count; i++) { var ax = nlist[i]; var dr = nplist[i]; sb.AppendLine($"[{++idx:000}] {ax} 위치 이동 : {dr.Position}mm({dr.Speed}ms)"); var p = new Tuple(ax, new sPositionData { Axis = (short)ax, Position = dr.Position, Speed = Math.Max(100, dr.Speed), Acc = dr.SpeedAcc, Dcc = dr.SpeedDcc, }, true); poslist.Enqueue(p); } for (int i = 0; i < zlist.Count; i++) { var ax = zlist[i]; var dr = zplist[i]; sb.AppendLine($"[{++idx:000}] {ax} 위치 이동 : {dr.Position}mm({dr.Speed}ms)"); var p = new Tuple(ax, new sPositionData { Axis = (short)ax, Position = Math.Max(dr.Position - 50, 0), Speed = Math.Max(100, dr.Speed), Acc = dr.SpeedAcc, Dcc = dr.SpeedDcc, }, false); poslist.Enqueue(p); } var dlg = UTIL.MsgQ(sb.ToString()); if (dlg != DialogResult.Yes) return; if (PUB.mot.HasHomeSetOff) { UTIL.MsgE("홈이 완료되지 않은 모션이 있습니다"); return; } MoveMotion = new Task(new Action(() => { DateTime starttime = DateTime.Now; Tuple p = null; while (poslist.Any() || p != null) //자료가있거나 현재 걸려있는게 있는 경우 { if (p == null) { p = poslist.Dequeue(); starttime = DateTime.Now; } var seqtime = DateTime.Now - starttime; if (p.Item3) //대기 { if (MOT.CheckMotionPos(seqtime, p.Item2, "USER", false) == false) { var msg = PUB.mot.ErrorMessage; //{ //Util.MsgE("모션 이동 실패\n" + Pub.mot.ErrorMessage); //break; //} if (seqtime.TotalSeconds > 60) { PUB.log.AddE("위치 이동실패 60초 초과"); break; } System.Threading.Thread.Sleep(100); continue; } } else MOT.Move(p.Item1, p.Item2.Position, p.Item2.Speed, p.Item2.Acc, false, false, false); //위치이동을한다 p = null; //다음으로 진행할 수 있게 한다 } })); MoveMotion.RunSynchronously(); } private void btSet_Click(object sender, EventArgs e) { //담당 축중에 ready 를 제외한 축을 추출하고 //해당 축의 해당 위치에 command 좌표를 할당 합니다. if (PUB.mot.HasHomeSetOff) { UTIL.MsgE("홈이 완료되지 않은 모션이 있습니다\n저장을 할 수 없습니다"); return; } //지정된 축중에 Z축을 가진 대상이 있다면 그것을 우선 0으로 이동시킨다. //지정된 축중에 Z축을 가진 대상이 있다면 그것을 우선 0으로 이동시킨다. List idxlist = GetCurrentList(); if (idxlist == null) return; List nlist = new List(); List nplist = new List(); foreach (var dridx in idxlist) { var dr = this.ds.MCModel.Where(t => t.idx == dridx).First(); if (dr.PosTitle.StartsWith("READY")) continue; var ax = (eAxis)dr.MotIndex; var cate = ax.CategoryAttr(); nlist.Add(ax); nplist.Add(dr); } Queue> poslist = new Queue>(); var sb = new System.Text.StringBuilder(); sb.AppendLine("다음좌표의 위치를 저장할까요?"); sb.AppendLine(); for (int i = 0; i < nlist.Count; i++) { var ax = nlist[i]; var dr = nplist[i]; var curpos = PUB.mot.GetCmdPos((short)ax); sb.AppendLine($"[{dr.idx}] 축:{ax} - {dr.PosTitle}\n\t변경위치 {dr.Position} -> {curpos}"); var param = new Tuple(dr, ax, dr.PosTitle, dr.Position, curpos); poslist.Enqueue(param); } using (var f = new Dialog.fSavePosition(poslist)) { if (f.ShowDialog() != DialogResult.OK) { UTIL.MsgE("좌표 저장이 취소 됨"); } } //var dlg = Util.MsgQ(sb.ToString()); //if (dlg != DialogResult.Yes) return; //var cnt = 0; //foreach (var p in poslist) //{ // p.Item1.Position = p.Item2; // p.Item1.EndEdit(); // cnt += 1; //} //Util.MsgI($"{cnt}건의 위치를 변경 했습니다"); } private void btJogUp_MouseDown(object sender, MouseEventArgs e) { var but = sender as Button; var tag = but.Tag.ToString(); var vel = (float)nudJogVel.Value; if (tag == "X+") { if (axisX >= 0) PUB.mot.JOG((short)axisX, arDev.MOT.MOTION_DIRECTION.Positive, vel, 500, false, false); } else if (tag == "X-") { if (axisX >= 0) PUB.mot.JOG((short)axisX, arDev.MOT.MOTION_DIRECTION.Negative, vel, 500, false, false); } else if (tag == "Y+") { if (axisY >= 0) PUB.mot.JOG((short)axisY, arDev.MOT.MOTION_DIRECTION.Positive, vel, 500, false, false); } else if (tag == "Y-") { if (axisY >= 0) PUB.mot.JOG((short)axisY, arDev.MOT.MOTION_DIRECTION.Negative, vel, 500, false, false); } else if (tag == "Z+") { if (axisZ >= 0) PUB.mot.JOG((short)axisZ, arDev.MOT.MOTION_DIRECTION.Positive, vel, 500, false, false); } else if (tag == "Z-") { if (axisZ >= 0) PUB.mot.JOG((short)axisZ, arDev.MOT.MOTION_DIRECTION.Negative, vel, 500, false, false); } } private void btAClear_MouseUp(object sender, MouseEventArgs e) { var but = sender as Button; var tag = but.Tag.ToString(); var vel = (float)nudJogVel.Value; if (tag == "X+") { if (axisX >= 0) PUB.mot.MoveStop("MOVETOGRP", (short)axisX, true); } else if (tag == "X-") { if (axisX >= 0) PUB.mot.MoveStop("MOVETOGRP", (short)axisX, true); } else if (tag == "Y+") { if (axisY >= 0) PUB.mot.MoveStop("MOVETOGRP", (short)axisY, true); } else if (tag == "Y-") { if (axisY >= 0) PUB.mot.MoveStop("MOVETOGRP", (short)axisY, true); } else if (tag == "Z+") { if (axisZ >= 0) PUB.mot.MoveStop("MOVETOGRP", (short)axisZ, true); } else if (tag == "Z-") { if (axisZ >= 0) PUB.mot.MoveStop("MOVETOGRP", (short)axisZ, true); } } private void tmDisplay_Tick(object sender, EventArgs e) { var motpos = string.Empty; if (axisX >= 0) { motpos += $"X:{PUB.mot.GetActPos((short)axisX):N3}/{PUB.mot.GetCmdPos((short)axisX):N3}"; button6.BackColor = PUB.iLock[axisX].IsEmpty() ? Color.FromArgb(224, 224, 224) : Color.Orange; } else { motpos += "X:(none)"; button6.BackColor = Color.FromArgb(224, 224, 224); } if (axisY >= 0) { motpos += $" / Y:{PUB.mot.GetActPos((short)axisY):N3}/{PUB.mot.GetCmdPos((short)axisY):N3}"; button5.BackColor = PUB.iLock[axisY].IsEmpty() ? Color.FromArgb(224, 224, 224) : Color.Orange; } else { motpos += " Y:(none)"; button5.BackColor = Color.FromArgb(224, 224, 224); } if (axisZ >= 0) { motpos += $" / Z:{PUB.mot.GetActPos((short)axisZ):N3},{PUB.mot.GetCmdPos((short)axisZ):N3}"; button4.BackColor = PUB.iLock[axisZ].IsEmpty() ? Color.FromArgb(224, 224, 224) : Color.Orange; } else { motpos += " Z:(none)"; button4.BackColor = Color.FromArgb(224, 224, 224); } this.lbMotPos.Text = motpos; } private void Motion_MoveToGroup_FormClosed(object sender, FormClosedEventArgs e) { tmDisplay.Stop(); } private void button1_Click(object sender, EventArgs e) { var but = sender as Button; if (but.Text.EndsWith("-ZERO")) { if (but.Text.StartsWith("X") && axisX >= 0) { if (UTIL.MsgQ("x위치를 0으로 이동할가요?") != DialogResult.Yes) return; MOT.Move((eAxis)axisX, 0, 100, 1000, false, false, false); } else if (but.Text.StartsWith("Y") && axisY >= 0) { if (UTIL.MsgQ("y위치를 0으로 이동할가요?") != DialogResult.Yes) return; MOT.Move((eAxis)axisY, 0, 100, 1000, false, false, false); } else if (but.Text.StartsWith("Z") && axisZ >= 0) { if (UTIL.MsgQ("Z위치를 0으로 이동할가요?") != DialogResult.Yes) return; MOT.Move((eAxis)axisZ, 0, 100, 1000, false, false, false); } } else if (but.Text.EndsWith("-MOVE")) { //지정된 축중에 Z축을 가진 대상이 있다면 그것을 우선 0으로 이동시킨다. List idxlist = GetCurrentList(); if (idxlist == null) return; foreach (var dridx in idxlist) { var dr = this.ds.MCModel.Where(t => t.idx == dridx).First(); var ax = (eAxis)dr.MotIndex; var cate = ax.CategoryAttr(); //나머지축에 인터락이 있으면 처리하지 않는다. var sb = new System.Text.StringBuilder(); if (PUB.iLock[dr.MotIndex].IsEmpty() == false) { if (sb.Length < 1) sb.AppendLine("모션에 인터락이 설정되어 있습니다\n"); var locklist = MOT.GetActiveLockList(ax, PUB.iLock[dr.MotIndex]); sb.AppendLine($"축 : {ax}({dr.MotIndex}) 대상:{string.Join(",", locklist)}"); sb.AppendLine(); sb.AppendLine("진행하시겠습니까?"); if (UTIL.MsgQ(sb.ToString()) != DialogResult.Yes) return; } if (but.Text.StartsWith("X") && cate.StartsWith("X") && axisX >= 0) { if (UTIL.MsgQ($"X위치를 ({dr.Position})으로 이동할가요?") != DialogResult.Yes) return; MOT.Move(ax, dr.Position, dr.Speed, 1000, false, false, false); } else if (but.Text.StartsWith("Y") && cate.StartsWith("Y") && axisY >= 0) { if (UTIL.MsgQ($"Y위치를 ({dr.Position})으로 이동할가요?") != DialogResult.Yes) return; MOT.Move(ax, dr.Position, dr.Speed, 1000, false, false, false); } else if (but.Text.StartsWith("Z") && cate.StartsWith("Z") && axisZ >= 0) { if (UTIL.MsgQ($"z위치를 ({dr.Position})으로 이동할가요?") != DialogResult.Yes) return; MOT.Move(ax, dr.Position, Math.Min(50, dr.Speed), 1000, false, false, false); } } } } private void button13_Click(object sender, EventArgs e) { var but = sender as Button; var txt = but.Text.Trim(); var aname = txt.Substring(0, 1); var value = txt.Split(':')[1].Replace("mm", "").Replace("+", "").Trim(); var v = float.Parse(value); if (aname == "X" && axisX >= 0) { //이동을 해준다 MOT.Move((eAxis)axisX, v, 100, 1000, true, false, false); } else if (aname == "Y" && axisY >= 0) { //이동을 해준다 MOT.Move((eAxis)axisY, v, 100, 1000, true, false, false); } else if (aname == "Z" && axisZ >= 0) { //이동을 해준다 MOT.Move((eAxis)axisZ, v, 100, 1000, true, false, false); } } TreeNode prevnode = null; TreeView seltv = null; private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { //선택되면 대상축에서 x,y,z를 찾아서 설정하고 enable 을 설정한다. if (seltv != null) { seltv.BackColor = Color.White; } seltv = sender as TreeView; seltv.BackColor = Color.LightGoldenrodYellow; if (prevnode != null) { prevnode.BackColor = Color.White; } //지정된 축중에 Z축을 가진 대상이 있다면 그것을 우선 0으로 이동시킨다. List idxlist = GetCurrentList(); if (idxlist == null) return; var tn = this.seltv.SelectedNode; this.Text = $"{tn.Parent.Text} - {tn.Text}"; this.prevnode = tn; this.prevnode.BackColor = Color.Lime; List xlist = new List(); List ylist = new List(); List zlist = new List(); List xplist = new List(); List yplist = new List(); List zplist = new List(); foreach (var dridx in idxlist) { var dr = this.ds.MCModel.Where(t => t.idx == dridx).First(); var ax = (eAxis)dr.MotIndex; var cate = ax.CategoryAttr(); if (cate.StartsWith("Z")) { zlist.Add(ax); zplist.Add(dr); } else if (cate.StartsWith("X")) { xlist.Add(ax); xplist.Add(dr); } else if (cate.StartsWith("Y")) { ylist.Add(ax); yplist.Add(dr); } } if (xlist.Count == 1) { axisX = (int)xlist.First(); btXNeg.Enabled = true; btXPos.Enabled = true; btXNeg.BackColor = Color.LightSkyBlue; btXPos.BackColor = Color.LightSkyBlue; } else { axisX = -1; btXNeg.Enabled = false; btXPos.Enabled = false; btXNeg.BackColor = Color.LightGray; btXPos.BackColor = Color.LightGray; } if (ylist.Count == 1) { axisY = (int)ylist.First(); btYNeg.Enabled = true; btYPos.Enabled = true; btYNeg.BackColor = Color.LightSkyBlue; btYPos.BackColor = Color.LightSkyBlue; } else { axisY = -1; btYNeg.Enabled = false; btYPos.Enabled = false; btYNeg.BackColor = Color.LightGray; btYPos.BackColor = Color.LightGray; } if (zlist.Count == 1) { axisZ = (int)zlist.First(); btZNeg.Enabled = true; btZPos.Enabled = true; btZNeg.BackColor = Color.LightSkyBlue; btZPos.BackColor = Color.LightSkyBlue; } else { axisZ = -1; btZNeg.Enabled = false; btZPos.Enabled = false; btZNeg.BackColor = Color.LightGray; btZPos.BackColor = Color.LightGray; } eAxis axx = (eAxis)axisX; eAxis axy = (eAxis)axisY; eAxis axz = (eAxis)axisZ; lbX.Text = $"({axisX}){axx}"; if (axisX >= 0) lbX.Text += $"({xplist.First().PosIndex}mm)"; lbY.Text = $"({axisY}){axy}"; if (axisY >= 0) lbY.Text += $"({yplist.First().PosIndex}mm)"; lbZ.Text = $"({axisZ}){axz}"; if (axisZ >= 0) lbZ.Text += $"({zplist.First().PosIndex}mm)"; } private void button25_Click(object sender, EventArgs e) { var but = sender as Button; var val = int.Parse(but.Text); nudJogVel.Value = (decimal)val; } private void toolStripButton2_Click_1(object sender, EventArgs e) { using (var f = new Model_Motion()) f.ShowDialog(); } private void toolStripButton3_Click(object sender, EventArgs e) { using (var f = new Dialog.fIOMonitor()) f.ShowDialog(); } private void button28_Click(object sender, EventArgs e) { //var cur = DIO.GetIOOutput(eDOName.F셔틀_회전180); //string msg; //if (cur) msg = "셔틀(F)이 현재 뒤집혀 있습니다.\n원위치로 복귀 할까요?"; //else msg = "셔틀(F) 을 뒤집을까요?"; //var dlg = Util.MsgQ(msg); //if (dlg != DialogResult.Yes) return; } private void button29_Click(object sender, EventArgs e) { } private void toolStripButton4_Click(object sender, EventArgs e) { using (var f = new Dialog.Quick_Control()) f.ShowDialog(); } private void button30_Click(object sender, EventArgs e) { } private void btAllZSafe_Click(object sender, EventArgs e) { //Z1,2,3 안전위치로 이동한다 220421 var dlg = UTIL.MsgQ("모든 Z축을 안전위치로 이동할까요?\n" + "Z1,Z4의 경우 소켓을 잡고 있다면 안전위치 이동시 파손될 수 있습니다.\n" + "각 그리퍼의 소켓 상황을 확인하고 진행 하세요\n" + "Z축을 임의 이동할 경우 작업이 이어서 진행되지 않을 수 있습니다\n " + "작업 취소 하고 다시 시작하기를 권장 합니다"); if (dlg != DialogResult.Yes) return; var PosZ1 = MOT.GetPZPos(ePZLoc.READY); var PosZ2 = MOT.GetLZPos(eLZLoc.READY); var PosZ3 = MOT.GetRZPos(eRZLoc.READY); PosZ1.Position = 0; PosZ2.Position = 0; PosZ3.Position = 0; MOT.Move(PosZ1); MOT.Move(PosZ2); MOT.Move(PosZ3); } private void button31_Click(object sender, EventArgs e) { } private void btJogStop_Click(object sender, EventArgs e) { if (axisX >= 0) MOT.Stop((eAxis)axisX, "MOVETOGRP", true); if (axisY >= 0) MOT.Stop((eAxis)axisY, "MOVETOGRP", true); if (axisZ >= 0) MOT.Stop((eAxis)axisZ, "MOVETOGRP", true); } private void motCommandButton1_Click(object sender, EventArgs e) { if (axisX >= 0) MOT.Stop((eAxis)axisX, "MOVETOGRP", true); if (axisY >= 0) MOT.Stop((eAxis)axisY, "MOVETOGRP", true); if (axisZ >= 0) MOT.Stop((eAxis)axisZ, "MOVETOGRP", true); } } }