Esempio n. 1
0
        /// <summary>
        /// 充电测试
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            byte         vnum = 6;
            ChargePacket cp   = new ChargePacket(vnum, (byte)vnum, new CellPoint(4000, 0));

            Console.WriteLine("send charge");
            AgvServerManager.Instance.SendTo(cp, vnum);
        }
        protected override void Run()
        {
            Thread.Sleep(ConstDefine.STEP_TIME);
            if (vehicles == null)
            {
                return;
            }
            for (int vnum = 2; vnum <= 16; vnum++)
            {
                if (vehicles[vnum].agvInfo == null)
                {
                    continue;
                }
                //     Console.WriteLine(vnum + "小车电量:" + vehicles[vnum].agvInfo.Electricity);
                if (vehicles[vnum].Route == null || vehicles[vnum].Route.Count <= 0)
                {
                    continue;
                }
                if (vehicles[vnum].CurState == State.cannotToDestination && vehicles[vnum].Arrive == false)
                {
                    vehicles[vnum].Arrive   = true;
                    vehicles[vnum].CurState = State.Free;
                    vFinished.Add(vehicles[vnum]);
                    ClearAllCrossedNode(vnum);

                    string str = string.Format("小车" + vnum + ":{0},{1}->{2},{3}没有搜索到路径,", vehicles[vnum].BeginX, vehicles[vnum].BeginY, vehicles[vnum].EndX, vehicles[vnum].EndY);
                    OnShowMessage(this, new MessageEventArgs(str));
                    continue;
                }
                if (vehicles[vnum].Finished == true)
                {
                    continue;
                }
                if (vehicles[vnum].IsAgvReceived == false)
                {
                    if (vehicles[vnum].WaitEndTime < DateTime.Now)//超过等待时间还不能走,则重新发送一下当前位置
                    {
                        Logs.Warn("Resend Current location");
                        //     MessageBox.Show("resend " + vnum);
                        SendPack(vnum, vehicles[vnum].LastSendPacket);
                    }
                    continue;
                }
                if (vehicles[vnum].Arrive == true && vehicles[vnum].CurState == State.NeedCharge)
                {
                    if (vehicles[vnum].agvInfo.OrderExec == OrderExecState.Free &&
                        vehicles[vnum].EqualWithRealLocation(CHARGE_END_X, CHARGE_END_Y)
                        )
                    {
                        uint         cellUnit = (int)ConstDefine.CELL_UNIT;
                        ChargePacket cp       = new ChargePacket((byte)(vehicles[vnum].Serinum), (byte)vnum, new CellPoint(CHARGING_X * cellUnit, CHARGING_Y * cellUnit));
                        SendPack(vnum, cp);
                        vehicles[vnum].CurState = State.Charging;
                    }
                    continue;
                }
                if (vehicles[vnum].Arrive == true && vehicles[vnum].CurState == State.Charging)
                {
                    if (vehicles[vnum].agvInfo.Electricity > chargeMax)
                    {
                        if (vehicles[vnum].agvInfo.OrderExec == OrderExecState.Free &&
                            vehicles[vnum].EqualWithRealLocation(CHARGING_X, CHARGING_Y)
                            )
                        {
                            uint cellUnit          = (int)ConstDefine.CELL_UNIT;
                            FinishChargePacket fcp = new FinishChargePacket((byte)(vehicles[vnum].Serinum), (byte)vnum, new CellPoint(CHARGE_END_X * cellUnit, CHARGE_END_Y * cellUnit));
                            SendPack(vnum, fcp);
                            vehicles[vnum].CurState = State.Charged;
                        }
                    }
                    continue;
                }
                if (vehicles[vnum].Arrive == true && vehicles[vnum].CurState == State.Charged)
                {
                    if (vehicles[vnum].EqualWithRealLocation(CHARGE_END_X, CHARGE_END_Y) && vehicles[vnum].agvInfo.OrderExec == OrderExecState.Free)
                    {
                        vehicles[vnum].CurState = State.Free;
                    }
                    continue;
                }

                if (vehicles[vnum].Arrive == true && vehicles[vnum].CurState == State.carried)
                {
                    if (vehicles[vnum].EqualWithRealLocation(vehicles[vnum].BeginX, vehicles[vnum].BeginY))
                    {
                        if (vehicles[vnum].agvInfo.OrderExec == OrderExecState.Free)
                        {
                            TrayMotion trayMotion = TrayMotion.YNegative;
                            TrayPacket tp         = new TrayPacket((byte)(vehicles[vnum].Serinum), (ushort)vnum, trayMotion);
                            SendPack(vnum, tp);
                            vehicles[vnum].CurState = State.unloading;
                        }
                    }
                    continue;
                }
                if (vehicles[vnum].Arrive == true && vehicles[vnum].CurState == State.unloading)
                {
                    if (vehicles[vnum].agvInfo.OrderExec == OrderExecState.Free &&
                        (vehicles[vnum].LastSendPacket is TrayPacket || vehicles[vnum].LastSendPacket is FinishChargePacket)
                        )
                    {
                        if (vehicles[vnum].agvInfo.Electricity < chargeMin)
                        {
                            GoToCharge(vnum);
                        }
                        else
                        {
                            vehicles[vnum].CurState = State.Free;
                        }
                    }
                    continue;
                }
                if (vehicles[vnum].Arrive == true && vehicles[vnum].CurState == State.Free)
                {
                    ClearAllCrossedNode(vnum);
                    vehicles[vnum].Finished = true;
                    vFinished.Add(vehicles[vnum]);
                    continue;
                }
                Random r = new Random(DateTime.Now.Millisecond);
                if (vehicles[vnum].StopTime < r.Next(vnum % 5))
                {
                    if (vehicles[vnum].CurNodeTypy() != MapNodeType.queuingArea && GetDirCount(vehicles[vnum].BeginX, vehicles[vnum].BeginY) > 1)
                    {
                        if (vehicles[vnum].Stoped > -1 && vehicles[vnum].Stoped < vehicles.Length)
                        {
                            vehicles[vehicles[vnum].Stoped].StopTime = ConstDefine.STOP_TIME;
                        }
                        //重新搜索路径
                        SearchRoute(vnum, true);
                    }
                    vehicles[vnum].StopTime = ConstDefine.STOP_TIME;
                }
                else
                {
                    MoveType moveState = vehicles[vnum].Move(ElecMap.Instance);
                    if (moveState == MoveType.move)
                    {
                        uint      x        = Convert.ToUInt32(vehicles[vnum].BeginX);
                        uint      y        = Convert.ToUInt32(vehicles[vnum].BeginY);
                        uint      endX     = Convert.ToUInt32(vehicles[vnum].EndX);
                        uint      endY     = Convert.ToUInt32(vehicles[vnum].EndY);
                        uint      cellUnit = (int)ConstDefine.CELL_UNIT;
                        RunPacket rp       = new RunPacket((byte)(vehicles[vnum].Serinum), (ushort)vnum, MoveDirection.Forward, 1500, new Destination(new CellPoint(x * cellUnit, y * cellUnit), new CellPoint(endX * cellUnit, endY * cellUnit), new AgvDriftAngle(0), TrayMotion.None));
                        SendPack(vnum, rp);

                        ElecMap.Instance.mapnode[vehicles[vnum].BeginX, vehicles[vnum].BeginY].TraCongesIntensity = 100;//实际场地没用,故用来表示已经发送过的节点的标志,便于在界面上绘制

                        moveCount++;
                        OnShowMessage(string.Format("{0:N} 公里", (moveCount * 1.5) / 1000.0));
                    }
                    if (moveState == MoveType.clearFault)
                    {
                        if (vehicles[vnum].agvInfo.OrderExec == OrderExecState.Free
                            )
                        {
                            ClearFalutPacket cf = new ClearFalutPacket(vehicles[vnum].Serinum, (ushort)vnum);
                            SendPack(vnum, cf);
                        }
                    }
                }
            }
            if (vFinished != null)
            {
                for (int i = 0; i < vFinished.Count; i++)
                {
                    FinishedQueue.Instance.Enqueue(vFinished[i]);
                }
                vFinished.Clear();
            }
        }