/// <summary> /// 小车Carwash需要重定向 /// </summary> /// <param name="message"></param> private void DoCarWashReDirect(Message_s message) { int index = message.Index; int car = message.Magic2; NDCItem item = Items.Find(c => c.CARRIERID == car && c._mTask.PAUSE && c._mTask.HADLOAD); if (item == null) { string msg = "找不到挂起的小车(" + car + ")任务"; _NoticeMsg(msg); log.LOG(msg); } else { item.ReUseAfterCarWash(index); if (item._mTask.NDCREDIRECTSITE == "") { string msg = "Carwash原任务" + item._mTask.TASKID + "没有重定向信息!"; _NoticeMsg(msg); log.LOG(msg); return; } DoRedirect(index, item._mTask.NDCREDIRECTSITE); } }
/// <summary> /// 更新S消息 /// </summary> /// <param name="message"></param> public override void UpdateItem(Message_s message) { try { NDCItem ndcItem = Items.Find(c => { return(c._mTask.ORDERINDEX == message.Index); }); if (ndcItem == null) { ndcItem = new NDCItem { CarrierId = message.CarrierNumber }; ndcItem._mTask.ORDERINDEX = message.Index; Items.Add(ndcItem); } ndcItem.SetSMessage(message); if (ndcItem.StatusInfo != "") { log.LOG(ndcItem.StatusInfo); } CheckMagic(ndcItem, message); CheckCanUpdateTaskList(ndcItem); ///通知并更新WCS //if(ndcItem.TaskID !=0 ) DataControl._mForAGVControl.SubmitAgvMagic(ndcItem.TaskID, ndcItem.CarrierId+"", ndcItem.Magic); }catch (Exception e) { Console.WriteLine(e.Message); log.LOG(e.Message); } }
/// <summary> /// 更新S消息 /// </summary> /// <param name="message"></param> public void SetSMessage(Message_s message) { s.OrderIndex = message.Index; s.TransportStructure = message.TransportStructure; Magic = message.Magic; s.Magic1 = message.Magic; s.Magic2 = message.Magic2; s.Magic3 = message.Magic3; s.CarrierId = message.CarrierNumber; s.Station = message.CarrierStation; StatusInfo = s.ToString(); }
/// <summary> /// 更新S消息 /// </summary> /// <param name="message"></param> internal override void UpdateItem(Message_s message) { try { //找出被挂起的任务的重定向站点,重新重定向任务 if (message.Magic == 32) //32 Carwash sends this request { //TODO Carwash 重定向 DoCarWashReDirect(message); return; } NDCItem ndcItem = Items.Find(c => { return(c._mTask.NDCINDEX == message.Index); }); if (ndcItem == null) { ndcItem = TempItems.Find(c => { return(c._mTask.NDCINDEX == message.Index); }); if (ndcItem != null) { ndcItem.CARRIERID = message.CarrierNumber; } else { ndcItem = new NDCItem(); ndcItem.CARRIERID = message.CarrierNumber; ndcItem._mTask.NDCINDEX = message.Index; TempItems.Add(ndcItem); } } ndcItem.SetSMessage(message); if (ndcItem.StatusInfo != "") { Console.WriteLine(ndcItem.StatusInfo); log.LOG(ndcItem.StatusInfo); } CheckMagic(ndcItem, message); _NoticeUpdate(ndcItem); } catch (Exception e) { Console.WriteLine(e.Message); log.LOG(e.Message); } }
public void Message_sTest() { //"002300000000000000020000000100000001562899EE00001C20000000000000000000000100000000060000000000000000"; //Arange byte[] data = new byte[] { 0x00, 0x25, 0x11, 0xFF, 0x00, 0x01, 0x00, 0x02, 0xC8, 0x00, 0x11, 0x22, 0x10, 0x00, 0x00, 0x03, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x20 }; ushort type = 's'; //Act IACIMessage message = MessageParser.Parse(type, data); Message_s msg = (Message_s)message; //Assert Assert.AreEqual(msg.Index, 37); Assert.AreEqual(msg.TransportStructure, 17); Assert.AreEqual(msg.Status, 255); Assert.AreEqual(msg.Magic, 1); Assert.AreEqual(msg.CarrierNumber, 200); Assert.AreEqual(msg.CarrierStatus, 0x1122); Assert.AreEqual(msg.CarrierStation, 0x1000); Assert.AreEqual(msg.Values[(msg.NoVal - 1)], 32); }
internal abstract void UpdateItem(Message_s m);
/// <summary> /// Event when Recive Data From System Manager /// </summary> /// <param name="msg"></param> private void Instance_ReciveData(IACIMessage msg) { if (!systemHalted) { if (msg.Type == "s") { Message_s s_response = (Message_s)msg; int index = s_response.Index; //任务序列 (SM返回) int phase = s_response.Magic; //任务的阶段标识(相当于顺序) #region Send the phase back to SM if (s_response.Magic == 1) { SendNewM(index, phase); } else if (s_response.Magic == 2) { SendNewM(index, phase); } else if (s_response.Magic == 4)//到达接货 { SendNewM(index, phase); } else if (s_response.Magic == 6)//接货完成,由重新定位返回数据 { SendNewM(index, phase); } else if (s_response.Magic == 8)//到达卸货 { SendNewM(index, phase); } else if (s_response.Magic == 10) { SendNewM(index, phase); } else if (s_response.Magic == 11) { SendNewM(index, phase); } else if (s_response.Magic == 48) { int sendNextPhase = 143; SendNewM(index, sendNextPhase); } else if (s_response.Magic == 49) { int sendNextPhase = 143; SendNewM(index, sendNextPhase); } else if (s_response.Magic == 50) { int sendNextPhase = 143; SendNewM(index, sendNextPhase); } else if (s_response.Magic == 143) { SendNewM(index, phase); } else if (s_response.Magic == 254) { SendNewM(index, phase); } else if (s_response.Magic == 255) { SendNewM(index, phase); } #endregion UpdateItem(s_response); } else if (msg.Type == "b") { Message_b b_response = (Message_b)msg; UpdateItem(b_response); } else if (msg.Type == "<")//改写PLC的结果返回 { Message_vpil v_response = (Message_vpil)msg; //MessageBox.Show(string.Format("成功改写Data{0},改写的值为{1}", v_response.PlcLp1 + 1, v_response.Value1)); UpdateItem(v_response); } } }
/// <summary> /// 检查任务进程 /// </summary> /// <param name="index"></param> /// <param name="magic"></param> private void CheckMagic(NDCItem item, Message_s s) { int index = item._mTask.NDCINDEX; switch (item.Magic) { case 2: //确定生成任务 item._mTask.NDCLOADSITE = s.Magic2 + ""; item._mTask.NDCUNLOADSITE = s.Magic3 + ""; break; case 5: #region 小车到达接货点 if (item.DirectStatus != NDCItemStatus.HasDirectInfo) { item.DirectStatus = NDCItemStatus.CanRedirect; } if (!ReDirectList.Contains(item._mTask.NDCINDEX)) { ReDirectList.Add(item._mTask.NDCINDEX); } //准备好装货了 item.PLCStatus = NDCPlcStatus.LoadReady; #endregion break; case 6: #region 小车接货完成 if (item.DirectStatus == NDCItemStatus.CanRedirect || item.DirectStatus == NDCItemStatus.Init) { if (item.HadDirectInfo) { item.DirectStatus = NDCItemStatus.HasDirectInfo; } else { item.DirectStatus = NDCItemStatus.NeedRedirect; } } if (!ReDirectList.Contains(item._mTask.NDCINDEX)) { ReDirectList.Add(item._mTask.NDCINDEX); } //装货完成 item.PLCStatus = NDCPlcStatus.Loaded; item._mTask.HADLOAD = true; if (item.DirectStatus == NDCItemStatus.NeedRedirect) { _NoticeRedirect(item); } #endregion break; case 254: //重新定位成功 item.DirectStatus = NDCItemStatus.Redirected; ReDirectList.Remove(item._mTask.NDCINDEX); break; case 9: //到达卸货点 //准备好卸货了 item.PLCStatus = NDCPlcStatus.UnloadReady; break; case 10: //卸货完成 item.PLCStatus = NDCPlcStatus.Unloaded; item._mTask.HADUNLOAD = true; break; case 255: //取消任务 case 48: //取消任务 if (!item.CancleFromSystem) //Carwash { item._mTask.PAUSE = true; } break; case 11: //任务完成 if (item.PLCStatus != NDCPlcStatus.Unloaded && item._mTask.PAUSE) { item.IsFinish = false; //装货前 取消任务不用恢复,只需重新呼叫AGV if (!item._mTask.HADLOAD && !item._mTask.HADUNLOAD) { item.BeforeReCall(Ikey++); DoStartOrder(item); log.LOG(item._mTask.TASKID + ":任务车出现问题,现在重新呼叫AGV"); } } else { item.IsFinish = true; item.finishTime = DateTime.Now; } break; default: break; } MatchTempInfo(item); }
public abstract void UpdateItem(Message_s m);
/// <summary> /// 检查任务进程 /// </summary> /// <param name="index"></param> /// <param name="magic"></param> private void CheckMagic(NDCItem item, Message_s s) { int index = item._mTask.ORDERINDEX; switch (item.Magic) { case 2: //确定生成任务 item._mTask.NDCLOADSITE = item.s.Magic2 + ""; item._mTask.NDCUNLOADSITE = item.s.Magic3 + ""; break; case 4: //小车到达接货点 if (item.DirectStatus != NDCItemStatus.HasDirectInfo) { item.DirectStatus = NDCItemStatus.CanRedirect; } if (!ReDirectList.Contains(item._mTask.ORDERINDEX)) { ReDirectList.Add(item._mTask.ORDERINDEX); } //TODO 告诉WCS 车已经到达 //准备好装货了 item.PLCStatus = NDCPlcStatus.LoadReady; break; case 6: //小车接货完成 if (item.DirectStatus == NDCItemStatus.CanRedirect || item.DirectStatus == NDCItemStatus.Init) { if (item.HadDirectInfo) { item.DirectStatus = NDCItemStatus.HasDirectInfo; } else { item.DirectStatus = NDCItemStatus.NeedRedirect; } } if (!ReDirectList.Contains(item._mTask.ORDERINDEX)) { ReDirectList.Add(item._mTask.ORDERINDEX); } //装货完成 item.PLCStatus = NDCPlcStatus.Loaded; item._mTask.HADLOAD = true; if (item.DirectStatus == NDCItemStatus.NeedRedirect) { NoticeRedirect?.Invoke(item); } break; case 254: //重新定位成功 item.DirectStatus = NDCItemStatus.Redirected; ReDirectList.Remove(item._mTask.ORDERINDEX); break; case 8: //到达卸货点 //准备好卸货了 item.PLCStatus = NDCPlcStatus.UnloadReady; break; case 10: //卸货完成 //卸货完成 item.PLCStatus = NDCPlcStatus.Unloaded; item._mTask.HADUNLOAD = true; break; case 11: //任务完成 item.IsFinish = true; item.finishTime = DateTime.Now; break; default: break; } GetTempInfo(item); }