xsd 9 月之前
父节点
当前提交
727bdfa4b1

二进制
DLL.zip


+ 2 - 1
业务工程/时效库/WCS.WorkEngineering/Extensions/SRMExtension.cs

@@ -97,7 +97,8 @@ namespace WCS.WorkEngineering.Extensions
                 //isOut = tasks.Any(x => x.Key == Entity.Code);
                 var tasks = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(x => x.BusType == "装箱码垛" && x.Status < WCS.Entity.TaskStatus.堆垛机执行).ToList().GroupBy(x => x.PalletizingID)
                 .Where(x => x.Count() < 10).SelectMany(x => x).Select(x => x.Device).ToList();
-                isOut = tasks.Any(x => x == Entity.Code);
+                
+                isOut = tasks.Any(x => x == Entity.Code) ;
             });
             if (InOut && !isOut)
             {//入库

+ 26 - 1
业务工程/时效库/WCS.WorkEngineering/Systems/堆垛机.cs

@@ -68,7 +68,32 @@ namespace WCS.WorkEngineering.Systems
                     obj.Data.CancelAck2 = 0;
                 return;
             }
-
+            //同时完成的情况一起处理
+            if (obj.Data2.FinishedTaskID1 != 0 && obj.Data2.FinishedTaskID2 != 0)
+            {
+                if (obj.Data2.FinishedTaskID1 != obj.Data.TaskID1)
+                {
+                    MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID1}有误", Time = DateTime.Now }));
+                    throw new Exception($"完成任务号{obj.Data2.FinishedTaskID1}有误");
+                }
+                if (obj.Data2.FinishedTaskID2 != obj.Data.TaskID2)
+                {
+                    MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID2}有误", Time = DateTime.Now }));
+                    throw new Exception($"完成任务号{obj.Data2.FinishedTaskID2}有误");
+                }
+                World.Log("开始处理堆垛机完成任务1和2");
+                WMS.堆垛机完成(obj.Data2.FinishedTaskID1);
+                WMS.堆垛机完成(obj.Data2.FinishedTaskID2);
+                SqlSugarHelper.Do(db =>
+                {
+                    obj.FinishTask(db, obj.Data2.FinishedTaskID1, obj.Entity.Code);
+                    obj.Data.OkAck1 = 1;
+                    obj.FinishTask(db, obj.Data2.FinishedTaskID2, obj.Entity.Code);
+                    obj.Data.OkAck2 = 1;
+                    World.Log("结束堆垛机完成任务1和2");
+                });
+                return;
+            }
             if (obj.Data2.FinishedTaskID1 != 0)
             {
                 if (obj.Data2.FinishedTaskID1 != obj.Data.TaskID1)

+ 95 - 78
业务工程/时效库/WCS.WorkEngineering/Systems/帘线.cs

@@ -63,26 +63,35 @@ namespace WCS.WorkEngineering.Systems
                 MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = "帘线扫码" + obj.Entity.Code + "扫码失败", Time = DateTime.Now }));
                 //throw new Exception("扫码失败");
 
-                SqlSugarHelper.Do(db =>
-                {
-                    var error = new BaseErrorinfoWcs()
-                    {
-                        ContBarCode = obj.Entity.Code,
-                        Message = $"扫码失败,自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
-                        Count = 1,
-                        Memo = "WCS"
-                    };
-                    db.Default.Insertable(error).ExecuteCommand();
-                });
-
-                obj.Data.TaskNumber = obj.Data2.TaskNumber;
-                obj.Data.GoodsEnd = 10;
-                obj.Data.VoucherNo++;
-                return;
+                //SqlSugarHelper.Do(db =>
+                //{
+                //    var error = new BaseErrorinfoWcs()
+                //    {
+                //        ContBarCode = obj.Entity.Code,
+                //        Message = $"扫码值是空值,自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
+                //        Count = 1,
+                //        Memo = "WCS"
+                //    };
+                //    db.Default.Insertable(error).ExecuteCommand();
+                //});
+                //if (obj.Entity.Code == "2134")
+                //{
+                    throw new Exception("扫码是空值");
+                //}
+                //else
+                //{
+                //    obj.Data.TaskNumber = obj.Data2.TaskNumber;
+                //    obj.Data.GoodsEnd = 10;
+                //    obj.Data.VoucherNo++;
+                //    return;
+                //}
+            
+                
                 //var num = MainWorld.Redis.HGet<int>($"NotScanNumber{obj.Entity.Code}", DateTime.Now.ToString("yyyyMMdd"));
                 //MainWorld.Redis.HSet($"NotScanNumber{obj.Entity.Code}", DateTime.Now.ToString("yyyyMMdd"), (num + 1));
                 //return;
             }
