Пример #1
0
 // make all neceseary changes after pick command
 public void Pick(UInt32 material, string source)
 {
     try
     {
         LPosition pos = LPosition.FromString(source);
         if (pos.IsWarehouse())
         {
             Warehouse.DBService.MaterialMove((int)material, source, Name);
             Warehouse.OnMaterialMove?.Invoke(new Place {
                 Material = (int)material, Place1 = Name
             }, EnumMovementTask.Move);
             Place = Warehouse.DBService.FindPlace(Name);
         }
         else
         {
             IConveyorIO cIO = FindInConveyor(source);
             Move(material, cIO as ConveyorBasic, this);
         }
     }
     catch (Exception ex)
     {
         Warehouse.AddEvent(Event.EnumSeverity.Error, Event.EnumType.Exception, ex.Message);
         throw new CraneException(String.Format("{0} Crane.Pick failed ({1},{2})", Name, material, source));
     }
 }
Пример #2
0
 public void Initialize(StrategyDoubleForkCrane c)
 {
     ConveyorCrane1 = c.Strategy1.Crane.InConveyor.FirstOrDefault(prop => prop.Name == ConveyorCrane1Name);
     ConveyorCrane2 = c.Strategy2.Crane.InConveyor.FirstOrDefault(prop => prop.Name == ConveyorCrane2Name);
 }
Пример #3
0
        public SimpleCraneCommand FindBestInput(bool automatic, IConveyorIO forcedInput)
        {
            try
            {
                CommandMaterial  cmd = null;
                List <BestInput> res = new List <BestInput>();

                foreach (ConveyorJunction c in InConveyor)
                {
                    if (c.Place != null)
                    {
                        cmd = Warehouse.DBService.FindFirstCommand(c.Place.Material, automatic);
                        if (cmd != null)
                        {
                            bool check = (c.ActiveRoute != null) && (c.ActiveRoute.Items[0].Final is Crane) && (c.ActiveRoute.Items[0].Final.Name == Name) && (c.ActiveMaterial == cmd.Material);
                            check = check && !Warehouse.DBService.CheckIfSimpleCraneCommandToPlaceMaterialExist(c.Place, automatic);
                            if (check)
                            {
                                Warehouse.AddEvent(Event.EnumSeverity.Event, Event.EnumType.Program, $"{Name}.FindBestInput({automatic},{forcedInput?.ToString()}");
                                foreach (var route in OutRouteDef.FinalRouteCost)
                                {
                                    if (route.Items.Last().Final.Compatible(cmd.Target))  // && route.Items[0].Final.Place == null)
                                    {
                                        if ((Warehouse.FreePlaces(route.Items[0].Final) > Warehouse.DBService.CountSimpleCraneCommandForTarget(route.Items[0].Final.Name, true)) ||
                                            route.Items[0].Final is Crane)
                                        {
                                            int a = Warehouse.FreePlaces(route.Items[0].Final);
                                            int b = Warehouse.DBService.CountSimpleCraneCommandForTarget(route.Items[0].Final.Name, true);
                                            Warehouse.AddEvent(Event.EnumSeverity.Event, Event.EnumType.Program, String.Format("FindBestInput On {0} Free places {1} Incoming commands {2}", route.Items[0].Final.Name, a, b));
                                            res.Add(new BestInput {
                                                ID = cmd.ID, Place = c.Name, Material = cmd.Material
                                            });
                                            if ((forcedInput != null && forcedInput == c))
                                            {
                                                res.Clear();
                                                res.Add(new BestInput {
                                                    ID = cmd.ID, Place = c.Name, Material = cmd.Material
                                                });
                                                break;
                                            }
                                        }
                                    }
                                }

                                /*                            var routes = from route in OutRouteDef.FinalRouteCost
                                 *                                       where route.Items.Last().Final.Compatible(cmd.Target) && route.Items[0].Next.Place == null &&
                                 *                                       (route.Items[0].Final is Crane || route.Items[0].Final.Place == null)
                                 *                                       group route by new { Route = route.Items[0] } into Group
                                 *                                       select new
                                 *                                       {
                                 *                                           Node1 = Group.Key.Route,
                                 *                                           RouteCost = Group.Min((x) => x.Cost)
                                 *                                       };
                                 */
                            }
                        }
                    }
                }

                if (res.Count() > 0)
                {
                    var c = res.ElementAt(Random.Next(res.Count())); // -1
                    return(new SimpleCraneCommand
                    {
                        Command_ID = c.ID,
                        Material = c.Material,
                        Source = c.Place,
                        Unit = Name,
                        Task = SimpleCommand.EnumTask.Pick,
                        Status = SimpleCommand.EnumStatus.NotInDB,
                        Time = DateTime.Now
                    });
                }
                return(null);
            }
            catch (Exception ex)
            {
                Warehouse.AddEvent(Event.EnumSeverity.Error, Event.EnumType.Exception, ex.Message);
                throw new CraneException(String.Format("{0} Crane.FindBestInput failed ({1})", Name, automatic));
            }
        }