林豪 左 3 年之前
父节点
当前提交
1117396b18

+ 38 - 39
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -109,50 +109,49 @@ namespace WCS.Service.Works.RGV
                 //RGV是否在任何一个取货站点
                 if (pickStation != null)
                 {
-                    //// 检查取货点是否需要取货
-                    //pickStation.WhetherToExecute();
-                    //// 筛选出有任务号和起始及目标地址的设备
-                    //var devs = pickStation.RGVGetTaskedDevice();
-                    var devs = 0;
+                    // 检查取货点是否需要取货
+                    pickStation.WhetherToExecute();
+                    // 筛选出有任务号和起始及目标地址的设备
+                    var devs = pickStation.RGVGetTaskedDevice();
                     //是否需要取货
-                    if (devs > 0)
+                    if (devs.Count() > 0)
                     {
                         //开始下达取货任务
-                        //DB.Do(db =>
-                        //{
-                        //    var taskids = devs.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 = pickStation.Items.ToArray()[0];
-                        //    var gw2 = pickStation.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}目标地址不一致");
-                        //    }
-                        //    obj.Data.TaskID_1 = gw1.Data2.Tasknum;
-                        //    obj.Data.TaskID_2 = gw2.Data2.Tasknum;
-                        //    obj.Data.TaskType_1 = RGVTaskType.取货;
-                        //    if (gw1.Data2.Tasknum != 0)
-                        //    {
-                        //        obj.Data.DestPosition_1 = gw1.Data2.Goodsend;
-                        //    }
-                        //    else
-                        //    {
-                        //        obj.Data.DestPosition_1 = gw2.Data2.Goodsend;
-                        //    }
-                        //    obj.Data.Trigger_1++;
+                        DB.Do(db =>
+                        {
+                            var taskids = devs.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 = pickStation.Items.ToArray()[0];
+                            var gw2 = pickStation.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}目标地址不一致");
+                            }
+                            obj.Data.TaskID_1 = gw1.Data2.Tasknum;
+                            obj.Data.TaskID_2 = gw2.Data2.Tasknum;
+                            obj.Data.TaskType_1 = RGVTaskType.取货;
+                            if (gw1.Data2.Tasknum != 0)
+                            {
+                                obj.Data.DestPosition_1 = gw1.Data2.Goodsend;
+                            }
+                            else
+                            {
+                                obj.Data.DestPosition_1 = gw2.Data2.Goodsend;
+                            }
+                            obj.Data.Trigger_1++;
 
-                        //    foreach (var task in tasks)
-                        //    {
-                        //        var msg = $"下达从{obj.Data.StartPosition_1}移动至{ obj.Data.DestPosition_1}的RGV PLC指令。";
-                        //        msg += $"[{ task.ID}][{obj.Data.StartPosition_1}][{obj.Data.DestPosition_1}[{ obj.Data.Trigger_1}]";
+                            foreach (var task in tasks)
+                            {
+                                var msg = $"下达从{obj.Data.StartPosition_1}移动至{ obj.Data.DestPosition_1}的RGV PLC指令。";
+                                msg += $"[{ task.ID}][{obj.Data.StartPosition_1}][{obj.Data.DestPosition_1}[{ obj.Data.Trigger_1}]";
 
-                        //        task.CreateStatusLog(db, msg, this.GetType());
-                        //    }
-                        //});
+                                task.CreateStatusLog(db, msg, this.GetType());
+                            }
+                        });
                         return;
                     }
                     //找到自己的后一个小车

+ 135 - 5
Projects/永冠OPP/WCS.Service/Works/Station/涂布入库.cs

@@ -1,12 +1,142 @@
-using System;
+using DBHelper;
+using Newtonsoft.Json;
+using System;
 using System.Collections.Generic;
 using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity;