+            var res = WMS.帘线扫码(obj.Entity.Code, barcode);
             World.Log($"帘线扫码{obj.Entity.Code}交互开始时间:工字轮条码{barcode} | 颜色标识 {obj.Data2.GoodsStart}" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
             var ww = "";
             if (barcode.EndsWith("R"))
@@ -107,51 +116,87 @@ namespace WCS.WorkEngineering.Systems
             {
                 color = "橙黄色";
             }
+            else if (obj.Data2.GoodsStart == 3)
+            {
+                color = "蓝色";
+            }
 
-
-            if (ww == "R")
+            if (res.Memo2 == "A")//A等级的工字轮才做颜色识别
             {
-                if (obj.Data2.GoodsStart != 2) // 1黑- >L; 2黄 -> R
+                if (ww == "R")
                 {
-                    SqlSugarHelper.Do(db =>
+                    if (obj.Data2.GoodsStart != 2) // 1黑- >L; 2黄 -> R
                     {
-                        var error = new BaseErrorinfoWcs()
-                        {
-                            ContBarCode = barcode,
-                            Message = $"帘线异常排出口,颜色不匹配,识别器识别为:{color},自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
-                            Count = 1,
-                            Memo = "WCS"
-                        };
-                        var errorinfoWcs = db.Default.Queryable<BaseErrorinfoWcs>().With(SqlWith.NoLock).Where(v => v.ContBarCode == error.ContBarCode && v.Message == error.Message).First();
-                        if (errorinfoWcs != null)
+                        SqlSugarHelper.Do(db =>
                         {
-                            errorinfoWcs.Count = errorinfoWcs.Count++;
-                            errorinfoWcs.AddTime = DateTime.Now;
-                            db.Default.Updateable(errorinfoWcs).ExecuteCommand();
-                        }
-                        else
+                            var error = new BaseErrorinfoWcs()
+                            {
+                                ContBarCode = barcode,
+                                Message = $"帘线异常排出口,颜色不匹配,识别器识别为:{color},自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
+                                Count = 1,
+                                Memo = "WCS"
+                            };
+                            var errorinfoWcs = db.Default.Queryable<BaseErrorinfoWcs>().With(SqlWith.NoLock).Where(v => v.ContBarCode == error.ContBarCode && v.Message == error.Message).First();
+                            if (errorinfoWcs != null)
+                            {
+                                errorinfoWcs.Count = errorinfoWcs.Count++;
+                                errorinfoWcs.AddTime = DateTime.Now;
+                                db.Default.Updateable(errorinfoWcs).ExecuteCommand();
+                            }
+                            else
+                            {
+                                db.Default.Insertable(error).ExecuteCommand();
+                            }
+                        });
+
+                        World.Log($"帘线扫码{obj.Entity.Code}交互结束时间:工字轮条码{barcode} | 颜色标识 {obj.Data2.GoodsStart} " + DateTime.Now.ToString("yyyyMMddHHmmss"));
+                        obj.Data.TaskNumber = obj.Data2.TaskNumber;
+                        obj.Data.GoodsEnd = 10;
+                        obj.Data.VoucherNo++;
+                        return;
+                    }
+                }
+                else
+                {
+                    if (obj.Data2.GoodsStart != 1 && obj.Data2.GoodsStart != 3)
+                    {
+                        SqlSugarHelper.Do(db =>
                         {
-                            db.Default.Insertable(error).ExecuteCommand();
-                        }
-                    });
+                            var error = new BaseErrorinfoWcs()
+                            {
+                                ContBarCode = barcode,
+                                Message = $"帘线异常排出口,颜色不匹配,识别器识别为:{color},自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
+                                Count = 1,
+                                Memo = "WCS"
+                            };
+                            var errorinfoWcs = db.Default.Queryable<BaseErrorinfoWcs>().With(SqlWith.NoLock).Where(v => v.ContBarCode == error.ContBarCode && v.Message == error.Message).First();
+                            if (errorinfoWcs != null)
+                            {
+                                errorinfoWcs.Count = errorinfoWcs.Count++;
+                                errorinfoWcs.AddTime = DateTime.Now;
+                                db.Default.Updateable(errorinfoWcs).ExecuteCommand();
+                            }
+                            else
+                            {
+                                db.Default.Insertable(error).ExecuteCommand();
+                            }
+                        });
 
-                    World.Log($"帘线扫码{obj.Entity.Code}交互结束时间:工字轮条码{barcode} | 颜色标识 {obj.Data2.GoodsStart} " + DateTime.Now.ToString("yyyyMMddHHmmss"));
-                    obj.Data.TaskNumber = obj.Data2.TaskNumber;
-                    obj.Data.GoodsEnd = 10;
-                    obj.Data.VoucherNo++;
-                    return;
+                        World.Log($"帘线扫码{obj.Entity.Code}交互结束时间:工字轮条码{barcode} | 颜色标识 {obj.Data2.GoodsStart} " + DateTime.Now.ToString("yyyyMMddHHmmss"));
+                        obj.Data.TaskNumber = obj.Data2.TaskNumber;
+                        obj.Data.GoodsEnd = 10;
+                        obj.Data.VoucherNo++;
+                        return;
+                    }
                 }
