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; using WCS.WMSWorkflow; namespace WCS.Workflow { /// /// 输送线02PLC /// public class ConveyorPlc02: Base_Conv { #region 只读变量 #region 电脑、液晶拆解线 private readonly string Conv_2002 = "2002"; private readonly string Conv_2004 = "2004"; private readonly string Conv_2006 = "2006"; private readonly string Conv_2008 = "2008"; private readonly string Conv_2011 = "2011"; private readonly string Conv_2012 = "2012"; private readonly string Conv_2013 = "2013"; private readonly string Conv_2014 = "2014"; private readonly string Conv_2015 = "2015"; private readonly string Conv_2016 = "2016"; private readonly string Conv_2017 = "2017"; private readonly string Conv_2018 = "2018"; #endregion; #region 电视拆解线 private readonly string Conv_2021 = "2021"; private readonly string Conv_2022 = "2022"; private readonly string Conv_2023 = "2023"; private readonly string Conv_2024 = "2024"; private readonly string Conv_2025 = "2025"; private readonly string Conv_2026 = "2026"; private readonly string Conv_2027 = "2027"; private readonly string Conv_2028 = "2028"; private readonly string Conv_2092 = "2092"; private readonly string Conv_2094 = "2094"; private readonly string Conv_2096 = "2096"; private readonly string Conv_2098 = "2098"; private readonly string Conv_2100 = "2100"; #endregion; #region 洗衣机拆解线 private readonly string Conv_2212 = "2212"; private readonly string Conv_2214 = "2214"; private readonly string Conv_2216 = "2216"; private readonly string Conv_2218 = "2218"; private readonly string Conv_2220 = "2220"; private readonly string Conv_2174 = "2174"; private readonly string Conv_2176 = "2176"; private readonly string Conv_2131 = "2131"; private readonly string Conv_2132 = "2132"; private readonly string Conv_2133 = "2133"; private readonly string Conv_2134 = "2134"; private readonly string Conv_2138 = "2138"; private readonly string Conv_2139 = "2139"; private readonly string Conv_2140 = "2140"; private readonly string Conv_2141 = "2141"; private readonly string Conv_2142 = "2142"; #endregion; #region 空调拆解线 private readonly string Conv_2166 = "2166"; private readonly string Conv_2168 = "2168"; private readonly string Conv_2170 = "2170"; private readonly string Conv_2172 = "2172"; private readonly string Conv_2111 = "2111"; private readonly string Conv_2112 = "2112"; private readonly string Conv_2113 = "2113"; private readonly string Conv_2114 = "2114"; private readonly string Conv_2116 = "2116"; private readonly string Conv_2120 = "2120"; private readonly string Conv_2121 = "2121"; private readonly string Conv_2122 = "2122"; private readonly string Conv_2123 = "2123"; private readonly string Conv_2124 = "2124"; #endregion; #region 堆垛机出口输送线 private readonly string Conv_2302 = "2302"; private readonly string Conv_2306 = "2306"; private readonly string Conv_2310 = "2310"; private readonly string Conv_2314 = "2314"; private readonly string Conv_2318 = "2318"; private readonly string Conv_2322 = "2322"; #endregion; #region 堆垛机一楼入库台 private readonly string Conv_2380 = "2380"; private readonly string Conv_2390 = "2390"; #endregion; #region 堆垛机一楼出库台 //异常口 private readonly string Conv_2381 = "2381"; private readonly string Conv_2391 = "2391"; #endregion; #region 震动输送机 private readonly string Conv_2065 = "2065"; private readonly string Conv_2067 = "2067"; private readonly string Conv_2069 = "2069"; private readonly string Conv_2071 = "2071"; private readonly string Conv_2073 = "2073"; private readonly string Conv_2075 = "2075"; #endregion; #region 称重输送线 private readonly string Conv_Weigh_2235 = "2235"; private readonly string Conv_Weigh_2336 = "2336"; private readonly string Conv_Weigh_2036 = "2036"; private readonly string Conv_Weigh_2034 = "2034"; private readonly string Conv_Weigh_2056 = "2056"; private readonly string Conv_Weigh_2344 = "2344"; private readonly string Conv_Weigh_2157 = "2157"; private readonly string Conv_Weigh_2155 = "2155"; private readonly string Conv_Weigh_2181 = "2181"; #endregion; #region 扫描输送线 private readonly string Conv_2246 = "2246"; private readonly string Conv_2235 = "2235"; public readonly string Conv_2238 = "2238"; private readonly string Conv_2359 = "2359"; #endregion; #region 穿梭车 private readonly string Rgv2019 = "rgv2019"; private readonly string Rgv2029 = "rgv2029"; private readonly string Rgv2044 = "rgv2044"; private readonly string Rgv2062 = "rgv2062"; private readonly string Rgv2081 = "rgv2081"; private readonly string Rgv2201 = "rgv2201"; private readonly string Rgv2189 = "rgv2189"; private readonly string Rgv2163 = "rgv2163"; private readonly string Rgv2143 = "rgv2143"; private readonly string Rgv2125 = "rgv2125"; #endregion; //打铁缓存位呼叫空托盘 private readonly string Conv_2047 = "2047"; private readonly string Conv_2436 = "2436"; private readonly string Conv_2136 = "2136"; private readonly string Conv_2137 = "2137"; //异常口 private readonly string Conv_2046 = "2046"; //异常口 private readonly string Conv_2437 = "2437"; private readonly string Conv_2184 = "2184"; private readonly string Conv_2151 = "2151"; private readonly string ROUTE_INOUTTYPE_IN = "in"; private readonly string ROUTE_INOUTTYPE_OUT = "out"; private readonly string Conv_2360 = "2360"; //发货口 private readonly string Conv_2361 = "2361"; private readonly string Conv_2365 = "2365"; //发货口 private readonly string Conv_2364 = "2364"; private readonly string Conv_2051 = "2051"; private readonly string Out_Area_D = "Out_Area_D"; #endregion; #region 构造函数 public ConveyorPlc02() : base() { } #endregion; #region 重载实现 /// /// 调度PLC执行任务 /// public override void Run() { //刷新任务数据 WCSWorkflow.RefreshData(); //一楼入库台申请(入库/搬运) Conv_FirstFloorExeTask(); //二楼环线扫码执行任务 Conv_ScanBarCodeExeTask(); //二楼堆垛机出口任务执行 SrmOutConvExeTask(); //RGV超高退回报警超高,WCS确认清除 ConvCancelTask(); //出口任务完成 ConveyorTaskFinish(); //WCS写入输送线执行任务 ConveyorWriteTaskExecute(); //生产线空框呼叫 ThreadHelper.TaskThread(ProLineCallEmptyOutTask); //生产线称重 ThreadHelper.TaskThread(ProLineWeigh); //生产线物料入库请求 ThreadHelper.TaskThread(ProLineInTaskRequest); //RGV对接的输送线自动执行的任务状态修改 ThreadHelper.TaskThread(ConveyorTaskExecute); //生产线异常口申请,任务变更目标地址 ThreadHelper.TaskThread(ExecConvRequest); } #endregion; #region 多线程调用 private static int _proLineWeigh = 0; private void ProLineWeigh() { if (Interlocked.Exchange(ref _proLineWeigh, 1) == 0) { try { int weight = 70000;//克 List convNoSet = new List(); convNoSet.Add(Conv_Weigh_2336); convNoSet.Add(Conv_Weigh_2034); convNoSet.Add(Conv_Weigh_2036); convNoSet.Add(Conv_Weigh_2056); convNoSet.Add(Conv_Weigh_2344); convNoSet.Add(Conv_Weigh_2157); convNoSet.Add(Conv_Weigh_2155); convNoSet.Add(Conv_Weigh_2181); foreach (var convNo in convNoSet) { 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) continue; if (equ_conv.DB521_Res04 <= 2000) continue; if (equ_conv.DB521_Res04 < weight) { var msg = string.Format("输送机[{0}]处称重异常,当前重量[{1}]克,铁托盘预估重量[{2}]克以上。", convNo, equ_conv.DB521_Res04, weight); LogMessageHelper.RecordLogMessage(msg); continue; } 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); } } } private static int _roLineInTaskRequest = 0; private void ProLineInTaskRequest() { if (Interlocked.Exchange(ref _roLineInTaskRequest, 1) == 0) { try { List convNoSet = new List(); #region 生产线电视,电脑 convNoSet.Add(Conv_2092); convNoSet.Add(Conv_2094); convNoSet.Add(Conv_2096); convNoSet.Add(Conv_2098); convNoSet.Add(Conv_2100); convNoSet.Add(Conv_2021); convNoSet.Add(Conv_2022); convNoSet.Add(Conv_2023); convNoSet.Add(Conv_2024); convNoSet.Add(Conv_2025); convNoSet.Add(Conv_2026); convNoSet.Add(Conv_2027); convNoSet.Add(Conv_2028); convNoSet.Add(Conv_2002); convNoSet.Add(Conv_2004); convNoSet.Add(Conv_2006); convNoSet.Add(Conv_2008); convNoSet.Add(Conv_2011); convNoSet.Add(Conv_2012); convNoSet.Add(Conv_2013); convNoSet.Add(Conv_2014); convNoSet.Add(Conv_2015); convNoSet.Add(Conv_2016); convNoSet.Add(Conv_2017); convNoSet.Add(Conv_2018); convNoSet.Add(Conv_2065); convNoSet.Add(Conv_2067); convNoSet.Add(Conv_2069); convNoSet.Add(Conv_2071); convNoSet.Add(Conv_2073); convNoSet.Add(Conv_2075); #endregion; #region 空调,洗衣机 convNoSet.Add(Conv_2111); convNoSet.Add(Conv_2112); convNoSet.Add(Conv_2113); convNoSet.Add(Conv_2114); convNoSet.Add(Conv_2116); convNoSet.Add(Conv_2120); convNoSet.Add(Conv_2121); convNoSet.Add(Conv_2122); convNoSet.Add(Conv_2123); convNoSet.Add(Conv_2124); convNoSet.Add(Conv_2131); convNoSet.Add(Conv_2132); convNoSet.Add(Conv_2133); convNoSet.Add(Conv_2134); convNoSet.Add(Conv_2138); convNoSet.Add(Conv_2139); convNoSet.Add(Conv_2140); convNoSet.Add(Conv_2141); convNoSet.Add(Conv_2142); convNoSet.Add(Conv_2166); convNoSet.Add(Conv_2168); convNoSet.Add(Conv_2170); convNoSet.Add(Conv_2172); convNoSet.Add(Conv_2174); convNoSet.Add(Conv_2176); convNoSet.Add(Conv_2212); convNoSet.Add(Conv_2214); convNoSet.Add(Conv_2216); convNoSet.Add(Conv_2218); convNoSet.Add(Conv_2220); convNoSet.Add(Conv_2436);//打铁 convNoSet.Add(Conv_2137);//打铁 #endregion; CreateInTaskByRequest(convNoSet); } catch (Exception ex) { Log4netHelper.Logger_Error.ErrorFormat(ex.ToString()); } finally { Interlocked.Exchange(ref _roLineInTaskRequest, 0); } } } private static int _conveyorTaskExecute = 0; private void ConveyorTaskExecute() { if (Interlocked.Exchange(ref _conveyorTaskExecute, 1) == 0) { try { //List convSet = new List() { "2033", "2061", "2041", "2038", "2088", "2246", "2188", "2208", "2160", "2154", "2159", "2153", "2151" }; foreach (var convNo in AppSettingsHelper.AppSettings.TaskStatusUpdateConNoList) { var task = Current.TaskSet.FirstOrDefault(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); } } } private static int _execConvRequest = 0; private void ExecConvRequest() { if (Interlocked.Exchange(ref _execConvRequest, 1) == 0) { try { ExecConvRequest(Conv_2046); ExecConvRequest(Conv_2437); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _execConvRequest, 0); } } } private static int _proLineCallEmptyOutTask = 0; private void ProLineCallEmptyOutTask() { if (Interlocked.Exchange(ref _proLineCallEmptyOutTask, 1) == 0) { try { WCSWorkflow.RefreshData(); List OutPos = new List(); //电视面板、面板塑料、PS、含汞背光灯 OutPos.Add(Conv_2092); OutPos.Add(Conv_2094); OutPos.Add(Conv_2096); OutPos.Add(Conv_2098); OutPos.Add(Conv_2100); //电路板、面板塑料(纸)、LED灯、扬声器 OutPos.Add(Conv_2021); OutPos.Add(Conv_2022); OutPos.Add(Conv_2023); OutPos.Add(Conv_2024); OutPos.Add(Conv_2025); OutPos.Add(Conv_2026); OutPos.Add(Conv_2027); OutPos.Add(Conv_2028); //电线电缆、电子枪、防静电线、螺丝 OutPos.Add(Conv_2011); OutPos.Add(Conv_2012); OutPos.Add(Conv_2013); OutPos.Add(Conv_2014); OutPos.Add(Conv_2015); OutPos.Add(Conv_2016); OutPos.Add(Conv_2017); OutPos.Add(Conv_2018); //屏玻璃 OutPos.Add(Conv_2002); OutPos.Add(Conv_2006); //锥玻璃 OutPos.Add(Conv_2004); OutPos.Add(Conv_2008); //震动输送机 //CallEmptyOutTask(Conv_2065); //CallEmptyOutTask(Conv_2067); //CallEmptyOutTask(Conv_2069); //CallEmptyOutTask(Conv_2071); //CallEmptyOutTask(Conv_2073); //CallEmptyOutTask(Conv_2075); //打铁缓存位呼叫空托盘 Conv_RequestCarry(Conv_2047, Conv_2436); Conv_RequestCarry(Conv_2136, Conv_2137); //打铁缓存位呼叫空托盘 OutPos.Add(Conv_2047); OutPos.Add(Conv_2136); //空调产物入库位置呼叫空箱 OutPos.Add(Conv_2111); OutPos.Add(Conv_2112); OutPos.Add(Conv_2113); OutPos.Add(Conv_2114); OutPos.Add(Conv_2116); //OutPos.Add(Conv_2120); OutPos.Add(Conv_2121); OutPos.Add(Conv_2122); OutPos.Add(Conv_2123); OutPos.Add(Conv_2124); //洗衣机产物入库位置呼叫空箱 OutPos.Add(Conv_2131); OutPos.Add(Conv_2132); OutPos.Add(Conv_2133); OutPos.Add(Conv_2134); //OutPos.Add(Conv_2138); OutPos.Add(Conv_2139); OutPos.Add(Conv_2140); OutPos.Add(Conv_2141); OutPos.Add(Conv_2142); //震动输送机 //CallEmptyOutTask(Conv_2166); //CallEmptyOutTask(Conv_2168); //CallEmptyOutTask(Conv_2170); //CallEmptyOutTask(Conv_2172); //CallEmptyOutTask(Conv_2174); //CallEmptyOutTask(Conv_2176); ////二楼产物 OutPos.Add(Conv_2212); OutPos.Add(Conv_2214); OutPos.Add(Conv_2216); OutPos.Add(Conv_2218); OutPos.Add(Conv_2220); foreach (var convNo in OutPos) { if (Current.WCS_TASKTIMEPOINTSet.Any(v => v.F_NO == convNo)) continue; CallEmptyOutTask(convNo); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } finally { Interlocked.Exchange(ref _proLineCallEmptyOutTask, 0); } } } #endregion; #region 模块调用 private void Conv_FirstFloorExeTask() { Conv_NotScannExeTask(Conv_2380, string.Empty, true); Conv_NotScannExeTask(Conv_2390, string.Empty, true); } private void Conv_ScanBarCodeExeTask() { Conv_Scanning_2246(Conv_2246, Conv_2235); Conv_Scanning_2235(Conv_2235, Conv_2381, "0", 1); Conv_Scanning_2238(Conv_2238, Conv_2246); Conv_Scanning_2359(Conv_2359); } private void SrmOutConvExeTask() { SrmOutConvExeTask(PlcName, Conv_2302); SrmOutConvExeTask(PlcName, Conv_2306); SrmOutConvExeTask(PlcName, Conv_2310); SrmOutConvExeTask(PlcName, Conv_2314); SrmOutConvExeTask(PlcName, Conv_2318); SrmOutConvExeTask(PlcName, Conv_2322); } /// /// 入口输送线超高报警取消任务(震动输送机和2436超高变更目标地址到异常口) /// private void ConvCancelTask() { //震动输送机超高 Conv_H_OutsideUpdateTaskEndAddress(Conv_Weigh_2056, Conv_2046); #region 电视,电脑 List list_rgv2019 = new List() { Conv_2002, Conv_2004, Conv_2006, Conv_2008, Conv_2011, Conv_2012, Conv_2013, Conv_2014, Conv_2015, Conv_2016, Conv_2017, Conv_2018 }; foreach (var item in list_rgv2019) { ConvSuperHighAlaramResetTask(Rgv2019, item); } List list_rgv2029 = new List() { Conv_2021, Conv_2022, Conv_2023, Conv_2024, Conv_2025, Conv_2026, Conv_2027, Conv_2028 }; foreach (var item in list_rgv2029) { ConvSuperHighAlaramResetTask(Rgv2029, item); } List list_rgv2044 = new List() { Conv_2046, Conv_2436 }; foreach (var item in list_rgv2044) { ConvSuperHighAlaramResetTask(Rgv2044, item); } List list_rgv2062 = new List() { Conv_2065, Conv_2067, Conv_2069, Conv_2071, Conv_2073, Conv_2075 }; foreach (var item in list_rgv2062) { ConvSuperHighAlaramResetTask(Rgv2062, item); } List list_rgv2081 = new List() { Conv_2092, Conv_2094, Conv_2096, Conv_2098, Conv_2100 }; foreach (var item in list_rgv2081) { ConvSuperHighAlaramResetTask(Rgv2081, item); } #endregion; #region 空调,洗衣机 List list_rgv2125 = new List() { Conv_2111, Conv_2112, Conv_2113, Conv_2114, Conv_2116, Conv_2120, Conv_2121, Conv_2122, Conv_2123, Conv_2124 }; foreach (var item in list_rgv2125) { ConvSuperHighAlaramResetTask(Rgv2125, item); } List list_rgv2143 = new List() { Conv_2131, Conv_2132, Conv_2133, Conv_2134, Conv_2137, Conv_2138, Conv_2139, Conv_2140, Conv_2141, Conv_2142 }; foreach (var item in list_rgv2143) { ConvSuperHighAlaramResetTask(Rgv2143, item); } List list_rgv2163 = new List() { Conv_2166, Conv_2168, Conv_2170, Conv_2174, Conv_2437 }; foreach (var item in list_rgv2163) { ConvSuperHighAlaramResetTask(Rgv2163, item); } List list_rgv2189 = new List() { Conv_2174, Conv_2176 }; foreach (var item in list_rgv2189) { ConvSuperHighAlaramResetTask(Rgv2189, item); } List list_rgv2201 = new List() { Conv_2212, Conv_2214, Conv_2216, Conv_2218, Conv_2220 }; foreach (var item in list_rgv2201) { ConvSuperHighAlaramResetTask(Rgv2201, item); } #endregion; } private void ConveyorTaskFinish() { //成品测试出口 ConveyorTaskFinish(PlcName,Conv_2238); ConveyorTaskFinish(PlcName,Conv_2246); #region 生产线输送线任务完成 A区 ConveyorTaskFinish(PlcName, Conv_2092); ConveyorTaskFinish(PlcName, Conv_2094); ConveyorTaskFinish(PlcName, Conv_2096); ConveyorTaskFinish(PlcName, Conv_2098); ConveyorTaskFinish(PlcName, Conv_2100); ConveyorTaskFinish(PlcName, Conv_2021); ConveyorTaskFinish(PlcName, Conv_2022); ConveyorTaskFinish(PlcName, Conv_2023); ConveyorTaskFinish(PlcName, Conv_2024); ConveyorTaskFinish(PlcName, Conv_2025); ConveyorTaskFinish(PlcName, Conv_2026); ConveyorTaskFinish(PlcName, Conv_2027); ConveyorTaskFinish(PlcName, Conv_2028); ConveyorTaskFinish(PlcName, Conv_2011); ConveyorTaskFinish(PlcName, Conv_2012); ConveyorTaskFinish(PlcName, Conv_2013); ConveyorTaskFinish(PlcName, Conv_2014); ConveyorTaskFinish(PlcName, Conv_2015); ConveyorTaskFinish(PlcName, Conv_2016); ConveyorTaskFinish(PlcName, Conv_2017); ConveyorTaskFinish(PlcName, Conv_2018); ConveyorTaskFinish(PlcName, Conv_2002); ConveyorTaskFinish(PlcName, Conv_2004); ConveyorTaskFinish(PlcName, Conv_2006); ConveyorTaskFinish(PlcName, Conv_2008); ConveyorTaskFinish(PlcName, Conv_2065); ConveyorTaskFinish(PlcName, Conv_2067); ConveyorTaskFinish(PlcName, Conv_2069); ConveyorTaskFinish(PlcName, Conv_2071); ConveyorTaskFinish(PlcName, Conv_2073); ConveyorTaskFinish(PlcName, Conv_2075); //ConveyorTaskFinish(plcName, "2100"); #endregion; #region 生产线输送线任务完成 B区 ConveyorTaskFinish(PlcName, Conv_2212); ConveyorTaskFinish(PlcName, Conv_2214); ConveyorTaskFinish(PlcName, Conv_2216); ConveyorTaskFinish(PlcName, Conv_2218); ConveyorTaskFinish(PlcName, Conv_2220); ConveyorTaskFinish(PlcName, Conv_2166); ConveyorTaskFinish(PlcName, Conv_2168); ConveyorTaskFinish(PlcName, Conv_2170); ConveyorTaskFinish(PlcName, Conv_2172); ConveyorTaskFinish(PlcName, Conv_2174); ConveyorTaskFinish(PlcName, Conv_2176); ConveyorTaskFinish(PlcName, Conv_2111); ConveyorTaskFinish(PlcName, Conv_2112); ConveyorTaskFinish(PlcName, Conv_2113); ConveyorTaskFinish(PlcName, Conv_2114); ConveyorTaskFinish(PlcName, Conv_2116); ConveyorTaskFinish(PlcName, Conv_2120); ConveyorTaskFinish(PlcName, Conv_2121); ConveyorTaskFinish(PlcName, Conv_2122); ConveyorTaskFinish(PlcName, Conv_2123); ConveyorTaskFinish(PlcName, Conv_2124); ConveyorTaskFinish(PlcName, Conv_2131); ConveyorTaskFinish(PlcName, Conv_2132); ConveyorTaskFinish(PlcName, Conv_2133); ConveyorTaskFinish(PlcName, Conv_2134); ConveyorTaskFinish(PlcName, Conv_2137); ConveyorTaskFinish(PlcName, Conv_2138); ConveyorTaskFinish(PlcName, Conv_2139); ConveyorTaskFinish(PlcName, Conv_2140); ConveyorTaskFinish(PlcName, Conv_2141); ConveyorTaskFinish(PlcName, Conv_2142); ConveyorTaskFinish(PlcName, Conv_2436); #endregion; ConveyorTaskFinish(PlcName, Conv_2047);//打铁托盘缓存位完成 ConveyorTaskFinish(PlcName, Conv_2136);//打铁托盘缓存位完成 #region 发货口任务完成 ThreadHelper.TaskThread(ConvTaskFinish); #endregion; } private void ConveyorWriteTaskExecute() { ConveyorWriteTaskExecute(Conv_2051); ConveyorWriteTaskExecute(Conv_Weigh_2056); ConveyorWriteTaskExecute(Conv_2184); ConveyorWriteTaskExecute(Conv_2151); } #endregion; #region 功能实现 private void CreateInTaskByRequest(List convNoSet) { WCSWorkflow.RefreshData(); foreach (var convNo in convNoSet) { 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) continue; if (!equ_conv.DB521_Res01) continue; var task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convNo); if (task == null || task.TASK_WKSTATUS >= 99) { var param = new GetInTaskParam(); param.ContainerBarCode = string.Empty; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; param.EquipmentNo = convNo; if (convNo == Conv_2120 || convNo == Conv_2138) { param.EndPostion = Conv_2381; } else { param.EndPostion = srm; } param.Memo2 = "2"; task = BaseWorkflow.GetInTask(param); } else if (task.TASK_WKSTATUS <= 1) { 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(); } else if (convNo == Conv_2436 || convNo == Conv_2137)//打铁位置可以生成多个入库任务 { var tasks = Current.TaskSet.Where(v => v.TASK_POSIDFROM == convNo); int count = 0; bool iscreatetask = true; foreach (var item in tasks) { count = SugarBase.DB.Queryable().Count(v => v.PARENTID == item.TASK_NO); if (count < 3) { iscreatetask = false; break; } } if (iscreatetask) { var param = new GetInTaskParam(); param.ContainerBarCode = string.Empty; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; param.EquipmentNo = convNo; param.EndPostion = srm; param.Memo2 = "2"; task = BaseWorkflow.GetInTask(param); } } } } /// /// 发货口任务完成 /// private void ConvTaskFinish() { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyorTo = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_2359); var cs = conveyorTo.EquSignal_Conv; List list = new List(); list.Add(Conv_2361); list.Add(Conv_2364); foreach (var convNo in list) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDTO == convNo && v.TASK_POSIDNEXT == convNo); if (task!=null && task.TASK_NO != cs.DB521_Tasknum) { string result = TryCachHelper.TryExecute((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(); }); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void CallEmptyOutTask(string posidTo) { if (!Current.TaskSet.Any(v => v.TASK_POSIDTO_SHORT == posidTo)) { var conv = ConveyorHelper.GetConveyorSignal(PlcName, posidTo); if (conv.CvDB51_PH_Status) return; if (conv.DB521_Tasknum > 0) return; var param = new GetOutTaskParam(); param.OutEndPostion = posidTo; if (posidTo == Conv_2047 || posidTo == Conv_2436 || posidTo == Conv_2136 || posidTo == Conv_2137) { param.OutType = 2; } else { param.OutType = 3; } param.WareHouseId = Current.Pvchouseputong; WCS_GetOutTask(param, posidTo); } } /// /// 输送线无扫码执行任务 /// /// 扫码输送线 /// 扫码异常退出口 /// 目标地址是否当前输送线 private void Conv_NotScannExeTask(string convNo, string exitNo, 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.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)); //GetInTaskParam param = new GetInTaskParam(); //param.ContainerBarCode = txtBarCode.Text.Trim(); //param.ContainerType = 1; //param.MatBarCode = string.Empty; //param.WareHouseId = "producthouse"; //param.EquipmentNo = "2390"; //param.EndPostion = "2246"; //CreateInTask(param); } 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 { throw new Exception(string.Format("该函数不支持多个分支输送地址,请编写扩展接口。")); } } WriteInfoToConveyor(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 打铁位置申请搬运任务 /// /// /// private void Conv_RequestCarry(string convNo,string endConvNo) { try { var plc = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == PlcName); var conveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == convNo); var startCs = conveyor.EquSignal_Conv; var endConveyor = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == endConvNo); var endCs = endConveyor.EquSignal_Conv; if (!startCs.CvDB51_PH_Status) return; if (endCs.CvDB51_PH_Status) return; if (endCs.DB521_Tasknum > 0) return; var task = Current.TaskSet.FirstOrDefault(v => v.TASK_POSIDFROM == convNo); if (task == null) { var param = new GetInTaskParam(); param.ContainerBarCode = string.Empty; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; param.EquipmentNo = convNo; param.EndPostion = endConvNo; param.Memo2 = "2"; task = BaseWorkflow.GetInTask(param); } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 输送线扫码执行 /// /// 扫码输送线 /// 扫码异常退出口(没有则传空值) /// 目标位置(method.调用扩展函数;0.无效参数; 1.仓库;2.区域A;3.区域B 等) /// 分配类型:0.不分配;1.分配巷道;2.分配货位 private void Conv_Scanning_2246(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 (ConveyorHelper.ConvGoodsAlarms(convNo, cs)) return; if (cs.DB521_BCR_Noread) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo)); //if (!string.IsNullOrWhiteSpace(exitNo)) //{ // var convwrite = new WCSWriteToConveyorSignal(); // convwrite.Plc = plc.Plc; // convwrite.DBName = plc.WriteDBName; // convwrite.ConveyorNo = convNo; // convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; // convwrite.Tasknum = 1; // convwrite.Goodscode = 0; // convwrite.Goodstype = 0; // convwrite.Goodssize = 0; // convwrite.Goodsstart = Convert.ToInt32(convNo); // convwrite.Goodsend = Convert.ToInt32(exitNo); // //创建任务失败,写入托盘退回 // ConveyorHelper.WriteInfoToConveyor(cs, convwrite, true); //} return; } //var scann = plc.WCS_ScannSet.FirstOrDefault(v => v.SCANN_PLCNAME == plcName && v.SCANN_STATIONNO == convNo); //if (string.IsNullOrWhiteSpace(scann.SCANN_BARCODE)) //{ // throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo)); //} //string barcodestr = scann.SCANN_BARCODE.Replace("\r", "").Replace("\0", "").Trim(); if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo)); } if (cs.BarCodeStr.ToUpper().Contains("ERROR") || cs.BarCodeStr.ToUpper().Contains("N") || cs.BarCodeStr.Contains("?")) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convNo, cs.BarCodeStr)); } var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == cs.BarCodeStr); if (task == null) { //if (!string.IsNullOrWhiteSpace(exitNo)) //{ // var convwrite = new WCSWriteToConveyorSignal(); // convwrite.Plc = plc.Plc; // convwrite.DBName = plc.WriteDBName; // convwrite.ConveyorNo = convNo; // convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; // convwrite.Tasknum = 1; // convwrite.Goodscode = 0; // convwrite.Goodstype = 0; // convwrite.Goodssize = 0; // convwrite.Goodsstart = Convert.ToInt32(convNo); // convwrite.Goodsend = Convert.ToInt32(exitNo); // //创建任务失败,写入托盘退回 // ConveyorHelper.WriteInfoToConveyor(cs, convwrite, true); //} //return; var param = new GetInTaskParam(); param.ContainerBarCode = cs.BarCodeStr; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; param.EquipmentNo = convNo; param.EndPostion = "srm"; //if (endPostion == "method") //{ // param.EndPostion = Current.WcsInterface.QuerySetExtendedParam(plcName, param); //} //else //{ // param.EndPostion = endPostion; //} task = BaseWorkflow.GetInTask(param); } else if (task.TASK_COMTYPE == (int)ComTypeEnum.搬运 && task.TASK_POSIDTO == convNo) { Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]是搬运到该位置的铁箱,等待任务完成后触发生成新的任务。", task.TASK_NO)); return; } //任务已经执行 if (task == null || task.TASK_POSIDCUR != convNo || task.TASK_ITEM5 == convNo) 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); 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 (task.TASK_POSIDTO == "srm") { converywrite.Goodsend = Convert.ToInt32(Conv_Weigh_2235); } //else if (task.TASK_POSIDTO == "2391" || task.TASK_POSIDTO == "2381") //{ // converywrite.Goodsend = 2235; //} else { throw new Exception(string.Format("该函数不支持多个分支输送地址,请编写扩展接口。")); } WriteInfoToConveyor(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 输送线扫码执行 /// /// 扫码输送线 /// 扫码异常退出口(没有则传空值) private void Conv_Scanning_2238(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 (ConveyorHelper.ConvGoodsAlarms(convNo, cs)) return; if (cs.DB521_BCR_Noread) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo)); //if (!string.IsNullOrWhiteSpace(exitNo)) //{ // var convwrite = new WCSWriteToConveyorSignal(); // convwrite.Plc = plc.Plc; // convwrite.DBName = plc.WriteDBName; // convwrite.ConveyorNo = convNo; // convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; // convwrite.Tasknum = 1; // convwrite.Goodscode = 0; // convwrite.Goodstype = 0; // convwrite.Goodssize = 0; // convwrite.Goodsstart = Convert.ToInt32(convNo); // convwrite.Goodsend = Convert.ToInt32(exitNo); // //创建任务失败,写入托盘退回 // ConveyorHelper.WriteInfoToConveyor(cs, convwrite, true); //} return; } //var scann = plc.WCS_ScannSet.FirstOrDefault(v => v.SCANN_PLCNAME == plcName && v.SCANN_STATIONNO == convNo); //if (string.IsNullOrWhiteSpace(scann.SCANN_BARCODE)) //{ // throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo)); //} //string barcodestr = scann.SCANN_BARCODE.Replace("\r", "").Replace("\0", "").Trim(); if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo)); } if (cs.BarCodeStr.ToUpper().Contains("ERROR") || cs.BarCodeStr.ToUpper().Contains("N") || cs.BarCodeStr.Contains("?")) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convNo, cs.BarCodeStr)); } var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == cs.BarCodeStr); if (task == null) { //throw new Exception(string.Format("输送线[{0}]条码[{1}]未查询到任务,请检查扫码是否正确。", convNo, cs.BarCodeStr)); //if (!string.IsNullOrWhiteSpace(exitNo)) //{ // var convwrite = new WCSWriteToConveyorSignal(); // convwrite.Plc = plc.Plc; // convwrite.DBName = plc.WriteDBName; // convwrite.ConveyorNo = convNo; // convwrite.WriteStartAddress = cs.EquDbInfo_ReadWrite.DBReadIndox; // convwrite.Tasknum = 1; // convwrite.Goodscode = 0; // convwrite.Goodstype = 0; // convwrite.Goodssize = 0; // convwrite.Goodsstart = Convert.ToInt32(convNo); // convwrite.Goodsend = Convert.ToInt32(exitNo); // //创建任务失败,写入托盘退回 // ConveyorHelper.WriteInfoToConveyor(cs, convwrite, true); //} //return; var param = new GetInTaskParam(); param.ContainerBarCode = cs.BarCodeStr; param.ContainerType = 1; param.MatBarCode = string.Empty; param.WareHouseId = Current.Pvchouseputong; param.EquipmentNo = convNo; param.EndPostion = "srm"; //if (endPostion == "method") //{ // param.EndPostion = Current.WcsInterface.QuerySetExtendedParam(plcName, param); //} //else //{ // param.EndPostion = endPostion; //} task = BaseWorkflow.GetInTask(param); } //任务已经执行 if (task == null || task.TASK_POSIDCUR != convNo || task.TASK_ITEM5 == convNo) 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); 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 (task.TASK_POSIDTO == "srm") { converywrite.Goodsend = Convert.ToInt32(Conv_2246); } else { throw new Exception(string.Format("该函数不支持多个分支输送地址,请编写扩展接口。")); } WriteInfoToConveyor(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 输送线扫码执行 /// /// 扫码输送线 /// 扫码异常退出口(没有则传空值) /// 目标位置(method.调用扩展函数;0.无效参数; 1.仓库;2.区域A;3.区域B 等) /// 分配类型:0.不分配;1.分配巷道;2.分配货位 private void Conv_Scanning_2235(string convNo, string exitNo, string endPostion, int assignType = 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.DB521_Request) return; //if (ConveyorHelper.ConvGoodsAlarms(convNo, cs)) return; WCS_TASK task = null; if (cs.DB521_BCR_Noread) { LogMessageHelper.RecordLogMessage(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo)); return; if (!string.IsNullOrWhiteSpace(exitNo)) { var taskExce = SugarBase.DB.Queryable().First(v => v.TASK_POSIDFROM == convNo && v.TASK_POSIDCUR == convNo && v.TASK_POSIDNEXT == convNo); if (taskExce == null) { //创建异常任务 taskExce = new WCS_TASK(); taskExce.TASK_WMSNO = "无"; taskExce.TASK_COMTYPE = (int)ComTypeEnum.搬运; taskExce.TASK_SYSTYPE = "WCS"; taskExce.TASK_POSIDFROM = convNo;//起点地址 taskExce.TASK_POSIDCUR = convNo; taskExce.TASK_POSIDNEXT = convNo; taskExce.TASK_POSIDMOVE = ""; taskExce.TASK_PRIORITY = 1; taskExce.TASK_WKSTATUS = 0; taskExce.TASK_WHID = "成品库"; taskExce.TASK_ADDUSERNO = "WMS"; taskExce.TASK_ADDDATETIME = DateTime.Now; taskExce.TASK_EDITUSERNO = "WMS"; taskExce.TASK_EDITDATETIME = DateTime.Now; taskExce.TASK_NOTES = ""; taskExce.TASK_RGVNO = ""; taskExce.TASK_SRMNO = "srm01"; taskExce.TASK_BOXBARCODE = string.Empty; taskExce.TASK_POSIDTO = exitNo; int id = SugarBase.DB.Insertable(taskExce).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("扫码位置[{0}]扫码异常,添加WCS异常任务失败", convNo)); } else { taskExce.TASK_NO = id; task = taskExce; } } } else { return; } } //var scann = plc.WCS_ScannSet.FirstOrDefault(v => v.SCANN_PLCNAME == plcName && v.SCANN_STATIONNO == convNo); //if (string.IsNullOrWhiteSpace(scann.SCANN_BARCODE)) //{ // throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo)); //} //string barcodestr = scann.SCANN_BARCODE.Replace("\r", "").Replace("\0", "").Trim(); if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo)); } if (cs.BarCodeStr.ToUpper().Contains("ERROR") || cs.BarCodeStr.ToUpper().Contains("N") || cs.BarCodeStr.Contains("?")) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convNo, cs.BarCodeStr)); } if (task == null) task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == cs.BarCodeStr); if (task == null) { throw new Exception(string.Format("输送线[{0}]条码[{1}]查询不到任务信息,请检测扫码是否正确。", convNo, cs.BarCodeStr)); //var param = new GetInTaskParam(); //param.ContainerBarCode = cs.BarCodeStr; //param.ContainerType = 1; //param.MatBarCode = string.Empty; //param.WareHouseId = Current.WareHouseId; //param.EquipmentNo = convNo; //if (endPostion == "method") //{ // param.EndPostion = Current.WcsInterface.QuerySetExtendedParam(plcName, param); //} //else //{ // param.EndPostion = endPostion; //} //if (assignType > 0 && param.EndPostion.Contains("srm")) param.Memo1 = assignType.ToString(); //task = BaseWorkflow.GetInTask(param); } else if (task.TASK_COMTYPE == (int)ComTypeEnum.搬运 && task.TASK_POSIDTO == convNo) { Log4netHelper.Logger_Info.InfoFormat(string.Format("任务[{0}]是搬运到该位置的铁箱,等待任务完成后触发生成新的任务。", task.TASK_NO)); return; } //任务已经执行 if (task.TASK_ITEM5 == convNo) return; //重量低于180000克报错。 if (cs.DB521_Res04 < 80000) throw new Exception(string.Format("输送线[{0}]称重[{1}]克错误。", convNo, cs.DB521_Res04)); GetWeightParam param = new GetWeightParam(); param.WMSTaskNum = task.TASK_WMSNO; param.Weight = cs.DB521_Res04; if (string.IsNullOrEmpty(task.TASK_ITEM3)) { if (BaseWorkflow.GetWeight(param) == false) { return; } } else { Log4netHelper.Logger_Info.Info(string.Format("任务[{0}]已称重[{1}],不会重复进行记录该称重信息。", task.TASK_NO, task.TASK_ITEM3)); } 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); var routeSet = EquRouteHelper.QueryRoute(convNo, task.TASK_POSIDTO); var routes = routeSet.Where(v => v.ROUTE_STARTPOS == convNo).ToList(); //if (task.TASK_POSIDTO == "2391") //{ // converywrite.Goodsend = 2304; // //修改堆垛机编号 // SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_COMTYPE = 4, TASK_SRMNO = "srm11", TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) // .Where(it => it.TASK_NO == task.TASK_NO) // .ExecuteCommand(); //} //else if (task.TASK_POSIDTO == "2381") //{ // converywrite.Goodsend = 2324; // SugarBase.DB.Updateable(it => new WCS_TASK() { TASK_COMTYPE = 4, TASK_SRMNO = "srm06", TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) // .Where(it => it.TASK_NO == task.TASK_NO) // .ExecuteCommand(); //} //else if (routes.Count == 1) { converywrite.Goodsend = Convert.ToInt32(routes[0].ROUTE_SONPOS); } else if (task.TASK_POSIDTO.Contains("srm") && assignType > 0) { ConveyorHelper.AssignSrm(routeSet, converywrite, Convert.ToInt32(task.TASK_WMSNO)); } else { throw new Exception(string.Format("任务[{0}]该函数不支持多个分支输送地址,请编写扩展接口。", task.TASK_NO)); } WriteInfoToConveyor(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void Conv_Scanning_2359(string convNo) { 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.DB521_BCR_Noread) { throw new Exception(string.Format("输送线[{0}]报读码错误,但是存在请求。", convNo)); } if (string.IsNullOrWhiteSpace(cs.BarCodeStr)) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但没读取到条码信息。", convNo)); } if (cs.BarCodeStr.ToUpper().Contains("ERROR") || cs.BarCodeStr.ToUpper().Contains("N") || cs.BarCodeStr.Contains("?")) { throw new Exception(string.Format("输送线[{0}]存在请求信号,但条码是:[{1}]存在报错,PLC应该报条码错误信号", convNo, cs.BarCodeStr)); } var conv2360 = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_2360).EquSignal_Conv; var conv2361 = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_2361).EquSignal_Conv; bool isNotTask_2061 = false; if (conv2360.DB521_Tasknum > 0 && conv2360.DB521_Goodsend == Convert.ToInt32(Conv_2361)) { isNotTask_2061 = true; } if (conv2361.DB521_Tasknum > 0 && conv2361.DB521_Goodsend == Convert.ToInt32(Conv_2361)) { isNotTask_2061 = true; } var conv2364 = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_2364).EquSignal_Conv; var conv2365 = plc.WCS_EquipmentInfoSet.FirstOrDefault(v => v.Equ_No == Conv_2365).EquSignal_Conv; bool isNotTask_2064 = false; if (conv2360.DB521_Tasknum > 0 && conv2360.DB521_Goodsend == Convert.ToInt32(Conv_2364)) { isNotTask_2064 = true; } if (conv2364.DB521_Tasknum > 0 && conv2364.DB521_Goodsend == Convert.ToInt32(Conv_2364)) { isNotTask_2064 = true; } if (conv2365.DB521_Tasknum > 0 && conv2365.DB521_Goodsend == Convert.ToInt32(Conv_2364)) { isNotTask_2064 = true; } string endaddress = string.Empty; if (isNotTask_2061 == false) { endaddress = Conv_2361; } else if (isNotTask_2064 == false) { endaddress = Conv_2364; } if (string.IsNullOrWhiteSpace(endaddress)) return; var task = Current.TaskSet.FirstOrDefault(v => v.TASK_BOXBARCODE == cs.BarCodeStr); if (task.TASK_POSIDTO == Out_Area_D) { string result = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new WCS_TASK() { TASK_POSIDTO = endaddress, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO).ExecuteCommand(); string msg = string.Format("任务[{0}]已到达发货出库口扫码位置[{1}]分配目标地址[{2}]成功。", task.TASK_NO, convNo, endaddress); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, endaddress, msg); }); if (string.IsNullOrWhiteSpace(result)) { task.TASK_POSIDTO = endaddress; } else { throw new Exception(string.Format("任务[{0}]已到达发货出库口扫码位置[{1}]分配目标地址[{2}]失败。", task.TASK_NO, convNo, endaddress)); } } if (task.TASK_POSIDNEXT == task.TASK_POSIDTO) 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); converywrite.Goodsend = Convert.ToInt32(task.TASK_POSIDTO); WriteInfoToConveyor(cs, converywrite); } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private static string guid = string.Empty; private bool WCS_GetOutTask(GetOutTaskParam param, string posidTo) { bool result = false; WCS_TASK wcstask = null; try { if (string.IsNullOrWhiteSpace(guid)) guid = Guid.NewGuid().ToString(); param.OutId = guid; var reply = Current.WmsInterface.I_WCS_GetOutTask(param); if (reply.ResType) { if(string.IsNullOrWhiteSpace(reply.WareHouseName)) { throw new Exception(string.Format("工位[{0}]申请出库任务仓库不能为空。", posidTo)); } var task = SugarBase.DB.Queryable().First(v => v.TASK_WMSNO == reply.WMSTaskNum); if (task == null) { //添加wcs任务 wcstask = new WCS_TASK(); wcstask.TASK_WMSNO = reply.WMSTaskNum; wcstask.TASK_COMTYPE = reply.TaskType; wcstask.TASK_SYSTYPE = "WMS"; wcstask.TASK_POSIDFROM = reply.OutWareCellNo;//起点地址 wcstask.TASK_POSIDCUR = reply.OutWareCellNo; wcstask.TASK_POSIDNEXT = reply.OutWareCellNo; wcstask.TASK_POSIDMOVE = ""; wcstask.TASK_PRIORITY = reply.Priority; wcstask.TASK_WKSTATUS = 0; wcstask.TASK_WHID = reply.WareHouseName; wcstask.TASK_ADDUSERNO = "WMS"; wcstask.TASK_ADDDATETIME = DateTime.Now; wcstask.TASK_EDITUSERNO = "WMS"; wcstask.TASK_EDITDATETIME = DateTime.Now; wcstask.TASK_NOTES = ""; wcstask.TASK_RGVNO = ""; wcstask.TASK_BOXBARCODE = reply.ContainerBarCode; wcstask.TASK_POSIDTO = posidTo; //wcstask.TASK_PRIORITY = reply.Priority; if (string.IsNullOrWhiteSpace(reply.TunnelNum)) { //wcstask.TASK_SRMNO = reply.EndPostion; } else { wcstask.TASK_FromTunnelNum = reply.TunnelNum; if (wcstask.TASK_FromTunnelNum.Length == 2) wcstask.TASK_SRMNO = string.Format("srm{0}", wcstask.TASK_FromTunnelNum); else wcstask.TASK_SRMNO = string.Format("srm0{0}", wcstask.TASK_FromTunnelNum); } if (wcstask.TASK_COMTYPE == 2 && string.IsNullOrWhiteSpace(wcstask.TASK_SRMNO)) { throw new Exception(string.Format("工位[{0}]申请出库任务中 堆垛机编号不能为空。", posidTo)); } if (string.IsNullOrWhiteSpace(wcstask.TASK_BOXBARCODE)) { throw new Exception(string.Format("工位[{0}]申请出库任务中 条码编号不能为空。", posidTo)); } int id = SugarBase.DB.Insertable(wcstask).ExecuteReturnIdentity(); if (id <= 0) { throw new Exception(string.Format("WMS任务[{0}]添加WCS任务失败", reply.WMSTaskNum)); } else { wcstask.TASK_NO = id; guid = Guid.NewGuid().ToString(); result = true; } } } else { if (string.IsNullOrWhiteSpace(reply.Memo2)) { var msg = string.Format("目标位置[{0}]获取出库任务失败,原因:[{1}]", posidTo, reply.ResMessage); LogMessageHelper.RecordLogMessage(msg); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } return result; } /// /// 超高重置任务 /// /// /// private void ConvSuperHighAlaramResetTask(string rgvName, string convNo) { 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; var rgv = Current.PlcSet.FirstOrDefault(v => v.PLC_NAME == rgvName).WCS_EquipmentInfoSet[0].EquSignal_Rgv; if (cs.DB521_H_Outside) { var task = Current.TaskSet.FirstOrDefault(v => v.TASK_NO == rgv.DB521_TaskID_1 && (v.TASK_WKSTATUS == 3 || v.TASK_WKSTATUS == 7) && (v.TASK_COMTYPE == 1 || v.TASK_COMTYPE == 4 || v.TASK_COMTYPE == 5)); if (task == null) { //throw new Exception(string.Format("输送线[{0}]超高报警,未查询到任务,取消任务失败。", convNo)); } else { //调用sp完成任务 string result = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 1, TASK_POSIDCUR = convNo, TASK_POSIDNEXT = convNo, TASK_RGVNO = "", TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加明细 string msg = string.Format("输送线[{0}]上料到穿梭车[{1}]任务[{2}]外检故障,重置任务。", convNo, rgvName, task.TASK_NO); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg); string alaram = string.Format("托盘[{0}]超高报警", task.TASK_BOXBARCODE); BaseWorkflow.AddLedErrorMsg(db, convNo, alaram, task.TASK_NO); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } } if (rgv.DB521_Finish_1 == false) { if (!Current.TaskSet.Any(v => v.TASK_RGVNO == rgvName && v.TASK_WKSTATUS == 7)) { //穿梭车不存在任务,写入取消任务信号,PLC根据该信号写入穿梭车完成信号 if (!plc.Plc.WriteBits((ushort)plc.WriteDBName, (ushort)((cs.EquDbInfo_ReadWrite.DBReadIndox + 17) * 8 + 6), true)) { throw new Exception(string.Format("输送线[{0}]任务[{0}]写入超高重置任务失败!", convNo, rgv.DB521_TaskID_2)); } else { Log4netHelper.Logger_Info.InfoFormat("输送线[{0}]任务[{0}]写入超高重置任务成功!", convNo, rgv.DB521_TaskID_2); } } } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void Conv_H_OutsideUpdateTaskEndAddress(string convNo,string endConvNo) { 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_H_Outside) { var task = Current.TaskSet.FirstOrDefault(v => (v.TASK_WKSTATUS == 9) && v.TASK_POSIDCUR == convNo && v.TASK_COMTYPE == 1); if (task == null) { //throw new Exception(string.Format("输送线[{0}]超高报警,未查询到任务,取消任务失败。", convNo)); } else { //调用sp完成任务 string result = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 2, TASK_POSIDNEXT = convNo, TASK_POSIDTO = endConvNo, TASK_RGVNO = "", TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); //添加明细 string msg = string.Format("输送线[{0}]任务[{1}]外检超高故障,变更任务目标地址为[{2}]。", convNo, task.TASK_NO, endConvNo); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, task.TASK_POSIDNEXT, msg); string alaram = string.Format("托盘[{0}]超高报警,排出到异常口[{1}]人工处理。", task.TASK_BOXBARCODE, endConvNo); BaseWorkflow.AddLedErrorMsg(db, convNo, alaram, task.TASK_NO); }); if (!string.IsNullOrWhiteSpace(result)) { throw new Exception(result); } } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } /// /// 堆垛机出口输送线任务执行(任务目标地址的下个地址只支持单一地址) /// private void SrmOutConvExeTask(string plcName, string convNo, bool endPosIsCurConv = false) { try { string conv_2381 = "2381";//危废仓库出口 string conv_2391 = "2391";//空调和小家电出库口 int conv_2324 = 2324;//危废仓库出口 string srmno = string.Empty; 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 && cs.DB523_Fault == false) { var taskSet = Current.TaskSet.Where(v => v.TASK_POSIDNEXT == convNo).ToList(); var task = taskSet.SingleOrDefault(v => v.TASK_WKSTATUS == (int)WkStatus.堆垛机完成); if (task != null) { 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 { if (task.TASK_POSIDTO == conv_2381)//危废仓库出口 { converywrite.Goodsend = conv_2324; } 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 (routes.Any(v => v.ROUTE_SONPOS == Conv_2246) && routes.Any(v => v.ROUTE_SONPOS == Conv_2238)) { converywrite.Goodsend = Convert.ToInt32(Conv_2246); } else { throw new Exception(string.Format("输送线[{0}]任务[{1}]请求该函数不支持多个分支输送地址,请编写扩展函数。", convNo, task.TASK_NO)); } } } if (task.TASK_POSIDTO == conv_2381 || task.TASK_POSIDTO == conv_2391)//危废仓库出口、小家电和冰箱出口 { srmno = task.TASK_POSIDTO == conv_2381 ? "srm06" : "srm11"; //修改目标堆垛机和任务类型 if (task.TASK_SRMNO != srmno) { //调用sp完成任务 string result = TryCachHelper.TryTranExecute((db) => { db.Updateable(it => new WCS_TASK() { TASK_COMTYPE = 4, TASK_SRMNO = srmno, 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_POSIDNEXT, msg); }); if (string.IsNullOrWhiteSpace(result)) { throw new Exception(string.Format("任务[{0}]去危废仓库变更堆垛机编号和任务类型失败。", task.TASK_NO)); } } } } WriteInfoToConveyor(cs, converywrite); } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } private void ExecConvRequest(string convNo) { 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_Res01) { var task = SugarBase.DB.Queryable().First(v => v.TASK_NO == cs.DB521_Tasknum && v.TASK_POSIDCUR == convNo && v.TASK_POSIDTO == convNo); if (task != null) { string result = TryCachHelper.TryTranExecute((db) => { //修改任务的目标地址 db.Updateable(it => new WCS_TASK() { TASK_WKSTATUS = 2, TASK_POSIDTO = srm, TASK_EDITUSERNO = "WCS", TASK_EDITDATETIME = DateTime.Now }) .Where(it => it.TASK_NO == task.TASK_NO) .ExecuteCommand(); string msg = string.Format("任务[{0}]超高报警处理完成,变更目标地址为[{1}]", task.TASK_NO, srm); CommonData.AddWCS_TASK_DTL(db, task.TASK_NO, task.TASK_NO, task.TASK_POSIDCUR, srm, msg); }); if (!string.IsNullOrWhiteSpace(result)) { LogMessageHelper.RecordLogMessage(string.Format("任务[{0}]超高,变更目标地址失败,原因:[{1}]", task.TASK_NO, result)); } } } } catch (Exception ex) { LogMessageHelper.RecordLogMessage(ex); } } #endregion; #region 重写 public override int ConveyorWriteTaskExecuteToMoreAddress(string convNo, WCS_TASK task, List routes) { int nextaddress = 0; if (convNo == Conv_2184 || convNo == Conv_Weigh_2056) { if (task.TASK_POSIDTO == srm) { nextaddress = Convert.ToInt32(routes.FirstOrDefault(v => v.ROUTE_INOUTTYPE == ROUTE_INOUTTYPE_IN).ROUTE_SONPOS); } else { nextaddress = Convert.ToInt32(routes.FirstOrDefault(v => v.ROUTE_INOUTTYPE == ROUTE_INOUTTYPE_OUT).ROUTE_SONPOS); } } else { throw new Exception(string.Format("输送线[{0}]申请任务[{1}]分配下一个地址失败。", convNo, task.TASK_NO)); } return nextaddress; } #endregion; } }