using System; using System.Collections.Generic; using System.Linq; using System.Threading; using HH.WCS.JingyuNongfu.util; using HH.WCS.JingyuNongfu.wms; using static HH.WCS.JingyuNongfu.util.Settings; namespace HH.WCS.JingyuNongfu.process { /// /// 瓶坯流程 /// internal class ProcessHelperPP { private static object _lockKkzy1 = new object(); // private static object _lockKkzy2 = new object(); private static object _lockMkzy = new object(); private static object _lockPGFDJ = new object(); private static object _lockPG = new object(); private static object _lockPPFDJSX = new object(); private static object _lockPPFDJXX = new object(); private static object _lockPPZSJSX = new object(); private static object _lockPPZSJXX = new object(); internal static void PpAuto() { //int a = 111; EmptyBagTransport(); FullLineTransportByWord(); FullBagTransportPGFDJ(); DdqTransport(); WjpTransport(); var list = Settings.Gettransport.ToList(); foreach (var item in list) { immobilizationLocTask(item.startloc, item.endloc); } } //---------------------------------20240619版本--------------------------------- /// /// 瓶盖翻斗机上满 /// /// /// internal static void PgEmpty1(WorkOrder workOrder, Location location) { lock (_lockPG) { try { Location start = null; int startLayer = 1; // var cntrCode = string.Empty; //var iron = false; zoneInfo startZone = new zoneInfo(); var bussType = ""; LogHelper.Info($"瓶盖翻斗机上满:当前工单产线:{workOrder.S_PLineNo}无可用货位"); if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "翻斗机即产满筐上线(瓶盖)"; if (workOrder.S_PLineNo.Contains("二期")) { bussType = "二期翻斗机即产满筐上线(瓶盖)"; if (workOrder.S_LinkLineNO.Contains("水盖")) { startZone = Settings.ppZones.Where(a => a.zoneType == 15 && a.deviceName == workOrder.S_PLineNo).FirstOrDefault(); } else { startZone = Settings.ppZones.Where(a => a.zoneType == 15 && a.deviceName == workOrder.S_LinkLineNO).FirstOrDefault(); } } else { startZone = Settings.ppZones.Where(a => a.zoneType == 0 && a.deviceName == workOrder.S_PLineNo).FirstOrDefault(); } } else { bussType = "翻斗机库存满筐上线(瓶盖)"; if (workOrder.S_PLineNo.Contains("二期")) { bussType = "二期翻斗机库存满筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 13 && a.deviceName == workOrder.S_PLineNo).FirstOrDefault(); } else { LogHelper.Info($"当前产线:{workOrder.S_PLineNo}没有非即产急用库区"); } } if (startZone != null) { LogHelper.Info($"瓶盖翻斗机上满:当前库区:{startZone},计算货位"); //计算开始货位 var StartLocList = LocationHelper.GetLocListAny(startZone.zone).OrderBy(a => a.N_ROW).ToList(); if (StartLocList.Count > 0) { start = FindStartcolByLoclistAndCol(StartLocList); } else { LogHelper.Info($"瓶盖翻斗机上满:根据库区{startZone.zone}找不到对应货位"); } //start = FindStartcolByLoclist(StartLocList); } else { LogHelper.Info($"瓶盖翻斗机上满:根据工单{workOrder.S_WorkNo}找不到对应库区"); } //二期即产即用库区无货位 找非即产即用库区 if (start == null && workOrder.S_PLineNo.Contains("二期") && workOrder.S_UsingNow.Trim() == "Y") { LogHelper.Info($"瓶盖翻斗机上满:当前库区:{startZone}无可用货位,二期即产急用,切换非即产即用库区"); bussType = "二期翻斗机库存满筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 13).FirstOrDefault(); if (startZone != null) { //计算开始货位 var StartLocList = LocationHelper.GetLocListAny(startZone.zone).OrderBy(a => a.N_ROW).ToList(); if (StartLocList.Count > 0) { start = FindStartcolByLoclistAndCol(StartLocList); } } } if (start != null) { var shelf1Info = LocationHelper.GetLocCntrRel(start.S_LOC_CODE); if (bussType == "二期翻斗机即产满筐上线(瓶盖)") { if (shelf1Info[0].Container.S_TYPE != "铁托盘") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone},托盘类型{shelf1Info[0].Container.S_TYPE},托盘类型不对,不生成任务"); return; } } else { if (shelf1Info[0].Container.S_TYPE != "塑料托盘") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone},托盘类型{shelf1Info[0].Container.S_TYPE},托盘类型不对,不生成任务"); return; } } if (shelf1Info.Count > 0) { if (start.N_CURRENT_NUM == 2) { startLayer = 2; } TaskProcess.CreateTransport(start.S_LOC_CODE, location.S_LOC_CODE, bussType, new List { shelf1Info[0].S_CNTR_CODE }, startLayer, 1, 1, 80); } } else { LogHelper.Info($"当前库区:{startZone}无可用货位"); } } catch (Exception ex) { Console.WriteLine("ZsjEmpty " + ex.Message); } } } /// /// 瓶坯翻斗机上满 /// /// /// internal static void PpFdjEmpty(WorkOrder workOrder, Location location) { lock (_lockPPFDJSX) { try { Location start = null; int startLayer = 1; //Location end = null; var cntrCode = string.Empty; //var iron = false; zoneInfo startZone; //zoneInfo EndZone; List locLists = null; var bussType = "瓶坯注塑机下满"; LogHelper.Info($"瓶坯翻斗机上满:当前工单产线:{workOrder.S_PLineNo}无可用货位"); if (workOrder.S_UsingNow.Trim() == "Y") { if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "二期翻斗机即产满筐上线(瓶胚)"; } else { bussType = "翻斗机即产满筐上线(瓶胚)"; } } else { if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "二期翻斗机库存满筐上线(瓶胚)"; } else { bussType = "翻斗机库存满筐上线(瓶胚)"; } } //即产即用和非即产即用流程一样 //找瓶坯线边满框缓存区 startZone = Settings.ppZones.Where(a => a.zoneType == 2 && a.deviceName == workOrder.S_PLineNo).FirstOrDefault(); if (!string.IsNullOrEmpty(startZone.zone)) { //根据货位编码获取货位信息 locLists = LocationHelper.GetLocListAny(startZone.zone).Where(a => a.N_CURRENT_NUM == 1).OrderBy(a => a.N_ROW).ToList(); } //找开始货位 if (locLists.Count > 0) { #region MyRegion //判断空框出库区同排有没有锁 //var rowsStart = locLists.Select(a => a.N_ROW).Distinct().ToList(); //for (int i = 0; i < rowsStart.Count; i++) //{ // var rowList = locLists.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); // if (rowList.Count(a => a.S_LOCK_STATE.Trim() != "无") == 0 && rowList.Count(a => a.N_CURRENT_NUM == 1) > 0) // { // Location other = null; // //当前排没有锁并且有空位置 // //找到最大的空位(先找满位,然后后面一位要么是空,要么不存在) // var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault(); // if (full != null) // { // other = full; // } // if (other != null) // { // if (start == null) // { // var time = LocationHelper.GetLocListAnybycode(start.S_LOC_CODE).FirstOrDefault(); // var t = int.Parse(Time); // if (DateTime.Now.Subtract(time.T_MODIFY).TotalSeconds > 60 * t) // { // start = other; // break; // } // } // } // } //} #endregion //计算开始货位 start = FindStartcolByTime(locLists); if (start != null) { //根据货位编码查货位容器表 var shelf1Info = LocationHelper.GetLocCntrRel(start.S_LOC_CODE); if (shelf1Info.Count > 0) { cntrCode = shelf1Info[0].S_CNTR_CODE; TaskProcess.CreateTransport(start.S_LOC_CODE, location.S_LOC_CODE, bussType, new List { cntrCode }, startLayer, 1, 1, 90); } else { LogHelper.Info($"根据货位{start.S_LOC_CODE}找不到货位容器表", "瓶坯"); } } } else { LogHelper.Info($"{workOrder.S_PLineNo}上满找不到满框区货位", "瓶坯"); } } catch (Exception ex) { Console.WriteLine("ZsjEmpty " + ex.Message); } } } /// /// 瓶盖注塑机上空 /// /// /// internal static void PgZsjEmpty(WorkOrder workOrder, Location location) { lock (_lockPG) { try { Location start = null; int startLayer = 1; // var cntrCode = string.Empty; //var iron = false; zoneInfo startZone = new zoneInfo(); var bussType = ""; LogHelper.Info($"瓶盖翻斗机上满:当前工单产线:{workOrder.S_PLineNo}无可用货位"); if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "二期注塑机即产空筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 16).FirstOrDefault(); } else { bussType = "二期注塑机库存空筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 17).FirstOrDefault(); } //计算开始货位 if (startZone != null) { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone},计算货位"); var StartLocList = LocationHelper.GetLocListAny(startZone.zone).OrderBy(a => a.N_ROW).ToList(); if (StartLocList.Count > 0) { start = FindStartcolByLoclistAndCol(StartLocList); } } else { LogHelper.Info($"瓶盖翻斗机上满:根据工单{workOrder.S_WorkNo}找不到对应库区"); } //start = FindStartcolByLoclist(StartLocList); //二期即产即用库区无货位 找非即产即用库区 if (start == null && workOrder.S_PLineNo.Contains("二期") && workOrder.S_UsingNow.Trim() == "Y") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone}无可用货位,二期即产急用,切换非即产即用库区"); bussType = "二期注塑机库存空筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 14).FirstOrDefault(); if (startZone != null) { //计算开始货位 var StartLocListqh = LocationHelper.GetLocListAny(startZone.zone).OrderBy(a => a.N_ROW).ToList(); if (StartLocListqh.Count > 0) { start = FindStartcolByLoclistAndCol(StartLocListqh); } } } if (start != null) { var shelf1Info = LocationHelper.GetLocCntrRel(start.S_LOC_CODE); if (bussType.Contains("二期")) { if (bussType == "二期注塑机即产空筐上线(瓶盖)") { if (shelf1Info[0].Container.S_TYPE != "铁托盘") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone},托盘类型{shelf1Info[0].Container.S_TYPE},托盘类型不对,不生成任务"); return; } } else { if (shelf1Info[0].Container.S_TYPE != "塑料托盘") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone},托盘类型{shelf1Info[0].Container.S_TYPE},托盘类型不对,不生成任务"); return; } } } if (shelf1Info.Count > 0) { TaskProcess.CreateTransport(start.S_LOC_CODE, location.S_LOC_CODE, bussType, new List { shelf1Info[0].S_CNTR_CODE }, startLayer, 1, 1, 80); } } else { LogHelper.Info($"当前库区:{startZone}无可用货位"); } } catch (Exception ex) { Console.WriteLine("ZsjEmpty " + ex.Message); } } } /// /// 瓶盖无菌坯上空 /// /// /// internal static void WjEmpty(WorkOrder workOrder, Location location) { lock (_lockPG) { try { Location start = null; int startLayer = 1; // var cntrCode = string.Empty; //var iron = false; zoneInfo startZone = new zoneInfo(); var bussType = ""; LogHelper.Info($"二期无菌上空:当前工单产线:{workOrder.S_PLineNo}无可用货位"); if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "二期无菌即产空筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 21).FirstOrDefault(); } else { bussType = "二期无菌库存空筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 14).FirstOrDefault(); } LogHelper.Info($"二期无菌上空:当前库区:{startZone},计算货位"); //计算开始货位 var StartLocList = LocationHelper.GetLocListAny(startZone.zone).OrderBy(a => a.N_ROW).ToList(); if (StartLocList.Count > 0) { start = FindStartcolByLoclistAndCol(StartLocList); } //start = FindStartcolByLoclist(StartLocList); if (start == null && workOrder.S_PLineNo.Contains("二期") && workOrder.S_UsingNow.Trim() == "Y") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone}无可用货位,二期即产急用,切换非即产即用库区"); bussType = "二期无菌库存空筐上线(瓶盖)"; startZone = Settings.ppZones.Where(a => a.zoneType == 14).FirstOrDefault(); if (startZone != null) { //计算开始货位 var StartLocListqh = LocationHelper.GetLocListAny(startZone.zone).OrderBy(a => a.N_ROW).ToList(); if (StartLocListqh.Count > 0) { start = FindStartcolByLoclistAndCol(StartLocListqh); } } } if (start != null) { var shelf1Info = LocationHelper.GetLocCntrRel(start.S_LOC_CODE); if (shelf1Info.Count > 0) { if (bussType == "二期无菌即产空筐上线(瓶盖)") { if (shelf1Info[0].Container.S_TYPE != "铁托盘") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone},托盘类型{shelf1Info[0].Container.S_TYPE},托盘类型不对,不生成任务"); return; } } else { if (shelf1Info[0].Container.S_TYPE != "塑料托盘") { LogHelper.Info($"瓶盖注塑机上空:当前库区:{startZone.zone},托盘类型{shelf1Info[0].Container.S_TYPE},托盘类型不对,不生成任务"); return; } } TaskProcess.CreateTransport(start.S_LOC_CODE, location.S_LOC_CODE, bussType, new List { shelf1Info[0].S_CNTR_CODE }, startLayer, 1, 1, 80); } } else { LogHelper.Info($"当前库区:{startZone}无可用货位"); } } catch (Exception ex) { Console.WriteLine("ZsjEmpty " + ex.Message); } } } /// /// 瓶盖注塑机下满 /// /// /// /// internal static void PgZsjFull(WorkOrder workOrder, Location location, LocCntrRel lcr) { try { Location end = null; var endLayer = 1; var bussType = "注塑机即产满筐下线(瓶盖)"; zoneInfo zone = new zoneInfo(); if (lcr.Container.S_TYPE == "铁托盘") { bussType = "注塑机即产满筐下线(瓶盖)"; zone = Settings.ppZones.Where(a => a.zoneType == 15 && a.deviceName == workOrder.S_LinkLineNO).FirstOrDefault(); } else { bussType = "注塑机库存满筐下线(瓶盖)"; zone = Settings.ppZones.Where(a => a.zoneType == 18 && a.deviceName == workOrder.S_PLineNo).FirstOrDefault(); } //找空框入库区 if (zone != null) { //按排进行排序,优先入库 低排低列 var list = LocationHelper.GetLocListAny(zone.zone).OrderBy(a => a.N_ROW).ToList(); end = FindEndcolByLocList(list); } else { LogHelper.Info($"瓶盖注塑机下满:根据工单{workOrder.S_WorkNo}找不到对应库区"); } if (end != null) { TaskProcess.CreateTransport(location.S_LOC_CODE, end.S_LOC_CODE, bussType, new List { lcr.S_CNTR_CODE }, 1, endLayer, 1, 80); } } catch (Exception ex) { Console.WriteLine("ZsjFull " + ex.Message); } } /// /// 瓶盖无菌坯下满 /// /// /// /// internal static void WjpFull(WorkOrder workOrder, Location location, LocCntrRel lcr) { try { Location end = null; var endLayer = 1; var bussType = "瓶盖无菌坯下满"; zoneInfo zone = new zoneInfo(); if (lcr.Container.S_TYPE == "铁托盘") { zone = Settings.ppZones.Where(a => a.zoneType == 19).FirstOrDefault(); } else { zone = Settings.ppZones.Where(a => a.zoneType == 18 && a.deviceName == workOrder.S_PLineNo).FirstOrDefault(); } //找空框入库区 if (zone != null) { //按排进行排序,优先入库 低排低列 var list = LocationHelper.GetLocListAny(zone.zone).OrderBy(a => a.N_ROW).ToList(); end = FindEndcolByLocList2(list); } if (end != null) { if (end.N_CURRENT_NUM == 1) { endLayer = 2; } TaskProcess.CreateTransport(location.S_LOC_CODE, end.S_LOC_CODE, bussType, new List { lcr.S_CNTR_CODE }, 1, endLayer, 1, 80); } } catch (Exception ex) { Console.WriteLine("ZsjFull " + ex.Message); } } /// /// 瓶坯注塑机上空 /// /// /// internal static void PpZsjEmpty(WorkOrder workOrder, Location location) { lock (_lockPPZSJSX) { try { Location start = null; int startLayer = 1;// Location end = null; var cntrCode = string.Empty; // var iron = false; //zoneInfo startZone; zoneInfo EndZone = new zoneInfo(); //List locLists = null; List locendLists = null; var bussType = "瓶坯注塑机上空"; if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "注塑即产空筐上线(瓶胚)"; } else { bussType = "注塑库存空筐上线(瓶胚)"; } //找空框套袋转运区 EndZone = Settings.ppZones.Where(a => a.zoneType == 11).FirstOrDefault(); locendLists = LocationHelper.GetLocListAny(EndZone.zone).Where(a => a.N_CURRENT_NUM == 1).OrderBy(a => a.N_ROW).ToList(); if (locendLists.Count <= 0) { //找瓶坯下空专用空框套袋区 EndZone = Settings.ppZones.Where(a => a.zoneType == 10).FirstOrDefault(); locendLists = LocationHelper.GetLocListAny(EndZone.zone).Where(a => a.N_CURRENT_NUM == 1).OrderBy(a => a.N_ROW).ToList(); } //找空框套袋货位 if (locendLists.Count > 0) { start = FindStartcolByTime(locendLists); } if (start != null) { var shelf1Info = LocationHelper.GetLocCntrRel(start.S_LOC_CODE); if (shelf1Info.Count <= 0) { Console.WriteLine($"根据{start.S_LOC_CODE}未找到空托盘,请检查货位容器表"); } else { //托盘绑定本来送去区域 var startCntr = LocationHelper.GetLocCntr(start.S_LOC_CODE).FirstOrDefault(); if (startCntr != null) { // ProcessHelper.SetTrayInfoFull1(workOrder, startCntr.Container, start.S_LOC_CODE, location.S_LOC_CODE); TaskProcess.CreateTransport(start.S_LOC_CODE, location.S_LOC_CODE, bussType, new List { shelf1Info[0].S_CNTR_CODE }, startLayer, 1, 1, 80); } else { LogHelper.Info($"根据货位编码{start.S_LOC_CODE},未找到托盘,请检查货位容器表", "任务"); } } } else { LogHelper.Info($"未找到空框套袋区货位", "任务"); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } } /// /// 瓶盖翻斗机下空 /// /// /// /// internal static void PgFdFull(WorkOrder workOrder, Location location, LocCntrRel lcr) { try { Location end = null; var endLayer = 1; var bussType = "翻斗机即产空筐下线(瓶盖)"; zoneInfo zone = new zoneInfo(); if (lcr.Container.S_TYPE == "铁托盘") { bussType = "翻斗机即产空筐下线(瓶盖)"; if (workOrder.S_PLineNo.Contains("二期")) { zone = Settings.ppZones.Where(a => a.zoneType == 16 && a.deviceName == workOrder.S_LinkLineNO).FirstOrDefault(); } } else { if (workOrder.S_PLineNo.Contains("二期")) { bussType = "翻斗机库存空筐下线(瓶盖)"; zone = Settings.ppZones.Where(a => a.zoneType == 14).FirstOrDefault(); } } //找空框入库区 if (zone != null) { //按排进行排序,优先入库 低排低列 var list = LocationHelper.GetLocListAny(zone.zone).OrderBy(a => a.N_ROW).ToList(); if (list.Count > 0) { end = FindEndcolByLocList(list); } else { LogHelper.Info($"翻斗机下空,根据库区编码{zone.zone}找不到对应货位+"); } } else { LogHelper.Info($"翻斗机下空,找不到对应库区"); } if (end != null) { TaskProcess.CreateTransport(location.S_LOC_CODE, end.S_LOC_CODE, bussType, new List { lcr.S_CNTR_CODE }, 1, endLayer, 1, 80); } } catch (Exception ex) { Console.WriteLine("ZsjFull " + ex.Message); } } /// /// 瓶坯翻斗机下空 /// /// /// /// internal static void PpFdFull(WorkOrder workOrder, Location location, LocCntrRel lcr) { lock (_lockPPFDJXX) { try { LogHelper.Info($"{workOrder.S_PLineNo}下线货位计算", "任务"); Location end = null; var endLayer = 1;// Location endtd = null; zoneInfo zone = null; zoneInfo EndZone = null; List list = null; List locendLists = null; LogHelper.Info($"瓶坯翻斗机下空:当前工单产线:{workOrder.S_PLineNo}"); var bussType = "瓶坯翻斗机下空入放置区"; //即产即用 if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "翻斗机即产空筐下线(瓶胚)"; } //非即产即用 else { bussType = "翻斗机库存空筐下线(瓶胚)"; } //找空框套袋区 if (workOrder.S_PLineNo.Contains("二期")) { EndZone = Settings.ppZones.Where(a => a.zoneType == 12).FirstOrDefault(); locendLists = LocationHelper.GetLocListAny(EndZone.zone).Where(a => a.N_CURRENT_NUM == 0).OrderBy(a => a.N_ROW).ToList(); list = LocationHelper.GetLocListAny(EndZone.zone).OrderBy(a => a.N_ROW).ToList(); end = FindEndcolByLocList(list); } else { EndZone = Settings.ppZones.Where(a => a.zoneType == 11).FirstOrDefault(); //计算线边是否有可下空货位 locendLists = LocationHelper.GetLocListAny(EndZone.zone).Where(a => a.N_CURRENT_NUM == 0).OrderBy(a => a.N_ROW).ToList(); list = LocationHelper.GetLocListAny(EndZone.zone).OrderBy(a => a.N_ROW).ToList(); end = FindEndcolByLocList(list); //空框套袋区无可下空货位 找空框入库区 if (end == null) { //找瓶坯下空专用空框套袋区 EndZone = Settings.ppZones.Where(a => a.zoneType == 6).FirstOrDefault(); locendLists = LocationHelper.GetLocListAny(EndZone.zone).Where(a => a.N_CURRENT_NUM == 0).OrderBy(a => a.N_ROW).ToList(); if (locendLists.Count > 0) { //根据终点库区找下线货位 list = LocationHelper.GetLocListAny(EndZone.zone).OrderBy(a => a.N_ROW).ToList(); if (list.Count > 0) { end = FindEndcolByLocList(list); } } } } if (end != null) { LogHelper.Info($"{workOrder.S_PLineNo}下线货位计算终点{end.S_LOC_CODE}", "任务"); TaskProcess.CreateTransport(location.S_LOC_CODE, end.S_LOC_CODE, bussType, new List { lcr.S_CNTR_CODE }, 1, endLayer, 1, 90); } else { LogHelper.Info($"{workOrder.S_PLineNo}下空无可用货位,请检查空框线边区和入库区", "任务"); } } catch (Exception ex) { Console.WriteLine("ZsjFull " + ex.Message); } } } /// /// 瓶坯注塑机下满 /// /// /// /// internal static void PpZsFull(WorkOrder workOrder, Location location, LocCntrRel lcr, int deviceNo) { lock (_lockPPZSJXX) { try { Location end = null; var endLayer = 1; zoneInfo zone = null; List list = null; var bussType = "瓶坯注塑机下满"; //即产即用 if (workOrder.S_UsingNow.Trim() == "Y") { bussType = "注塑即产满筐下线(瓶胚)"; zone = Settings.ppZones.Where(a => a.zoneType == 2 && a.deviceName == workOrder.S_LinkLineNO).FirstOrDefault(); //根据终点库区找下线货位 list = LocationHelper.GetLocListAny(zone.zone).OrderBy(a => a.N_ROW).ToList(); } //非即产即用 else { bussType = "注塑库存满筐下线(瓶胚)"; zone = Settings.ppZones.Where(a => a.zoneType == 7 && a.deviceName == workOrder.S_PLineNo).FirstOrDefault(); //根据终点库区找下线货位 list = LocationHelper.GetLocListAny(zone.zone).Where(a => a.N_ROW == deviceNo).ToList(); } //找终点入库区域 if (list.Count > 0) { end = FindEndcolByLocList(list); } else { LogHelper.Info($"{workOrder.S_PLineNo}找不到满框线边区", "瓶坯"); } //找转运货位 //var Zyzone = Settings.ppZones.Where(a => a.zoneType == 7).FirstOrDefault(); if (end != null) { //托盘绑定本来送去区域 //ProcessHelper.SetTrayInfoZone(lcr.Container, location.S_LOC_CODE, Zyzone.zone); TaskProcess.CreateTransport(location.S_LOC_CODE, end.S_LOC_CODE, bussType, new List { lcr.S_CNTR_CODE }, 1, endLayer, 1, 80); } else { LogHelper.Info($"{workOrder.S_PLineNo}容器找不到目的地,请检查满框入库区和瓶坯满框入库区", "瓶坯"); } } catch (Exception ex) { Console.WriteLine("ZsjFull " + ex.Message); } } } /// /// 找终点空货位 /// /// /// internal static Location FindEndcolByLocList(List locations) { try { var db = new SqlHelper().GetInstance(); Location end = null; //根据终点货位找空闲货位 var rows = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rows.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList(); if (rowList.Count(a => a.S_LOCK_STATE != "无") == 0 && rowList.Count(a => a.N_CURRENT_NUM == 0) > 0) { Location other = null; //当前排没有锁并且有空位置 //先找满位,然后后面一位要么是空,要么不存在 var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault(); if (full == null) { //没有满位,那就找最小的空位 other = rowList.OrderBy(a => a.N_COL).FirstOrDefault(); } else { other = rowList.OrderBy(a => a.N_COL).Where(a => a.N_COL > full.N_COL).FirstOrDefault(); } if (other != null && (!string.IsNullOrEmpty(other.C_ENABLE) && other.C_ENABLE == "禁用")) { //禁用了选择后面一个货位 other = db.Queryable().OrderBy(a => a.N_COL).Where(a => (string.IsNullOrEmpty(a.C_ENABLE) || a.C_ENABLE.Trim() != "禁用") && a.S_AREA_CODE == other.S_AREA_CODE && a.N_ROW == other.N_ROW && a.N_COL > other.N_COL).First(); //LogHelper.Info($"禁用选择后一个货位{result}", "成品"); } if (other != null) { end = other; break; } } } return end; } catch (Exception) { throw; } } /// /// 找终点空货位(两层货位) /// /// /// internal static Location FindEndcolByLocList2(List locations) { try { var db = new SqlHelper().GetInstance(); Location end = null; //根据终点货位找空闲货位 var rows = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rows.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList(); if (rowList.Count(a => a.S_LOCK_STATE != "无") == 0 && rowList.Count(a => a.N_CURRENT_NUM < 2) > 0) { Location other = null; //当前排没有锁并且有空位置 //找空货位 var full = rowList.OrderBy(a => a.N_COL).Where(a => a.N_CURRENT_NUM < 2).FirstOrDefault(); if (full != null) { other = full; } if (other != null) { end = other; break; } } } return end; } catch (Exception) { throw; } } /// /// 上线任务找起点满货位 计算套袋时间 /// /// /// internal static Location FindStartcolByLoclistAndTime(List locations) { try { Location start = new Location(); var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); //当前排没有锁并且有满货位 if (rowList.Count(a => a.S_LOCK_STATE.Trim() != "无") == 0 && rowList.Count(a => a.N_CURRENT_NUM == 1) > 0) { Location other = null; //找到最大的满位,如果有就直接出 var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM == 1).FirstOrDefault(); if (full != null) { other = full; } if (other != null) { var time = LocationHelper.GetLocListAnybycode(start.S_LOC_CODE).FirstOrDefault(); var t = int.Parse(Time); if (DateTime.Now.Subtract(time.T_MODIFY).TotalSeconds > 60 * t) { start = other; break; } } } } return start; } catch (Exception) { throw; } } /// /// 找起点满货位 /// /// /// internal static Location FindStartcolByLoclist(List locations) { try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); //当前排没有锁并且有满货位 if (rowList.Count(a => a.S_LOCK_STATE.Trim() != "无") == 0 && rowList.Count(a => a.N_CURRENT_NUM >= 1) > 0) { Location other = null; //找到最大的满位,如果有就直接出 var full = rowList.OrderByDescending(a => a.N_COL).Where(a => a.N_CURRENT_NUM >= 1).FirstOrDefault(); if (full != null) { other = full; } if (other != null) { start = other; break; } } } return start; } catch (Exception) { throw; } } /// /// 找货位修改时间最小的货位 /// /// /// internal static Location FindStartcolByTime(List locations) { try { Location start = null; start = locations.FindAll(a => a.N_CURRENT_NUM == 1 && a.S_LOCK_STATE.Trim() == "无").OrderBy(a => a.T_MODIFY).FirstOrDefault(); return start; } catch (Exception) { throw; } } /// /// 找起点满货位按列优化 /// /// /// internal static Location FindStartcolByLoclistAndCol(List locations) { try { Location start = null; var rowsStart = locations.Select(a => a.N_ROW).Distinct().ToList(); for (int i = 0; i < rowsStart.Count; i++) { var rowList = locations.Where(r => r.N_ROW == rowsStart[i]).ToList().OrderByDescending(a => a.N_COL); //当前排有锁并且没有货位,排除 if (rowList.Count(a => a.S_LOCK_STATE.Trim() != "无") > 0 || rowList.Count(a => a.N_CURRENT_NUM >= 1) == 0) { locations.RemoveAll(a => a.N_ROW == rowsStart[i]); } } start = locations.FindAll(a => a.N_CURRENT_NUM >= 1 && a.S_LOCK_STATE == "无").OrderByDescending(a => a.N_COL).FirstOrDefault(); return start; } catch (Exception) { throw; } } /// /// 空框转运 /// internal static void EmptyBagTransport() { //线边空框区自动转运 try { Monitor.Enter(_lockKkzy1); Location start = null; var XbshelfInfo = Settings.ppZones.Where(a => a.zoneType == 10).ToList(); if (XbshelfInfo != null) { foreach (var item in XbshelfInfo) { //找空框套袋位 var Kknone = LocationHelper.GetLocListAny(item.zone).OrderByDescending(b => b.N_ROW).ToList(); var Kzone = Settings.ppZones.Where(c => c.zoneType == 3).FirstOrDefault(); //找线边空框区 var shelfInfo = LocationHelper.GetLocListAny(Kzone.zone).FindAll(b => b.N_CURRENT_NUM == 1).OrderBy(b => b.N_ROW).ToList(); var suo = shelfInfo.FindAll(a => a.S_LOCK_STATE == "无"); //线边空框区数量为1全部被锁,找空框入库区 if (suo.Count <= 0) { Kzone = Settings.ppZones.Where(c => c.zoneType == 5).FirstOrDefault(); shelfInfo = LocationHelper.GetLocListAny(Kzone.zone).FindAll(b => b.N_CURRENT_NUM == 1).OrderBy(b => b.N_ROW).ToList(); } if (shelfInfo.Count > 0) { //计算起点货位 start = FindStartcolByLoclist(shelfInfo); if (start != null) { var list = LocationHelper.GetLocCntrItem(start.S_LOC_CODE); if (list.Count > 0) { Location end = null; //计算终点货位 end = FindEndcolByLocList(Kknone); if (end != null) { TaskProcess.CreateTransport(start.S_LOC_CODE, end.S_LOC_CODE, "空框套袋区转运", new List { list[0].S_CNTR_CODE }, 1, 1, 1, 80); } } } } } } Thread.Sleep(500); } catch (Exception ex) { throw ex; } finally { Monitor.Exit(_lockKkzy1); } } /// /// 满框线边区根据工单转运 /// internal static void FullLineTransportByWord() { //线边满框区自动转运 try { Monitor.Enter(_lockMkzy); //线边满框区有工单开始转运 var MkCkshelfInfo = Settings.ppZones.Where(a => a.zoneType == 8).ToList(); WorkOrder workOrder = null; //zoneInfo Xb = null; foreach (var item in MkCkshelfInfo) { workOrder = MESHelper.GetWorkOrderN(item.deviceName); if (workOrder != null) { var MkCkzone = Settings.ppZones.Where(c => c.zoneType == 8 && c.deviceName == workOrder.S_PLineNo).FirstOrDefault(); //找满框出库区 var shelfInfo = LocationHelper.GetLocListAny(MkCkzone.zone).OrderBy(b => b.N_ROW).ToList(); Location start = null; if (shelfInfo.Count > 0) { //计算起点货位 start = FindStartcolByLoclistAndCol(shelfInfo); //start = FindStartcolByLoclist(shelfInfo); if (start != null) { //根据起点货位招托盘 var list = LocationHelper.GetLocCntrItem(start.S_LOC_CODE); if (list.Count > 0) { var XbMkshelfInfo = Settings.ppZones.Where(a => a.zoneType == 2 && a.deviceName == workOrder.S_PLineNo).ToList().FirstOrDefault(); //找满框线边区 var Mknone = LocationHelper.GetLocListAny(XbMkshelfInfo.zone).OrderByDescending(b => b.N_ROW).ToList(); Location end = null; //计算终点货位 end = FindEndcolByLocList(Mknone); if (end != null) { //Console.WriteLine($"{end.S_AREA_CODE}满框线边区可以转运"); TaskProcess.CreateTransport(start.S_LOC_CODE, end.S_LOC_CODE, "瓶坯满框转运", new List { list[0].S_CNTR_CODE }, 1, 1, 1, 80); } } else { LogHelper.Info($"当前货位{start.S_LOC_CODE}找不到托盘,请检查货位容器表", "瓶坯"); } } } } } Thread.Sleep(500); } catch (Exception ex) { throw ex; } finally { Monitor.Exit(_lockMkzy); } } private static object _immobilization = new object(); /// /// 固定点对点任务创建 /// internal static void immobilizationLocTask(string startloc, string endloc) { Location end = null; var db = new SqlHelper().GetInstance(); try { lock (_immobilization) { var loc = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startloc).First(); if (loc != null) { if (loc.N_CURRENT_NUM > 0 && loc.S_LOCK_STATE == "无") { var endlist = LocationHelper.GetLocListAny(endloc).OrderByDescending(b => b.N_ROW).ToList(); //计算终点货位 end = FindEndcolByLocList(endlist); if (end != null) { //根据起点货位招托盘 var list = LocationHelper.GetLocCntrItem(loc.S_LOC_CODE); TaskProcess.CreateTransport(loc.S_LOC_CODE, end.S_LOC_CODE, "废料下线", new List { list[0].S_CNTR_CODE }, 1, 1, 1, 80); } else { LogHelper.Info($"immobilizationLocTask:终点库区:{endloc}无可用排"); } } else { // LogHelper.Info($"immobilizationLocTask:货位{loc.S_LOC_CODE}数量为0或者货位有锁"); } } else { LogHelper.Info($"immobilizationLocTask:根据货位:{startloc}找不货位表数据,请检查货位表"); } } } catch (Exception ex) { LogHelper.Info($"immobilizationLocTask Error:{ex.ToString()}"); } //线边满框区自动转运 } /// /// 瓶盖翻斗机退空框区转运 /// internal static void FullBagTransportPGFDJ() { try { Monitor.Enter(_lockPGFDJ); Location start = null; Location end = null; List EndInfo = new List(); List StartInfo = new List(); //找瓶盖翻斗机空框入库区 var XbshelfInfo = Settings.ppZones.Where(a => a.zoneType == 1).FirstOrDefault(); if (XbshelfInfo != null) { EndInfo = LocationHelper.GetLocListAny(XbshelfInfo.zone).OrderByDescending(b => b.N_ROW).ToList(); } //找瓶盖翻斗机退空框区 var Kzone = Settings.ppZones.Where(c => c.zoneType == 4).FirstOrDefault(); if (Kzone != null) { StartInfo = LocationHelper.GetLocListAny(Kzone.zone).FindAll(b => b.N_CURRENT_NUM == 1).OrderBy(b => b.N_ROW).ToList(); } if (StartInfo.Count > 0) { //计算起点货位 start = FindStartcolByLoclist(StartInfo); if (start != null) { //计算终点货位 end = FindEndcolByLocList(EndInfo); var list = LocationHelper.GetLocCntrItem(start.S_LOC_CODE); if (list.Count > 0) { if (end != null) { TaskProcess.CreateTransport(start.S_LOC_CODE, end.S_LOC_CODE, "瓶盖翻斗机退空框区转运", new List { list[0].S_CNTR_CODE }, 1, 1, 1, 80); } } } } else { LogHelper.Info($"根据起点库区{Kzone.zone}找不到对应货位,请检查货位表", "转运"); } Thread.Sleep(500); } catch (Exception ex) { throw ex; } finally { Monitor.Exit(_lockPGFDJ); } } private static object _lockDdq = new object(); /// /// 二期满框堆叠区转运 /// internal static void DdqTransport() { //二期堆叠区转运 try { Monitor.Enter(_lockDdq); Location start = null; var XbshelfInfo = Settings.ppZones.Where(a => a.zoneType == 19).ToList(); if (XbshelfInfo != null) { foreach (var item in XbshelfInfo) { //判断堆叠区数量 var shelfInfo = LocationHelper.GetLocListAny(item.zone).FindAll(b => b.N_CURRENT_NUM == 2).OrderBy(b => b.N_ROW).ToList(); if (shelfInfo.Count > 0) { var endarea = Settings.ppZones.Where(a => a.zoneType == 20).FirstOrDefault(); var endlocs = LocationHelper.GetLocListAny(endarea.zone).ToList(); //计算起点货位 start = FindStartcolByLoclist(shelfInfo); if (start != null) { var list = LocationHelper.GetLocCntrItem(start.S_LOC_CODE); if (list.Count > 0) { Location end = null; //计算终点货位 end = FindEndcolByLocList(endlocs); if (end != null) { TaskProcess.CreateTransport(start.S_LOC_CODE, end.S_LOC_CODE, "二期堆叠区搬运", new List { list[0].S_CNTR_CODE, list[1].S_CNTR_CODE }, 1, 1, 1, 80); } } } } } } Thread.Sleep(500); } catch (Exception ex) { throw ex; } finally { Monitor.Exit(_lockDdq); } } /// /// 二期无菌坯空框堆叠区转运 /// internal static void WjpTransport() { //二期堆叠区转运 try { // Monitor.Enter(_lockDdq); Location start = null; var XbshelfInfo = Settings.ppZones.Where(a => a.zoneType == 16 && a.deviceName.Contains("无菌")).ToList(); if (XbshelfInfo.Count > 0) { foreach (var item in XbshelfInfo) { //判断堆叠区数量 var shelfInfo = LocationHelper.GetLocListAny(item.zone).FindAll(b => b.N_CURRENT_NUM == 1).OrderBy(b => b.N_ROW).ToList(); if (shelfInfo.Count > 0) { var endarea = Settings.ppZones.Where(a => a.zoneType == 21).FirstOrDefault(); var endlocs = LocationHelper.GetLocListAny(endarea.zone).ToList(); //计算起点货位 start = FindStartcolByLoclist(shelfInfo); if (start != null) { var list = LocationHelper.GetLocCntrItem(start.S_LOC_CODE); if (list.Count > 0) { Location end = null; //计算终点货位 end = FindEndcolByLocList(endlocs); if (end != null) { TaskProcess.CreateTransport(start.S_LOC_CODE, end.S_LOC_CODE, "二期无菌空框搬运", new List { list[0].S_CNTR_CODE }, 1, 1, 1, 80); } } } } } } Thread.Sleep(500); } catch (Exception ex) { throw ex; } //finally //{ // Monitor.Exit(_lockKkzy1); //} } } }