-            }
-            else
-            {
-                if (obj.Data2.GoodsStart != 1)
+                if (obj.Data2.GoodsStart == 0) //没有识别出颜色标识
                 {
                     SqlSugarHelper.Do(db =>
                     {
                         var error = new BaseErrorinfoWcs()
                         {
                             ContBarCode = barcode,
-                            Message = $"帘线异常排出口,颜色不匹配,识别器识别为:{color},自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
+                            Message = $"帘线异常排出口,没有识别出工字轮的颜色,521db块颜色值:{color},自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
                             Count = 1,
                             Memo = "WCS"
                         };
@@ -167,43 +212,15 @@ namespace WCS.WorkEngineering.Systems
                             db.Default.Insertable(error).ExecuteCommand();
                         }
                     });
-
-                    World.Log($"帘线扫码{obj.Entity.Code}交互结束时间:工字轮条码{barcode} | 颜色标识 {obj.Data2.GoodsStart} " + DateTime.Now.ToString("yyyyMMddHHmmss"));
                     obj.Data.TaskNumber = obj.Data2.TaskNumber;
                     obj.Data.GoodsEnd = 10;
                     obj.Data.VoucherNo++;
                     return;
                 }
+
             }
-            if (obj.Data2.GoodsStart == 0) //没有识别出颜色标识
-            {
-                SqlSugarHelper.Do(db =>
-                {
-                    var error = new BaseErrorinfoWcs()
-                    {
-                        ContBarCode = barcode,
-                        Message = $"帘线异常排出口,没有识别出工字轮的颜色,521db块颜色值:{color},自动异常排出,{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}",
-                        Count = 1,
-                        Memo = "WCS"
-                    };
-                    var errorinfoWcs = db.Default.Queryable<BaseErrorinfoWcs>().With(SqlWith.NoLock).Where(v => v.ContBarCode == error.ContBarCode && v.Message == error.Message).First();
-                    if (errorinfoWcs != null)
-                    {
-                        errorinfoWcs.Count = errorinfoWcs.Count++;
-                        errorinfoWcs.AddTime = DateTime.Now;
-                        db.Default.Updateable(errorinfoWcs).ExecuteCommand();
-                    }
-                    else
-                    {
-                        db.Default.Insertable(error).ExecuteCommand();
-                    }
-                });
-                obj.Data.TaskNumber = obj.Data2.TaskNumber;
-                obj.Data.GoodsEnd = 10;
-                obj.Data.VoucherNo++;
-                return;
-            }
-            var res = WMS.帘线扫码(obj.Entity.Code, barcode);
+
+
             if (!res.Success)
             {
                 SqlSugarHelper.Do(db =>

+ 43 - 1
业务工程/时效库/WCS.WorkEngineering/Systems/环线成品分配.cs

@@ -10,6 +10,7 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Worlds;
+using wms.sqlsugar.model;
 
 namespace WCS.WorkEngineering.Systems
 {
@@ -27,7 +28,7 @@ namespace WCS.WorkEngineering.Systems
                 return;
             if (obj.Data2.GoodsStart != 1)
                 throw new Exception("GoodsStart值有误");
-
+            //MaduoChuKuTiShenJi
             var floor = short.Parse(obj.Entity.GetFlag("Floor"));
             var list = new List<short>();
             if (floor == 1)
@@ -84,4 +85,45 @@ namespace WCS.WorkEngineering.Systems
             return dev.HasFlag("出库扫码");
         }
     }
+
+    /// <summary>
+    ///  配置信息表
+    /// </summary>
+    [Tenant("sx")]
+    [SugarTable("sys_config", "配置信息表")]
+    public class SxSysConfig : BaseModel
+    {
+        /// <summary>
+        ///  编号
+        /// </summary>
+        [SugarColumn(ColumnName = "code", Length = 100)]
+        public string Code { get; set; }
+
+        /// <summary>
+        ///  名称
+        /// </summary>
+        [SugarColumn(ColumnName = "name", Length = 100)]
+        public string Name { get; set; }
+
+        /// <summary>
+        ///  内容
+        /// </summary>
+        [SugarColumn(ColumnName = "scontent", Length = 100)]
+        public string SContent { get; set; }
+
+        /// <summary>
+        ///  类型
+        /// </summary>
+        [SugarColumn(ColumnName = "stype", Length = 50)]
+        public string SType { get; set; }
+
+        [SugarColumn(ColumnName = "default1", Length = 100, IsNullable = true)]
+        public string Default1 { get; set; }
+
+        [SugarColumn(ColumnName = "default2", Length = 100, IsNullable = true)]
+        public string Default2 { get; set; }
+
+        [SugarColumn(ColumnName = "default3", Length = 100, IsNullable = true)]
+        public string Default3 { get; set; }
+    }
 }

+ 24 - 0
业务工程/时效库/WCS.WorkEngineering/Systems/环线扫码.cs

@@ -248,6 +248,30 @@ namespace WCS.WorkEngineering.Systems
                 {
                     WMS.补料(task.ID, obj.Entity.Code);
                 }
