林豪 左 vor 3 Jahren
Ursprung
Commit
e6f6c76c89

+ 3 - 0
Projects/永冠/WCS.Entity.Protocol/Station/IStation520.cs

@@ -43,6 +43,9 @@ namespace WCS.Entity.Protocol
         /// </summary>
         bool RES { get; set; }
 
+        /// <summary>
+        /// WCS确认信号,由PLC清除
+        /// </summary>
         bool CONFIRM { get; set; }
 
         byte RES2 { get; set; }

+ 15 - 3
Projects/永冠/WCS.Entity.Protocol/Station/IStation521.cs

@@ -39,12 +39,12 @@ namespace WCS.Entity.Protocol
         Int16 GOODSEND { get; set; }
 
         /// <summary>
-        /// 请求
+        /// PLC请求信号
         /// </summary>
         bool REQUEST { get; set; }
 
         /// <summary>
-        /// 确认
+        /// WCS确认信号
         /// </summary>
         bool RES { get; set; }
 
@@ -89,7 +89,7 @@ namespace WCS.Entity.Protocol
         bool R_OUTSIDE { get; set; }
 
         /// <summary>
-        ///
+        /// 超高故障
         /// </summary>
         bool H_OUTSIDE { get; set; }
 
@@ -103,12 +103,24 @@ namespace WCS.Entity.Protocol
         /// </summary>
         bool OVERLOAD { get; set; }
 
+        /// <summary>
+        /// 拆盘机用光电
+        /// </summary>
         bool PH_STATUS2 { get; set; }
 
+        /// <summary>
+        /// 备用
+        /// </summary>
         bool RES4 { get; set; }
 
+        /// <summary>
+        /// 备用
+        /// </summary>
         bool RES5 { get; set; }
 
+        /// <summary>
+        /// 外检高度
+        /// </summary>
         short HEIGHT { get; set; }
     }
 }

+ 4 - 4
Projects/永冠/WCS.Service/WebApi/WCSApi.cs

@@ -8,7 +8,6 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Service.Entity;
-using WCS.Service.Extensions;
 using WCS.Service.WebApi.ViewModels;
 
 namespace WCS.Service.WebApi
@@ -406,13 +405,14 @@ namespace WCS.Service.WebApi
 
             return result;
         }
+
         /// <summary>
         /// 通过该接口获取wcs报警信息
         /// </summary>
         /// <param name="query"></param>
         /// <returns></returns>
         [HttpPost]
-        public  List<V_WCSALARM> GetWcsAlarms(ALARMQUERY query)
+        public List<V_WCSALARM> GetWcsAlarms(ALARMQUERY query)
         {
             var wcsAlarms = new List<V_WCSALARM>();
             query.EQUNO = String.IsNullOrEmpty(query.EQUNO) ? "" : query.EQUNO;
@@ -578,7 +578,7 @@ namespace WCS.Service.WebApi
                     REQUEST = device.Data.REQUEST,
                     PH_STATUS = device.Data.PH_STATUS,
                     ADDRTO = device.Data.GOODSEND.ToString(),
-                    WEIGTH=device.Data.GOODSCODE/10
+                    WEIGTH = device.Data.GOODSCODE / 10
                 };
             }));
 
@@ -610,4 +610,4 @@ namespace WCS.Service.WebApi
 
         #endregion 静态方法
     }
-}
+}

+ 113 - 1
Projects/永冠/WCS.Service/Works/RGV/RGVWork.cs

@@ -117,4 +117,116 @@ namespace WCS.Service.Works
             return true;
         }
     }