+using WCS.Entity.Protocol;
+using WCS.Service.Extensions;
 
 namespace WCS.Service.Works.Station
 {
-    internal class 涂布入库
+    /// <summary>
+    /// 车间入库
+    /// </summary>
+    //[WorkTitle(typeof(ProductHandler), "车间入库")]
+    public class 车间入库 : Work<StationDeviceGroup>
     {
+        protected override void Do(StationDeviceGroup obj)
+        {
+            obj.EX(obj =>
+            {
+                var station = obj.Entity.CODE;
+
+                #region 处理新增入库任务
+
+                DB.Do(db =>
+                {
+                    //找到所有的AGV任务
+                    var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.Station == station && v.TaskType == AGVTaskType.入库)
+                    .Where(v => v.Status < AGVTaskStatus.完成).ToArray();
+
+                    foreach (var agvtask in agvTasks)
+                    {
+                        var position = agvtask.Position;
+                        if (!ProtocolProxy.AllDatas.ContainsKey(position))
+                            ProtocolProxy.AllDatas[position] = new ProdLineData();
+                        var pld = ProtocolProxy.AllDatas[position] as ProdLineData;
+                        pld.Frame = LogicHandler.Frame;
+                        pld.Code = position;
+                        pld.TaskList.Add(agvtask);
+
+                        if (Ltc.Do(agvtask, agvtask => agvtask.Status == AGVTaskStatus.新建))
+                        {
+                            var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成)
+                           .Where(v => v.Position == agvtask.Position).Count();
+
+                            if (qty >= 2)
+                            {
+                                throw new Exception($"{agvtask.Position}正在执行的入库任务数量已达{qty},暂停入库");
+                            }
+                            //当前工位是否可以放货
+                        }
+                        else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.完成))
+                        {
+                            agvtask.Status = agvtask.AGVStatus;
+                            agvtask.UpdateTime = DateTime.Now;
+                            db.Default.SaveChanges();
+                        }
+                        else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.取消))
+                        {
+                            agvtask.Status = agvtask.AGVStatus;
+                            agvtask.UpdateTime = DateTime.Now;
+                            db.Default.SaveChanges();
+                        }
+                    }
+                });
+
+                #endregion 处理新增入库任务
+
+                //空闲自动,停止运行
+                if (obj.Items.Any(v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException("等待执行任务");
+                if (obj.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动))) return;
+                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException("设备运行中");
+                if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("没有光电");
+
+                var taskIds = new List<int>();
+                obj.Items.ToList().ForEach(dev => taskIds.Add(dev.Data2.Tasknum));
+                DB.Do(db =>
+                            {
+                                var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID));
+                                if (taskList == null) throw new WarnException($"WCS任务号{JsonConvert.SerializeObject(taskIds)}不存在");
+                                if (taskList.Any(v => v.TYPE != TaskType.出库)) throw new WarnException("有任务的类型不是出库");
+                                if (taskList.Any(v => v.AgvTask == 0)) throw new WarnException("人工出库任务,请手动搬走");
+                                var agvtask = db.Default.Set<WCS_AGVTask>().Find(taskList.FirstOrDefault().AgvTask);
+                                if (agvtask == null) throw new WarnException($"AGV任务号{taskList.FirstOrDefault().AgvTask}不存在");
+
+                                if (agvtask.Status == AGVTaskStatus.确认)
+                                {
+                                    var flag = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料)
+                                    .Where(v => v.Status > AGVTaskStatus.确认 && v.Status < AGVTaskStatus.取放完成).Count();
+                                    if (flag > 2) throw new Exception("有2未完成的AGV出库任务");
+
+                                    taskList.ToList().ForEach(task =>
+                                            {
+                                                task.STATUS = WCS.Entity.TaskStatus.已完成;
+                                                task.UPDATETIME = DateTime.Now;
+                                                task.ENDTIME = DateTime.Now;
+                                            });
+
+                                    agvtask.Station = obj.Entity.CODE;
+                                    agvtask.Status = AGVTaskStatus.执行;
+                                    agvtask.UpdateTime = DateTime.Now;
+                                    db.Default.SaveChanges();
+                                }
+                                else if (agvtask.Status < agvtask.AGVStatus)
+                                {
+                                    if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
+                                    {
+                                        if (agvtask.Status < AGVTaskStatus.执行) throw new WarnException($"AGV状态错误-{agvtask.Status}");
+                                        if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
+
+                                        agvtask.Status = agvtask.AGVStatus;
+                                        agvtask.UpdateTime = DateTime.Now;
+                                        db.Default.SaveChanges();
+                                    }
+                                    else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
+                                    {
+                                        if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
+                                        if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new WarnException("AGV取货完成后依然有光电信号");
+                                        if (agvtask.Status < AGVTaskStatus.请求_允许) throw new WarnException("AGV任务状态有误");
+
+                                        agvtask.Status = agvtask.AGVStatus;
+                                        agvtask.UpdateTime = DateTime.Now;
+                                        db.Default.SaveChanges();
+
+                                        obj.Items.ToList().ForEach(dev =>
+                            {
+                                dev.Data2.Status = IstationStatus.RES1;
+                            });
+                                    }
+                                }
+                            });
+            });
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.CODE == "G1386" || dev.CODE == "G1394";
+        }
     }