+                else if (task.Type == TaskType.EnterDepot)
+                {
+                    if (obj.Entity.Code == "3752")
+                    {
+                        obj.Data.GoodsEnd = 3618;   //1环线转圈目标地址
+                        obj.Data.VoucherNo++;
+                    }
+                    else if (obj.Entity.Code == "3452")
+                    {
+                        obj.Data.GoodsEnd = 3318;  //2环线转圈目标地址
+                        obj.Data.VoucherNo++;
+                    }
+                    else if (obj.Entity.Code == "3152")
+                    {
+                        obj.Data.GoodsEnd = 3018;  //环线转圈目标地址
+                        obj.Data.VoucherNo++;
+                    }
+                    else
+                    {
+                        throw new Exception($"{obj.Entity.Code}没有对应的入库目标地址");
+                    }
+                    World.Log($"环线出库扫码{obj.Entity.Code}是入库工字轮,分配去转圈:工字轮条码 {barcode} | " + DateTime.Now.ToString("yyyyMMddHHmmss"));
+                    return;
+                }
                 SqlSugarHelper.Do(db =>
                 {
                     if (task != null)

+ 61 - 37
业务工程/时效库/WCS.WorkEngineering/Systems/装箱码垛/入缓存扫码.cs

@@ -5,6 +5,7 @@ using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using SqlSugar;
 using System.ComponentModel;
+using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.BCR;
@@ -58,6 +59,15 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                     if (item == null)
                     {
                         MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code}条码{bcrCode}找不到对应任务", Time = DateTime.Now }));
+                        var error = new BaseErrorinfoWcs()
+                        {
+                            ContBarCode = bcrCode,
+                            Message = $"码垛异常排出口|5251,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务不是码垛出库任务,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
+                            Count = 1,
+                            Memo = "WCS"
+                        };
+                        error.UpdataErrorinfo();
+                        Circling(obj, 5038, 5173, bcrCode);
                         continue;
                     }
                     if (item.AddrTo != "8090" && item.AddrTo != "8092" && item.AddrTo != "8096" && item.AddrTo != "8098")
@@ -65,13 +75,13 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                         var error = new BaseErrorinfoWcs()
                         {
                             ContBarCode = bcrCode,
-                            Message = $"码垛异常排出口|5180,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务不是码垛出库任务,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
+                            Message = $"码垛异常排出口|5251,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务不是码垛出库任务,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
                             Count = 1,
                             Memo = "WCS"
                         };
                         error.UpdataErrorinfo();
 
-                        Circling(obj, 5041, 5180, bcrCode);
+                        Circling(obj, 5038, 5180, bcrCode);
                         continue;
                     }
 
@@ -87,12 +97,12 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                             var error = new BaseErrorinfoWcs()
                             {
                                 ContBarCode = bcrCode,
-                                Message = $"码垛入缓存扫码口|5041,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务状态大于或等于码垛抓取扫码,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
+                                Message = $"码垛入缓存扫码口|5251,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务状态大于或等于码垛抓取扫码,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
                                 Count = 1,
                                 Memo = "WCS"
                             };
                             error.UpdataErrorinfo();
-                            Circling(obj, 5041, 5180, bcrCode);
+                            Circling(obj, 5251, 5180, bcrCode);
                             return;
                         }
 
@@ -103,11 +113,11 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 
                         if (task.Robot is "Robot1" or "")
                         {
-                            cacheList = new List<string>() { "5100", "5086" };
+                            cacheList = new List<string>() { /*"5100",*/ "5086", "5070", "5056" };
                         }
                         else if (task.Robot is "Robot2" or "")
                         {
-                            cacheList = new List<string>() { "5070", "5056" };
+                            cacheList = new List<string>() { "5310", "5295", "5280", "5265" };
                         }
                         //当前任务是否正在码垛
                         var isPallet = db.Default.Queryable<Palletizing>().Any(v => v.PalletizState == 0 && v.ID == task.PalletizingID);
@@ -131,9 +141,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                                     .Where(x => x.PalletizingID == task.PalletizingID && cacheList.Contains(x.AddrNext) && x.Status < TaskStatus.码垛缓存放行)
                                     .ToList()
                                     .GroupBy(x => x.AddrNext)
