using System; using System.Linq; using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Windows.Forms; using VirtualConveyor.Cache.Entity; using VirtualConveyor.Conveyor.Entity; using VirtualConveyor.Utils; using VirtualConveyor.Properties; namespace VirtualConveyor.View.Conveyor { public partial class ConveyorForm : Form { private ConveyorEntity Conveyor; private List GetGateStateThreads; private List ReceiveTaskThreads; private List StartTaskThreads; private List FinishTaskThreads; public ConveyorForm(string name) { InitializeComponent(); Conveyor = new ConveyorEntity(name); GetGateStateThreads = new List(); ReceiveTaskThreads = new List(); StartTaskThreads = new List(); FinishTaskThreads = new List(); Conveyor.Gates.ForEach(x => { x.TaskId = ""; x.WPickUpLicense = true; x.WPutDownLicense = true; x.WOccupied = true; x.WStartRotation = false; x.WPickUpLicenseManual = true; x.WLayingOffComplete = false; x.WCheckResult = 0; }); } private void ConveyorForm_Load(object sender, EventArgs e) { try { CheckForIllegalCrossThreadCalls = false; this.Text = Conveyor.Name; for (var i = 0; i < Conveyor.Gates.Count; i++) { var gate = Conveyor.Gates[i]; var group = new GroupBox(); group.Text = gate.Name; group.Location = new Point(5, 10 + i * 130); group.Size = new Size(780, 120); this.Controls.Add(group); var tableLayoutPanel = new TableLayoutPanel(); tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; tableLayoutPanel.Location = new System.Drawing.Point(0, 0); tableLayoutPanel.TabIndex = 0; tableLayoutPanel.ColumnCount = 8; tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 10F)); tableLayoutPanel.RowCount = 4; tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 25F)); group.Controls.Add(tableLayoutPanel); var j = 0; var k = 0; //1 if (!string.IsNullOrEmpty(gate.OpcReadItems.TaskId)) { var lbProcessCard = new Label(); lbProcessCard.Dock = System.Windows.Forms.DockStyle.Fill; lbProcessCard.TabIndex = 0; lbProcessCard.Text = "任务号"; lbProcessCard.TextAlign = ContentAlignment.MiddleRight; tableLayoutPanel.Controls.Add(lbProcessCard, j, k); j += 1; var tbProcessCard = new TextBox(); tbProcessCard.Dock = System.Windows.Forms.DockStyle.Fill; tbProcessCard.ReadOnly = true; tbProcessCard.TabIndex = 1; tbProcessCard.DataBindings.Add("Text", gate, "TaskId"); tableLayoutPanel.Controls.Add(tbProcessCard, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //2 if (!string.IsNullOrEmpty(gate.OpcReadItems.PutSymbol)) { var lbStartSymbol = new Label(); lbStartSymbol.Dock = System.Windows.Forms.DockStyle.Fill; lbStartSymbol.TabIndex = 0; lbStartSymbol.Text = "放货完成"; lbStartSymbol.TextAlign = ContentAlignment.MiddleRight; tableLayoutPanel.Controls.Add(lbStartSymbol, j, k); j += 1; var tbStartSymbol = new TextBox(); tbStartSymbol.Dock = System.Windows.Forms.DockStyle.Fill; tbStartSymbol.ReadOnly = true; tbStartSymbol.TabIndex = 1; tbStartSymbol.DataBindings.Add("Text", gate, "PutSymbol"); tableLayoutPanel.Controls.Add(tbStartSymbol, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //3 if (!string.IsNullOrEmpty(gate.OpcReadItems.PutSymbolManual)) { var lbStartSymbolManual = new Label(); lbStartSymbolManual.Dock = System.Windows.Forms.DockStyle.Fill; lbStartSymbolManual.TabIndex = 0; lbStartSymbolManual.Text = "手动放货完成"; lbStartSymbolManual.TextAlign = ContentAlignment.MiddleRight; tableLayoutPanel.Controls.Add(lbStartSymbolManual, j, k); j += 1; var tbStartSymbolManual = new TextBox(); tbStartSymbolManual.Dock = System.Windows.Forms.DockStyle.Fill; tbStartSymbolManual.ReadOnly = true; tbStartSymbolManual.TabIndex = 1; tbStartSymbolManual.DataBindings.Add("Text", gate, "PutSymbolManual"); tableLayoutPanel.Controls.Add(tbStartSymbolManual, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //4 if (!string.IsNullOrEmpty(gate.OpcReadItems.PickSymbol)) { var lbPickSymbol = new Label(); lbPickSymbol.Dock = System.Windows.Forms.DockStyle.Fill; lbPickSymbol.TabIndex = 0; lbPickSymbol.Text = "取货完成"; lbPickSymbol.TextAlign = ContentAlignment.MiddleRight; tableLayoutPanel.Controls.Add(lbPickSymbol, j, k); j += 1; var tbPickSymbol = new TextBox(); tbPickSymbol.Dock = System.Windows.Forms.DockStyle.Fill; tbPickSymbol.ReadOnly = true; tbPickSymbol.TabIndex = 1; tbPickSymbol.DataBindings.Add("Text", gate, "PickSymbol"); tableLayoutPanel.Controls.Add(tbPickSymbol, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } j = 0; k = 2; //5 if (!string.IsNullOrEmpty(gate.OpcWriteItems.TaskId)) { var lbWProcessCardNumber = new Label(); lbWProcessCardNumber.Dock = System.Windows.Forms.DockStyle.Fill; lbWProcessCardNumber.TabIndex = 0; lbWProcessCardNumber.Text = "任务号"; lbWProcessCardNumber.TextAlign = ContentAlignment.MiddleRight; tableLayoutPanel.Controls.Add(lbWProcessCardNumber, j, k); j += 1; var tbWProcessCardNumber = new TextBox(); tbWProcessCardNumber.Dock = System.Windows.Forms.DockStyle.Fill; tbWProcessCardNumber.ReadOnly = true; tbWProcessCardNumber.TabIndex = 1; tbWProcessCardNumber.DataBindings.Add("Text", gate, "WTaskId"); tableLayoutPanel.Controls.Add(tbWProcessCardNumber, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //6 if (!string.IsNullOrEmpty(gate.OpcWriteItems.PickUpLicense)) { var lbWPickUpLicense = new Label(); lbWPickUpLicense.Dock = System.Windows.Forms.DockStyle.Fill; lbWPickUpLicense.TabIndex = 0; lbWPickUpLicense.Text = "允许取货"; lbWPickUpLicense.TextAlign = ContentAlignment.MiddleRight; lbWPickUpLicense.Name = "lbWPickUpLicense" + gate.Name; lbWPickUpLicense.Click += new EventHandler(lbChangeValue_Click); tableLayoutPanel.Controls.Add(lbWPickUpLicense, j, k); j += 1; var tbWPickUpLicense = new TextBox(); tbWPickUpLicense.Dock = System.Windows.Forms.DockStyle.Fill; tbWPickUpLicense.ReadOnly = true; tbWPickUpLicense.TabIndex = 1; tbWPickUpLicense.DataBindings.Add("Text", gate, "WPickUpLicense"); tableLayoutPanel.Controls.Add(tbWPickUpLicense, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //7 if (!string.IsNullOrEmpty(gate.OpcWriteItems.PutDownLicense)) { var lbWPickUpLicense = new Label(); lbWPickUpLicense.Dock = System.Windows.Forms.DockStyle.Fill; lbWPickUpLicense.TabIndex = 0; lbWPickUpLicense.Text = "允许放货"; lbWPickUpLicense.TextAlign = ContentAlignment.MiddleRight; lbWPickUpLicense.Name = "lbWPutDownLicense" + gate.Name; lbWPickUpLicense.Click += new EventHandler(lbChangeValue_Click); tableLayoutPanel.Controls.Add(lbWPickUpLicense, j, k); j += 1; var tbWPickUpLicense = new TextBox(); tbWPickUpLicense.Dock = System.Windows.Forms.DockStyle.Fill; tbWPickUpLicense.ReadOnly = true; tbWPickUpLicense.TabIndex = 1; tbWPickUpLicense.DataBindings.Add("Text", gate, "WPutDownLicense"); tableLayoutPanel.Controls.Add(tbWPickUpLicense, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //8 if (!string.IsNullOrEmpty(gate.OpcWriteItems.PickUpLicenseManual)) { var lbWPickUpLicenseManual = new Label(); lbWPickUpLicenseManual.Dock = System.Windows.Forms.DockStyle.Fill; lbWPickUpLicenseManual.TabIndex = 0; lbWPickUpLicenseManual.Text = "手动放货允许"; lbWPickUpLicenseManual.TextAlign = ContentAlignment.MiddleRight; lbWPickUpLicenseManual.Name = "lbWPickUpLicenseManual" + gate.Name; lbWPickUpLicenseManual.Click += new EventHandler(lbChangeValue_Click); tableLayoutPanel.Controls.Add(lbWPickUpLicenseManual, j, k); j += 1; var tbWPickUpLicenseManual = new TextBox(); tbWPickUpLicenseManual.Dock = System.Windows.Forms.DockStyle.Fill; tbWPickUpLicenseManual.ReadOnly = true; tbWPickUpLicenseManual.TabIndex = 1; tbWPickUpLicenseManual.DataBindings.Add("Text", gate, "WPickUpLicenseManual"); tableLayoutPanel.Controls.Add(tbWPickUpLicenseManual, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //9 if (!string.IsNullOrEmpty(gate.OpcWriteItems.Occupied)) { var lbWOccupied = new Label(); lbWOccupied.Dock = System.Windows.Forms.DockStyle.Fill; lbWOccupied.TabIndex = 0; lbWOccupied.Text = "到位信号"; lbWOccupied.Name = "lbWOccupied" + gate.Name; lbWOccupied.Click += new EventHandler(lbChangeValue_Click); lbWOccupied.TextAlign = ContentAlignment.MiddleRight; tableLayoutPanel.Controls.Add(lbWOccupied, j, k); j += 1; var tbWOccupied = new TextBox(); tbWOccupied.Dock = System.Windows.Forms.DockStyle.Fill; tbWOccupied.ReadOnly = true; tbWOccupied.TabIndex = 1; tbWOccupied.DataBindings.Add("Text", gate, "WOccupied"); tableLayoutPanel.Controls.Add(tbWOccupied, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //10 if (!string.IsNullOrEmpty(gate.OpcWriteItems.StartRotation)) { var lbWStartRotation = new Label(); lbWStartRotation.Dock = System.Windows.Forms.DockStyle.Fill; lbWStartRotation.TabIndex = 0; lbWStartRotation.Text = "滚动开始"; lbWStartRotation.Name = "lbWStartRotation" + gate.Name; lbWStartRotation.Click += new EventHandler(lbChangeValue_Click); lbWStartRotation.TextAlign = ContentAlignment.MiddleRight; tableLayoutPanel.Controls.Add(lbWStartRotation, j, k); j += 1; var tbWStartRotation = new TextBox(); tbWStartRotation.Dock = System.Windows.Forms.DockStyle.Fill; tbWStartRotation.ReadOnly = true; tbWStartRotation.TabIndex = 1; tbWStartRotation.DataBindings.Add("Text", gate, "WStartRotation"); tableLayoutPanel.Controls.Add(tbWStartRotation, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //11 if (!string.IsNullOrEmpty(gate.OpcWriteItems.LayingOffComplete)) { var lbWLayingOffComplete = new Label(); lbWLayingOffComplete.Dock = System.Windows.Forms.DockStyle.Fill; lbWLayingOffComplete.TabIndex = 0; lbWLayingOffComplete.Text = "滚料完成"; lbWLayingOffComplete.TextAlign = ContentAlignment.MiddleRight; lbWLayingOffComplete.Name = "lbWLayingOffComplete" + gate.Name; lbWLayingOffComplete.Click += new EventHandler(lbChangeValue_Click); tableLayoutPanel.Controls.Add(lbWLayingOffComplete, j, k); j += 1; var tbWLayingOffComplete = new TextBox(); tbWLayingOffComplete.Dock = System.Windows.Forms.DockStyle.Fill; tbWLayingOffComplete.ReadOnly = true; tbWLayingOffComplete.TabIndex = 1; tbWLayingOffComplete.DataBindings.Add("Text", gate, "WLayingOffComplete"); tableLayoutPanel.Controls.Add(tbWLayingOffComplete, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } //12 if (!string.IsNullOrEmpty(gate.OpcWriteItems.CheckResult)) { var lbWCheckResult = new Label(); lbWCheckResult.Dock = System.Windows.Forms.DockStyle.Fill; lbWCheckResult.TabIndex = 0; lbWCheckResult.Text = "人工结果"; lbWCheckResult.TextAlign = ContentAlignment.MiddleRight; lbWCheckResult.Name = "lbWCheckResult" + gate.Name; lbWCheckResult.Click += new EventHandler(lbChangeValue_Click); tableLayoutPanel.Controls.Add(lbWCheckResult, j, k); j += 1; var tbWCheckResult = new TextBox(); tbWCheckResult.Dock = System.Windows.Forms.DockStyle.Fill; tbWCheckResult.ReadOnly = true; tbWCheckResult.TabIndex = 1; tbWCheckResult.DataBindings.Add("Text", gate, "WCheckResult"); tableLayoutPanel.Controls.Add(tbWCheckResult, j, k); j = j < tableLayoutPanel.ColumnCount - 1 ? j + 1 : 0; if (j == 0) { k += 1; } } } Conveyor.Gates.ForEach(x => { var t1 = new Thread(new ParameterizedThreadStart(GetGateState)); GetGateStateThreads.Add(t1); ThreadHelper.StartThread(t1, x); var t2 = new Thread(new ParameterizedThreadStart(ReceiveTask)); ReceiveTaskThreads.Add(t2); ThreadHelper.StartThread(t2, x); var t3 = new Thread(new ParameterizedThreadStart(StartTask)); StartTaskThreads.Add(t3); ThreadHelper.StartThread(t3, x); var t4 = new Thread(new ParameterizedThreadStart(FinishTask)); FinishTaskThreads.Add(t4); ThreadHelper.StartThread(t4, x); }); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void ConveyorForm_FormClosing(object sender, FormClosingEventArgs e) { GetGateStateThreads.ForEach(x => ThreadHelper.CloseThread(x)); ReceiveTaskThreads.ForEach(x => ThreadHelper.CloseThread(x)); StartTaskThreads.ForEach(x => ThreadHelper.CloseThread(x)); FinishTaskThreads.ForEach(x => ThreadHelper.CloseThread(x)); } private void lbChangeValue_Click(object sender, EventArgs e) { var name = ((Label)sender).Name; if(name.StartsWith("lbWPickUpLicenseManual")) { var gateName = name.Substring("lbWPickUpLicenseManual".Length); var gate = Conveyor.Gates.FirstOrDefault(x => x.Name == gateName); gate.WPickUpLicenseManual = !gate.WPickUpLicenseManual; } else if (name.StartsWith("lbWPickUpLicense")) { var gateName = name.Substring("lbWPickUpLicense".Length); var gate = Conveyor.Gates.FirstOrDefault(x => x.Name == gateName); gate.WPickUpLicense = !gate.WPickUpLicense; } else if (name.StartsWith("lbWPutDownLicense")) { var gateName = name.Substring("lbWPutDownLicense".Length); var gate = Conveyor.Gates.FirstOrDefault(x => x.Name == gateName); gate.WPutDownLicense = !gate.WPutDownLicense; } else if (name.StartsWith("lbWCheckResult")) { var gateName = name.Substring("lbWCheckResult".Length); var gate = Conveyor.Gates.FirstOrDefault(x => x.Name == gateName); gate.WCheckResult = (gate.WCheckResult + 1) % 3; } else if (name.StartsWith("lbWOccupied")) { var gateName = name.Substring("lbWOccupied".Length); var gate = Conveyor.Gates.FirstOrDefault(x => x.Name == gateName); gate.WOccupied = !gate.WOccupied; } else if (name.StartsWith("lbWStartRotation")) { var gateName = name.Substring("lbWStartRotation".Length); var gate = Conveyor.Gates.FirstOrDefault(x => x.Name == gateName); gate.WStartRotation = !gate.WStartRotation; } else if (name.StartsWith("lbWLayingOffComplete")) { var gateName = name.Substring("lbWLayingOffComplete".Length); var gate = Conveyor.Gates.FirstOrDefault(x => x.Name == gateName); gate.WLayingOffComplete = !gate.WLayingOffComplete; } } private void FinishTask(object x) { var gate = (GateEntity)x; string msg; while (true) { var flag = gate.FinishTask(out msg); if (!flag) { //LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}接收任务失败:{1}", Stacker.Name, msg); } else { LogTextHelper.WriteLine(Resources.LogDir, "端口{0}结束任务成功:{1}", gate.Name, gate.TaskId); } Thread.Sleep(1000); } } private void StartTask(object x) { var gate = (GateEntity)x; string msg; while (true) { var flag = gate.StartTask(out msg); if (!flag) { //LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}接收任务失败:{1}", Stacker.Name, msg); } else { LogTextHelper.WriteLine(Resources.LogDir, "端口{0}开始任务成功:{1}", gate.Name, gate.TaskId); } Thread.Sleep(1000); } } private void ReceiveTask(object x) { var gate = (GateEntity)x; string msg; while (true) { var flag = gate.ReceiveTask(out msg); if (!flag) { //LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}接收任务失败:{1}", Stacker.Name, msg); } else { LogTextHelper.WriteLine(Resources.LogDir, "端口{0}接收任务成功:{1}", gate.Name, gate.TaskId); } Thread.Sleep(1000); } } private void GetGateState(object x) { var gate = (GateEntity)x; var items = new List(); //1 if (!string.IsNullOrEmpty(gate.OpcReadItems.TaskId)) { items.Add(gate.OpcReadItems.TaskId); } //5 if (!string.IsNullOrEmpty(gate.OpcReadItems.PutSymbol)) { items.Add(gate.OpcReadItems.PutSymbol); } //6 if (!string.IsNullOrEmpty(gate.OpcReadItems.PickSymbol)) { items.Add(gate.OpcReadItems.PickSymbol); } //7 if (!string.IsNullOrEmpty(gate.OpcReadItems.PutSymbolManual)) { items.Add(gate.OpcReadItems.PutSymbolManual); } while(true) { var opcs = CacheEntity.OpcWcfServiceClient.ReadValues(items.ToArray()); if (opcs == null || opcs.Length <= 0) { Thread.Sleep(1000); continue; } var i = 0; //1 if (!string.IsNullOrEmpty(gate.OpcReadItems.TaskId)) { var value = opcs[i++]; gate.TaskId = value == null ? "" : value.ToString(); } //5 if (!string.IsNullOrEmpty(gate.OpcReadItems.PutSymbol)) { var value = opcs[i++]; gate.PutSymbol = value == null ? false : bool.Parse(value.ToString()); } //6 if (!string.IsNullOrEmpty(gate.OpcReadItems.PickSymbol)) { var value = opcs[i++]; gate.PickSymbol = value == null ? false : bool.Parse(value.ToString()); } //7 if (!string.IsNullOrEmpty(gate.OpcReadItems.PutSymbolManual)) { var value = opcs[i++]; gate.PutSymbolManual = value == null ? false : bool.Parse(value.ToString()); } Thread.Sleep(1000); } } } }