-}
+}

+ 50 - 50
Projects/永冠OPP/WCS.Service/Works/Station/涂布出库.cs

@@ -177,12 +177,12 @@ namespace WCS.Service.Works.Station
                          pld.Code = position;
                          pld.TaskList.Add(agvtask);
 
-                         if (Ltc.Do(agvtask, agvtask => agvtask.Status == AGVTaskStatus.新建))
+                         if (agvtask.Status == AGVTaskStatus.新建)
                          {
                              var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成)
                             .Where(v => v.Position == agvtask.Position).Count();
-                             //TODO:暂时不考虑单卷叫料
-                             if (Ltc.Do(qty, OutTaskQty => OutTaskQty > 8))
+                             //最多两个AGV任务
+                             if (qty >= 2)
                              {
                                  throw new Exception($"{agvtask.Position}正在执行的叫料任务数量已达{qty},暂停出库");
                              }
@@ -217,13 +217,13 @@ namespace WCS.Service.Works.Station
                                  db.Default.SaveChanges();
                              });
                          }
-                         else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.完成))
+                         else if (agvtask.AGVStatus == AGVTaskStatus.完成)
                          {
                              agvtask.Status = agvtask.AGVStatus;
                              agvtask.UpdateTime = DateTime.Now;
                              db.Default.SaveChanges();
                          }
-                         else if (Ltc.Do(agvtask, v => v.AGVStatus == AGVTaskStatus.取消))
+                         else if (agvtask.AGVStatus == AGVTaskStatus.取消)
                          {
                              agvtask.Status = agvtask.AGVStatus;
                              agvtask.UpdateTime = DateTime.Now;
@@ -243,60 +243,60 @@ namespace WCS.Service.Works.Station
                  var taskIds = new List<int>();
                  obj.Items.ToList().ForEach(dev => taskIds.Add(dev.Data2.Tasknum));
                  DB.Do(db =>
-                 {
-                     var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID));
-                     if (taskList == null) throw new WarnException($"WCS任务号{JsonConvert.SerializeObject(taskIds)}不存在");
-                     if (taskList.Any(v => v.TYPE != TaskType.出库)) throw new WarnException("有任务的类型不是出库");
-                     if (taskList.Any(v => v.AgvTask == 0)) throw new WarnException("人工出库任务,请手动搬走");
-                     var agvtask = db.Default.Set<WCS_AGVTask>().Find(taskList.FirstOrDefault().AgvTask);
-                     if (agvtask == null) throw new WarnException($"AGV任务号{taskList.FirstOrDefault().AgvTask}不存在");
+                              {
+                                  var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID));
+                                  if (taskList == null) throw new WarnException($"WCS任务号{JsonConvert.SerializeObject(taskIds)}不存在");
+                                  if (taskList.Any(v => v.TYPE != TaskType.出库)) throw new WarnException("有任务的类型不是出库");
+                                  if (taskList.Any(v => v.AgvTask == 0)) throw new WarnException("人工出库任务,请手动搬走");
+                                  var agvtask = db.Default.Set<WCS_AGVTask>().Find(taskList.FirstOrDefault().AgvTask);
+                                  if (agvtask == null) throw new WarnException($"AGV任务号{taskList.FirstOrDefault().AgvTask}不存在");
 