-                                    .Where(x => x.Count() < 13)
-                                    .OrderByDescending(x => x.Count())
-                                    .FirstOrDefault();
+                                    .Where(x => x.Count() < 13).MaxBy(x => x.Count());
 
                                 if (addNext == null || addNext.Count() >= 13)
                                 {
@@ -141,7 +149,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                                     var addrNextList = db.Default.Queryable<WCS_TaskInfo>().Where(x => x.Type == TaskType.OutDepot && x.BusType == "装箱码垛" && x.Status == TaskStatus.码垛缓存扫码)
                                             .ToList().Select(x => x.AddrNext).Distinct().ToList();
                                     //找到没有被使用过的下一个地址
-                                    var caches = cacheList.Where(x => !addrNextList.Contains(x)).OrderByDescending(x => x.ToShort()).ToList();
+                                    var caches = cacheList.Where(x => !addrNextList.Contains(x)).OrderBy(x => x.ToShort()).ToList();
                                     if (caches == null || caches.Count < 1) //没有可以使用的缓存位了,绕圈去
                                     {
                                         //是正在码垛的箱
@@ -159,7 +167,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                                             var error1 = new BaseErrorinfoWcs()
                                             {
                                                 ContBarCode = bcrCode,
-                                                Message = $"入缓存扫码|5040,当前正在码垛工字轮条码{bcrCode}已无可用缓存道,直接去往码垛位,{DateTime.Now:yyyyMMddHH}",
+                                                Message = $"入缓存扫码|5251,当前正在码垛工字轮条码{bcrCode}已无可用缓存道,直接去往码垛位,{DateTime.Now:yyyyMMddHH}",
                                                 Count = 1,
                                                 Memo = "WCS"
                                             };
@@ -170,7 +178,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                                         var error = new BaseErrorinfoWcs()
                                         {
                                             ContBarCode = bcrCode,
-                                            Message = $"入缓存扫码|5040,条码{bcrCode}已无可用缓存道,{DateTime.Now:yyyyMMddHH}",
+                                            Message = $"入缓存扫码|5251,条码{bcrCode}已无可用缓存道,{DateTime.Now:yyyyMMddHH}",
                                             Count = 1,
                                             Memo = "WCS"
                                         };
@@ -178,38 +186,24 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                                         Circling(obj, task.ID, 5173, bcrCode);
                                         return;
                                     }
+
                                     if (caches.Count == 1) //可以使用的缓存位只有一个
                                     {
-                                        //先获取任务所在机械臂的最早一条未结束的码垛信息
-                                        //0:正在码垛  1:码垛结束  2:等待码垛
-                                        var pallet = db.Default.Queryable<Palletizing>().Where(v => v.PalletizState != 1 && v.Robot == task.Robot)
-                                            .OrderBy(x => x.AddTime)
-                                            .First();
-                                        //var pallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).Where(v => v.PalletizState == 0 && v.Equip == task.AddrTo).First();
-                                        if (pallet.ID != task.PalletizingID) //不是当前机械臂的第一箱(最早一箱)
+                                        if (db.Default.Queryable<WCS_TaskInfo>().Count(x => x.PalletizingID == task.PalletizingID && x.Status < Entity.TaskStatus.码垛缓存扫码) > 10)
                                         {
-                                            if (!db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status < Entity.TaskStatus.码垛抓取扫码 && addrNextList.Contains(x.AddrNext)))
-                                            {
-                                                //获取当前任务对应码垛信息
-                                                var curPallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).First(x => x.ID == task.PalletizingID);
-                                                //当前机械臂中在当前任务码垛信息前未结束的码垛信息
-                                                var palletIds = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock)
-                                                    .Where(x => x.PalletizState != 1 && x.Robot == task.Robot && x.AddTime < curPallet.AddTime)
-                                                    .Select(x => x.ID).ToList();
+                                            //获取同机械臂正在码垛的另一箱任务,同一时间同一机械臂只能有一箱在码垛
+                                            var pallet = db.Default.Queryable<Palletizing>().Where(v => v.PalletizState == 0 && v.Robot == task.Robot && v.ID != task.PalletizingID).First();
 
-                                                //判断正在码垛的箱是否全部大于等于码垛扫码的,如果不是,就需要留下一条线用来走上一箱的最后几个轮子
-                                                var isOut = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Any(x => palletIds.Contains(x.PalletizingID) && x.Status < Entity.TaskStatus.码垛抓取扫码);
-                                                //if (isOut)
-                                                //{
-                                                //    World.Log($"目标位置{task.AddrTo},正在码垛箱未全部离开码垛合流点,如有异常请检查正在码垛箱是否有任务小于码垛合流状态");
-                                                //    throw new Exception($"目标位置{task.AddrTo},正在码垛箱未全部离开码垛合流点,如有异常请检查正在码垛箱是否有任务小于码垛合流状态");
-                                                //}
-                                                if (isOut)
+                                            //判断获取到的码垛箱是否有未进入码垛缓存放行的任务
+                                            if (pallet != null && db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status < Entity.TaskStatus.码垛缓存扫码))
+                                            {
+                                                //没有已经分配缓存道的任务
+                                                if (!db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status == Entity.TaskStatus.码垛缓存扫码))
                                                 {
                                                     var error = new BaseErrorinfoWcs()
                                                     {
                                                         ContBarCode = bcrCode,
-                                                        Message = $"入缓存扫码|5040,,{task.PalletizingID}的上一箱未全部经过抓取扫码,需要流出缓存行走上一箱的产品,因此此产品绕圈去,{DateTime.Now:yyyyMMddHH}",
+                                                        Message = $"入缓存扫码|5251,,{task.PalletizingID}的同机械臂的另外一箱任务还没有占用任何一个缓存道,需要留出缓存行走另一箱的产品,因此此产品绕圈去,{DateTime.Now:yyyyMMddHH}",
                                                         Count = 1,
                                                         Memo = "WCS"
                                                     };
@@ -219,6 +213,36 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
                                                 }
                                             }
                                         }
