using System; using System.Threading; using System.Windows.Forms; using VirtualSrm.Cache.Entity; using VirtualSrm.Properties; using VirtualSrm.Srm.Entity; using VirtualSrm.Srm.EnumType; using VirtualSrm.Utils; namespace VirtualSrm.View.Srm { public partial class StackerForm : Form { private StackerEntity Stacker; private Thread GetStackerStateThread; private Thread ReceiveTaskThread; private Thread DoTaskThread; private Thread AlarmAckThread; public StackerForm(string name) { Stacker = new StackerEntity(name); Stacker.WSrmNo = name == "stacker1" ? 1 : 2; ; Stacker.WMode = (int)ESrmMode.自动模式; Stacker.WAlarm = 0; Stacker.WLiftFull = 0; Stacker.WPosX = 0; Stacker.WPosY = 0; Stacker.WPosZ = 0; Stacker.WPosXmm = 0; Stacker.WPosYmm = 0; Stacker.WPosZmm = 0; Stacker.WPickFinish = 0; Stacker.WDeliveryFinish = 0; Stacker.WTaskFinish = 0; Stacker.WTaskNo = 0; Stacker.WState = (int)ESrmState.堆垛机空闲; Stacker.WActualLane = name == "stacker1" ? 1 : 2; Stacker.WAlarmNumber = 0; Stacker.WHandShake = 0; Stacker.Ack = 0; CacheEntity.OpcWcfServiceClient.WriteValues(new string[] { Stacker.OpcReadItems.SrmNo, Stacker.OpcReadItems.TaskNo, Stacker.OpcReadItems.Stb, Stacker.OpcReadItems.SourcePosX, Stacker.OpcReadItems.SourcePosY, Stacker.OpcReadItems.SourcePosZ, Stacker.OpcReadItems.DestinationPosX, Stacker.OpcReadItems.DestinationPosY, Stacker.OpcReadItems.DestinationPosZ, Stacker.OpcReadItems.Command, Stacker.OpcReadItems.EmergencyStop, Stacker.OpcReadItems.AlarmAck }, new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); InitializeComponent(); } private void StackerForm_Load(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; this.Text = Stacker.Name; this.tbSrmNo.DataBindings.Add("Text",Stacker,"SrmNo"); this.tbTaskNo.DataBindings.Add("Text", Stacker, "TaskNo"); this.tbSourcePosZ.DataBindings.Add("Text", Stacker, "SourcePosZ"); this.tbSourcePosX.DataBindings.Add("Text", Stacker, "SourcePosX"); this.tbSourcePosY.DataBindings.Add("Text", Stacker, "SourcePosY"); this.tbDestinationPosZ.DataBindings.Add("Text", Stacker, "DestinationPosZ"); this.tbDestinationPosX.DataBindings.Add("Text", Stacker, "DestinationPosX"); this.tbDestinationPosY.DataBindings.Add("Text", Stacker, "DestinationPosY"); this.tbCommand.DataBindings.Add("Text", Stacker, "Command"); this.tbEmergencyStop.DataBindings.Add("Text", Stacker, "EmergencyStop"); this.tbAlarmAck.DataBindings.Add("Text", Stacker, "AlarmAck"); this.tbStb.DataBindings.Add("Text", Stacker, "Stb"); this.tbAck.DataBindings.Add("Text", Stacker, "Ack"); this.tbHandShake.DataBindings.Add("Text", Stacker, "HandShake"); this.tbWSrmNo.DataBindings.Add("Text", Stacker, "WSrmNo"); this.tbWMode.DataBindings.Add("Text", Stacker, "WMode"); this.tbWAlarm.DataBindings.Add("Text", Stacker, "WAlarm"); this.tbWLiftFull.DataBindings.Add("Text", Stacker, "WLiftFull"); this.tbWPosX.DataBindings.Add("Text", Stacker, "WPosX"); this.tbWPosY.DataBindings.Add("Text", Stacker, "WPosY"); this.tbWPosZ.DataBindings.Add("Text", Stacker, "WPosZ"); this.tbWPosXmm.DataBindings.Add("Text", Stacker, "WPosXmm"); this.tbWPosYmm.DataBindings.Add("Text", Stacker, "WPosYmm"); this.tbWPosZmm.DataBindings.Add("Text", Stacker, "WPosZmm"); this.tbWPickFinish.DataBindings.Add("Text", Stacker, "WPickFinish"); this.tbWDeliveryFinish.DataBindings.Add("Text", Stacker, "WDeliveryFinish"); this.tbWTaskFinish.DataBindings.Add("Text", Stacker, "WTaskFinish"); this.tbWTaskNo.DataBindings.Add("Text", Stacker, "WTaskNo"); this.tbWState.DataBindings.Add("Text", Stacker, "WState"); this.tbWActualLane.DataBindings.Add("Text", Stacker, "WActualLane"); this.tbWAlarmNumber.DataBindings.Add("Text", Stacker, "WAlarmNumber"); this.tbWHandShake.DataBindings.Add("Text", Stacker, "WHandShake"); GetStackerStateThread = new Thread(new ThreadStart(GetStackerState)); ThreadHelper.StartThread(GetStackerStateThread); ReceiveTaskThread = new Thread(new ThreadStart(ReceiveTask)); ThreadHelper.StartThread(ReceiveTaskThread); DoTaskThread = new Thread(new ThreadStart(DoTask)); ThreadHelper.StartThread(DoTaskThread); AlarmAckThread = new Thread(new ThreadStart(AlarmAck)); ThreadHelper.StartThread(AlarmAckThread); } private void StackerForm_FormClosing(object sender, FormClosingEventArgs e) { ThreadHelper.CloseThread(GetStackerStateThread); ThreadHelper.CloseThread(ReceiveTaskThread); ThreadHelper.CloseThread(DoTaskThread); ThreadHelper.CloseThread(AlarmAckThread); if(Stacker != null) { Stacker.CloseWriteHandShakeThread(); //Stacker = null; // GC.Collect(); } } /// /// 获取每个堆垛机状态 /// /// 需要获取状态的堆垛机 private void GetStackerState() { var items = new string[] { //Stacker.OpcWriteItems.SrmNo,// 1Srm编号 //Stacker.OpcWriteItems.Mode,// 2任务号 //Stacker.OpcWriteItems.Alarm,// 3告警 //Stacker.OpcWriteItems.LiftFull, // 4载货工位是否有货 //Stacker.OpcWriteItems.PosX,// 5当前列 //Stacker.OpcWriteItems.PosY,// 6当前层 //Stacker.OpcWriteItems.PosZ,//7货叉位置 //Stacker.OpcWriteItems.PosXmm,// 8当前列坐标 //Stacker.OpcWriteItems.PosYmm,// 9当前层坐标 //Stacker.OpcWriteItems.PosZmm,// 10当前货叉标 //Stacker.OpcWriteItems.PickFinish,// 11完成取货信号 //Stacker.OpcWriteItems.DeliveryFinish,//// 12完成放货信号 //Stacker.OpcWriteItems.TaskFinish,// 13任务完成 //Stacker.OpcWriteItems.TaskNo,// 14当前任务号 //Stacker.OpcWriteItems.State,// 15当前任务执行状态 //Stacker.OpcWriteItems.ActualLane,// 16当前巷道号 //Stacker.OpcWriteItems.AlarmNumber,// 17告警代码 //Stacker.OpcWriteItems.HandShake,// 18心跳 Stacker.OpcReadItems.SrmNo,// 1Srm编号 Stacker.OpcReadItems.TaskNo,// 2任务号 Stacker.OpcReadItems.SourcePosX,// 3源列 Stacker.OpcReadItems.SourcePosY,// 4源层 Stacker.OpcReadItems.SourcePosZ,//5源排 Stacker.OpcReadItems.DestinationPosX,// 6宿列 Stacker.OpcReadItems.DestinationPosY,// 7宿层 Stacker.OpcReadItems.DestinationPosZ,// 8宿排 Stacker.OpcReadItems.Command,// 9发送命令 Stacker.OpcReadItems.EmergencyStop,// 10紧急停止 Stacker.OpcReadItems.AlarmAck,// 11解除告警 Stacker.OpcReadItems.Stb,// 12WCS通讯 //Stacker.OpcReadItems.Ack,// 13SRM 应答位 Stacker.OpcReadItems.HandShake// 14心跳 }; while (true) { try { var opcs = CacheEntity.OpcWcfServiceClient.ReadValues(items); if (opcs == null || opcs.Length <= 0) { Thread.Sleep(1000); continue; } var i = 0; //Stacker.WSrmNo = int.Parse(opcs[i++].ToString()); //Stacker.WMode = int.Parse(opcs[i++].ToString()); //Stacker.WAlarm = int.Parse(opcs[i++].ToString()); //Stacker.WLiftFull = int.Parse(opcs[i++].ToString()); //Stacker.WPosX = int.Parse(opcs[i++].ToString()); //Stacker.WPosY = int.Parse(opcs[i++].ToString()); //Stacker.WPosZ = int.Parse(opcs[i++].ToString()); //Stacker.WPosXmm = int.Parse(opcs[i++].ToString()); //Stacker.WPosYmm = int.Parse(opcs[i++].ToString()); //Stacker.WPosZmm = int.Parse(opcs[i++].ToString()); //Stacker.WPickFinish = int.Parse(opcs[i++].ToString()); //Stacker.WDeliveryFinish = int.Parse(opcs[i++].ToString()); //Stacker.WTaskFinish = int.Parse(opcs[i++].ToString()); //Stacker.WTaskNo = int.Parse(opcs[i++].ToString()); //Stacker.WState = int.Parse(opcs[i++].ToString()); //Stacker.WActualLane = int.Parse(opcs[i++].ToString()); //Stacker.WAlarmNumber = int.Parse(opcs[i++].ToString()); //Stacker.WHandShake = int.Parse(opcs[i++].ToString()); Stacker.SrmNo = int.Parse(opcs[i++].ToString()); Stacker.TaskNo = int.Parse(opcs[i++].ToString()); Stacker.SourcePosX = int.Parse(opcs[i++].ToString()); Stacker.SourcePosY = int.Parse(opcs[i++].ToString()); Stacker.SourcePosZ = int.Parse(opcs[i++].ToString()); Stacker.DestinationPosX = int.Parse(opcs[i++].ToString()); Stacker.DestinationPosY = int.Parse(opcs[i++].ToString()); Stacker.DestinationPosZ = int.Parse(opcs[i++].ToString()); Stacker.Command = int.Parse(opcs[i++].ToString()); Stacker.EmergencyStop = int.Parse(opcs[i++].ToString()); Stacker.AlarmAck = int.Parse(opcs[i++].ToString()); Stacker.Stb = int.Parse(opcs[i++].ToString()); //Stacker.Ack = int.Parse(opcs[i++].ToString()); Stacker.HandShake = int.Parse(opcs[i++].ToString()); } catch (Exception ex) { LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}读取状态失败:{1}", Stacker.Name, ex.Message); } finally { Thread.Sleep(1000); } } } private void ReceiveTask() { string msg; while(true) { var flag = Stacker.ReceiveTask(out msg); if (!flag) { //LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}接收任务失败:{1}", Stacker.Name, msg); } else { LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}接收任务成功:{1}", Stacker.Name, Stacker.TaskNo); } Thread.Sleep(1000); } } private void DoTask() { string msg; while (true) { var flag = Stacker.DoTask(out msg); if (!flag) { //LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}执行任务失败:{1}", Stacker.Name, msg); } else { LogTextHelper.WriteLine(Resources.LogDir, "堆垛机{0}执行任务成功:{1}", Stacker.Name, Stacker.TaskNo); } Thread.Sleep(1000); } } private void AlarmAck() { while (true) { if(Stacker.AlarmAck == 1) { Stacker.WAlarm = 0; Stacker.WAlarmNumber = 0; CacheEntity.OpcWcfServiceClient.WriteValue(Stacker.OpcReadItems.AlarmAck, 0); } Thread.Sleep(1000); } } /// /// 点击告警触发的事件 /// /// /// private void button1_Click(object sender, EventArgs e) { Stacker.WAlarm = 1; Stacker.WAlarmNumber = int.Parse(tbCode.Text.Trim()); } } }