Просмотр исходного кода

新增涂布环穿取货及赶车逻辑

林豪 左 3 лет назад
Родитель
Сommit
ca41ee1703

+ 1 - 1
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -494,7 +494,7 @@ namespace WCS.Service.Extensions
         }
 
         /// <summary>
-        /// 当前RGV是否有拦住传入RGV
+        /// 当前RGV是否有拦住其他RGV
         /// </summary>
         /// <param name="rgv">RGV</param>
         /// <returns></returns>

+ 85 - 3
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -20,8 +20,8 @@ namespace WCS.Service.Works.RGV
             rgv.EX(rgv =>
             {
                 //RGV是自动且空闲的
-                if (rgv.Data2.WorkMode != WCS.Entity.Protocol.RGV.RGVMode.自动) return;
-                if (rgv.Data2.SystemStatus != WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) return;
+                if (rgv.Data2.WorkMode != RGVMode.自动) return;
+                if (rgv.Data2.SystemStatus != RGVRunStatus.空闲) return;
 
                 var obj = Device.Find(ConvGroup_1030).Create<StationDeviceGroup>();
 
@@ -86,7 +86,89 @@ namespace WCS.Service.Works.RGV
                 var rgv = obj.CurrentRGV();
                 if (rgv != null) //有车
                 {
-                    //是否有取货任务
+                    //RGV是自动且空闲的
+                    if (rgv.Data2.WorkMode != RGVMode.自动) return;
+                    if (rgv.Data2.SystemStatus != RGVRunStatus.空闲) return;
+                    //是否有任务
+                    if (rgv.Data.Trigger_1 != rgv.Data2.Trigger_2) throw new WarnException($"待执行任务{rgv.Data.TaskID_1}-{rgv.Data.TaskID_2}");
+                    //检查取货点是否需要取货
+                    obj.WhetherToExecute();
+                    //筛选出有任务号和起始及目标地址的设备
+                    var dev = obj.RGVGetTaskedDevice();
+                    if (dev.Count > 0) //有需要取货的任务
+                    {
+                        //开始下达取货任务
+                        DB.Do(db =>
+                        {
+                            var taskids = dev.Select(v => v.Data2.Tasknum);
+                            var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
+                            if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
+                                throw new WarnException("任务组ID不一致");
+                            if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
+                                throw new WarnException("无任务组ID");
+                            var gw1 = obj.Items.ToArray()[0];
+                            var gw2 = obj.Items.ToArray()[1];
+                            if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0)
+                            {
+                                if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{obj.Entity.Code}目标地址不一致");
+                            }
+                            rgv.Data.TaskID_1 = gw1.Data2.Tasknum;
+                            rgv.Data.TaskID_2 = gw2.Data2.Tasknum;
+                            rgv.Data.TaskType_1 = RGVTaskType.取货;
+                            if (gw1.Data2.Tasknum != 0)
+                            {
+                                rgv.Data.DestPosition_1 = gw1.Data2.Goodsend;
+                            }
+                            else
+                            {
+                                rgv.Data.DestPosition_1 = gw2.Data2.Goodsend;
+                            }
+                            rgv.Data.Trigger_1++;
+
+                            foreach (var task in tasks)
+                            {
+                                var msg = $"下达从{rgv.Data.StartPosition_1}移动至{ rgv.Data.DestPosition_1}的RGV PLC指令。";
+                                msg += $"[{ task.ID}][{rgv.Data.StartPosition_1}][{rgv.Data.DestPosition_1}[{ rgv.Data.Trigger_1}]";
+
+                                task.CreateStatusLog(db, msg, this.GetType());
+                            }
+                        });
+                    }
+                    else
+                    {
+                        //检查RGV自身是否有任务
+                        var b = false; //暂时默认无任务
+                        if (b)
+                        {
+                        }
+                        else
+                        {
+                            //找到自己的后一个小车
+                            var a = rgv.After();
+                            //后面的小车是否在执行任务
+                            if (a.Data2.WorkMode == RGVMode.自动 && a.Data2.SystemStatus == RGVRunStatus.空闲) return;
+                            //自己是否阻挡了该小车
+                            if (rgv.StopedByMe(a))
+                            {
+                                //取小车的目标位置值
+                                var c = Device.Find($"G{a.Data2.DestPosition_1}").Create<StationDeviceGroup>();
+                                //计算目标位置最近的一个取货口
+                                var d = Device.Where(v => v.Is(DF.涂布RGV取货站台))
+                                              .Select(v => v.Create<StationDeviceGroup>())
+                                              .Where(v => v.Position > c.Position)
+                                              .OrderBy(v => v.Position)
+                                              .FirstOrDefault();
+                                //写入移动任务
+                                rgv.Move(d);
+                            }
+
+                            ///检查是否阻挡了其他RGV
+                            ////找到所有自动不空闲的小车
+                            //var rgvs = rgv.RGVList.Where(v => v.Data2.WorkMode == RGVMode.自动 && v.Data2.SystemStatus != RGVRunStatus.空闲);
+                            ////找到不空闲且离自己最近的
+                            //var a = rgvs.OrderBy(v => v.Distance(rgv)).FirstOrDefault();
+                        }
+                    }
                 }
                 else //没车
                 {