+
+                                        //if (pallet.ID != task.PalletizingID) //不是当前机械臂的第一箱(最早一箱)
+                                        //{
+                                        //    if (!db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status < Entity.TaskStatus.码垛抓取扫码 && addrNextList.Contains(x.AddrNext)))
+                                        //    {
+                                        //        //获取当前任务对应码垛信息
+                                        //        var curPallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).First(x => x.ID == task.PalletizingID);
+                                        //        //当前机械臂中在当前任务码垛信息前未结束的码垛信息
+                                        //        var palletIds = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock)
+                                        //            .Where(x => x.PalletizState != 1 && x.Robot == task.Robot && x.AddTime < curPallet.AddTime)
+                                        //            .Select(x => x.ID).ToList();
+
+                                        //        //判断正在码垛的箱是否全部大于等于码垛扫码的,如果不是,就需要留下一条线用来走上一箱的最后几个轮子
+                                        //        var isOut = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Any(x => palletIds.Contains(x.PalletizingID) && x.Status < Entity.TaskStatus.码垛抓取扫码);
+
+                                        //        if (isOut)
+                                        //        {
+                                        //            var error = new BaseErrorinfoWcs()
+                                        //            {
+                                        //                ContBarCode = bcrCode,
+                                        //                Message = $"入缓存扫码|5251,,{task.PalletizingID}的上一箱未全部经过抓取扫码,需要流出缓存行走上一箱的产品,因此此产品绕圈去,{DateTime.Now:yyyyMMddHH}",
+                                        //                Count = 1,
+                                        //                Memo = "WCS"
+                                        //            };
+                                        //            error.UpdataErrorinfo();
+                                        //            Circling(obj, task.ID, 5173, bcrCode);
+                                        //            return;
+                                        //        }
+                                        //    }
+                                        //}
                                     }
                                     //判断当前箱的
                                     var cache = caches.FirstOrDefault();
@@ -305,7 +329,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 
         public override bool Select(Device dev)
         {
-            return dev.Code == "5040";
+            return dev.Code == "5251";
         }
 
         public void Circling(Device<IBCR83, IStation525> obj, int taskNumber, short next, string bcrCode)

+ 1 - 0
业务工程/时效库/WCS.WorkEngineering/Systems/装箱码垛/机器人抓取.cs

@@ -38,6 +38,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Device<IRobot520, IRobot521, IRobot522> obj)
         {
+
             if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
             {
                 MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = obj.Entity.Code + "凭证号不一样,不允许做新的交互", Time = DateTime.Now }));

+ 5 - 4
业务工程/时效库/WCS.WorkEngineering/Systems/装箱码垛/码垛位.cs

@@ -1,5 +1,6 @@
 using Microsoft.Data.SqlClient.Server;
 using Newtonsoft.Json;
+using Org.BouncyCastle.Bcpg;
 using PlcSiemens.Core.Extension;
 using ServiceCenter.SqlSugars;
 using SqlSugar;
@@ -28,13 +29,13 @@ namespace WCS.WorkEngineering.Systems
          
 
         public override void Do(Device<IRobot530, IRobot531, IStation521> obj)
