using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using WCS.Data; using WCS.Data.Models; using WCS.Data.Utils; using WCS.PLC; namespace WCS.Workflow { public class ConvPlc02 : Base_Conv { #region 只读变量 private readonly string Conv_1200 = "1200"; private readonly string Conv_1204 = "1204"; private readonly string Conv_1460 = "1460"; private readonly string Conv_1099 = "1099"; private readonly string Conv_1105 = "1105"; private readonly string Conv_1102 = "1102"; private readonly string Conv_1104 = "1104"; private readonly string Conv_1035 = "1035"; private readonly string Conv_1036 = "1036"; private readonly string Conv_1051 = "1051"; private readonly string Conv_1056 = "1056"; private readonly string Conv_1172 = "1172"; private readonly string Conv_1173 = "1173"; private readonly string Conv_1178 = "1178"; private readonly string Conv_1177 = "1177"; private readonly string Conv_1044 = "1044"; private readonly string Conv_1071 = "1071"; private readonly string Conv_1072 = "1072"; private readonly string Conv_1085 = "1085"; private readonly string Conv_1070 = "1070"; private readonly string Conv_1285 = "1285"; private readonly string Conv_1286 = "1286"; private readonly string Conv_1179 = "1179"; private readonly string Conv_1199 = "1199"; private readonly string Conv_1196 = "1196"; private readonly string Conv_1504 = "1504"; private readonly string Conv_1107 = "1107"; private readonly string Conv_1110 = "1110"; private readonly string Conv_1109 = "1109"; private readonly string Conv_1114 = "1114"; private readonly string Conv_1115 = "1115"; private readonly string Conv_1112 = "1112"; private readonly string Conv_1518 = "1518"; private readonly string Conv_1092 = "1092"; private readonly string Conv_1094 = "1094"; private readonly string Conv_1097 = "1097"; private readonly string Conv_1098 = "1098"; private readonly string Conv_1185 = "1185"; private readonly string Conv_1221 = "1221"; private readonly string Conv_1246 = "1246"; private readonly string Conv_1233 = "1233"; private readonly string Conv_1234 = "1234"; private readonly string Conv_1251 = "1251"; private readonly string Conv_1257 = "1257"; private readonly string Conv_1252 = "1252"; private readonly string Conv_1258 = "1258"; private readonly string Conv_1261 = "1261"; private readonly string Conv_1278 = "1278"; private readonly string Conv_1283 = "1283"; private readonly string Conv_1288 = "1288"; private readonly string Conv_1293 = "1293"; private readonly string Conv_1273 = "1273"; private readonly string Conv_1260 = "1260"; private readonly string Conv_1193 = "1193"; private readonly string Conv_1182 = "1182"; private readonly string Conv_1226 = "1226"; private readonly string Conv_1231 = "1231"; #endregion; #region WMS 调用 private static int _WMSRun = 0; private void WMSRun() { if (Interlocked.Exchange(ref _WMSRun, 1) == 0) { try { ThreadHelper.TaskThread(Conv_Scanning_1185_WMS); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _WMSRun, 0); } } } #endregion; #region 重载实现 /// /// 调度PLC执行任务 /// public override void Run() { DateTime dt = DateTime.Now; //Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始WMSRun"); WMSRun(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始Conv_ScanBarCodeExeTask"); //扫码执行任务 Conv_ScanBarCodeExeTask(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConveyorWriteTaskExecute"); //输送线任务执行 ConveyorWriteTaskExecute(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvCacheOutTask_1172"); //1172缓存出库 ThreadHelper.TaskThread(ConvCacheOutTask_1072); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTask_6_7_1115"); ConvWriteTask_6_7(Conv_1115, Conv_1112, Conv_1114);//7# Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTask_6_7_1110"); ConvWriteTask_6_7(Conv_1110, Conv_1107, Conv_1109);//6# //电控无扫码执行任务 //Conv_NoScanExeTask(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始SrmOutConvExeTask"); //堆垛机出口任务执行 SrmOutConvExeTask(); //测试1117出口任务完成 //ConvTaskFinish_1117(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTaskExe_1204"); //输送机执行任务 ConvWriteTaskExe_1204(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTaskExe_1460"); //1460申请并且上传称重信息 ConvWriteTaskExe_1460(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTaskExe_1044_1071"); ConvWriteTaskExe_1044(Conv_1071); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTaskExe_1044_1072"); ConvWriteTaskExe_1044(Conv_1072); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTaskExe_1071"); ConvWriteTaskExe_1071(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvWriteTaskExe_1072"); ConvWriteTaskExe_1072(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始BindingTray"); BindingTray(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始CallEmptyOutTask"); //码盘机托盘组出库 ThreadHelper.TaskThread(CallEmptyOutTask); //写入尾箱信息 WriteLastBoxInfo(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConveyorTaskExecute"); //修改任务状态 ThreadHelper.TaskThread(ConveyorTaskExecute); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConvtaskFinish"); //出口任务完成 ConvTaskFinish(); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlc02开始ConveyorFinish_1199"); //1199手动出库任务完成 ThreadHelper.TaskThread(ConveyorFinish_1199); Log4netHelper.Logger_ProductLog.InfoFormat("ConvPlce02开始AgvRun"); //Agv信号对接 AgvRun(); DateTime dt2 = DateTime.Now; if (dt.AddSeconds(2) <= dt2) { Log4netHelper.Logger_ProductLog.InfoFormat(string.Format("开始时间[{0}]结束时间[{1}]", dt.ToString("yyyy-MM-dd hh:mm:ss ffff"), dt2.ToString("yyyy-MM-dd hh:mm:ss ffff"))); } Log4netHelper.Logger_ProductLog.InfoFormat("结束"); } #region 模块调用 /// /// 输送线无扫码执行任务 /// /// 扫码输送线 /// 扫码异常退出口 /// 目标地址是否当前输送线 /// PLC索引 private void Conv_NotScannExeTask(string convNo, string exitNo, bool endPosIsCurConv = false, int plcindex = 0) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) return; if (!cs.DB521_Request) return; var task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convNo && v.TASK_POSIDCUR == convNo && v.TASK_POSIDNEXT == convNo && v.TASK_WKSTATUS <= 1); if (task == null) { throw new Exception(string.Format("输送线[{0}]有请求未查询到任务信息", convNo)); } var converywrite = new WCSWriteToConveyorSignal(); converywrite.Plc = plc.PlcInstanceSet[plcindex];//plc.Plc; converywrite.DBName = plc.WriteDBName; converywrite.ConveyorNo = convNo; converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; converywrite.Tasknum = task.TASK_NO; converywrite.Goodscode = 0; converywrite.Goodstype = 0; converywrite.Goodssize = 0; converywrite.Goodsstart = Convert.ToInt32(convNo); converywrite.isClearPalletizingPos = true; if (endPosIsCurConv) { converywrite.Goodsend = converywrite.Goodsstart; } else { //if (task.TASK_POSIDTO == srm) //{ // ThreadHelper.TaskThread(BaseWorkflow.AssignSrm, task, 2000); // return; //} var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO); var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList(); if (routes.Count == 1) { converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS); } else { converywrite.Goodsend = ConveyorWriteTaskExecuteToMoreAddress(convNo, task, routes); } } WriteInfoToConv(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private static int _callEmptyOutTask = 0; /// /// 码盘机托盘组出库 /// private void CallEmptyOutTask() { if (Interlocked.Exchange(ref _callEmptyOutTask, 1) == 0) { try { Thread.Sleep(10000); if (!SugarBase.DB.Queryable().Any(v => v.TASK_POSIDTO == Conv_1185)) { var conv = ConveyorHelper.GetConveyorSignal(PlcName, Conv_1185); if (conv.CvDB51_PH_Status) return; if (conv.DB521_Tasknum > 0) return; if (conv.DB521_Notask) return; if (conv.DB521_BCR_Noread) return; if (conv.DB521_Request) return; if (conv.DB520_Confirm) return; var param = new GetOutTaskParam() { OutId = Guid.NewGuid().ToString(), OutEndPostion = Conv_1185, OutType = 2, WareHouseId = Current.Pvchouseputong }; BaseWorkflow.GetOutTask(param); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _callEmptyOutTask, 0); } } } /// /// 写入尾箱信息 /// private void WriteLastBoxInfo() { string convPosFrom = ""; try { var sysset = SugarBase.DB.Queryable().First(v => v.SET_TYPE == "PalletizingPos" && v.SET_VALUE == "1"); if (sysset == null) return; //var dt = Convert.ToDateTime(sysset.SET_EDITTIME); //if (dt.AddMinutes(20) > SugarBase.DB.GetDate()) return; convPosFrom = sysset.SET_ID; if (SugarBase.DB.Queryable().Any(v => v.TASK_POSIDTO == sysset.SET_ID && v.TASK_COMTYPE == 4)) { throw new Exception(string.Format("机械手码垛位置[{0}]存在切单信号但写入尾箱信息失败,原因:工位[{1}]存在未完成的任务。", sysset.SET_ID,sysset.SET_ID)); } var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == sysset.SET_ID); var cs = conveyor.EquSignal_Conv; if (cs.DB521_Request) { throw new Exception(string.Format("机械手码垛位置[{0}]写入尾箱信息失败,原因:存在请求,需要先处理请求信号。", sysset.SET_ID)); } if (cs.DB520_Confirm) { throw new Exception(string.Format("机械手码垛位置[{0}]写入尾箱信息失败,原因: 520存在确认信号Confirm值,请先处理。", sysset.SET_ID)); } if (!cs.CvDB51_PH_Status) { throw new Exception(string.Format("机械手码垛位置[{0}]写入尾箱信息失败,原因:没有光电信号。", sysset.SET_ID)); } if (cs.DB521_Tasknum <= 0) { throw new Exception(string.Format("机械手码垛位置[{0}]写入尾箱信息失败,原因:没有任务号。", sysset.SET_ID)); } if (cs.DB521_Goodsend != Convert.ToInt32(sysset.SET_ID)) { throw new Exception(string.Format("机械手码垛位置[{0}]写入尾箱信息失败,原因:该位置目标地址不等于当前输送线编号。", sysset.SET_ID)); } if (cs.DB520_Res01) { throw new Exception(string.Format("机械手码垛位置[{0}]写入尾箱信息失败,原因:DB520_Res01存在信号,不需要重复写入。", sysset.SET_ID)); } if (cs.DB521_Res02) { throw new Exception(string.Format("机械手码垛位置[{0}]写入尾箱信息失败,原因:DB521_Res02存在信号,不需要重复写入。", sysset.SET_ID)); } string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string result = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new WCS_SYSSET() { SET_VALUE = "0", SET_EDITTIME = date }) .Where(it => it.SET_ID == sysset.SET_ID) .ExecuteCommand(); if (WCS_PLCItem.Plc.WriteBits((ushort)WCS_PLCItem.WriteDBName, (uint)((cs.EquDbInfo_ReadWrite.DBReadIndox + 17) * 8 + 6), true)) { Log4netHelper.Logger_Info.InfoFormat(string.Format("机械手码垛位置[{0}]写入强制完成信号成功!", sysset.SET_ID)); } else { throw new Exception(string.Format("机械手码垛位置[{0}]写入强制完成信号失败!", sysset.SET_ID)); } }); if (!string.IsNullOrWhiteSpace(result)) throw new Exception(result); } catch (Exception ex) { BaseWorkflow.AddLedErrorMsg(convPosFrom, ex.Message, 0); LogMessageHelper.RecordLogMessage(ex); } } private void AgvRun() { //agv申请取货 AgvRequestOnMat(); //PLC允许取货 ConvEnableOnMat(); //agv取货完成 AgvFinishOnMat(); //PLC允许离开(取货完成) ConvEnableAgvLeave(); //agv申请放货 AgvRequestUpMat(); //PLC允许放货 ConvEnableUpMat(); //agv放货完成 AgvFinishUpMat(); //PLC允许离开(放货完成) ConvEnableAgvLeave_OnMat(); //Agv对接完成后输送线请求(6#) RequestByAgvConv(Conv_1107, Conv_1504); //Agv对接完成后输送线请求(7#) RequestByAgvConv(Conv_1112, Conv_1518); //Agv对接完成后输送线请求(4#,5#,18#) ConvRequestDeleteAgvSignal(); } private void ConvWriteTask_6_7(string convNo, string agvPosNo, string scanningNo) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; var converywrite = new WCSWriteToConveyorSignal(); converywrite.Plc = plc.Plc; converywrite.DBName = plc.WriteDBName; converywrite.ConveyorNo = convNo; converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; converywrite.Goodstype = 1; converywrite.Goodssize = 0;// converywrite.Goodsstart = Convert.ToInt32(convNo); var task = SugarBase.DB.Queryable().First(v => v.TASK_NO == cs.DB521_Tasknum && v.TASK_COMTYPE == 2); if (task == null) { converywrite.Tasknum = Convert.ToInt32(convNo); converywrite.Goodsend = Convert.ToInt32(scanningNo); //检测是否存在出库任务 //if (CheckIsExistOutTask(convNo)) return; //WriteInfoToConveyor(cs, converywrite, true); WriteInfoToCv(cs, converywrite, true); } else { //检测AGV对接工位是否为空 var agvconvNo = ConveyorHelper.GetConveyorSignal(PlcName, agvPosNo); if (agvconvNo.DB521_Tasknum > 0 || agvconvNo.CvDB51_PH_Status || agvconvNo.DB521_Request) { return; } converywrite.Goodstype = task.TASK_BOXBARCODE.Substring(0, 2) == "SH" ? 1 : 2; converywrite.Tasknum = task.TASK_NO; //var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO); //var route = routeSet.FirstOrDefault(v => v.ROUTE_STARTPOS == convNo); converywrite.Goodsend = Convert.ToInt32(agvPosNo); WriteInfoToConv(cs, converywrite); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void ConvTaskFinish() { ConveyorTaskFinish(PlcName, Conv_1185); ConveyorTaskFinish(PlcName, Conv_1285); ConveyorTaskFinish(PlcName, Conv_1286); ConveyorTaskFinish(PlcName, Conv_1288, true); ConveyorTaskFinish(PlcName, Conv_1293, true); //ConveyorTaskFinish(PlcName, Conv_1454); //ConveyorTaskFinish(PlcName, Conv_1199, false, true); //ConveyorTaskFinish(PlcName, "1198", false, true); } private static int _conveyorFinish_1199 = 0; /// /// 输送线任务完成 /// public void ConveyorFinish_1199() { if (Interlocked.Exchange(ref _conveyorFinish_1199, 1) == 0) { try { List list = new List(); list.Add("1196"); list.Add("1197"); list.Add("1198"); list.Add("1199"); var tasks = SugarBase.DB.Queryable().Where(v => v.TASK_POSIDNEXT == Conv_1196 || v.TASK_POSIDNEXT == Conv_1199).ToList(); tasks = tasks.Where(v => list.Contains(v.TASK_POSIDCUR)).ToList(); foreach (var item in tasks) { bool isupdate = false; int agvStatus = 0; if (item.TASK_POSIDTO.Contains("Pvc_18")) { if (Current.SysSets.FirstOrDefault(v => v.SET_ID == "Agv_18#").SET_VALUE == "1") { isupdate = true; agvStatus = 99; } else { int task_id = string.IsNullOrWhiteSpace(item.TASK_ITEM8) ? 0 : Convert.ToInt32(item.TASK_ITEM8); var agvtask = SugarBase.DB.Queryable().First(v => v.Task_Id == task_id); if (agvtask == null || (agvtask.Task_AgvStatus == 99 && agvtask.Task_WcsStatus == 4)) { isupdate = true; agvStatus = 0; } } } else { isupdate = true; agvStatus = 99; } if (isupdate) { string result = TryCachHelper.TryTranExecute((db) => { //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == item.TASK_NO) .ExecuteCommand(); int task_id = string.IsNullOrWhiteSpace(item.TASK_ITEM8) ? 0 : Convert.ToInt32(item.TASK_ITEM8); if (task_id > 0) { if (agvStatus > 0) { //标识agv任务Wcs完成状态 db.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 99, Task_AgvStatus = 99, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == task_id) .ExecuteCommand(); } else { if (db.Queryable().Any(v => v.Task_Id == task_id)) { //标识agv任务Wcs完成状态 db.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 99, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == task_id) .ExecuteCommand(); } } } }); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _conveyorFinish_1199, 0); } } } private void ConveyorWriteTaskExecute() { ConveyorWriteTaskExecute(Conv_1179); ConveyorWriteTaskExecute(Conv_1098); ConveyorWriteTaskExecute(Conv_1105); ConveyorWriteTaskExecute(Conv_1092);//4# ConveyorWriteTaskExecute(Conv_1099);//5# ConveyorWriteTaskExecute(Conv_1504);//6# ConveyorWriteTaskExecute(Conv_1518);//7# ConveyorWriteTaskExecute(Conv_1221); ConveyorWriteTaskExecute(Conv_1246); Conv_NotScannExeTask(Conv_1288, string.Empty, true); Conv_NotScannExeTask(Conv_1293, string.Empty, true); Conv_NotScannExeTask(Conv_1285, string.Empty, true); Conv_NotScannExeTask(Conv_1286, string.Empty, true); ConveyorWriteTaskExecute(Conv_1273); ConveyorWriteTaskExe(Conv_1226); ConveyorWriteTaskExe(Conv_1231); ConveyorWriteTaskExe(Conv_1234); ConveyorWriteTaskExe(Conv_1251); ConveyorWriteTaskExe(Conv_1257); ConveyorWriteTaskExe(Conv_1252); ConveyorWriteTaskExe(Conv_1258); ConveyorWriteTaskExe(Conv_1261); ConveyorWriteTaskExe(Conv_1278); ConveyorWriteTaskExe(Conv_1283); } private void SrmOutConvExeTask() { SrmOutConvExeTask(PlcName, Conv_1051); SrmOutConvExeTask(PlcName, Conv_1056); SrmOutConvExeTask(PlcName, Conv_1172, true); SrmOutConvExeTask(PlcName, Conv_1173, true); SrmOutConvExeTask(PlcName, Conv_1036, true); SrmOutConvExeTask(PlcName, Conv_1035, true); SrmOutConvExeTask(PlcName, Conv_1178, true); SrmOutConvExeTask(PlcName, Conv_1177, false); } /// /// 扫码执行任务 /// private void Conv_ScanBarCodeExeTask() { //4#入库申请 Conv_Scanning(Conv_1094, Conv_1097); //5#入库申请 Conv_Scanning_1102(); //18#入库申请 Conv_ScanningRequestIn(Conv_1200, Conv_1200); //6#入库申请 Conv_ScanningRequestIn(Conv_1109, Conv_1110); //7#入库申请 Conv_ScanningRequestIn(Conv_1114, Conv_1115); //拆盘机拆盘扫码请求 Conv_Scanning_1185_WCS(); } #endregion; #region 功能实现 private static int _convCacheOutTask_1072 = 0; private void ConvCacheOutTask_1072() { if (Interlocked.Exchange(ref _convCacheOutTask_1072, 1) == 0) { try { Thread.Sleep(60000); int conv1072_num = Current.TaskSet.Count(v => v.TASK_POSIDTO == Conv_1072); if (conv1072_num < 3) { var param = new GetOutTaskParam() { OutId = Guid.NewGuid().ToString(), OutEndPostion = Conv_1072, OutType = 2, WareHouseId = Current.Pvchouseputong }; BaseWorkflow.GetOutTask(param); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _convCacheOutTask_1072, 0); } } } public void ConveyorWriteTaskExe_WMS(string convNo) { try { var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo).EquSignal_Conv; if (equ_conv.DB523_Fault) return; if (!equ_conv.CvDB51_PH_Status) return; if (!equ_conv.DB521_Request) return; if (equ_conv.DB521_Tasknum <= 0) return; if (equ_conv.DB521_Res04_1 == 5)//码垛正常完成 { string barcode = SugarBase.DB.Queryable().First(v => v.SET_ID == convNo).SET_MEMO.Trim(); if (!Current.TaskSet.Any(v => v.TASK_BOXBARCODE == barcode)) { int contype = equ_conv.DB520_Res02 ? 2 : 1; var param = new GetInTaskParam(); param.ContainerBarCode = barcode; param.ContainerType = contype; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; param.EquipmentNo = convNo; param.EndPostion = srm; ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } public void ConveyorWriteTaskExe(string convNo) { try { var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo).EquSignal_Conv; if (equ_conv.DB523_Fault) return; if (!equ_conv.CvDB51_PH_Status) return; if (!equ_conv.DB521_Request) return; if (equ_conv.DB521_Tasknum <= 0) return; var task =SugarBase.DB.Queryable().First(v => v.TASK_NO == equ_conv.DB521_Tasknum); if (equ_conv.DB521_Res04_1 == 1)//请求码垛 { bool isHaveSonTray = true;//是否有子托盘 //var palletizingCodeSet = SugarBase.DB.Queryable().ToList(); //WCS_PalletizingCode palletizingCode = null; if (task == null || task.TASK_COMTYPE == 1 || task.TASK_WKSTATUS >= 99) { throw new Exception(string.Format("输送线[{0}]请求码垛未查询到任务[{1}],无法获取码垛清单信息", convNo, equ_conv.DB521_Tasknum)); } else { if (string.IsNullOrWhiteSpace(task.PalletizingSonTraySize)) { isHaveSonTray = false; } else { if (Convert.ToInt32(task.PalletizingSonTraySize) > 0) { isHaveSonTray = true; if (task.SonTrayColorNo.GetValueOrDefault() <= 0 || task.SonTrayColorNo.GetValueOrDefault() > 3) { throw new Exception(string.Format("输送线[{0}]任务[{1}]有子托盘但无子托盘颜色编号(1.蓝;2.白;3.绿),不能码垛。", convNo, task.TASK_NO)); } } else { isHaveSonTray = false; } } } // if (palletizingCode == null) return; if (task == null) return; var convwrite = new WCSWriteToConveyorSignal() { Plc = WCS_PLCItem.Plc, DBName = WCS_PLCItem.WriteDBName, ConveyorNo = convNo, WriteStartAddress = equ_conv.EquDbInfo_ReadWrite.DBReadIndox, Tasknum = task.TASK_NO, //Goodscode = palletizingCode.PalletizingBoxNo, //Goodstype = palletizingCode.PalletizingNo, //Goodssize = palletizingCode.PalletizingSonTrayNo, Goodscode = string.IsNullOrWhiteSpace(task.PalletizingBoxSize) ? 0 : Convert.ToInt32(task.PalletizingBoxSize), Goodstype = task.TASK_STACKINGTYPE, Goodssize = string.IsNullOrWhiteSpace(task.PalletizingSonTraySize) ? 0 : Convert.ToInt32(task.PalletizingSonTraySize), Goodsstart = Convert.ToInt32(convNo), Goodsend = Convert.ToInt32(convNo), Res02 = isHaveSonTray, TrayColor_One = task.SonTrayColorNo.GetValueOrDefault() == 1 ? true : false, TrayColor_Two = task.SonTrayColorNo.GetValueOrDefault() == 2 ? true : false, TrayColor_Three = task.SonTrayColorNo.GetValueOrDefault() == 3 ? true : false, Remark = convNo }; WriteInfoToConv(equ_conv, convwrite); } if (equ_conv.DB521_Res04_1 == 5 || equ_conv.DB521_Res04_1 == 4)//码垛正常完成 { if (SugarBase.DB.Queryable().Any(v => v.TASK_POSIDTO == convNo && (v.TASK_WKSTATUS == 99 || v.TASK_WKSTATUS == 109))) { throw new Exception(string.Format("工位[{0}]存在料箱未上报完成到WMS。", convNo)); } var cv_1401 = ConveyorHelper.GetConveyorSignal("conveyor03", "1401"); var cv_1416 = ConveyorHelper.GetConveyorSignal("conveyor03", "1416"); if ((cv_1401.DB521_Request && cv_1401.DB521_Goodsend.ToString() == convNo) || (cv_1416.DB521_Request && cv_1416.DB521_Goodsend.ToString() == convNo)) { throw new Exception(string.Format("码垛工位[{0}]存在未上报完成的料箱,不能生成入库任务。", convNo)); } string barcode = SugarBase.DB.Queryable().First(v => v.SET_ID == convNo).SET_MEMO.Trim(); var taskitem = SugarBase.DB.Queryable().Single(v => v.TASK_BOXBARCODE == barcode && v.TASK_POSIDFROM == convNo && v.TASK_WKSTATUS <= 1); if (taskitem == null) { Log4netHelper.Logger_Info.InfoFormat(string.Format("码垛位置[{0}]条码[{1}]获取到机械手传递的高度是否超过1.7[{2}]", convNo, barcode, equ_conv.DB521_Res01)); int contype = equ_conv.DB521_Res01 ? 2 : 1; var param = new GetInTaskParam() { ContainerBarCode = barcode, ContainerType = contype, MatBarCode = string.Empty, WareHouseId = Current.Pvchouseputong, EquipmentNo = convNo, EndPostion = "srm" }; task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param); } else { int goodsend = 0; var routeSet = EquRouteHelper.QueryRoute(convNo, taskitem.TASK_POSIDTO); var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList(); if (routes.Count() == 0) { throw new Exception(string.Format("输送线[{0}]任务[{1}]查询路由失败。", convNo, taskitem.TASK_NO)); } else { goodsend = Convert.ToInt32(routes.First().ROUTE_SONPOS); } if (goodsend == 0) return; if (convNo == Conv_1234) goodsend = 1235; else if (convNo == Conv_1261) goodsend = 1262; var convwrite = new WCSWriteToConveyorSignal() { Plc = WCS_PLCItem.Plc, DBName = WCS_PLCItem.WriteDBName, ConveyorNo = convNo, WriteStartAddress = equ_conv.EquDbInfo_ReadWrite.DBReadIndox, Tasknum = taskitem.TASK_NO, Goodsstart = Convert.ToInt32(convNo), isClearPalletizingPos = true, Goodsend = goodsend }; WriteInfoToConv(equ_conv, convwrite); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } //private static int _proLineWeigh = 0; //private void ProLineWeigh() //{ // if (Interlocked.Exchange(ref _proLineWeigh, 1) == 0) // { // try // { // int weight = 10000;//克 // string convNo = "1460"; // var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo).EquSignal_Conv; // //if (equ_conv.DB523_Fault) continue; // if (!equ_conv.CvDB51_PH_Status) return; // if (equ_conv.DB521_Res04 <= 2000) return; // if (equ_conv.DB521_Res04 < weight) // { // var msg = string.Format("输送机[{0}]处称重异常,当前重量[{1}]克,托盘预估重量[{2}]克以上。", convNo, equ_conv.DB521_Res04, weight); // LogMessageHelper.RecordLogMessage(msg); // return; // } // var tasks = SugarBase.DB.Queryable().Where(v => v.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回).ToList(); // var task = tasks.FirstOrDefault(v => v.TASK_POSIDCUR == convNo && // string.IsNullOrWhiteSpace(v.TASK_ITEM3) && // v.TASK_WKSTATUS < 99 && v.TASK_WKSTATUS != 7 && v.TASK_WKSTATUS != 4); // if (task == null) return; // var param = new GetWeightParam(); // param.WMSTaskNum = task.TASK_WMSNO; // param.Weight = equ_conv.DB521_Res04; // BaseWorkflow.GetWeight(param); // } // catch (Exception ex) // { // LogMessageHelper.RecordLogMessage(ex); // } // finally // { // Interlocked.Exchange(ref _proLineWeigh, 0); // } // } //} /// /// 涂布车间人工上料(18#,6#,7#) /// /// /// private void Conv_ScanningRequestIn(string convNo, string exitNo) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; if (cs.DB520_Confirm) return; if (convNo == Conv_1200 && cs.DB521_Goodstype == 0) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]外捡高度为零,WCS默认标识为1", convNo), true, LogLevelEnum.INFO.ToString()); } WCS_TASK task = QueryTaskByBarcode(cs, convNo); //if (task == null) //{ // if (CheckIsExistOutTask(convNo, cs.BarCodeStr)) // { // //查询异常任务 // task = SugarBase.DB.Queryable().First(v => v.TASK_BOXBARCODE == cs.BarCodeStr && v.TASK_COMTYPE == 6); // } //} if (task == null) { var param = new GetInTaskParam(); param.ContainerBarCode = cs.BarCodeStr; param.ContainerType = cs.DB521_Goodstype > 0 ? cs.DB521_Goodstype : 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; param.EquipmentNo = convNo; param.EndPostion = srm; //param.Memo3 = "1";//需要传递熟化类型,温度,时长 param.Memo2 = exitNo; task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param); } if (task == null) return; var converywrite = new WCSWriteToConveyorSignal(); converywrite.Plc = plc.Plc; converywrite.DBName = plc.WriteDBName; converywrite.ConveyorNo = convNo; converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; converywrite.Tasknum = task.TASK_NO; converywrite.Goodstype = 1; converywrite.Goodssize = 0;// converywrite.Goodsstart = Convert.ToInt32(convNo); //判断任务是否已经执行 if (task.TASK_WKSTATUS >= 2) return; if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回) { converywrite.Notask = true; converywrite.Goodsend = Convert.ToInt32(exitNo); } else { var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO); var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == convNo); converywrite.Goodsend = Convert.ToInt32(route.ROUTE_SONPOS); } //检测存在出库任务 //if (CheckIsExistOutTask(convNo, cs.BarCodeStr)) return; if (convNo == Conv_1200) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]任务[{1}]条码[{2}]外检高度[{3}](零值默认为1)。", convNo, task.TASK_NO, cs.BarCodeStr, cs.DB521_Goodstype), true, LogLevelEnum.INFO.ToString()); } WriteInfoToCv(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// Agv对接输送线请求删除与Agv对接信号 /// public void ConvRequestDeleteAgvSignal() { try { var list = new Dictionary(); list.Add("1097", "1094");//4# list.Add("1104", "1102");//5# list.Add("1199", ""); foreach (var item in list) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Key); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; if (!cs.DB521_Request) continue; //if (cs.CvDB51_PH_Status == false) continue; //if (cs.DB521_Tasknum == 0) continue; #region 检测AGV任务是否已经完成 if (cs.DB521_Tasknum > 10000) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == cs.DB521_Tasknum); if (task != null && (!string.IsNullOrWhiteSpace(task.TASK_ITEM8))) { var agvtask = SugarBase.DB.Queryable().Single(v => v.Task_Id == Convert.ToInt32(task.TASK_ITEM8)); if (agvtask != null && (agvtask.Task_WcsStatus != 4 && agvtask.Task_WcsStatus != 99 && agvtask.Task_WcsStatus != 106)) { throw new Exception(string.Format("输送线[{0}]收到清除AGV对接信号请求,任务[{1}]与AGV对接未完成,不能清除信号。", item.Key, cs.DB521_Tasknum)); } } } #endregion; var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = item.Key; convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; if (item.Key == Conv_1199) { convwrite.TaskDelete = true; } else { convwrite.Tasknum = Convert.ToInt32(item.Key); convwrite.Goodsstart = Convert.ToInt32(item.Key); convwrite.Goodsend = Convert.ToInt32(item.Value); if (cs.DB521_Goodstype == 2 || cs.CvDB51_PH_Status) { //检测是否存在出库任务 if (CheckIsExistOutTask(item.Key)) return; } } WriteInfoToConv(cs, convwrite, true); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 检测是否存在出库任务 /// private bool CheckIsExistOutTask(string convNo, string barcode = "") { bool result = false; if (convNo == Conv_1112)//7#AGV对接工位 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1518 || v.TASK_POSIDNEXT == Conv_1115 || v.TASK_POSIDNEXT == Conv_1112) && v.TASK_POSIDCUR != Conv_1115)) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]请求,存在出库任务,交通管制无法入库,请等待。", convNo)); result = true; } } else if (convNo == Conv_1107)//6#AGV对接工位 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1504 || v.TASK_POSIDNEXT == Conv_1110 || v.TASK_POSIDNEXT == Conv_1107) && v.TASK_POSIDCUR != Conv_1110)) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]请求,存在出库任务,交通管制无法入库,请等待。", convNo)); result = true; } } else if (convNo == Conv_1114)//7#扫描位置 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1518 || v.TASK_POSIDNEXT == Conv_1115 || v.TASK_POSIDNEXT == Conv_1112) && (v.TASK_POSIDCUR != Conv_1112))) { if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == barcode)) return false; //生成退回异常任务 string msg = string.Format("输送线[{0}]条码[{1}]无法入库,单通道存在出库任务。", convNo, barcode); LogMessageHelper.RecordLogMessage(msg); string errormsg = TryCachHelper.TryTranExecute((db) => { BaseWorkflow.AddLedErrorMsg(db, Conv_1114, msg, 0); //wms任务异常需要生成退回托盘任务 var wcstask = new WCS_TASK(); wcstask.TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"); wcstask.TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回; wcstask.TASK_SYSTYPE = "WCS"; wcstask.TASK_POSIDFROM = Conv_1114;//起点地址 wcstask.TASK_POSIDCUR = Conv_1114; wcstask.TASK_POSIDNEXT = Conv_1114; wcstask.TASK_POSIDMOVE = ""; wcstask.TASK_PRIORITY = 1; wcstask.TASK_WKSTATUS = 1; wcstask.TASK_WHID = "PVC原膜立库"; wcstask.TASK_ADDUSERNO = "WCS"; wcstask.TASK_ADDDATETIME = DateTime.Now; wcstask.TASK_EDITUSERNO = "WCS"; wcstask.TASK_EDITDATETIME = DateTime.Now; wcstask.TASK_NOTES = ""; wcstask.TASK_RGVNO = ""; wcstask.TASK_BOXBARCODE = barcode; wcstask.TASK_POSIDTO = Conv_1115; //wcstask.TASK_NOTES = errormsg; int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("条码[{0}]添加WCS任务失败", barcode)); } else { wcstask.TASK_NO = id; } CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(errormsg)) { throw new Exception(errormsg); } result = true; } } else if (convNo == Conv_1109)//6#扫描位置 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1504 || v.TASK_POSIDNEXT == Conv_1110 || v.TASK_POSIDNEXT == Conv_1107) && (v.TASK_POSIDCUR != Conv_1107))) { if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == barcode)) return false; //生成退回异常任务 string msg = string.Format("输送线[{0}]条码[{1}]无法入库,单通道存在出库任务。", convNo, barcode); LogMessageHelper.RecordLogMessage(msg); string errormsg = TryCachHelper.TryTranExecute((db) => { BaseWorkflow.AddLedErrorMsg(db, convNo, msg, 0); //wms任务异常需要生成退回托盘任务 var wcstask = new WCS_TASK(); wcstask.TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"); wcstask.TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回; wcstask.TASK_SYSTYPE = "WCS"; wcstask.TASK_POSIDFROM = convNo;//起点地址 wcstask.TASK_POSIDCUR = convNo; wcstask.TASK_POSIDNEXT = convNo; wcstask.TASK_POSIDMOVE = ""; wcstask.TASK_PRIORITY = 1; wcstask.TASK_WKSTATUS = 1; wcstask.TASK_WHID = "PVC原膜立库"; wcstask.TASK_ADDUSERNO = "WCS"; wcstask.TASK_ADDDATETIME = DateTime.Now; wcstask.TASK_EDITUSERNO = "WCS"; wcstask.TASK_EDITDATETIME = DateTime.Now; wcstask.TASK_NOTES = ""; wcstask.TASK_RGVNO = ""; wcstask.TASK_BOXBARCODE = barcode; wcstask.TASK_POSIDTO = Conv_1110; //wcstask.TASK_NOTES = errormsg; int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("条码[{0}]添加WCS任务失败", barcode)); } else { wcstask.TASK_NO = id; } CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(errormsg)) { throw new Exception(errormsg); } result = true; } } else if (convNo == Conv_1115)//7#人工上料位置 { var tasks_1115 = SugarBase.DB.Queryable().Where(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1518 || v.TASK_POSIDNEXT == Conv_1115 || v.TASK_POSIDNEXT == Conv_1112) && v.TASK_POSIDCUR != Conv_1112).ToList(); if (tasks_1115.Any(v => (v.TASK_POSIDCUR == Conv_1112 && v.TASK_BOXBARCODE.Contains("SH")) == false)) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]请求,存在出库任务,交通管制无法入库,请等待。", convNo)); result = true; } } else if (convNo == Conv_1110)//6#人工上料位置 { var tasks_1110 = SugarBase.DB.Queryable().Where(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1504 || v.TASK_POSIDNEXT == Conv_1110 || v.TASK_POSIDNEXT == Conv_1107) && (v.TASK_POSIDCUR != Conv_1109)).ToList(); if (tasks_1110.Any(v => (v.TASK_POSIDCUR == Conv_1107 && v.TASK_BOXBARCODE.Contains("SH")) == false)) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]请求,存在出库任务,交通管制无法入库,请等待。", convNo)); result = true; } } else if (convNo == Conv_1102)//5#扫描位置 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1099 || v.TASK_POSIDNEXT == Conv_1105) && v.TASK_POSIDCUR != Conv_1105)) { if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == barcode)) return false; //生成退回异常任务 string msg = string.Format("输送线[{0}]条码[{1}]无法入库,单通道存在出库任务。", convNo, barcode); LogMessageHelper.RecordLogMessage(msg); string errormsg = TryCachHelper.TryTranExecute((db) => { BaseWorkflow.AddLedErrorMsg(db, convNo, msg, 0); //wms任务异常需要生成退回托盘任务 var wcstask = new WCS_TASK(); wcstask.TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"); wcstask.TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回; wcstask.TASK_SYSTYPE = "WCS"; wcstask.TASK_POSIDFROM = convNo;//起点地址 wcstask.TASK_POSIDCUR = convNo; wcstask.TASK_POSIDNEXT = convNo; wcstask.TASK_POSIDMOVE = ""; wcstask.TASK_PRIORITY = 1; wcstask.TASK_WKSTATUS = 1; wcstask.TASK_WHID = "PVC原膜立库"; wcstask.TASK_ADDUSERNO = "WCS"; wcstask.TASK_ADDDATETIME = DateTime.Now; wcstask.TASK_EDITUSERNO = "WCS"; wcstask.TASK_EDITDATETIME = DateTime.Now; wcstask.TASK_NOTES = ""; wcstask.TASK_RGVNO = ""; wcstask.TASK_BOXBARCODE = barcode; wcstask.TASK_POSIDTO = Conv_1104; //wcstask.TASK_NOTES = errormsg; int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("条码[{0}]添加WCS任务失败", barcode)); } else { wcstask.TASK_NO = id; } CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(errormsg)) { throw new Exception(errormsg); } result = true; } } else if (convNo == Conv_1094)//4#扫描位置 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1092 || v.TASK_POSIDNEXT == Conv_1098) && v.TASK_POSIDCUR != Conv_1098)) { if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE == barcode)) return false; //生成退回异常任务 string msg = string.Format("输送线[{0}]条码[{1}]无法入库,单通道存在出库任务。", convNo, barcode); LogMessageHelper.RecordLogMessage(msg); string errormsg = TryCachHelper.TryTranExecute((db) => { BaseWorkflow.AddLedErrorMsg(db, convNo, msg, 0); //wms任务异常需要生成退回托盘任务 var wcstask = new WCS_TASK(); wcstask.TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"); wcstask.TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回; wcstask.TASK_SYSTYPE = "WCS"; wcstask.TASK_POSIDFROM = convNo;//起点地址 wcstask.TASK_POSIDCUR = convNo; wcstask.TASK_POSIDNEXT = convNo; wcstask.TASK_POSIDMOVE = ""; wcstask.TASK_PRIORITY = 1; wcstask.TASK_WKSTATUS = 1; wcstask.TASK_WHID = "PVC原膜立库"; wcstask.TASK_ADDUSERNO = "WCS"; wcstask.TASK_ADDDATETIME = DateTime.Now; wcstask.TASK_EDITUSERNO = "WCS"; wcstask.TASK_EDITDATETIME = DateTime.Now; wcstask.TASK_NOTES = ""; wcstask.TASK_RGVNO = ""; wcstask.TASK_BOXBARCODE = barcode; wcstask.TASK_POSIDTO = Conv_1097; //wcstask.TASK_NOTES = errormsg; int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("条码[{0}]添加WCS任务失败", barcode)); } else { wcstask.TASK_NO = id; } CommonData.AddWCS_TASK_DTL(db, wcstask.TASK_NO, wcstask.TASK_NO, wcstask.TASK_POSIDCUR, wcstask.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(errormsg)) { throw new Exception(errormsg); } result = true; } } else if (convNo == Conv_1097)//5#AGV对接位置 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1092 || v.TASK_POSIDNEXT == Conv_1098 || v.TASK_POSIDNEXT == Conv_1097) && v.TASK_POSIDCUR != Conv_1098 && v.TASK_POSIDCUR != Conv_1097)) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]请求,存在出库任务,交通管制无法入库,请等待。", convNo)); result = true; } } else if (convNo == Conv_1104)//5#AGV对接位置 { if (SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && (v.TASK_POSIDNEXT == Conv_1099 || v.TASK_POSIDNEXT == Conv_1105 || v.TASK_POSIDNEXT == Conv_1104) && v.TASK_POSIDCUR != Conv_1105 && v.TASK_POSIDCUR != Conv_1104)) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]请求,存在出库任务,交通管制无法入库,请等待。", convNo)); result = true; } } return result; } /// /// Agv对接输送线请求(6#,7#) /// private void RequestByAgvConv(string convNo, string endConPosNo) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) return; if (!cs.DB521_Request) return; if (cs.DB521_Tasknum == 0) return; #region 检测AGV任务是否已经完成 if (cs.DB521_Tasknum > 10000) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == cs.DB521_Tasknum); if (task != null && (!string.IsNullOrWhiteSpace(task.TASK_ITEM8))) { var agvtask = SugarBase.DB.Queryable().Single(v => v.Task_Id == Convert.ToInt32(task.TASK_ITEM8)); if (agvtask != null && (agvtask.Task_WcsStatus != 4 && agvtask.Task_WcsStatus != 99 && agvtask.Task_WcsStatus != 106)) { throw new Exception(string.Format("输送线[{0}]收到清除AGV对接信号请求,任务[{1}]与AGV对接未完成,不能清除信号。", convNo, cs.DB521_Tasknum)); } } } #endregion; bool isMatureTray = false;//是否是熟化架 string barcode = string.Empty; QueryInBarcode(cs.DB521_Tasknum, ref isMatureTray, ref barcode); var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = convNo; convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; if (isMatureTray) { //convwrite.TaskDelete = true; WriteInfoToConv(cs, convwrite, true); } else { var taskitem = SugarBase.DB.Queryable().First(v => v.TASK_BOXBARCODE == barcode && v.TASK_COMTYPE == 1); if (taskitem == null) { var param = new GetInTaskParam(); param.ContainerBarCode = barcode; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; var agvtask = SugarBase.DB.Queryable().First(v => v.Task_BreakTrayNo == barcode && v.Task_Type == 2);//退料任务 if (agvtask != null) { param.EquipmentNo = agvtask.Task_PosidFrom; param.Memo3 = agvtask.Task_BreakBarCode_1; param.Memo4 = agvtask.Task_BreakBarCode_2; } else { param.EquipmentNo = convNo; } param.EndPostion = srm; taskitem = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param); } if (taskitem != null && taskitem.TASK_COMTYPE == 1) { if (taskitem.TASK_POSIDNEXT == endConPosNo) return; //检测存在出库任务 //if (CheckIsExistOutTask(convNo)) return; convwrite.Tasknum = taskitem.TASK_NO; convwrite.Goodsstart = Convert.ToInt32(convNo); convwrite.Goodsend = Convert.ToInt32(endConPosNo); //WriteInfoToConv(cs, convwrite); WriteInfoToCv(cs, convwrite); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private static void QueryInBarcode(int tasknum, ref bool isMatureTray, ref string barcode) { var task = SugarBase.DB.Queryable().First(v => v.TASK_NO == tasknum); if (task == null) { var task_dis = SugarBase.DB.Queryable().First(v => v.TASK_NO == tasknum); if (task_dis != null) { isMatureTray = task_dis.TASK_BOXBARCODE.Substring(0, 2) == "SH" ? true : false; barcode = task_dis.TASK_BOXBARCODE; } } else { if (task.TASK_COMTYPE == 2) { //完成任务 string result = TryCachHelper.TryTranExecute((db) => { //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]完成", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } } isMatureTray = task.TASK_BOXBARCODE.Substring(0, 2) == "SH" ? true : false; barcode = task.TASK_BOXBARCODE; } } /// /// Agv申请取货 /// public void AgvRequestOnMat() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 4).ToList(); agvtasks = agvtasks.Where(v => Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 3) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidFrom); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; if (cs.CvDB51_PH_Status == false) continue; if (cs.DB521_Tasknum == 0) continue; if (cs.DB520_Res02) continue;//已写入申请取货 var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = item.Task_PosidFrom.Trim(); convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; convwrite.Res02 = true; if (convwrite.Plc.WriteBits((ushort)convwrite.DBName, (uint)((convwrite.WriteStartAddress + 17) * 8 + 7), true)) { Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]写入申请取货信号到输送线[{1}]成功!", convwrite.Tasknum, convwrite.ConveyorNo)); } else { throw new Exception(string.Format("agv任务[{0}]写入申请取货信号到输送线[{1}]失败!", item.Task_Id, convwrite.ConveyorNo)); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 输送线PLC允许取货 /// public void ConvEnableOnMat() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 4).ToList(); agvtasks = agvtasks.Where(v=> Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 3) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidFrom); if (conveyor == null) continue; var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; if (cs.CvDB51_PH_Status == false) continue; if (cs.DB521_Tasknum == 0) continue; if (cs.DB521_L_Outside) { int task_no = string.IsNullOrWhiteSpace(item.Task_Remark) ? 0 : Convert.ToInt32(item.Task_Remark); if (task_no == cs.DB521_Tasknum || task_no == 0) { //允许取货 SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 3, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); } else { string msg = string.Format("输送线WCS任务号[{0}]是上一个任务,AGV任务WCS任务号[{1}]是下一个任务,请等待上一个回库。", cs.DB521_Tasknum, task_no); throw new Exception(msg); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// Agv完成取货 /// public void AgvFinishOnMat() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 5 && (v.Task_WcsStatus == 4 || v.Task_WcsStatus == 3) && (v.Task_Type == 1 || v.Task_Type == 3)).ToList(); agvtasks = agvtasks.Where(v => Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 4) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidFrom.Trim()); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; if (cs.DB520_Res03 == 1) continue;//已写入取货完成 var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = item.Task_PosidFrom.Trim(); convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; convwrite.Res03 = 1; if (convwrite.Plc.WriteSignal((ushort)convwrite.DBName, (ushort)((convwrite.WriteStartAddress + 18)), 2, true)) { Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]写入取货完成信号到输送线[{1}]成功!", convwrite.Tasknum, convwrite.ConveyorNo)); } else { throw new Exception(string.Format("agv任务[{0}]写入取货完成信号到输送线[{1}]失败!", item.Task_Id, convwrite.ConveyorNo)); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// //输送线PLC允许Agv离开(取货完成) /// public void ConvEnableAgvLeave() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 5 && (v.Task_Type == 1 || v.Task_Type == 3)).ToList(); agvtasks = agvtasks.Where(v => Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 4) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidFrom.Trim()); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; if (cs.DB521_R_Outside) { //允许AGV离开 SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 4, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// Agv申请放货 /// public void AgvRequestUpMat() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 2).ToList(); agvtasks = agvtasks.Where(v => Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 2) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidTo); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; if (cs.DB520_RollerTurn) continue;//已写入申请放货 var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = item.Task_PosidFrom.Trim(); convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; convwrite.UpMatRequest = true; if (convwrite.Plc.WriteBits((ushort)convwrite.DBName, (uint)((convwrite.WriteStartAddress + 17) * 8 + 5), true)) { Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]写入申请放货信号到输送线[{1}]成功!", convwrite.Tasknum, convwrite.ConveyorNo)); } else { throw new Exception(string.Format("agv任务[{0}]写入申请放货信号到输送线[{1}]失败!", item.Task_Id, convwrite.ConveyorNo)); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 输送线PLC允许放货 /// public void ConvEnableUpMat() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 2).ToList(); agvtasks = agvtasks.Where(v => Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 2) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidTo.Trim()); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; bool isEnableUpMat = false; if (item.Task_WorkshopNo == "18") { if (cs.DB521_Res03) { isEnableUpMat = true; } } else { if (cs.DB521_Goodstype == 0 && cs.CvDB51_PH_Status == false && cs.DB521_Tasknum <= 0 && cs.DB521_F_Outside)//判断旋转台没有托盘和熟化架 { isEnableUpMat = true; } else if (cs.DB521_Goodstype == 2 && cs.CvDB51_PH_Status && cs.DB521_F_Outside)//判断旋转台有原膜托盘 { isEnableUpMat = true; } } if (isEnableUpMat) { //允许放货 SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 2, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// Agv完成放货 /// public void AgvFinishUpMat() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 3).ToList(); agvtasks = agvtasks.Where(v => Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 4) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidTo.Trim()); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; if (cs.DB520_Res01) continue;//已写入放货完成 var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = item.Task_PosidFrom.Trim(); convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; convwrite.Res01 = true; if (convwrite.Plc.WriteBits((ushort)convwrite.DBName, (uint)((convwrite.WriteStartAddress + 17) * 8 + 6), true)) { Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]写入放货完成信号到输送线[{1}]成功!", convwrite.Tasknum, convwrite.ConveyorNo)); } else { throw new Exception(string.Format("agv任务[{0}]写入放货完成信号到输送线[{1}]失败!", item.Task_Id, convwrite.ConveyorNo)); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// //输送线PLC允许Agv离开(放货完成) /// public void ConvEnableAgvLeave_OnMat() { try { var agvtasks = SugarBase.DB.Queryable().Where(v => v.Task_AgvStatus == 3).ToList(); agvtasks = agvtasks.Where(v => Current.SysSets.Any(t => t.SET_ID == v.Task_Workshop && t.SET_VALUE == "0")).ToList(); foreach (var item in agvtasks) { try { if (item.Task_WcsStatus == 4) continue; if (item.Task_WcsStatus == 106) continue; var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == item.Task_PosidTo.Trim()); var cs = conveyor.EquSignal_Conv; if (cs.DB523_Fault) continue; bool isEnableUpMat = false; if (item.Task_WorkshopNo == "18") { if (cs.DB521_Res04 != 0) { isEnableUpMat = true; } } else { if (cs.DB521_B_Outside) { isEnableUpMat = true; } } if (isEnableUpMat) { //允许AGV离开 SugarBase.DB.Updateable(it => new Middle_AGVTask() { Task_WcsStatus = 4, Task_UpdateUser = "wcs", Task_UpdateDate = DateTime.Now }) .Where(it => it.Task_Id == item.Task_Id) .ExecuteCommand(); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } public override int ConveyorWriteTaskExecuteToMoreAddress(string convNo, WCS_TASK task, List routes) { int result = 0; if (convNo == Conv_1105) { result = Convert.ToInt32(Conv_1099); } else if (convNo == Conv_1179) { if (convNo == Conv_1252 || convNo == Conv_1226 || convNo == Conv_1231 || convNo == Conv_1234 || convNo == Conv_1251 || convNo == Conv_1257 || convNo == Conv_1258 || convNo == Conv_1261 || convNo == Conv_1278 || convNo == Conv_1283 || convNo == Conv_1288 || convNo == Conv_1293) { //去机械码垛位置,指定到1182 result = Convert.ToInt32(Conv_1182); } else { result= Convert.ToInt32(Conv_1193); } } else { result = base.ConveyorWriteTaskExecuteToMoreAddress(convNo, task, routes); } return result; } public override void SetConvwrite(WCSWriteToConveyorSignal convwrite, WCS_TASK task) { if (convwrite.ConveyorNo == Conv_1099 || convwrite.ConveyorNo == Conv_1504 || convwrite.ConveyorNo == Conv_1518 || convwrite.ConveyorNo == Conv_1092 || convwrite.ConveyorNo == Conv_1105 || convwrite.ConveyorNo == Conv_1098) { convwrite.Goodstype = task.TASK_BOXBARCODE.Substring(0, 2) == "SH" ? 1 : 2; if (convwrite.ConveyorNo == Conv_1518)//7# { if (task.TASK_COMTYPE != 2) { throw new Exception(string.Format("输送线[{0}]有请求信号,但任务[{1}]不是出库任务。", convwrite.ConveyorNo, task.TASK_NO)); } //检测是否存在原膜托盘任务 if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE.Substring(0, 3) == "TPC" && (v.TASK_POSIDNEXT == Conv_1112 || v.TASK_POSIDNEXT == Conv_1115))) { convwrite.Goodsend = Convert.ToInt32(Conv_1115);//避障位 } else { //检测1112输送线是否存在任务或光电信息 if (Current.TaskSet.Any(v => v.TASK_POSIDFROM == Conv_1112 && v.TASK_POSIDCUR == Conv_1112)) { convwrite.Goodsend = Convert.ToInt32(Conv_1115);//避障位 } else { var cv = ConveyorHelper.GetConveyorSignal(PlcName, Conv_1112); if (cv.CvDB51_PH_Status && cv.DB521_Request || cv.DB521_Goodsend.ToString() == Conv_1518) { convwrite.Goodsend = Convert.ToInt32(Conv_1115);//避障位 } else { convwrite.Goodsend = Convert.ToInt32(Conv_1112); } //if (cv.DB521_Tasknum > 0 || cv.CvDB51_PH_Status || cv.DB521_Request || cv.DB521_Goodstype == 2) //{ // convwrite.Goodsend = Convert.ToInt32(Conv_1115); //} //else //{ // convwrite.Goodsend = Convert.ToInt32(Conv_1112); //} } } } else if (convwrite.ConveyorNo == Conv_1504)//6# { if (task.TASK_COMTYPE != 2) { throw new Exception(string.Format("输送线[{0}]有请求信号,但任务[{1}]不是出库任务。", convwrite.ConveyorNo, task.TASK_NO)); } //检测是否存在原膜托盘任务 if (Current.TaskSet.Any(v => v.TASK_BOXBARCODE.Substring(0, 3) == "TPC" && (v.TASK_POSIDNEXT == Conv_1107 || v.TASK_POSIDNEXT == Conv_1110))) { convwrite.Goodsend = Convert.ToInt32(Conv_1110);//避障位 } else { //检测1112输送线是否存在任务或光电信息 if (Current.TaskSet.Any(v => v.TASK_POSIDFROM == Conv_1107 && v.TASK_POSIDCUR == Conv_1107)) { convwrite.Goodsend = Convert.ToInt32(Conv_1110);//避障位 } else { var cv = ConveyorHelper.GetConveyorSignal(PlcName, Conv_1107); if (cv.CvDB51_PH_Status && cv.DB521_Request || cv.DB521_Goodsend.ToString() == Conv_1518) { convwrite.Goodsend = Convert.ToInt32(Conv_1110);//避障位 } else { convwrite.Goodsend = Convert.ToInt32(Conv_1107); } //if (cv.DB521_Tasknum > 0 || cv.CvDB51_PH_Status || cv.DB521_Request || cv.DB521_Goodstype == 2) //{ // convwrite.Goodsend = Convert.ToInt32(Conv_1115); //} //else //{ // convwrite.Goodsend = Convert.ToInt32(Conv_1112); //} } } } else if (convwrite.ConveyorNo == Conv_1105)//5#避障位 { var agvtask = SugarBase.DB.Queryable().First(v => v.Task_PosidTo == Conv_1104 && v.Task_WcsStatus > 0 && v.Task_Type != 2); if (agvtask != null) throw new Exception(string.Format("5#避障位不能出库,存在AGV入库任务[{0}]", agvtask.Task_Id)); } else if (convwrite.ConveyorNo == Conv_1098)//4#避障位 { var agvtask = SugarBase.DB.Queryable().First(v => v.Task_PosidTo == Conv_1097 && v.Task_WcsStatus > 0 && v.Task_Type != 2); if (agvtask != null) throw new Exception(string.Format("4#避障位不能出库,存在AGV入库任务[{0}]", agvtask.Task_Id)); } else if (convwrite.ConveyorNo == Conv_1099)//5#穿梭车下料点 { if (task.TASK_COMTYPE != 2) { throw new Exception(string.Format("输送线[{0}]有请求信号,但任务[{1}]不是出库任务。", convwrite.ConveyorNo, task.TASK_NO)); } } else if (convwrite.ConveyorNo == Conv_1092)//4#穿梭车下料点 { if (task.TASK_COMTYPE != 2) { throw new Exception(string.Format("输送线[{0}]有请求信号,但任务[{1}]不是出库任务。", convwrite.ConveyorNo, task.TASK_NO)); } } } } //public void ConveyorWriteTaskExecute(string convNo, string nextNo, bool endPosIsCurConv = false) //{ // try // { // var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo).EquSignal_Conv; // if (equ_conv.DB523_Fault) return; // if (!equ_conv.CvDB51_PH_Status) return; // if (!equ_conv.DB521_Request) return; // if (equ_conv.DB521_Tasknum <= 0) return; // var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == equ_conv.DB521_Tasknum); // if (task.TASK_POSIDNEXT != convNo) return; // if (task.TASK_WKSTATUS == 7 || task.TASK_WKSTATUS == 3 || task.TASK_WKSTATUS == 4) return; // if (equ_conv.DB521_H_Outside) // { // if (task.TASK_POSIDTO == srm) return; // } // var convwrite = new WCSWriteToConveyorSignal(); // convwrite.Plc = WCS_PLCItem.Plc; // convwrite.DBName = WCS_PLCItem.WriteDBName; // convwrite.ConveyorNo = convNo; // convwrite.WriteStartAddress = equ_conv.EquDbInfo_ReadWrite.DBReadIndox; // convwrite.Tasknum = task.TASK_NO; // convwrite.Goodscode = 0;//待定 // convwrite.Goodstype = 0; // convwrite.Goodssize = 0;//待定 // convwrite.Goodsstart = Convert.ToInt32(convNo); // if (endPosIsCurConv) // { // convwrite.Goodsend = convwrite.Goodsstart; // } // else // { // convwrite.Goodsend = Convert.ToInt32(nextNo); // } // WriteInfoToConveyor(equ_conv, convwrite); // } // catch (Exception ex) // { // LogMessageHelper.RecordLogMessage(ex); // } //} private void ConvWriteTaskExe_1071() { try { var convitem = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1071).EquSignal_Conv; if (convitem.DB521_Tasknum <= 0) return; if (!convitem.DB521_Request) return; //if (!convitem.CvDB51_PH_Status) return; var task = SugarBase.DB.Queryable().First(v => v.TASK_NO == convitem.DB521_Tasknum); if (string.IsNullOrWhiteSpace(task.TASK_ITEM1)) return; if (string.IsNullOrWhiteSpace(task.TASK_ITEM5)) return;//检查是否绑定了第一个原膜卷 string endAddress = string.Empty; if (Current.TaskSet.Any(v => v.TASK_ITEM1 == task.TASK_ITEM1 && v.TASK_NO != task.TASK_NO && v.TASK_POSIDNEXT != Conv_1070 && v.TASK_SRMNO == "srm01")) { //到1072 endAddress = Conv_1072; } else { endAddress = Conv_1085; } if (task.TASK_POSIDNEXT == endAddress) return; var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = Conv_1071; convwrite.WriteStartAddress = convitem.EquDbInfo_ReadWrite.DBReadIndox; convwrite.Tasknum = task.TASK_NO; convwrite.Goodscode = 0;//待定 convwrite.Goodstype = 0; convwrite.Goodssize = 0;//待定 convwrite.Goodsstart = Convert.ToInt32(Conv_1071); convwrite.Goodsend = Convert.ToInt32(endAddress); WriteInfoToConv(convitem, convwrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void ConvWriteTaskExe_1072() { ConveyorWriteTaskExecute(Conv_1072); } private static int _palletizingConvRequest = 0; /// /// 机器人码垛输送线托盘需求 /// private void Conv_Scanning_1185_WMS() { if (Interlocked.Exchange(ref _palletizingConvRequest, 1) == 0) { try { Thread.Sleep(3000); var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1185); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; if (cs.DB520_Confirm) return; if (cs.BarCodeStr.ToUpper().Contains("ERROR") || cs.BarCodeStr.ToUpper().Contains("N") || cs.BarCodeStr.Contains("?")) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", Conv_1185, cs.BarCodeStr)); } //条码未读出 if (cs.DB521_Res01) return; List list = new List() { Conv_1251, Conv_1261, Conv_1226, Conv_1234, Conv_1257, Conv_1252, Conv_1231, Conv_1258, Conv_1278, Conv_1283, Conv_1288, Conv_1293 }; foreach (var item in list) { if (SugarBase.DB.Queryable().Any(v => v.TASK_BOXBARCODE == cs.BarCodeStr)) break; var conv = ConveyorHelper.GetConveyorSignal(PlcName, item); if (conv.CvDB51_PH_Status) continue; if (conv.DB521_Tasknum > 0) continue; if (SugarBase.DB.Queryable().Any(v => v.TASK_POSIDTO == item && (v.TASK_COMTYPE == 2 || v.TASK_POSIDFROM == Conv_1185))) continue; if (item == Conv_1288 || item == Conv_1293) { if (SugarBase.DB.Queryable().Any(v => v.TASK_POSIDTO == item)) continue; var sysset = SugarBase.DB.Queryable().First(v => v.SET_ID == item); if (!string.IsNullOrWhiteSpace(sysset.SET_MEMO)) { LogMessageHelper.RecordLogMessage(string.Format("字母托盘码盘位置[{0}]电控无光电无任务号,但是配置项中存在托盘信息[{1}]", item, sysset.SET_MEMO)); continue; } //创建搬运任务 var task = new WCS_TASK() { TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"), TASK_COMTYPE = (int)ComTypeEnum.搬运, TASK_SYSTYPE = "WCS", TASK_POSIDFROM = Conv_1185,//起点地址 TASK_POSIDCUR = Conv_1185, TASK_POSIDNEXT = Conv_1185, TASK_POSIDMOVE = "", TASK_PRIORITY = 1, TASK_WKSTATUS = 1, TASK_WHID = "PVC普通立库", TASK_ADDUSERNO = "WCS", TASK_ADDDATETIME = DateTime.Now, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now, TASK_NOTES = "", TASK_RGVNO = "", TASK_BOXBARCODE = cs.BarCodeStr, TASK_POSIDTO = item }; int id = SugarBase.DB.Insertable(task).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("添加WCS搬运任务失败")); } else { break; } } else { var param = new GetOutTaskParam() { OutId = Guid.NewGuid().ToString(), OutEndPostion = item, OutType = 2, WareHouseId = Current.Pvchouseputong, Memo2 = cs.BarCodeStr }; //调用WMS接口生成出库任务 if (BaseWorkflow.WCS_GetOutTask(param)) break; } Thread.Sleep(2000); } if (!SugarBase.DB.Queryable().Any(v => v.TASK_BOXBARCODE == cs.BarCodeStr)) { var taskitem = SugarBase.DB.Queryable().First(v => v.TASK_POSIDFROM == Conv_1185 && v.TASK_WKSTATUS <= 1 && v.TASK_COMTYPE == 4 && (v.TASK_POSIDTO == Conv_1285 || v.TASK_POSIDTO == Conv_1286)); if (taskitem != null) { SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_BOXBARCODE = cs.BarCodeStr, TASK_EDITUSERNO = "wcs", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == taskitem.TASK_NO) .ExecuteCommand(); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _palletizingConvRequest, 0); } } } private void Conv_Scanning_1185_WCS() { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1185); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; if (cs.DB520_Confirm) return; WCS_TASK task = null; if (cs.DB521_Res01)//未扫码到条码 { task =SugarBase.DB.Queryable().Single(v => v.TASK_POSIDFROM == Conv_1185 && v.TASK_POSIDCUR == Conv_1185); if (task == null) { string errormsg = TryCachHelper.TryTranExecute((db) => { //创建异常任务 task = new WCS_TASK(); task.TASK_WMSNO = "wcs_" + DateTime.Now.ToString("yyyyMMddhhmmss"); task.TASK_COMTYPE = (int)ComTypeEnum.托盘异常退回; task.TASK_SYSTYPE = "WCS"; task.TASK_POSIDFROM = Conv_1185;//起点地址 task.TASK_POSIDCUR = Conv_1185; task.TASK_POSIDNEXT = Conv_1185; task.TASK_POSIDMOVE = ""; task.TASK_PRIORITY = 1; task.TASK_WKSTATUS = 1; task.TASK_WHID = "PVC普通立库"; task.TASK_ADDUSERNO = "WCS"; task.TASK_ADDDATETIME = DateTime.Now; task.TASK_EDITUSERNO = "WCS"; task.TASK_EDITDATETIME = DateTime.Now; task.TASK_NOTES = ""; task.TASK_RGVNO = ""; task.TASK_BOXBARCODE = "扫码异常"; task.TASK_POSIDTO = Conv_1199; int id = SugarBase.DB.Insertable(task).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("条码[扫码异常]添加WCS任务失败")); } else { task.TASK_NO = id; } string msg = string.Format("拆盘机位置[{0}]扫码未识别", Conv_1185); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(errormsg)) { throw new Exception(errormsg); } } } else { task = SugarBase.DB.Queryable().Single(v => v.TASK_BOXBARCODE == cs.BarCodeStr); } if (task == null || task.TASK_WKSTATUS > 1) return; var converywrite = new WCSWriteToConveyorSignal(); converywrite.Plc = plc.Plc; converywrite.DBName = plc.WriteDBName; converywrite.ConveyorNo = Conv_1185; converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; converywrite.Tasknum = task.TASK_NO; converywrite.Goodssize = 0;// converywrite.Goodsstart = Convert.ToInt32(Conv_1185); //var routeSet = EquRouteHelper.QueryRoute(Conv_1185, task.TASK_POSIDTO); //var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == Conv_1185); //if (task.TASK_COMTYPE == 6) //{ // converywrite.Goodsend = Convert.ToInt32(Conv_1193); //} //else //{ converywrite.Goodsend = Convert.ToInt32(Conv_1182); //} WriteInfoToConv(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void Conv_Scanning_1102() { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1102); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; if (cs.DB520_Confirm) return; var task = QueryTaskByBarcode(cs, Conv_1102); if (task == null) { var param = new GetInTaskParam(); param.ContainerBarCode = cs.BarCodeStr; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; var agvtask = SugarBase.DB.Queryable().First(v => v.Task_BreakTrayNo == cs.BarCodeStr && v.Task_Type == 2);//退料任务 if (agvtask != null) { param.EquipmentNo = agvtask.Task_PosidFrom; param.Memo3 = agvtask.Task_BreakBarCode_1; param.Memo4 = agvtask.Task_BreakBarCode_2; } else { param.EquipmentNo = Conv_1102; } param.EndPostion = srm; param.Memo2 = Conv_1104; task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param); } else if (task.TASK_COMTYPE == 2 && task.TASK_POSIDNEXT == Conv_1104 && task.TASK_WKSTATUS < 99) { //完成任务 string result = TryCachHelper.TryTranExecute((db) => { //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]完成", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } } if (task == null || (task.TASK_COMTYPE != 1 && task.TASK_COMTYPE != 6)) return; var converywrite = new WCSWriteToConveyorSignal(); converywrite.Plc = plc.Plc; converywrite.DBName = plc.WriteDBName; converywrite.ConveyorNo = Conv_1102; converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; //判断任务是否已经执行 if (task.TASK_WKSTATUS == 2 || task.TASK_WKSTATUS == 99 || task.TASK_WKSTATUS == 109 || task.TASK_WKSTATUS == 106) return; converywrite.Tasknum = task.TASK_NO; //converywrite.Goodstype = task.TASK_BOXBARCODE.Substring(0,2)== "SH" ? 1 : 2; converywrite.Goodssize = 0;// converywrite.Goodsstart = Convert.ToInt32(Conv_1102); if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回) { converywrite.Notask = true; converywrite.Goodsend = Convert.ToInt32(Conv_1104); } else { //bool isany = SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && v.TASK_POSIDTO == Conv_1104 && (v.TASK_POSIDNEXT == Conv_1099 || v.TASK_POSIDNEXT == Conv_1104 || v.TASK_POSIDNEXT == Conv_1105)); //if (isany) //{ // //二楼有托盘出库,入库托盘送到中转位置1105 // converywrite.Goodsend = Convert.ToInt32(Conv_1105); //} //else //{ // //二楼没有出库托盘,入库目标地址位1099; // var routeSet = EquRouteHelper.QueryRoute(Conv_1102, task.TASK_POSIDTO); // var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == Conv_1102); // converywrite.Goodsend = Convert.ToInt32(route.ROUTE_SONPOS); //} var routeSet = EquRouteHelper.QueryRoute(Conv_1102, task.TASK_POSIDTO); var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == Conv_1102); converywrite.Goodsend = Convert.ToInt32(route.ROUTE_SONPOS); } //检测存在出库任务 //if (CheckIsExistOutTask(Conv_1102, cs.BarCodeStr)) return; //WriteInfoToConv(cs, converywrite); WriteInfoToCv(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void Conv_Scanning(string convNo,string ExceptionNo) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; if (cs.DB520_Confirm) return; var task = QueryTaskByBarcode(cs, convNo); if (task == null) { var param = new GetInTaskParam(); param.ContainerBarCode = cs.BarCodeStr; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; var agvtask =SugarBase.DB.Queryable().Single(v => v.Task_BreakTrayNo == cs.BarCodeStr && v.Task_Type == 2);//退料任务 if (agvtask != null) { param.EquipmentNo = agvtask.Task_PosidFrom; param.Memo3 = agvtask.Task_BreakBarCode_1; param.Memo4 = agvtask.Task_BreakBarCode_2; } else { param.EquipmentNo = convNo; } param.EndPostion = srm; param.Memo2 = ExceptionNo; task = ThreadHelper.TaskThread(BaseWorkflow.GetWcsInTask, param); } else if (task.TASK_COMTYPE == 2 && task.TASK_POSIDNEXT == ExceptionNo && task.TASK_WKSTATUS < 99) { //完成任务 string result = TryCachHelper.TryTranExecute((db) => { //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]完成", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } } if (task == null || (task.TASK_COMTYPE != 1 && task.TASK_COMTYPE != 6)) return; var converywrite = new WCSWriteToConveyorSignal(); converywrite.Plc = plc.Plc; converywrite.DBName = plc.WriteDBName; converywrite.ConveyorNo = convNo; converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; //判断任务是否已经执行 if (task.TASK_WKSTATUS == 2 || task.TASK_WKSTATUS == 99 || task.TASK_WKSTATUS == 109 || task.TASK_WKSTATUS == 106) return; converywrite.Tasknum = task.TASK_NO; //converywrite.Goodstype = task.TASK_BOXBARCODE.Substring(0,2)== "SH" ? 1 : 2; converywrite.Goodssize = 0;// converywrite.Goodsstart = Convert.ToInt32(convNo); if (task.TASK_COMTYPE == (int)ComTypeEnum.托盘异常退回) { converywrite.Notask = true; converywrite.Goodsend = Convert.ToInt32(ExceptionNo); } else { //bool isany = SugarBase.DB.Queryable().Any(v => v.TASK_COMTYPE == 2 && v.TASK_POSIDTO == Conv_1104 && (v.TASK_POSIDNEXT == Conv_1099 || v.TASK_POSIDNEXT == Conv_1104 || v.TASK_POSIDNEXT == Conv_1105)); //if (isany) //{ // //二楼有托盘出库,入库托盘送到中转位置1105 // converywrite.Goodsend = Convert.ToInt32(Conv_1105); //} //else //{ // //二楼没有出库托盘,入库目标地址位1099; // var routeSet = EquRouteHelper.QueryRoute(Conv_1102, task.TASK_POSIDTO); // var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == Conv_1102); // converywrite.Goodsend = Convert.ToInt32(route.ROUTE_SONPOS); //} //var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO); //var route = routeSet.SingleOrDefault(v => v.ROUTE_STARTPOS == convNo); converywrite.Goodsend = Convert.ToInt32(Conv_1092); } //检测存在出库任务 //if (CheckIsExistOutTask(convNo, cs.BarCodeStr)) return; //WriteInfoToConv(cs, converywrite); WriteInfoToCv(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 二坐标写入抓取原膜卷组盘任务 /// private void ConvWriteTaskExe_1044(string convNo) { try { var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1044).EquSignal_Conv; if (equ_conv.DB523_Fault) return; if (!equ_conv.DB521_Request) return; if (equ_conv.DB521_Res04 != 1) return;//二坐标机械手完成信号 var convitem = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo).EquSignal_Conv; if (convitem.DB521_Tasknum <= 0) return; //if (!convitem.CvDB51_PH_Status) return; var task = SugarBase.DB.Queryable().First(v => v.TASK_NO == convitem.DB521_Tasknum); if (task == null || task.TASK_POSIDNEXT != convNo) return; if (convNo == Conv_1071) { if (!string.IsNullOrWhiteSpace(task.TASK_ITEM5)) return; } else if (convNo == Conv_1072) { if (!string.IsNullOrWhiteSpace(task.TASK_ITEM6)) return; } string first = string.IsNullOrWhiteSpace(task.TASK_ITEM5) ? string.Empty : task.TASK_ITEM5.Trim(); string second = string.IsNullOrWhiteSpace(task.TASK_ITEM6) ? string.Empty : task.TASK_ITEM6.Trim(); var conv1035 = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1035).EquSignal_Conv; var conv1036 = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1036).EquSignal_Conv; var taskitem_1035 = SugarBase.DB.Queryable().First(v => v.TASK_NO == conv1035.DB521_Tasknum); var taskitem_1036 = SugarBase.DB.Queryable().First(v => v.TASK_NO == conv1036.DB521_Tasknum); string startAddress = string.Empty; string endAddress = string.Empty; int task_no; if (string.IsNullOrWhiteSpace(first)) { //写入二坐标目标地址1071任务 if (taskitem_1035 != null) { startAddress = "1035"; task_no = taskitem_1035.TASK_NO; //endAddress = "1071"; } else if (taskitem_1036 != null) { startAddress = "1036"; task_no = taskitem_1036.TASK_NO; //endAddress = "1071"; } else { return; } } else if (string.IsNullOrWhiteSpace(second)) { //写入二坐标目标地址1072任务 if (taskitem_1035 != null && taskitem_1035.TASK_ITEM1 == task.TASK_ITEM1) { startAddress = "1035"; task_no = taskitem_1035.TASK_NO; //endAddress = "1071"; } else if (taskitem_1036 != null && taskitem_1036.TASK_ITEM1 == task.TASK_ITEM1) { startAddress = "1036"; task_no = taskitem_1036.TASK_NO; //endAddress = "1071"; } else { return; } } else { return; } if (taskitem_1036 != null && taskitem_1036.TASK_POSIDNEXT == Conv_1070) return; if (taskitem_1035 != null && taskitem_1035.TASK_POSIDNEXT == Conv_1070) return; var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = Conv_1044; convwrite.WriteStartAddress = equ_conv.EquDbInfo_ReadWrite.DBReadIndox; convwrite.Tasknum = task_no; convwrite.Goodscode = 0;//待定 convwrite.Goodstype = 0; convwrite.Goodssize = 0;//待定 convwrite.Goodsstart = Convert.ToInt32(startAddress); convwrite.Goodsend = Convert.ToInt32(Conv_1070); if (SugarBase.DB.Queryable().Any(v => v.TASK_POSIDNEXT == Conv_1070 && v.TASK_WKSTATUS < 99)) { throw new Exception(string.Format("二坐标[{0}]存在未完成的任务,任务[{1}]未能下发给二坐标。", Conv_1044, task_no)); } WriteInfoToConveyor(equ_conv, convwrite); //WriteInfoToConv(equ_conv, convwrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 卷绑定托盘 /// private void BindingTray() { try { var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1044).EquSignal_Conv; if (equ_conv.DB523_Fault) return; if (!equ_conv.DB521_Request) return; if (equ_conv.DB521_Res04 != 1) return; if (equ_conv.DB521_Goodscode <= 0) return; var task = SugarBase.DB.Queryable().First(v => v.TASK_NO == equ_conv.DB521_Goodscode && v.TASK_WKSTATUS < 99); if (task == null) return; var convitem_1071 = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1071).EquSignal_Conv; //if (task.TASK_POSIDNEXT == Conv_1071) //{ var task1071 = SugarBase.DB.Queryable().Single(v => v.TASK_NO == convitem_1071.DB521_Tasknum); if (task1071 != null && string.IsNullOrWhiteSpace(task1071.TASK_ITEM5)) { //卷绑定托盘任务,完成任务 string result = TryCachHelper.TryTranExecute((db) => { //卷绑定托盘任务 db.Updateable(it => new WCS_TASK() { TASK_POSIDTO = task.TASK_POSIDTO, TASK_ITEM1 = task.TASK_ITEM1, TASK_ITEM5 = task.TASK_BOXBARCODE, TASK_ITEM8 = task.TASK_ITEM8, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task1071.TASK_NO) .ExecuteCommand(); //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]完成", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } } //} var convitem_1072 = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1072).EquSignal_Conv; //if (task.TASK_POSIDNEXT == Conv_1072) //{ var task1072 = SugarBase.DB.Queryable().Single(v => v.TASK_NO == convitem_1072.DB521_Tasknum); if (task1072 != null && string.IsNullOrWhiteSpace(task1072.TASK_ITEM6)) { //卷绑定托盘任务,完成任务 string result = TryCachHelper.TryTranExecute((db) => { //卷绑定托盘任务 db.Updateable(it => new WCS_TASK() { TASK_ITEM6 = task.TASK_BOXBARCODE, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task1072.TASK_NO) .ExecuteCommand(); //修改任务的状态 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 99, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加修改明细 string msg = string.Format("任务[{0}]完成", task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDTO, msg); }); } //} } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } public virtual void ConvWriteTaskExe_1204() { try { var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1204).EquSignal_Conv; if (equ_conv.DB523_Fault) return; if (!equ_conv.CvDB51_PH_Status) return; if (!equ_conv.DB521_Request) return; if (equ_conv.DB521_Tasknum <= 0) return; var task = SugarBase.DB.Queryable().First(v => v.TASK_NO == equ_conv.DB521_Tasknum); if (task.TASK_POSIDNEXT != Conv_1204) return; if (task.TASK_WKSTATUS != 9) return; var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = Conv_1204; convwrite.WriteStartAddress = equ_conv.EquDbInfo_ReadWrite.DBReadIndox; convwrite.Tasknum = task.TASK_NO; convwrite.Goodscode = 0;//待定 convwrite.Goodstype = 0; convwrite.Goodssize = 0;//待定 convwrite.Goodsstart = Convert.ToInt32(Conv_1204); //string item2 = string.IsNullOrWhiteSpace(task.TASK_ITEM2) ? string.Empty : task.TASK_ITEM2.Trim(); convwrite.UpMatRequest = task.TASK_IsWrapFilm; var routeSet = EquRouteHelper.QueryRoute(Conv_1204, task.TASK_POSIDTO); var routes = routeSet.Where(v => v.ROUTE_STARTPOS == Conv_1204).ToList(); if (routes.Count == 1) { convwrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS); } else { convwrite.Goodsend = ConveyorWriteTaskExecuteToMoreAddress(Conv_1204, task, routes); } WriteInfoToConv(equ_conv, convwrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } public virtual void ConvWriteTaskExe_1460() { try { var equ_conv = WCS_PLCItem.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_1460).EquSignal_Conv; if (equ_conv.DB523_Fault) return; if (!equ_conv.CvDB51_PH_Status) return; if (!equ_conv.DB521_Request) return; if (equ_conv.DB521_Tasknum <= 0) return; var task =SugarBase.DB.Queryable().First(v => v.TASK_NO == equ_conv.DB521_Tasknum); if (task.TASK_POSIDNEXT != Conv_1460) return; if (task.TASK_POSIDNEXT == "14600") return; //if (task.TASK_WKSTATUS != 2) return; var convwrite = new WCSWriteToConveyorSignal(); convwrite.Plc = WCS_PLCItem.Plc; convwrite.DBName = WCS_PLCItem.WriteDBName; convwrite.ConveyorNo = Conv_1460; convwrite.WriteStartAddress = equ_conv.EquDbInfo_ReadWrite.DBReadIndox; convwrite.Tasknum = task.TASK_NO; convwrite.Goodscode = 0;//待定 convwrite.Goodstype = 0; convwrite.Goodssize = 0;//待定 convwrite.Goodsstart = Convert.ToInt32(Conv_1460); convwrite.Goodsend = 14600; WriteInfoToConv(equ_conv, convwrite, false); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址) /// private void SrmOutConvExeTask(string plcName, string convNo, bool endPosIsCurConv = false) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == plcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var cs = conveyor.EquSignal_Conv; if (!cs.DB521_Request) return; if (cs.DB523_Fault) return; var taskSet = Current.TaskSet.Where(v => v.TASK_POSIDNEXT == convNo).ToList(); var task = taskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.堆垛机完成); if (task == null) { throw new Exception(string.Format("堆垛机出口输送线[{0}]存在请求信号,但没查询到任务信息。", convNo)); } var converywrite = new WCSWriteToConveyorSignal(); converywrite.Plc = plc.Plc; converywrite.DBName = plc.WriteDBName; converywrite.ConveyorNo = convNo; converywrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; converywrite.Tasknum = task.TASK_NO; converywrite.Goodscode = 0; converywrite.Goodstype = 0; converywrite.Goodssize = 0; converywrite.Goodsstart = Convert.ToInt32(convNo); if (endPosIsCurConv) { converywrite.Goodsend = converywrite.Goodsstart; } else { var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO); var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList(); if (routes.Count == 1) { converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS); } else { if (convNo == Conv_1056 || convNo == Conv_1051) { if (task.TASK_POSIDTO != "1072") { converywrite.Goodsend = 1085; } } else { throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO)); } //if (convNo == Conv_1056 || convNo== Conv_1051) //{ // string taryType = string.IsNullOrWhiteSpace(task.TASK_ITEM2) ? string.Empty : task.TASK_ITEM2.Trim(); // string isEmpty = string.IsNullOrWhiteSpace(task.TASK_ITEM3) ? string.Empty : task.TASK_ITEM3.Trim(); // if (taryType == "1" && isEmpty == "1") // { // converywrite.Goodsend = 1071; // } // else // { // converywrite.Goodsend = 1085; // } //} //else //{ //throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO)); //} } } WriteInfoToConv(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private static int _conveyorTaskExecute = 0; private void ConveyorTaskExecute() { if (Interlocked.Exchange(ref _conveyorTaskExecute, 1) == 0) { try { foreach (var convNo in AppSettingsHelper.AppSettings.TaskStatusUpdateConNoList) { var task = SugarBase.DB.Queryable().First(v => v.TASK_POSIDCUR == convNo && (v.TASK_WKSTATUS == (int)WkStatus.RGV完成 || v.TASK_WKSTATUS == (int)WkStatus.RGV下料执行)); if (task == null) continue; if (convNo == task.TASK_ITEM4) continue; task.TASK_WKSTATUS = (int)WkStatus.输送机执行; task.TASK_EDITUSERNO = "wcs"; task.TASK_POSIDNEXT = task.TASK_POSIDCUR; task.TASK_EDITDATETIME = DateTime.Now; SugarBase.DB.Updateable(task).UpdateColumns(it => new { it.TASK_WKSTATUS, it.TASK_POSIDNEXT, it.TASK_EDITUSERNO, it.TASK_EDITDATETIME }).ExecuteCommand(); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _conveyorTaskExecute, 0); } } } #endregion; #endregion; } }