Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        /// <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);
            }
        }
Beispiel #3
0
 /// <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();
 }
Beispiel #4
0
        /// <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);
            }
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 internal abstract void UpdateItem(Message_s m);
Beispiel #7
0
        /// <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);
                }
            }
        }
Beispiel #8
0
        /// <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);
        }
Beispiel #9
0
 public abstract void UpdateItem(Message_s m);
Beispiel #10
0
        /// <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);
        }