-        { 
+        {
+           
             if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
                 return;
-            if (obj.Entity.Code == "8092" && obj.Data.PalletID == 193705 && obj.Data.VoucherNo == 8389)
+            if (obj.Entity.Code == "8090" && obj.Data.PalletID == 485161 && obj.Data.VoucherNo == -32601 && obj.Data.Cmd != 0)
             {
-                
-                obj.Data.VoucherNo = 8388;
+                obj.Data.Cmd = 0;
             }
             if (obj.Data2.Rqst == RobotStationRqst.完成码垛)
             {

+ 33 - 6
业务工程/时效库/WCS.WorkEngineering/Systems/装箱码垛/码垛抓取扫码.cs

@@ -63,7 +63,23 @@ namespace WCS.WorkEngineering.Systems
                 return;
             }
             var addrTo = obj.Entity.GetFlag("码垛工位");
-            var addrPick = short.Parse(obj.Entity.Code) + 4;
+            var addrPick = 0;
+
+            switch (obj.Entity.Code) 
+            {
+                case "5126":
+                    addrPick = 5135;
+                        break;
+                case "5137":
+                    addrPick = 5146;
+                    break;
+                case "5149":
+                    addrPick = 5158;
+                    break;
+                case "5160":
+                    addrPick = 5169;
+                    break;
+            }
 
             var arr = Device.All.Where(v => v.HasProtocol<IStation521>())
                 .Where(v => v.HasFlag("装箱码垛") && v.HasFlag("Parent", addrPick.ToString()))
@@ -82,7 +98,18 @@ namespace WCS.WorkEngineering.Systems
                 {
                     World.Log("任务号有误");
                     MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code}未找到对应的码垛任务信息,请检查521任务号{obj.Data2.TaskNumber}是否正确", Time = DateTime.Now }));
-               
+                    obj.Data.TaskNumber = obj.Data2.TaskNumber;
+                    obj.Data.GoodsEnd = 5173;
+                    obj.Data.VoucherNo++;
+                    World.Log($"码垛抓取扫码{obj.Entity.Code}电控给的任务号和条码不匹配,自动去转圈:工字轮条码 {barcode}  | " + obj.Data2.TaskNumber +"|"+ DateTime.Now.ToString("yyyyMMddHHmmss"));
+                    var error = new BaseErrorinfoWcs()
+                    {
+                        ContBarCode = barcode,
+                        Message = $"电控给的任务号和条码不匹配,抓取扫码器{obj.Entity.Code},自动去绕圈,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
+                        Count = 1,
+                        Memo = "WCS"
+                    };
+                    error.UpdataErrorinfo();
                     return;
                 }
                 if (task.BarCode != barcode)
@@ -132,7 +159,7 @@ namespace WCS.WorkEngineering.Systems
                 }
                 if (task.AddrTo == "8090")
                 {
-                    if (obj.Entity.Code != "5131")
+                    if (obj.Entity.Code != "5126")
                     {
                         obj.Data.TaskNumber = int.Parse(obj.Entity.Code);
                         obj.Data.GoodsEnd = 5173;
@@ -144,7 +171,7 @@ namespace WCS.WorkEngineering.Systems
                 }
                 if (task.AddrTo == "8092")
                 {
-                    if (obj.Entity.Code != "5142")
+                    if (obj.Entity.Code != "5137")
                     {
                         obj.Data.TaskNumber = int.Parse(obj.Entity.Code);
                         obj.Data.GoodsEnd = 5173;
@@ -156,7 +183,7 @@ namespace WCS.WorkEngineering.Systems
                 }
                 if (task.AddrTo == "8096")
                 {
-                    if (obj.Entity.Code != "5154")
+                    if (obj.Entity.Code != "5149")
                     {
                         obj.Data.TaskNumber = int.Parse(obj.Entity.Code);
                         obj.Data.GoodsEnd = 5173;
@@ -168,7 +195,7 @@ namespace WCS.WorkEngineering.Systems
                 }
                 if (task.AddrTo == "8098")
                 {
-                    if (obj.Entity.Code != "5165")
+                    if (obj.Entity.Code != "5160")
                     {
                         obj.Data.TaskNumber = int.Parse(obj.Entity.Code);
                         obj.Data.GoodsEnd = 5173;

+ 17 - 3
业务工程/时效库/WCS.WorkEngineering/Systems/装箱码垛/码垛缓存放行.cs

@@ -67,7 +67,7 @@ namespace WCS.WorkEngineering.Systems
                     }
                 }
 
-                var devCodeList = Device.All.Where(x => x.Code is "5100" or "5086" or "5070" or "5056").Select(x => new Device<IStation521>(x, World)).Where(x => x.Data.Request == 1).Select(x => x.Entity.Code).ToList();
+                var devCodeList = Device.All.Where(x => x.Code is "5100" or "5086" or "5070" or "5056" or "5310" or "5295" or "5280" or "5265").Select(x => new Device<IStation521>(x, World)).Where(x => x.Data.Request == 1).Select(x => x.Entity.Code).ToList();
 
                 //检查当前线体缓存是不是当前箱中最少的
                 var addrNextGroup = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(x =>
@@ -95,8 +95,8 @@ namespace WCS.WorkEngineering.Systems
                 var devCodes = new List<string>() { obj.Entity.Code, (devCode - 1).ToString(), (devCode - 2).ToString() };
                 var devList = Device.All.Where(x => devCodes.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World));
                 devList = devList.Where(x => x.Data2.TaskNumber > 0).OrderByDescending(x => x.Entity.Code.ToShort());
-                var maxQ = 8;
-                if (addrTo == "8098") maxQ = 9;
+                var maxQ = 9;
+                //if (addrTo == "8098") maxQ = 9;
 
                 if (qty + devList.Count() <= maxQ)
                 {
@@ -105,6 +105,19 @@ namespace WCS.WorkEngineering.Systems
                         var number = maxQ - qty;
                         devList = devList.OrderByDescending(x => x.Entity.Code.ToShort()).Take(number).ToList();
                     }
+                    var taskidlist = devList.Select(p => p.Data2.TaskNumber).ToList();
+                    if (db.Default.Queryable<WCS_TaskInfo>().Where(v => taskidlist.Contains(v.ID) && v.Status > TaskStatus.码垛缓存扫码).Any())
+                    {
+                        MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));
+                        World.Log("码垛缓存放行:任务状态存在已经大于缓存扫码的任务:" + JsonConvert.SerializeObject(taskidlist));
+                        throw new Exception("任务状态存在已经大于缓存扫码的任务:" + JsonConvert.SerializeObject(taskidlist));
+                    }
+                    if (db.Default.Queryable<WCS_TaskInfo>().Where(v => taskidlist.Contains(v.ID) && v.AddrTo != addrTo).Any())
+                    {
+                        MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));
+                        World.Log("码垛缓存放行:码垛工位错误:" + JsonConvert.SerializeObject(taskidlist));
+                        throw new Exception("码垛工位错误:" + JsonConvert.SerializeObject(taskidlist));
+                    }
                     foreach (var device in devList)
                     {
                         var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == device.Data2.TaskNumber && v.Status == TaskStatus.码垛缓存扫码).First();
@@ -139,6 +152,7 @@ namespace WCS.WorkEngineering.Systems
                         device.Data.TaskNumber = task.ID;
                         device.Data.GoodsEnd = short.Parse(addrScan.Code);
                         MainWorld.Redis.Decr($"stockOperateNum{task.AddrTo}");
+                        World.Log("码垛缓存放行:" + device.Data.TaskNumber + "," + device.Data.GoodsEnd+",之前凭证号:"+ obj.Data.VoucherNo);
                     }
                     obj.Data.VoucherNo++;
                 }

+ 0 - 1
业务工程/时效库/WCS.WorkEngineering/WCS.WorkEngineering.csproj

@@ -51,7 +51,6 @@
     <Compile Remove="Worlds\SortingBranchWorld.cs" />
     <Compile Remove="Worlds\SortingMainLineWorld.cs" />
     <Compile Remove="Worlds\SortingPalletizingWorld.cs" />
-    <Compile Remove="Worlds\SrmWorld.cs" />
   </ItemGroup>
 
   <ItemGroup>