-}
+
+    [WorkTitle(typeof(ProductHandler), "双工位RGV", true)]
+    public class 双工位RGV : DeviceWork<Device<IRGV521, IRGV520, IRGV523>>
+    {
+        protected override void Do(Device<IRGV521, IRGV520, IRGV523> dev)
+        {
+            
+            if (dev.Data3.Fault != 0)
+            {
+                if (dev.Entity.WakeupOn(5000))
+                {
+                    WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                }
+            }
+
+            if (Ltc.Do(dev, v => v.Data2.Trigger != 0))
+                return;
+            if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动))
+                return;
+            if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲))
+                return;
+
+            var startStations = Device.Where(v => v.ROUTES.Any(d => d.NEXT.CODE == dev.Entity.CODE))
+                .Select(v => v.Device<IStation521, IStation520>()).ToArray();
+            startStations = Ltc.Do(startStations, (arr) => arr.Where(v => v.Data.GOODSEND > 0 && v.Data.PH_STATUS).ToArray());
+            if (dev.Entity.CODE == "RGV1")
+                startStations = Ltc.Do(startStations, (arr) => arr.Where(v => v.Data.GOODSEND > 0 && v.Data.PH_STATUS && !v.Data.REQUEST).ToArray());
+            if (startStations.Length == 0)
+                return;
+
+            //startStations = Ltc.Do(startStations, dev, (arr, dev) => arr.Where(v => dev.Entity.ROUTES.Any(d => d.NEXT.CODE == v.Data.GOODSEND.ToString())).ToArray());
+            //if (startStations.Length == 0)
+            //    return;
+
+            startStations = Ltc.Do(startStations, arr => arr.Where(v => v.Data.GOODSEND.ToString() != v.Entity.CODE).ToArray());
+            if (startStations.Length == 0)
+                return;
+
+            var endEmptys = startStations.Where(v =>
+            {
+                var end = Device.Find(v.Data.GOODSEND.ToString());
+                var next = dev.Entity.GetNext(end.CODE).Device<IStation521>();
+                var res = next.Data.TASKNUM == 0 && next.Data.PH_STATUS == false;
+                if (res && end.CODE == "2324")
+                {
+                    res = Device.Find("2071", "2072", "2073", "2074", "2075", "2076", "2077", "2078", "2079", "2017", "2019", "2022", "2024", "2029").Select(v => v.Device<IStation521>())
+                    .Count(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0) > 3;
+                    if (!res)
+                    {
+                        Configs.UploadException(end.CODE, "库前拥堵,RGV暂停入库");
+                    }
+                }
+                return res;
+            }).ToArray();
+
+            short taskType = 1;
+            var st = Ltc.Do(endEmptys, arr => arr.OrderBy(v => v.Entity.CODE == "2182" || v.Entity.CODE == "2181" || v.Entity.CODE == "2081" || v.Entity.CODE == "2325" ? 1 : 2)
+            .ThenBy(v => v.Data.GetUpdateTime())
+            .FirstOrDefault());
+            if (st == null)
+            {
+                st = startStations.OrderBy(v => v.Entity.CODE == "2182" || v.Entity.CODE == "2181" || v.Entity.CODE == "2081" || v.Entity.CODE == "2325" ? 1 : 2)
+                .ThenBy(v => v.Data.GetUpdateTime())
+                .FirstOrDefault();
+                taskType = 3;
+            }
+
+            if (taskType == 3)
+            {
+                var target = st.Entity.Code();
+                if (dev.Data.DestPosition != target)
+                {
+                    dev.Data2.TaskType = taskType;
+                    dev.Data2.TaskID = 1;
+                    dev.Data2.StartPosition = 0;
+                    dev.Data2.DestPosition = short.Parse(st.Entity.CODE);
+                    dev.Data2.Trigger = 1;
+                }
+            }
+            else
+            {
+                var next = dev.Entity.GetNext(st.Data.GOODSEND.ToString());
+                if (next == null)
+                    return;
+
+                DB.Do(db =>
+                {
+                    var task = db.Default.Set<WCS_TASK>().Find(st.Data.TASKNUM);
+                    if (task != null)
+                    {
+                        if (next.CODE == task.ADDRTO)
+                        {
+                            //task.ADDRCURRENT = dev.Entity.CODE;
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                        }
+                    }
+
+                    dev.Data2.TaskType = taskType;
+                    dev.Data2.TaskID = st.Data.TASKNUM;
+                    dev.Data2.StartPosition = short.Parse(st.Entity.CODE);
+                    dev.Data2.DestPosition = next.Code();
+                    dev.Data2.Trigger = 1;
+                });
+            }
+        }
+
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return true;
+        }
+    }
+}