创建TaskInfo类
public class TaskInfo { public IAgv AgvName { get; set; } public IStation PickStation { get; set; } public IStation DropStation { get; set; } public IPocketLines PocketLine { get; set; } public bool IsMovingObstacle { get; set; } // 是否正在移动障碍物 public TaskInfo(IAgv agv, IStation PickStation, IPocketLines pocketLine = null) { this.AgvName = agv; this.PickStation = PickStation; this.PocketLine = pocketLine; this.IsMovingObstacle = false; agv.Tag = this; } }初始化AGV和站点,为站点和AGV分配全局属性
public void InitProcess() { API.StartVirtualSim(); API.QuickGProperty<IStation, bool>("取货点", Dispatch.PPT.PropertyDetail.PropertyCtrlEnum.CheckBox, true); API.QuickGProperty<IStation, bool>("放货点", Dispatch.PPT.PropertyDetail.PropertyCtrlEnum.CheckBox, true); API.QuickGProperty<IAgv, string>("小车状态", Dispatch.PPT.PropertyDetail.PropertyCtrlEnum.TextBox, true); API.QuickGProperty<IAgv, string>("待命点", Dispatch.PPT.PropertyDetail.PropertyCtrlEnum.TextBox, true); API.Agvs.Foreach(agv => { agv.ShowInMap("小车状态", true); agv.SetValue("小车状态", "空闲"); agv.TakeAll(); agv.Tag = null; agvMovingStatus[agv] = false; if (agv.GetValue<string>("待命点") != null) { agv.GoTo(agv.GetValue<string>("待命点")); } }); var 取货点 = API.Stations.Where(x => x.GetValue<bool>("取货点")).ToList(); 取货点.ForEach(sta => { sta.Tag = null; }); var 放货点 = API.Stations.Where(x => x.GetValue<bool>("放货点")).ToList(); foreach (var sta in 放货点) { sta.TakeAll(); sta.Tag = null; } }随机生成货物且生成障碍货物
//生成货物 public void SimProduce() { var allCargoStas = API.Stations.Where(x => x.GetValue<bool>("取货点")).ToList(); API.ClearCargos(allCargoStas.SelectMany(x => x.CargoAreas).ToList()); API.RandomGenerateCargoInfo(3); API.RandomGenerateContainerInfo(1, true, false, false); var storageStas = allCargoStas; var pocketLines = storageStas.SelectMany(x => x.BelongPocketLines).Distinct().ToList(); var pocketLineStas = pocketLines.SelectMany(x => x.OrderStations).Distinct().ToList(); // 生成货物_1(目标货物) var haveCargoStas = (int)(pocketLineStas.Count * initCargosPercent); var rand = new Random(); while (haveCargoStas > 0) { var pocketLine = pocketLines[rand.Next(pocketLines.Count)]; var catchOne = false; foreach (var sta in pocketLine.OrderStations) { if (sta.GetValue<bool>("取货点") && sta.IsEmpty()) { var container = sta.CargoAreas.FirstOrDefault().ContainerPlace("托盘_0"); container.CargoPlace("货物_1", 1); catchOne = true; Tools.trace($"生成货物_1 在 {sta.Mark}"); break; } } if (catchOne) haveCargoStas--; } // 生成障碍物货物(货物_2),放在货物_1前面,造成障碍 var obstacleCount = (int)(pocketLineStas.Count * 0.2); while (obstacleCount > 0) { var pocketLine = pocketLines[rand.Next(pocketLines.Count)]; var catchOne = false; foreach (var sta in pocketLine.OrderStations) { if (sta.GetValue<bool>("取货点") && sta.IsEmpty()) { var container = sta.CargoAreas.FirstOrDefault().ContainerPlace("托盘_0"); container.CargoPlace("货物_2", 1); catchOne = true; Tools.trace($"生成障碍物货物_2 在 {sta.Mark}"); break; } } if (catchOne) obstacleCount--; } }