+ 15 - 9
业务工程/时效库/WCS.WorkEngineering/WorkStart.cs

@@ -202,14 +202,14 @@ namespace WCS.WorkEngineering
 
 
             Device.Find("5056").AddFlag("码垛工位", "8090").AddFlag("位置", "缓存");
-            Device.Find("5070").AddFlag("码垛工位", "8092").AddFlag("位置", "缓存");
-            Device.Find("5086").AddFlag("码垛工位", "8096").AddFlag("位置", "缓存");
-            Device.Find("5100").AddFlag("码垛工位", "8098").AddFlag("位置", "缓存");
+            Device.Find("5070").AddFlag("码垛工位", "8090").AddFlag("位置", "缓存");
+            Device.Find("5086").AddFlag("码垛工位", "8092").AddFlag("位置", "缓存");
+            Device.Find("5100").AddFlag("码垛工位", "8092").AddFlag("位置", "缓存");
 
             Device.Find("5310").AddFlag("码垛工位", "8096").AddFlag("位置", "缓存");
             Device.Find("5295").AddFlag("码垛工位", "8096").AddFlag("位置", "缓存");
-            Device.Find("5280").AddFlag("码垛工位", "8096").AddFlag("位置", "缓存");
-            Device.Find("5265").AddFlag("码垛工位", "8096").AddFlag("位置", "缓存");
+            Device.Find("5280").AddFlag("码垛工位", "8098").AddFlag("位置", "缓存");
+            Device.Find("5265").AddFlag("码垛工位", "8098").AddFlag("位置", "缓存");
 
             Device.Find("5135").AddFlag("码垛工位", "8090").AddFlag("位置", "抓取");
             "5213,5214,5215".Split(',').For((dev, i) =>
@@ -240,10 +240,16 @@ namespace WCS.WorkEngineering
             //Device.Find("5157").AddFlag("码垛工位", "8096").AddFlag("位置","扫码");
             //Device.Find("5168").AddFlag("码垛工位", "8098").AddFlag("位置","扫码");
             //码垛抓取扫码
-            Device.Find("5131").AddProtocol<IBCR81>(2794, 81, "10.30.39.220").AddFlag("码垛工位", "8090").AddFlag("位置", "扫码");
-            Device.Find("5142").AddProtocol<IBCR81>(3050, 81, "10.30.39.220").AddFlag("码垛工位", "8092").AddFlag("位置", "扫码");
-            Device.Find("5154").AddProtocol<IBCR81>(3306, 81, "10.30.39.220").AddFlag("码垛工位", "8096").AddFlag("位置", "扫码");
-            Device.Find("5165").AddProtocol<IBCR81>(3562, 81, "10.30.39.220").AddFlag("码垛工位", "8098").AddFlag("位置", "扫码");
+            //Device.Find("5131").AddProtocol<IBCR81>(2794, 81, "10.30.39.220").AddFlag("码垛工位", "8090").AddFlag("位置", "扫码");
+            //Device.Find("5142").AddProtocol<IBCR81>(3050, 81, "10.30.39.220").AddFlag("码垛工位", "8092").AddFlag("位置", "扫码");
+            //Device.Find("5154").AddProtocol<IBCR81>(3306, 81, "10.30.39.220").AddFlag("码垛工位", "8096").AddFlag("位置", "扫码");
+            //Device.Find("5165").AddProtocol<IBCR81>(3562, 81, "10.30.39.220").AddFlag("码垛工位", "8098").AddFlag("位置", "扫码");
+
+            //码垛抓取扫码
+            Device.Find("5126").AddProtocol<IBCR81>(2794, 81, "10.30.39.220").AddFlag("码垛工位", "8090").AddFlag("位置", "扫码");
+            Device.Find("5137").AddProtocol<IBCR81>(3050, 81, "10.30.39.220").AddFlag("码垛工位", "8092").AddFlag("位置", "扫码");
+            Device.Find("5149").AddProtocol<IBCR81>(3306, 81, "10.30.39.220").AddFlag("码垛工位", "8096").AddFlag("位置", "扫码");
+            Device.Find("5160").AddProtocol<IBCR81>(3562, 81, "10.30.39.220").AddFlag("码垛工位", "8098").AddFlag("位置", "扫码");
 
             #endregion 成品码垛
 

+ 19 - 2
业务工程/时效库/WCS.WorkEngineering/Worlds/SrmWorld.cs

@@ -1,17 +1,34 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using WCS.Core;
 
 namespace WCS.WorkEngineering.Worlds
 {
     /// <summary>
-    ///  堆垛机
+    /// 堆垛机
     /// </summary>
     [Description("堆垛机")]
-    public class SrmWorld:MainWorld
+    public class SRMWorld : WorldWithLog
     {
+        public SRMWorld()
+        {
+        }
+        protected override void AfterUpdate(List<WorkTimes> list)
+        {
+            base.AfterUpdate(list);
+            var wt = new WorkTimes();
+            wt.Key = "堆垛机保存文本日志";
+            var sw = new Stopwatch();
+            sw.Start();
+            SaveFileLog();
+            sw.Stop();
+            wt.Total = sw.ElapsedMilliseconds;
+            list.AddSafe(wt);
+        }
     }
 }