using DBHelper; using System; using System.Linq; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; using WCS.Service.Helpers; namespace WCS.Service.Works.Stations { [WorkTitle(typeof(ProductHandler), "成品车间", true)] public class 成品车间 : DeviceWork> { protected override void Do(Device dev) { if (!SystemConfigHelpers.GetDeviceConfig(dev.Entity.CODE)) throw new Exception($"已禁止[{dev.Entity.CODE}]入库,请联系机修确认"); if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) throw new Exception($"设备[{dev.Entity.CODE}]确认信号未清除,请检查PLC中上一个任务是否完成状态异常"); if (Ltc.Do(dev, v => !v.Data.REQUEST)) return; var bcr = dev.Entity.BCR(); var barcode = bcr.CONTENT.Trim('\r'); if (barcode == "") throw new Exception($"[{dev.Entity.CODE}]扫码失败"); var addr = barcode == "" ? 2161 : 2153; var next = dev.Entity.GetNext(addr.ToString()); if (next == null) throw new Exception($"缺少[{dev.Entity.CODE}]-[{addr}]路径信息,请检查路径配置"); //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(5000, "成品车间"))) // return; var workShop = dev.Entity.WorkShop(); var station = dev.Entity.CODE; short outTemp = 0, inTemp = 0; bool flag = false; Device[] arr = null; string trafficControl = ""; if (dev.Entity.CODE == "2143") { outTemp = 2326; inTemp = 2274; trafficControl = "2385-2374-2135-2137-2138-2326"; arr = Device.Find("2385", "2374", "2135", "2137", "2138", "2326").Select(v => v.Device()).ToArray(); } else if (dev.Entity.CODE == "2131") { outTemp = 2327; inTemp = 2273; trafficControl = "2366-2368-2123-2125-2126-2327"; arr = Device.Find("2366", "2368", "2123", "2125", "2126", "2327").Select(v => v.Device()).ToArray(); } else if (dev.Entity.CODE == "2122") { outTemp = 2328; inTemp = 2272; trafficControl = "2108-2114-2116-2117-2328"; arr = Device.Find("2108", "2114", "2116", "2117", "2328").Select(v => v.Device()).ToArray(); var rgv = Device.Find("RGV4").Device(); if (rgv.Data2.Trigger != 0) throw new Exception("RGV4任务触发中"); if (rgv.Data.DestPosition == 2114 && rgv.Data.SystemStatus != RGVRunStatus.空闲) { flag = true; } } if (arr.Any(v => v.Data2.CONFIRM)) throw new Exception($"设备集[{trafficControl}]存在确认信号,请检查是否为异常状况"); flag = arr.Where(v => v.Data.GOODSEND == outTemp).Any() || flag; var nextcode = next.Code(); if (flag) { nextcode = inTemp; } DB.Do(db => { var flag = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库).Where(v => v.Station == station) .Where(v => (v.Status == AGVTaskStatus.取放完成 && v.AGVStatus == AGVTaskStatus.请求_允许2) || v.Status == AGVTaskStatus.完成).Any(); if (!flag && !dev.Data.RES1) throw new Exception($"[{dev.Entity.CODE}]已扫码等待AGV交互完成"); var arr = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库 && v.Status == AGVTaskStatus.完成) .Where(v => v.Station == station).ToArray(); foreach (var t in arr) { t.Status = AGVTaskStatus.完成扫码; t.UpdateTime = DateTime.Now; } db.Default.SaveChanges(); var info = WMS.GetProductInfo(barcode, dev.Entity.CODE); if (workShop > 0 && workShop < 4) { addr = info.IsLeft == 1 ? 2161 : 2153; } var height = (short)(info.Height > 1.4m ? 2 : 1); var task = new WCS_TASK(); task.BARCODE = info.BarCode; task.TYPE = TaskType.组盘; task.STATUS = info.IsLeft == 1 ? WCS.Entity.TaskStatus.已完成 : WCS.Entity.TaskStatus.执行中; task.ADDRFROM = dev.Entity.CODE; task.ADDRTO = addr.ToString(); task.STARTTIME = DateTime.Now; task.PALLETTYPE = info.ChildContainerType; task.UPDATEUSER = "WCS"; task.UPDATETIME = DateTime.Now; task.PRODLINE = info.ProLine; task.FULLQTY = info.LoadCount; task.FLOOR = 2; task.HEIGHT = height; task.DOCID = info.DocId; //task.ADDRCURRENT = dev.Entity.CODE; task.ADDRNEXT = nextcode.ToString(); db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = nextcode; dev.Data2.CONFIRM = true; }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2143", "2131", "2122" }.Contains(dev.CODE); } } [WorkTitle(typeof(ProductHandler), "入库缓存", true)] public class 入库缓存 : DeviceWork> { protected override void Do(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) return; if (Ltc.Do(dev, v => v.Data.PH_STATUS == false)) return; short inTemp = 0, outTemp = 0; short addrTo = 0; Device[] arr = null; if (dev.Entity.CODE == "2274" || dev.Entity.CODE == "2141") { outTemp = 2326; inTemp = 2274; addrTo = 2143; arr = Device.Find("2385", "2374", "2135", "2137", "2138", "2326").Select(v => v.Device()).ToArray(); } else if (dev.Entity.CODE == "2273" || dev.Entity.CODE == "2129") { outTemp = 2327; inTemp = 2273; addrTo = 2131; arr = Device.Find("2366", "2368", "2123", "2125", "2126", "2327").Select(v => v.Device()).ToArray(); } else if (dev.Entity.CODE == "2272" || dev.Entity.CODE == "2120") { outTemp = 2328; inTemp = 2272; addrTo = 2122; arr = Device.Find("2108", "2114", "2116", "2117", "2328").Select(v => v.Device()).ToArray(); var rgv = Device.Find("RGV4").Device(); if (rgv.Data2.Trigger != 0) throw new Exception("RGV4任务触发中"); if (rgv.Data.DestPosition == 2114 && rgv.Data.SystemStatus != RGVRunStatus.空闲) throw new Exception("交通管制,RGV4正在出库"); } if (Ltc.Do(dev, v => v.Data.GOODSEND != inTemp)) return; var inTempDev = Device.Find(inTemp.ToString()).Device(); if (inTempDev.Data.TASKNUM < 10000) return; if (!inTempDev.Data.PH_STATUS) return; if (arr.Any(v => v.Data2.CONFIRM)) return; var toDev = Device.Find(addrTo.ToString()).Device(); if (toDev.Data.PH_STATUS) { if (toDev.Data.TASKNUM < 10000) return; if (toDev.Data.GOODSEND != toDev.Entity.Code()) return; } if (arr.Where(v => v.Data.GOODSEND == outTemp || v.Data.GOODSEND == addrTo).Any()) throw new Exception("交通管制"); var station = dev.Entity.CODE; DB.Do(db => { //var flag = db.Default.Set().Where(v => v.TYPE == TaskType.出库 && v.ADDRTO == addrTo) //.Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成) //.Where(v => v.ADDRNEXT == addrTo || v.ADDRNEXT == outTemp.ToString()).ToList() //.Where(v => v.AddrCurrent(db) != addrTo).Any(); //if (flag) // throw new Exception("交通管制"); var task = db.Default.Set().Find(dev.Data.TASKNUM); if (task == null) throw new Exception($"任务号{dev.Data.TASKNUM}不存在"); var next = Device.Find(addrTo.ToString()).GetNext(task.ADDRTO); task.ADDRNEXT = next.CODE; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = next.Code(); dev.Data2.CONFIRM = true; }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2274", "2141", "2273", "2129", "2272", "2120" }.Contains(dev.CODE); } } [WorkTitle(typeof(ProductHandler), "出口等待", true)] public class 出口等待 : DeviceWork> { protected override void Do(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) return; if (Ltc.Do(dev, v => v.Data.GOODSEND != dev.Entity.Code())) return; var station = dev.Entity.CODE; short addrto = 0; if (dev.Entity.CODE == "2326") { addrto = 2143; } else if (dev.Entity.CODE == "2327") { addrto = 2131; } else if (dev.Entity.CODE == "2328") { addrto = 2122; } DB.Do(db => { var flag = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库 && v.Status < AGVTaskStatus.完成扫码 && v.Status > AGVTaskStatus.新建) .Where(v => v.Station == addrto.ToString()).Any(); if (flag) { throw new Exception("交通管制,有正在执行的AGV入库任务"); } var task = db.Default.Set().Find(dev.Data.TASKNUM); if (task == null) throw new Exception($"任务号{dev.Data.TASKNUM}不存在"); task.ADDRNEXT = addrto.ToString(); task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = addrto; dev.Data2.CONFIRM = true; }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2326", "2327", "2328" }.Contains(dev.CODE); } } [WorkTitle(typeof(ProductHandler), "连廊等待", true)] public class 连廊等待 : DeviceWork> { protected override void Do(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) return; if (Ltc.Do(dev, v => v.Data.GOODSEND != dev.Entity.Code())) return; var station = dev.Entity.CODE; short addrto = 0, outTemp = 0; Device[] arr = null; if (dev.Entity.CODE == "2385") { addrto = 2143; outTemp = 2326; arr = Device.Find("2274", "2141", "2140", "2143", "2326", "2138", "2137", "2135").Select(v => v.Device()).ToArray(); } else if (dev.Entity.CODE == "2366") { addrto = 2131; outTemp = 2327; arr = Device.Find("2273", "2129", "2128", "2131", "2327", "2126", "2125", "2123").Select(v => v.Device()).ToArray(); } else if (dev.Entity.CODE == "2108") { addrto = 2122; outTemp = 2328; arr = Device.Find("2272", "2120", "2119", "2122", "2328", "2117", "2116", "2114").Select(v => v.Device()).ToArray(); if (arr.Where(v => v.Data.GOODSEND == 2359).Any()) throw new Exception("交通管制,提升机被入库任务占用"); } if (arr.Any(v => v.Data2.CONFIRM)) return; if (arr.Where(v => v.Data.GOODSEND == 2153).Any()) throw new Exception("交通管制,提升机被入库任务占用"); if (arr.Where(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0).Any()) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用"); DB.Do(db => { var task = db.Default.Set().Find(dev.Data.TASKNUM); if (task == null) throw new Exception($"任务号{dev.Data.TASKNUM}不存在"); task.ADDRNEXT = outTemp.ToString(); task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = outTemp; dev.Data2.CONFIRM = true; }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2385", "2366", "2108" }.Contains(dev.CODE); } } }