-                     if (agvtask.Status == AGVTaskStatus.确认)
-                     {
-                         var flag = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料)
-                         .Where(v => v.Status > AGVTaskStatus.确认 && v.Status < AGVTaskStatus.取放完成).Count();
-                         if (flag > 2) throw new Exception("有2未完成的AGV出库任务");
+                                  if (agvtask.Status == AGVTaskStatus.确认)
+                                  {
+                                      var flag = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.叫料)
+                                      .Where(v => v.Status > AGVTaskStatus.确认 && v.Status < AGVTaskStatus.取放完成).Count();
+                                      if (flag > 2) throw new Exception("有2未完成的AGV出库任务");
 
-                         taskList.ToList().ForEach(task =>
-                         {
-                             task.STATUS = WCS.Entity.TaskStatus.已完成;
-                             task.UPDATETIME = DateTime.Now;
-                             task.ENDTIME = DateTime.Now;
-                         });
+                                      taskList.ToList().ForEach(task =>
+                                              {
+                                                  task.STATUS = WCS.Entity.TaskStatus.已完成;
+                                                  task.UPDATETIME = DateTime.Now;
+                                                  task.ENDTIME = DateTime.Now;
+                                              });
 
-                         agvtask.Station = obj.Entity.CODE;
-                         agvtask.Status = AGVTaskStatus.执行;
-                         agvtask.UpdateTime = DateTime.Now;
-                         db.Default.SaveChanges();
-                     }
-                     else if (agvtask.Status < agvtask.AGVStatus)
-                     {
-                         if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
-                         {
-                             if (agvtask.Status < AGVTaskStatus.执行) throw new WarnException($"AGV状态错误-{agvtask.Status}");
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
+                                      agvtask.Station = obj.Entity.CODE;
+                                      agvtask.Status = AGVTaskStatus.执行;
+                                      agvtask.UpdateTime = DateTime.Now;
+                                      db.Default.SaveChanges();
+                                  }
+                                  else if (agvtask.Status < agvtask.AGVStatus)
+                                  {
+                                      if (agvtask.AGVStatus == AGVTaskStatus.请求_允许)
+                                      {
+                                          if (agvtask.Status < AGVTaskStatus.执行) throw new WarnException($"AGV状态错误-{agvtask.Status}");
+                                          if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
 
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
-                             db.Default.SaveChanges();
-                         }
-                         else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
-                         {
-                             if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
-                             if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new WarnException("AGV取货完成后依然有光电信号");
-                             if (agvtask.Status < AGVTaskStatus.请求_允许) throw new WarnException("AGV任务状态有误");
+                                          agvtask.Status = agvtask.AGVStatus;
+                                          agvtask.UpdateTime = DateTime.Now;
+                                          db.Default.SaveChanges();
+                                      }
+                                      else if (agvtask.AGVStatus == AGVTaskStatus.取放完成)
+                                      {
+                                          if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.RES1))) throw new WarnException("任务清零信号未清除");
+                                          if (obj.Items.Any(v => !v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new WarnException("AGV取货完成后依然有光电信号");
+                                          if (agvtask.Status < AGVTaskStatus.请求_允许) throw new WarnException("AGV任务状态有误");
 
-                             agvtask.Status = agvtask.AGVStatus;
-                             agvtask.UpdateTime = DateTime.Now;
-                             db.Default.SaveChanges();
+                                          agvtask.Status = agvtask.AGVStatus;
+                                          agvtask.UpdateTime = DateTime.Now;
+                                          db.Default.SaveChanges();
 
-                             obj.Items.ToList().ForEach(dev =>
+                                          obj.Items.ToList().ForEach(dev =>
                              {
                                  dev.Data2.Status = IstationStatus.RES1;
                              });
-                         }
-                     }
-                 });
+                                      }
+                                  }
+                              });
              });
         }