/// <summary> /// 退出充电测试 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button7_Click_1(object sender, EventArgs e) { byte vnum = 2; FinishChargePacket cp = new FinishChargePacket(vnum, (byte)vnum, new CellPoint(4000, 1000)); Console.WriteLine("send FihishCharge"); 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(); } }