using BLL.DAL; using Commom.DotNetDevices; using Common; using FastReport.Export.Email; using Microsoft.Extensions.Logging; using Microsoft.JScript; using Model; using Model.WmsModel; using Newtonsoft.Json; using NLog; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics.Eventing.Reader; using System.IO; using System.Linq; using System.Net.WebSockets; using System.Security.Policy; using System.Threading; using System.Threading.Tasks; using System.Web.UI.WebControls; using wms.Controllers; namespace wms.Task { public static class Global { public static string statusReady = "1"; public static string statusRuning = "2"; public static string statusEnd = "3"; } public static class TaskAction { // WCS标准版本代码 private static bool IsRunTast = true; private static bool IsRunConveyor = true; private static bool IsRunStacker = true; private static bool IsRunAlarm = true; private static DataTable PlcInfoDt; // 获取所有设备 private static DataTable AlarmDt; // 获取多有报警信息 private static int PlcSsxNums; //输送线 private static int PlcDjNums; //垛机 private static int TaskTypeCount70; //拆桶任务数量 private static int TaskYouxian; //出入库优先级 1出库 2入库 // 参考定义,标准版弄通后删除掉 private static bool m_bRuning = true; //private static DataTable AlarmDt; private static string plcSatu = string.Empty; private static string plcDjSatu = string.Empty; private static string LedTopStr = string.Empty; // Led上面多文本区域 private static string LedFootStr = string.Empty; // Led下面字幕区域 private static readonly WSChatController _chat; static TaskAction() { _chat = new WSChatController(); // WCS标准版本代码 执行一次 DALWcsMessage wcsSql = new DALWcsMessage(); PlcInfoDt = wcsSql.GetPlcInfos("", "", ""); AlarmDt = wcsSql.GetWcsAlarmInfo(); // 参考定义,标准版本弄通后删除掉 //DALWcsMessage wcsSql = new DALWcsMessage(); //AlarmDt = wcsSql.GetErrorInfor(); } /// /// PLC读写测试 /// /// /// public static void TestPlc(object source, System.Timers.ElapsedEventArgs e) { try { if (IsRunTast) { IsRunTast = false; Logger logger = LogManager.GetCurrentClassLogger(); //logger.Error("在运行" + "执行该方法:", "iis自动回收机制"); //连接测试 //string plcStatus = ""; //PlcIO plc = new PlcIO("192.168.8.40", 1, ref plcStatus); //if (plcStatus.Length > 0) //{ // // 连接失败 //} //string plcValue = ""; //plcValue = plc.GetPlcDBValue(1101, "String", "40.0"); //plcValue = plc.GetPlcDBValue(1101, "String", "360.0"); //led灯相应位置显示 // 提示LED选择执行批次 // LedDisplay(row["LedIP"].ToString(), "38工位", "入库前,请操作执行批次信息!", "停止入库\t"); //LedDisplay("192.168.8.55", "38工位 C1口", "空闲中D", "整托空桶/重桶入库分拣交互工位38"); //D口 //LedDisplay("192.168.8.51", "28工位 C口", "空闲中C1", "人工处理/整托袋子入库交互工位28"); //C1口 //LedDisplay("192.168.8.52", "24工位 B口", "空闲中C", "托袋子入库交互工位24"); //C口 //LedDisplay("192.168.8.54", "18工位 A口", "空闲中B", "吨袋入库B口 交互工位18"); //B口 //LedDisplay("192.168.8.53", "13工位 D口", "空闲中A", "桶类出入库A口 交互工位13"); //A口 // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口 ////LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理交互工位28"); //C1口 //LedDisplay("192.168.8.52", "24工位 C口", "空闲中", "托袋子入库交互工位24"); //C口 //LedDisplay("192.168.8.54", "18工位 B口", "空闲中", "吨袋入库B口 交互工位18"); //B口 //LedDisplay("192.168.8.53", "13工位 A口", "空闲中", "桶类出入库A口 交互工位13"); //A口 //LedDisplay("192.168.8.55", "38工位 D口", "空闲中", "整托空桶/重桶入库分拣交互工位38"); //D口 //return; //// 手动设置各工位状态 //plc.SetPlcDBValue(1101, "Int", "100", "420.0"); // PLC控制流程字 //var aa = plc.SetPlcDBValue(1101, "String", "T2300001", "400.0"); // 托盘号 //plc.SetPlcDBValue(1101, "Int", "70", "424.0"); // 任务类型 70满桶子母托入 80满桶母托入 //plc.SetPlcDBValue(1101, "Int", "60", "426.0"); // 物料类型 60:满桶字母托盘 70:满桶母托盘 //plc.SetPlcDBValue(1101, "Byte", "1", "428.0"); // 目标工位号 //plc.SetPlcDBValue(1101, "Byte", "1", "429.0"); // 字母托盘状态 0无 1有 //plc.SetPlcDBValue(1101, "Byte", "1", "430.0"); // 物料数量 //plc.SetPlcDBValue(1101, "Real", "200", "432.0"); // 物料重量 //plc.SetPlcDBValue(1101, "Byte", "0", "431.0"); // 拆跺数量 // 读取 //string plcValue = ""; //plcValue = plc.GetPlcDBValue(1101, "String", "400.0"); //plc.SetPlcDBValue(1101, "String", "T2300001", "10.0"); //plcValue = plc.GetPlcDBValue(1101, "Int", "420.0"); ////plc.SetPlcDBValue(1101, "Int", "99", "22.0"); //plcValue = plc.GetPlcDBValue(1101, "Int", "424.0"); ////plc.SetPlcDBValue(1101, "Int", "99", "24.0"); //plcValue = plc.GetPlcDBValue(1101, "Int", "426.0"); ////plc.SetPlcDBValue(1101, "Int", "99", "26.0"); //plcValue = plc.GetPlcDBValue(1101, "Byte", "428.0"); ////plc.SetPlcDBValue(1101, "Byte", "99", "28.0"); //plcValue = plc.GetPlcDBValue(1101, "Byte", "429.0"); ////plc.SetPlcDBValue(1101, "Byte", "99", "29.0"); //plcValue = plc.GetPlcDBValue(1101, "Byte", "430.0"); ////plc.SetPlcDBValue(1101, "Byte", "99", "30.0"); //plcValue = plc.GetPlcDBValue(1101, "Byte", "431.0"); ////plc.SetPlcDBValue(1101, "Byte", "99", "31.0"); //plcValue = plc.GetPlcDBValue(1101, "Real", "432.0"); ////plc.SetPlcDBValue(1101, "Real", "99", "32.0"); // LED显示屏连接测试 //LedDll Led = new LedDll(); //Led.LEDstr("192.168.8.55", "最上方", "中间多文本区域!", "最下方区域 "); // 接口测试 //WCSPalletBind model = new WCSPalletBind(); //model.PalletNo = "T2300001"; //model.TaskType = "001"; //model.SubPallet = "0"; //model.SkuQty = 10; //model.SkuWeight = "235"; //model.SkuType = "001"; //model.LotNo = "2305190"; //model.SupplierLot = ""; //DALWcsMessage wcsMySql = new DALWcsMessage(); //string endLocat = ""; // 取货工位号 //string strMsg = wcsMySql.GetLocation("T2300001", model, ref endLocat); //plc.ClosePlc(); IsRunTast = true; } } catch (Exception ex) { throw ex; } finally { //IsRunTast = true; } } /// /// 获取当前工位交互流程字为多少 /// public static string GetPlcOrWcsPos(string Ip, string Stat, string Plcpos) { #region 与PLC交互逻辑 DataRow[] iProws = null; string type = "0"; //判断是输送线连接还是垛机连接 if (Ip == "192.168.8.40") { type = "1"; // 获取运输线交互IP集合 iProws = PlcInfoDt.Select("Level = '0' and Type = '1' "); } else { // 获取跺机交互IP集合 iProws = PlcInfoDt.Select("Level = '0' and Type = '0' "); } // 连接运输线PlC //string plcIp = ipRow["PlcIP"].ToString(); string plcStatus = ""; // PLC连接状态 PlcIO plc = new PlcIO(Ip, 1, ref plcStatus); if (plcStatus.Length > 0) { return "连接垛机或输送线异常!"; } //else //{ //if (type == "1") //{ // //输送线 // PlcCounts(1, 0, "获取工位流程字 连接"); //} //else //{ // //垛机 // PlcCounts(0, 1, "获取工位流程字 连接"); //} //} try { // 循环连接运输线设备 foreach (DataRow ipRow in iProws) { // 循环各跺机与PLC进行交互 DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '{type}' and PlcIP='{Ip}' "); //rows.Select(a=>a.) rows = PlcInfoDt.Select($"StationNum = '{Stat}' and PlcPos = '{Plcpos}'"); foreach (DataRow row in rows) { // 读取工位流程字 string dbNumber = row["DbNumber"].ToString(); string posType = row["PosType"].ToString(); string plcPos = row["PlcPos"].ToString(); string wcsPos = row["WcsPos"].ToString(); string stationNum = row["StationNum"].ToString(); string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); //判断工位号 if (stationNum == Stat) { if (plcValue == "0" || plcValue == "10" || plcValue == "20" || plcValue == "21" || plcValue == "22" || plcValue == "100" || plcValue == "110" || plcValue == "120" || plcValue == "130" || plcValue == "140" || plcValue == "200" || plcValue == "210" || plcValue == "290" || plcValue == "300" || plcValue == "310" || plcValue == "320") { // 关闭设备连接 plc.ClosePlc(); //if (type == "1") //{ // //输送线 // PlcCounts(-1, 0, "获取工位流程字 断开"); //} //else //{ // //垛机 // PlcCounts(0, -1, "获取工位流程字 断开"); //} return plcValue; } else { continue; } } else { continue; } } } } catch { // 关闭设备连接 plc.ClosePlc(); //if (type == "1") //{ // //输送线 // PlcCounts(-1, 0, "获取工位流程字(异常处) 断开"); //} //else //{ // //垛机 // PlcCounts(0, -1, "获取工位流程字(异常处) 断开"); //} } // 关闭设备连接 plc.ClosePlc(); //if (type == "0") //{ // //输送线 // PlcCounts(-1, 0, "获取工位流程字 断开"); //} //else //{ // //垛机 // PlcCounts(0, -1, "获取工位流程字 断开"); //} return null; #endregion } /// /// 运输线 /// public static void Conveyors(object source, System.Timers.ElapsedEventArgs e) { try { if (IsRunConveyor) { Logger logger = LogManager.GetCurrentClassLogger(); IsRunConveyor = false; #region 与PLC交互逻辑 // 获取运输线交互IP集合 DataRow[] iProws = PlcInfoDt.Select("Level = '0' and Type = '1' "); string plcStatus = ""; // PLC连接状态 PlcIO plc = new PlcIO("192.168.8.40", 1, ref plcStatus); int a = 0; // 循环连接运输线设备 foreach (DataRow ipRow in iProws) { if (plcStatus.Length > 0) { // 通知前端设备监控画面连接PLC失败 WSChatController wSChat = new WSChatController(); wSChat.AlarmInformation("连接设备失败:" + ipRow["Name"].ToString(), ""); // LED显示连连接失败 LedDll Led = new LedDll(); Led.LEDstr(ipRow["LedIP"].ToString(), "提示", "连接不上PLC,请检查网络连接!", ipRow["Name"].ToString()); break; } //else //{ // //输送线 // PlcCounts(1, 0, "运输线连接处 连接348"); //} // 循环各工位与PLC进行交互 DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and PlcIP='192.168.8.40' "); foreach (DataRow row in rows) { // 读取工位流程字 string dbNumber = row["DbNumber"].ToString(); string posType = row["PosType"].ToString(); string plcPos = row["PlcPos"].ToString(); string wcsPos = row["WcsPos"].ToString(); string stationNum = row["StationNum"].ToString(); string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); // 判断该工位是否有任务 if (plcValue == "0" || plcValue == "10") { continue; } else if (plcValue == "20" || plcValue == "21" || plcValue == "22" || plcValue == "100" || plcValue == "110" || plcValue == "120" || plcValue == "130" || plcValue == "140" || plcValue == "200" || plcValue == "210" || plcValue == "290" || plcValue == "300" || plcValue == "310" || plcValue == "320" || plcValue == "330") { try { BllHandler(plc, plcValue, row); } catch { } } else { continue; } } } // 关闭设备连接 plc.ClosePlc(); //PlcCounts(-1, 0, "运输线连接处 断开388"); //logger.Error("是否进入?"+a.ToString()); IsRunConveyor = true; #endregion } } catch (Exception ex) { IsRunConveyor = true; Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("输送线异常消息:" + ex.Message, "输送线定时器错误"); } } /// /// 堆垛机 /// public static void Stackers(object source, System.Timers.ElapsedEventArgs e) { try { if (IsRunStacker) { //Logger logger = LogManager.GetCurrentClassLogger(); //var logStr = $@".\LogFile\WCS连接输送线、垛机\接收垛机连接成功" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; //logger.Error("垛机定时进入成功", logStr); IsRunStacker = false; #region 与PLC交互逻辑 // 获取跺机交互IP集合 DataRow[] iProws = PlcInfoDt.Select("Level = '0' and Type = '0' "); //string plcStatus1 = ""; // PLC连接状态 //string plcStatus2 = ""; // PLC连接状态 //string plcStatus3 = ""; // PLC连接状态 //PlcIO plc1 = new PlcIO("192.168.8.10", 1, ref plcStatus1); //PlcIO plc2 = new PlcIO("192.168.8.20", 1, ref plcStatus2); //PlcIO plc3 = new PlcIO("192.168.8.30", 1, ref plcStatus3); // 循环连接跺机设备 foreach (DataRow ipRow in iProws) { // 连接跺机PlC string plcIp = ipRow["PlcIP"].ToString(); string plcStatus = ""; // PLC连接状态 PlcIO plc = new PlcIO(plcIp, 1, ref plcStatus); if (plcStatus.Length > 0) //if (plcStatus1.Length > 0 || plcStatus2.Length > 0 || plcStatus3.Length >0) { // 通知前端设备监控画面连接PLC失败 WSChatController wSChat = new WSChatController(); wSChat.AlarmInformation("连接跺机失败:" + ipRow["Name"].ToString(), ""); // LED显示连连接失败 LedDll Led = new LedDll(); Led.LEDstr(ipRow["LedIP"].ToString(), "提示", "连接不上跺机,请检查网络连接!", ipRow["Name"].ToString()); break; } //else //{ // PlcCounts(0, 1, "垛机处 连接449"); //} // 循环各跺机与PLC进行交互 DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '0' and PlcIP='{plcIp}' "); foreach (DataRow row in rows) { // 读取工位流程字 string dbNumber = row["DbNumber"].ToString(); string posType = row["PosType"].ToString(); string plcPos = row["PlcPos"].ToString(); //string plcValue = ""; //if (plcIp == "192.168.8.10") //{ // plcValue = plc1.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); //}else if (plcIp == "192.168.8.20") //{ // plcValue = plc2.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); //}else if (plcIp == "192.168.8.30") //{ // plcValue = plc3.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); //} string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); if (plcValue == "0") { continue; } else if (plcValue == "10" || plcValue == "20" || plcValue == "30" || plcValue == "40" || plcValue == "50" || plcValue == "100") { //if (plcIp == "192.168.8.10") //{ // BllHandlerDj(plc1, plcValue, row); //} //else if (plcIp == "192.168.8.20") //{ // BllHandlerDj(plc2, plcValue, row); //} //else if (plcIp == "192.168.8.30") //{ // BllHandlerDj(plc3, plcValue, row); //} try { BllHandlerDj(plc, plcValue, row); } catch { } //BllHandlerDj(plc, plcValue, row); } else { continue; } } // 关闭设备连接 plc.ClosePlc(); //PlcCounts(0, -1, "垛机处 断开511"); } #endregion IsRunStacker = true; } } catch (Exception ex) { IsRunStacker = true; Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("堆垛机异常消息:" + ex.Message, "堆垛机定时器错误"); } } /// /// 报警 /// public static void Alarms(object source, System.Timers.ElapsedEventArgs e) { try { if (IsRunAlarm) { IsRunAlarm = false; DataRow[] iProws = PlcInfoDt.Select("Level = '0'"); // 循环连接运输线设备 foreach (DataRow ipRow in iProws) { // 获取所有设备IP地址 string plcIp = ipRow["PlcIP"].ToString(); string plcStatus = ""; // PLC连接状态 PlcIO plc = new PlcIO(plcIp, 1, ref plcStatus); if (plcStatus.Length > 0) { continue; } DataRow[] rows = AlarmDt.Select($"PlcIP = '{plcIp}'"); Parallel.For(0, rows.Length, item => { string value = plc.GetPlcMBValue("Bit", rows[item]["AlarmCode"].ToString()); if (value == "True") { // 改变报警信息表数据 //if () //{ //} } else { // 改变报警信息表数据 } }); } //foreach (DataRow row in AlarmDt.Rows) //{ // // 改为for的并循环 // string Mstr = string.Empty; // string vluestr = string.Empty; // switch (row["IPAddre"].ToString()) // { // case "跺机": // vluestr = plcDJ.GetPlcMBValue("Bit", row["M"].ToString()); // if (vluestr == "True") // { // plcDjBl = true; // // 发送到LED屏幕运行状态区域 // Mstr = row["AlarmStr"].ToString(); // string AccessCode = row["AccessCode"].ToString(); // Led.SetMstrLeds(AccessCode, Mstr); // // 将报警信息存储到Table // wcsSql.SetErrorMessage("跺机报警", row["M"].ToString(), Mstr); // // 读取M点报警信息;通知前端刷新 // WSChatController wSChat = new WSChatController(); // wSChat.AlarmInformation("跺机报警:" + Mstr); // }; // break; // case "输送线": // vluestr = plc.GetPlcMBValue("Bit", row["M"].ToString()); // if (vluestr == "True") // { // plcBl = true; // // 发送到LED屏幕运行状态区域 // Mstr = row["AlarmStr"].ToString(); // string AccessCode = row["AccessCode"].ToString(); // Led.SetMstrLeds(AccessCode, Mstr); // // 将报警信息存储到Table // wcsSql.SetErrorMessage("输送线报警", row["M"].ToString(), Mstr); // // 读取M点报警信息;通知前端刷新 // //WSChatController wSChat = new WSChatController(); // //wSChat.AlarmInformation("输送线报警:" + Mstr); // }; // break; // default:; break; // } //} // 开始交互逻辑 // 开始交互逻辑 Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "测试运行时间"); IsRunAlarm = true; } } catch (Exception ex) { throw ex; } } /// /// 清除log日志 /// public static void DeleteNlogFile(object source, System.Timers.ElapsedEventArgs e) { try { // 时 分 秒 // 得到 hour minute second 如果等于某个值就开始执行某个程序。 int intHour = e.SignalTime.Hour; int intMinute = e.SignalTime.Minute; //int intSecond = e.SignalTime.Second; // 定制时间; 比如 在10:30 :00 的时候执行某个函数 int iHour = 00; int iMinute = 05; //int iSecond = 00; // 设置 在每天晚上的23点50执行 //if (intHour == iHour && intMinute == iMinute && intSecond == iSecond) if (intHour == iHour && intMinute == iMinute) { int count = 0; string[] files = Directory.GetFiles("E:\\server\\WcsServer\\LogFile"); //string[] files = Directory.GetFiles("D:\\WMS\\JC08Wcs\\WCS-V1.0\\wms\\LogFile"); foreach (string file in files) { FileInfo fi = new FileInfo(file); var a = fi.Name.Split('.'); a[0].ToDate(); if (a[0].ToDate() < DateTime.Now.AddMonths(-1)) { count += 1; fi.Delete(); } } Logger logger = LogManager.GetCurrentClassLogger(); if (count > 0) { logger.Error("清除WCS日志消息:清除成功"); //调用WMS清除日志接口 var response = Utility.Extra.HttpHelper.DoPost("http://192.168.220.137:8081/api/DownAPi/DeleteNlogFile", null); if (response != "清除成功") { logger.Error("清除WMS日志消息:清除成功"); } } } //else if (intHour == 03 && intMinute == 00) //{ // var response = Utility.Extra.HttpHelper.DoPost("http://192.168.220.137:8081/api/DownAPi/UptTaskYouxian", null); // BLLYouxian("出库任务优先"); //} } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("清除日志异常消息:" + ex.Message, "清除日志定时器错误"); } } public static void BLLYouxian(string str) { //判断优先级 if (str == "出库任务优先") { TaskYouxian = 1; //return ""; } else if (str == "入库任务优先") { TaskYouxian = 2; //return ""; } } /// /// 运输线业务处理函数 /// /// PLC连接 /// PLC控制字 /// 工位信息 private static void BllHandler(PlcIO plc, string plcValue, DataRow row) { try { //WebStocket发送消息 WSChatController wSChat = new WSChatController(); DALWcsMessage wcsMySql = new DALWcsMessage(); DataTable dt = wcsMySql.GetWCSConveyorInfo(); TaskReques taskReques = new TaskReques(); string palletNo = ""; // 托盘号 string taskType = ""; // 任务类型 string skuType = ""; // 物料类型 string subPallet = ""; // 有无子托盘 0无 1有 string skuQty = ""; // 物料数量 string disQty = ""; // 拆跺数量 string skuWeight = ""; // 物料重量 string packagingStatus = ""; //打包状态 string wrappedStatus = ""; //缠膜状态 // 托盘绑定实体类 WCSPalletBind model = new WCSPalletBind(); // 任务明细实体类 WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); tasksMonitor.TaskNo = ""; tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.Status = "2"; // 执行完成 switch (row["StationNum"].ToString()) { #region 申请储位工位 case "13": #region A口 子托盘跺 母托盘跺 if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { palletNo = plc.GetPlcDBValue(1101, "String", "240.0"); // 托盘号 // Led提示给客户 LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:申请储位", "桶类出入库A口 交互工位13"); //A口 taskType = plc.GetPlcDBValue(1101, "Int", "264.0"); // 任务类型 skuType = plc.GetPlcDBValue(1101, "Int", "266.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "269.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "270.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "272.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "274.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "278.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "279.0"); //缠膜状态 // 获取当前口批次信息 DataRow conRow = null; var aa = dt; if (skuType != "10" && skuType != "20" && skuType != "21") { conRow = dt.Select("Conveyor = 'A'")[0]; } // 将托盘绑定信息插存储到组托表 model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.StationNum = "13"; if (skuType != "10" && skuType != "20" && skuType != "21") { //model.SkuType = conRow["SkuType"].ToString(); model.LotNo = conRow["LotNo"].ToString(); model.SupplierLot = conRow["SupplierLot"].ToString(); model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString()); } model.PlcId = row["Id"].ToString(); // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "268.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:13工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:入库中", "桶类出入库A口 交互工位13"); //A口 } } } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "240.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "268.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "13"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); LedDisplay("192.168.8.53", "13工位 A口", "空闲中", "桶类出入库A口 交互工位13"); //A口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:申请储位失败", "桶类出入库A口 交互工位13"); //A口 } else if (plcValue == "140") { // 不用管 break; } else if (plcValue == "320") { //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "240.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "268.0"); // 目标地址 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); if (dt3.Rows.Count == 0) { plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); LedDisplay("192.168.8.53", "13工位 A口", $"{palletNo}:出库完成", "桶类出入库A口 交互工位13"); //A口 //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "13"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = "13"; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); } } LedDisplay("192.168.8.53", "13工位 A口", "空闲中", "桶类出入库A口 交互工位13"); //A口 break; } #endregion break; case "18": #region B口 子托盘跺 母托盘跺 if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { palletNo = plc.GetPlcDBValue(1101, "String", "280.0"); // 托盘号 // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", $"{palletNo}:申请储位", "吨袋入库B口 交互工位18"); //B口 taskType = plc.GetPlcDBValue(1101, "Int", "304.0"); // 任务类型 skuType = plc.GetPlcDBValue(1101, "Int", "306.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "309.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "310.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "312.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "314.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "318.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "319.0"); //缠膜状态 // 获取当前口批次信息 DataRow conRow = dt.Select("Conveyor = 'B'")[0]; // 将托盘绑定信息插存储到组托表 model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.StationNum = "18"; //model.SkuType = conRow["SkuType"].ToString(); model.LotNo = conRow["LotNo"].ToString(); model.SupplierLot = conRow["SupplierLot"].ToString(); model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString()); model.PlcId = row["Id"].ToString(); // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "308.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:18工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", $"{palletNo}:入库中", "吨袋入库B口 交互工位18"); //B口 } } } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "280.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "308.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "18"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "空闲中", "吨袋入库B口 交互工位18"); //B口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "申请储位失败", "吨袋入库B口 交互工位18"); //B口 } else if (plcValue == "140") { // 不用管 break; } else if (plcValue == "320") { // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "出库完成", "吨袋入库B口 交互工位18"); //B口 //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "280.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "308.0"); // 目标地址 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); if (dt3.Rows.Count == 0) { plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "18"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = "18"; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); } } // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "空闲中", "吨袋入库B口 交互工位18"); //B口 break; } #endregion break; case "24": #region C口 500kg吨袋入库 子托盘跺 母托盘跺 if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { palletNo = plc.GetPlcDBValue(1101, "String", "320.0"); // 托盘号 LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:申请储位", "整托袋子入库交互工位24"); //C口 taskType = plc.GetPlcDBValue(1101, "Int", "344.0"); // 任务类型 skuType = plc.GetPlcDBValue(1101, "Int", "346.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "349.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "350.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "352.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "354.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "358.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "359.0"); //缠膜状态 // 获取当前口批次信息 DataRow conRow = dt.Select("Conveyor = 'C'")[0]; // 将托盘绑定信息插存储到组托表 //WCSPalletBind model = new WCSPalletBind(); model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.LotNo = conRow["LotNo"].ToString(); model.SupplierLot = conRow["SupplierLot"].ToString(); model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString()); model.StationNum = "24"; model.PlcId = row["Id"].ToString(); // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "348.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:24工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); // Led提示给客户 LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:入库中", "整托袋子入库交互工位24"); //C口 } } } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "320.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "348.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "24"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.52", "24工位 C口", "空闲中", "整托袋子入库交互工位24"); //C口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:申请储位失败", "整托袋子入库交互工位24"); //C口 } else if (plcValue == "140") { // 不用管 break; } else if (plcValue == "320") { // Led提示给客户 LedDisplay("192.168.8.52", "24工位 C口", $"{palletNo}:出库完成", "整托袋子入库交互工位24"); //C口 //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "320.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "348.0"); // 目标地址 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); if (dt3.Rows.Count == 0) { plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "24"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = "24"; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); } } // Led提示给客户 LedDisplay("192.168.8.52", "24工位 C口", "空闲中", "整托袋子入库交互工位24"); //C口 break; } #endregion break; case "28": #region C1口 25kg袋子入库 子托盘跺 母托盘跺 if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { palletNo = plc.GetPlcDBValue(1101, "String", "360.0"); // 托盘号 // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位", "人工处理/整托袋子入库交互工位28"); //C1口 taskType = plc.GetPlcDBValue(1101, "Int", "384.0"); // 任务类型 skuType = plc.GetPlcDBValue(1101, "Int", "386.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "389.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "390.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "392.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "394.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "398.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "399.0"); //缠膜状态 // 获取当前口批次信息 DataRow conRow = null; var aa = dt; if (skuType != "10" && skuType != "20" && skuType != "21") { conRow = dt.Select("Conveyor = 'C1'")[0]; } // 将托盘绑定信息插存储到组托表 model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 if (skuType != "10" && skuType != "20" && skuType != "21") { model.LotNo = conRow["LotNo"].ToString(); model.SupplierLot = conRow["SupplierLot"].ToString(); model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString()); } model.StationNum = "28"; model.PlcId = row["Id"].ToString(); // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "388.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:28工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:入库中", "人工处理/整托袋子入库交互工位28"); //C1口 } } } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "360.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "388.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "28"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位失败", "人工处理/整托袋子入库交互工位28"); //C1口 } else if (plcValue == "140") { // 不用管 break; } else if (plcValue == "320") { // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:出库完成", "人工处理/整托袋子入库交互工位28"); //C1口 //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "360.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "388.0"); // 目标地址 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); if (dt3.Rows.Count == 0) { plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "28"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); tasksMonitor.EndLocat = "28"; tasksMonitor.Status = "2"; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); } } // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口 break; } #endregion break; case "38": #region D口 桶类(塑料空桶 铁空桶 重桶)物料入库 palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号 taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库 skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "432.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "434.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "438.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "439.0"); //缠膜状态 // 绑定托盘实体类 model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.StationNum = "38"; model.PlcId = row["Id"].ToString(); if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { // Led提示给客户 LedDisplay("192.168.8.55", "38工位 D口", $"{palletNo}:申请储位", "整托空桶/重桶入库分拣交互工位38"); //D口 // 获取当前口批次信息 DataRow[] conRows = dt.Select("Conveyor = 'D'"); if (conRows.Length <= 0) { // 提示LED选择执行批次 LedDisplay(row["LedIP"].ToString(), "38工位 D口", $"{palletNo}:入库前,请操作执行批次信息!", "停止入库\t"); break; } else { // 提示LED正在入库 LedDisplay(row["LedIP"].ToString(), "38工位 D口", $"{palletNo}:正在入库,请误进行其他操作!", "停止操作\t"); } DataRow conRow = conRows[0]; // 将托盘绑定信息插存储到组托表 model.LotNo = conRow["LotNo"].ToString(); model.SupplierLot = conRow["SupplierLot"].ToString(); model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString()); //model.SkuType = conRow["SkuType"].ToString(); // 桶类的PLC无法确认物料类型 // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //TaskMonitorManager.ToolBar(); //WebSocket socket = ("Wcs/"); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "428.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = "写入指令:38工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); // Led提示给客户 LedDisplay("192.168.8.55", "38工位 D口", $"{palletNo}:入库中", "整托空桶/重桶入库分拣交互工位38"); //D口 } } } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "428.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "38"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.55", "38工位 D口", "空闲中", "整托空桶/重桶入库分拣交互工位38"); //D口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.55", "38工位 D口", $"{palletNo}:申请储位失败", "整托空桶/重桶入库分拣交互工位38"); //D口 } else if (plcValue == "140") { // 不用管 break; } else if (plcValue == "320") { // Led提示给客户 LedDisplay("192.168.8.55", "38工位 D口", "{palletNo}:出库完成", "整托空桶/重桶入库分拣交互工位38"); //D口 //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "428.0"); // 目标地址 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); if (dt3.Rows.Count == 0) { plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "38"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = "38"; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "320", row["WcsPos"].ToString(), palletNo); //_chat.Get(); } } // Led提示给客户 LedDisplay("192.168.8.55", "38工位 D口", "空闲中", "整托空桶/重桶入库分拣交互工位38"); //D口 break; } #endregion break; case "23": #region 23号工位(物料、空托盘垛)物料入库 palletNo = plc.GetPlcDBValue(1101, "String", "440.0"); // 托盘号 taskType = plc.GetPlcDBValue(1101, "Int", "464.0"); // 任务类型 10 入库 其它为出库 skuType = plc.GetPlcDBValue(1101, "Int", "466.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "469.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "470.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "472.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "474.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "478.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "479.0"); //缠膜状态 // 绑定托盘实体类 model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.StationNum = "23"; model.PlcId = row["Id"].ToString(); if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务 { //向WMS申请塑料子托盘垛 string endLocat = "23"; // 送货工位号 string skulinshi = "100098"; //子托盘塑料 - 蓝色 if (model.SkuType == "22") { skulinshi = "100096"; //子托盘塑料 - 黑色 } string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, skulinshi, endLocat); if (string.IsNullOrEmpty(strMsg)) { break; } //向WMS申请空托盘信息 else if (strMsg.Contains("-1")) // 申请空托盘失败 { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo1}:申请空托盘失败!"; tasksMonitor.PalletNo = palletNo1; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo1); } else // 申请空托盘成功 { //收到申请后给plc返回20 plc.SetPlcDBValue(1101, "Int", "20", "462.0", palletNo1); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo1); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo1}:申请空托盘", "人工处理/整托袋子入库交互工位28"); //C1口 } } else if (plcValue == "21") { // 不用管 plc处理中 break; } else if (plcValue == "22") { // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:出库完成", "人工处理/整托袋子入库交互工位28"); //C1口 //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "440.0"); // 托盘号 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "23"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { //收到22后 为plc确认货物到41工位 在任务明细中加入空托出库完成 // 写入wcs流程控制字 21 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请空托出库完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); tasksMonitor.EndLocat = "23"; tasksMonitor.Status = "2"; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口 } } } else if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位", "人工处理/整托袋子入库交互工位28"); //C1口 //// 获取当前口批次信息 //DataRow[] conRows = dt.Select("Conveyor = 'D'"); //if (conRows.Length <= 0) //{ // // 提示LED选择执行批次 // //LedDisplay(row["LedIP"].ToString(), "23工位", "入库前,请操作执行批次信息!", "停止入库\t"); // break; //} //DataRow conRow = conRows[0]; //// 将托盘绑定信息插存储到组托表 //model.LotNo = conRow["LotNo"].ToString(); //model.SupplierLot = conRow["SupplierLot"].ToString(); //model.SkuType = conRow["SkuType"].ToString(); // 桶类的PLC无法确认物料类型 // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "468.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:23工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } } // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:入库中", "人工处理/整托袋子入库交互工位28"); //C1口 } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "440.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "468.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "23"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位失败", "人工处理/整托袋子入库交互工位28"); //C1口 } else if (plcValue == "140") { // 不用管 break; } #endregion break; case "33": #region 33号工位(物料、空托盘垛)物料入库 palletNo = plc.GetPlcDBValue(1101, "String", "480.0"); // 托盘号 taskType = plc.GetPlcDBValue(1101, "Int", "504.0"); // 任务类型 10 入库 其它为出库 skuType = plc.GetPlcDBValue(1101, "Int", "506.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "509.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "510.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "512.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "514.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "518.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "519.0"); //缠膜状态 // 绑定托盘实体类 model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.StationNum = "33"; model.PlcId = row["Id"].ToString(); if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务 { //向WMS申请塑料子托盘垛 string endLocat = "33"; // 送货工位号 string skulinshi = "100097"; //子托盘木制 - 单面 if (model.SkuType == "23") { skulinshi = "100095"; //子托盘木制 - 双面 } string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, skulinshi, endLocat); if (string.IsNullOrEmpty(strMsg)) { break; } //向WMS申请空托盘信息 else if (strMsg.Contains("-1")) // 申请空托盘失败 { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo1}:申请空托盘失败!"; tasksMonitor.PalletNo = palletNo1; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo1); } else // 申请空托盘成功 { //收到申请后给plc返回20 plc.SetPlcDBValue(1101, "Int", "20", "502.0", palletNo); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo1); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo1}:申请空托盘", "人工处理/整托袋子入库交互工位28"); //C1口 } } else if (plcValue == "21") { // 不用管 plc处理中 break; } else if (plcValue == "22") { // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:出库完成", "人工处理/整托袋子入库交互工位28"); //C1口 //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "480.0"); // 托盘号 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "33"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { //收到22后 为plc确认货物到41工位 在任务明细中加入空托出库完成 // 写入wcs流程控制字 21 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请空托出库完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); tasksMonitor.EndLocat = "33"; tasksMonitor.Status = "2"; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口 } } } else if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位", "人工处理/整托袋子入库交互工位28"); //C1口 //// 获取当前口批次信息 //DataRow[] conRows = dt.Select("Conveyor = 'D'"); //if (conRows.Length <= 0) //{ // // 提示LED选择执行批次 // LedDisplay(row["LedIP"].ToString(), "28工位 C1口", "入库前,请操作执行批次信息!", "停止入库\t"); // break; //} //DataRow conRow = conRows[0]; //// 将托盘绑定信息插存储到组托表 //model.LotNo = conRow["LotNo"].ToString(); //model.SupplierLot = conRow["SupplierLot"].ToString(); //model.SkuType = conRow["SkuType"].ToString(); // 桶类的PLC无法确认物料类型 // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "508.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:33工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:入库中", "人工处理/整托袋子入库交互工位28"); //C1口 } } //LedDisplay(row["LedIP"].ToString(), "23工位", ledStr, row["Name"].ToString()); } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "480.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "508.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "33"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", "空闲中", "人工处理/整托袋子入库交互工位28"); //C1口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.51", "28工位 C1口", $"{palletNo}:申请储位失败", "人工处理/整托袋子入库交互工位28"); //C1口 } else if (plcValue == "140") { // 不用管 break; } #endregion break; case "41": #region 41号工位(物料、空托盘垛)物料入库 palletNo = plc.GetPlcDBValue(1101, "String", "520.0"); // 托盘号 taskType = plc.GetPlcDBValue(1101, "Int", "544.0"); // 任务类型 10 入库 其它为出库 skuType = plc.GetPlcDBValue(1101, "Int", "546.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "549.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "550.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "552.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "554.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "558.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "559.0"); //缠膜状态 // 绑定托盘实体类 model.PalletNo = palletNo; model.TaskType = taskType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.StationNum = "41"; model.PlcId = row["Id"].ToString(); model.SkuType = skuType; if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务 { //向WMS申请塑料子托盘垛 string endLocat = "41"; // 送货工位号 string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, "100099", endLocat); if (string.IsNullOrEmpty(strMsg)) { // 关闭设备连接 plc.ClosePlc(); break; } //向WMS申请空托盘信息 else if (strMsg.Contains("-1")) // 申请空托盘失败 { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo1}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo1; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo1); //_chat.Get(); // 关闭设备连接 plc.ClosePlc(); } else // 申请空托盘成功 { //收到申请后给plc返回20 plc.SetPlcDBValue(1101, "Int", "20", "542.0", palletNo1); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo1); } } else if (plcValue == "21") { //收到申请后给plc返回20 //plc.SetPlcDBValue(1101, "Int", "0", "542.0"); // 不用管 plc处理中 break; } else if (plcValue == "22") { //物料到达出库位置 进行处理 palletNo = plc.GetPlcDBValue(1101, "String", "520.0"); // 托盘号 //获取出库任务 DataTable dt3 = wcsMySql.GetWCSTasks("1", "", palletNo); // 判断任务类型 DataRow taskRow = dt3.Rows[0]; if (taskRow["Type"].ToString() == "1") { //修改任务状态 出库成功 wcsMySql.SetWCSTasks(palletNo, "2", "41"); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsMySql.RequestTasks(taskReques); if (bl) { //收到22后 为plc确认货物到41工位 在任务明细中加入空托出库完成 // 写入wcs流程控制字 21 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请空托出库完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); tasksMonitor.EndLocat = "41"; tasksMonitor.Status = "2"; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } } } else if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "548.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:41工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } } //LedDisplay(row["LedIP"].ToString(), "41工位", ledStr, row["Name"].ToString()); } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "520.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "548.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "41"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } else if (plcValue == "140") { // 不用管 break; } #endregion break; case "20": #region 20号工位 物料入库 if (plcValue == "100") // PLC 写入物料信息,任务类型,向WCS申请绑定 { palletNo = plc.GetPlcDBValue(1101, "String", "560.0"); // 托盘号 // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B1口", $"{palletNo}:申请储位", "吨袋入库B口 交互工位18"); //B口 taskType = plc.GetPlcDBValue(1101, "Int", "584.0"); // 任务类型 skuType = plc.GetPlcDBValue(1101, "Int", "586.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "589.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "590.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "592.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "594.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "598.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "599.0"); //缠膜状态 // 获取当前口批次信息 DataRow conRow = null; var aa = dt; if (skuType != "10" && skuType != "20" && skuType != "21") { conRow = dt.Select("Conveyor = 'B'")[0]; } // 将托盘绑定信息插存储到组托表 model.PalletNo = palletNo; model.TaskType = taskType; model.SkuType = skuType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; //打带 model.WrappedStatus = wrappedStatus; //缠膜 model.IsBale = wrappedStatus; //裹包 model.IsBelt = packagingStatus; //打带 model.StationNum = "18"; if (skuType != "10" && skuType != "20" && skuType != "21") { //model.SkuType = conRow["SkuType"].ToString(); model.LotNo = conRow["LotNo"].ToString(); model.SupplierLot = conRow["SupplierLot"].ToString(); model.ManuFactureDate = DateTime.Parse(conRow["ManuFactureDate"].ToString()); } model.PlcId = row["Id"].ToString(); // 向WMS申请储位信息 string endLocat = ""; // 取货工位号 string strMsg = wcsMySql.GetLocation(palletNo, model, ref endLocat); string ledStr = strMsg; if (strMsg.Contains("-1")) // 申请储位失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:申请储位绑定托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(palletNo, "1", ""); // 写入目的工位 plc.SetPlcDBValue(1101, "Byte", endLocat, "588.0", palletNo); // 写入wcs控制字流程100 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); if (inBl) { // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:18工位====》" + endLocat + "工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B1口", $"{palletNo}:入库中", "吨袋入库B口 交互工位18"); //B口 //_chat.Get(); } } //LedDisplay(row["LedIP"].ToString(), "41工位", ledStr, row["Name"].ToString()); } else if (plcValue == "110") { //读取托盘号 palletNo = plc.GetPlcDBValue(1101, "String", "560.0"); // 托盘号 //读取目标地址 string endLocat = plc.GetPlcDBValue(1101, "Byte", "588.0"); // 目标地址 // 写入wcs流程控制字 110 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "110", row["WcsPos"].ToString(), palletNo); // 写入任务明细表 tasksMonitor.StartLocat = "18"; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC收到指令开始执行!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B1口", "空闲中", "吨袋入库B口 交互工位18"); //B口 } else if (plcValue == "120") { // 不用管 流程控制字为120时,代表输送线将托盘运往入库口; break; } else if (plcValue == "130") { // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "130", row["WcsPos"].ToString(), palletNo); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo}:PLC接收到申请储位绑定失败信号!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B1口", $"{palletNo}:申请储位失败", "吨袋入库B口 交互工位18"); //B口 //_chat.Get(); } else if (plcValue == "140") { // 不用管 break; } #endregion break; #endregion #region 入库取货工位 case "2": #region 1号跺机 if (plcValue == "200" || plcValue == "210") { // 获取任务信息 DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo); palletNo = plc.GetPlcDBValue(1101, "String", "0.0"); // 托盘号 string plcStatus = ""; PlcIO plcDj = new PlcIO("192.168.8.10", 1, ref plcStatus); if (plcStatus.Length > 0) { // 连接跺机失败 写入任务明细表 //tasksMonitor.StartLocat = "2"; //tasksMonitor.InteractiveMsg = "1号跺机连接失败!"; //tasksMonitor.PalletNo = palletNo; //wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 连接剁机失败 写入log日志 Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "1号跺机连接失败!"); break; } //else //{ // PlcCounts(0, 1, "1号垛机 入库取货工位 连接2586"); //} try { // 获取跺机当前状态 string djValue = plcDj.GetPlcDBValue(1101, "Int", "0.0"); if (djValue != "10") { //string djendLocat = dtdj.Rows[0]["EndLocat"].ToString(); Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "1号跺机有任务稍后执行!"); // 跺机占用 写入任务明细表 //tasksMonitor.StartLocat = "2"; //tasksMonitor.InteractiveMsg = "1号跺机有任务稍后执行!"; //tasksMonitor.PalletNo = palletNo; //tasksMonitor.EndLocat = djendLocat; //wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "1号垛机 入库取货工位 断开2606"); break; } // 获取任务信息 DataTable dt02 = wcsMySql.GetWCSTasks("1", "0", palletNo); if (plcValue == "220") { dt02 = wcsMySql.GetWCSTasks("1", "0", ""); } if (dt02 == null || dt02.Rows.Count <= 0) { // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "1号垛机 入库取货工位 断开2619"); break; } string endLocat = dt02.Rows[0]["EndLocat"].ToString(); //[] locats = endLocat.Split('-'); string pai = int.Parse(endLocat.Substring(0, 2)).ToString(); string lie = int.Parse(endLocat.Substring(2, 2)).ToString(); string ceng = int.Parse(endLocat.Substring(4, 2)).ToString(); string shen = int.Parse(endLocat.Substring(6, 2)).ToString(); #region 放货工位算法 //判断排是否为单数 if (int.Parse(pai) % 2 == 0) //双数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是双数 深度为1 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } else if (shen == "2") //深度为2 { //排数是双数 深度为2 排数*2 pai = (int.Parse(pai) * 2).ToString(); } } //判断是否为双数 else//单数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是单数 深度为1 排数*2 pai = (int.Parse(pai) * 2).ToString(); } else if (shen == "2") //深度为2 { //排数是单数 深度为2 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } } //判断是否大于8 if (int.Parse(pai) > 8) { pai = (int.Parse(pai) - 8).ToString(); } //判断排数大于4 if (int.Parse(pai) > 4) //大于4 { pai = (int.Parse(pai) - 4).ToString(); } #endregion // 向跺机写入托盘号 plcDj.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo); // 向跺机写入取货地址 plcDj.SetPlcDBValue(1101, "Int", "2", "24.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", "28", "26.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", "13", "28.0", palletNo); // 向跺机写入放货地址(储位地址) plcDj.SetPlcDBValue(1101, "Int", pai, "30.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", lie, "32.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", ceng, "34.0", palletNo); // 向跺机写入控制流程字 plcDj.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo); // 向取货2工位写入流程控制字 plc.SetPlcDBValue(1101, "Int", "200", "22.0", palletNo); if (plcValue == "200") { // 写入任务明细 tasksMonitor.StartLocat = "2"; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:2工位====》" + endLocat + "储位地址!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } //if (djValue == "0") //{ // // 写入任务明细 // tasksMonitor.StartLocat = "2"; // tasksMonitor.InteractiveMsg = "垛机因异常停止重新下发任务"; // tasksMonitor.PalletNo = palletNo; // tasksMonitor.EndLocat = endLocat; // wcsMySql.AddWCSTasksMonitor(tasksMonitor); // // 通知任务界面任务已存在更新 请更新界面 // wSChat.AlarmInformation("1"); //} // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "1号垛机 入库取货工位 断开2709"); } catch { plcDj.ClosePlc(); //PlcCounts(0, -1, "1号垛机 入库取货工位 断开2714"); } } #endregion break; case "6": #region 2号跺机 if (plcValue == "200" || plcValue == "210") { //获取任务信息 DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo); palletNo = plc.GetPlcDBValue(1101, "String", "80.0"); string plcStatus = ""; PlcIO plcDj = new PlcIO("192.168.8.20", 1, ref plcStatus); if (plcStatus.Length > 0) { // 连接跺机失败 写入任务明细表 //tasksMonitor.StartLocat = "6"; //tasksMonitor.InteractiveMsg = "2号跺机连接失败!"; //tasksMonitor.PalletNo = palletNo; //wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 连接剁机失败 写入log日志 Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "2号跺机连接失败!"); break; } else { //PlcCounts(0, 1, "2号垛机 入库取货工位 连接2746"); } try { // 获取跺机当前状态 string djValue = plcDj.GetPlcDBValue(1101, "Int", "0.0"); if (djValue != "10") { //string djendLocat = dtdj.Rows[0]["EndLocat"].ToString(); Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "2号跺机有任务稍后执行!"); // 获取任务信息 //DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo); //string djendLocat = dtdj.Rows[0]["EndLocat"].ToString(); //// 跺机占用 写入任务明细表 //tasksMonitor.StartLocat = "6"; //tasksMonitor.InteractiveMsg = "2号跺机有任务稍后执行!"; //tasksMonitor.PalletNo = palletNo; //tasksMonitor.EndLocat = djendLocat; //wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "2号垛机 入库取货工位 断开2772"); break; } DataTable dt02 = wcsMySql.GetWCSTasks("1", "0", palletNo); if (plcValue == "220") { dt02 = wcsMySql.GetWCSTasks("1", "0", ""); } if (dt02 == null || dt02.Rows.Count <= 0) { // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "2号垛机 入库取货工位 断开2784"); break; } string endLocat = dt02.Rows[0]["EndLocat"].ToString(); //[] locats = endLocat.Split('-'); string pai = int.Parse(endLocat.Substring(0, 2)).ToString(); string lie = int.Parse(endLocat.Substring(2, 2)).ToString(); string ceng = int.Parse(endLocat.Substring(4, 2)).ToString(); string shen = int.Parse(endLocat.Substring(6, 2)).ToString(); #region 放货工位算法 //判断排是否为单数 if (int.Parse(pai) % 2 == 0) //双数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是双数 深度为1 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } else if (shen == "2") //深度为2 { //排数是双数 深度为2 排数*2 pai = (int.Parse(pai) * 2).ToString(); } } //判断是否为双数 else//单数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是单数 深度为1 排数*2 pai = (int.Parse(pai) * 2).ToString(); } else if (shen == "2") //深度为2 { //排数是单数 深度为2 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } } //判断是否大于8 if (int.Parse(pai) > 8) { pai = (int.Parse(pai) - 8).ToString(); } //判断排数大于4 if (int.Parse(pai) > 4) //大于4 { pai = (int.Parse(pai) - 4).ToString(); } #endregion // 向跺机写入托盘号 plcDj.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo); // 向跺机写入取货地址 plcDj.SetPlcDBValue(1101, "Int", "2", "24.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", "28", "26.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", "13", "28.0", palletNo); // 向跺机写入储位地址 // 向跺机写入放货地址(储位地址) plcDj.SetPlcDBValue(1101, "Int", pai, "30.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", lie, "32.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", ceng, "34.0", palletNo); // 向跺机写入控制流程字 plcDj.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo); // 向取货工位写入流程控制字 plc.SetPlcDBValue(1101, "Int", "200", "102.0", palletNo); if (plcValue == "200") { // 写入任务明细 tasksMonitor.StartLocat = "6"; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:6工位====》" + endLocat + "储位地址!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "2号垛机 入库取货工位 断开2877"); } catch { // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "2号垛机 入库取货工位 断开2884"); } } #endregion break; case "10": #region 3号跺机 if (plcValue == "200" || plcValue == "210") { //获取任务信息 DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo); palletNo = plc.GetPlcDBValue(1101, "String", "160.0"); string plcStatus = ""; PlcIO plcDj = new PlcIO("192.168.8.30", 1, ref plcStatus); if (plcStatus.Length > 0) { // 连接跺机失败 写入任务明细表 //tasksMonitor.StartLocat = "10"; //tasksMonitor.InteractiveMsg = "3号跺机连接失败!"; //tasksMonitor.PalletNo = palletNo; //wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 连接剁机失败 写入log日志 Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "3号跺机连接失败!"); break; } //else //{ // PlcCounts(0, 1, "3号垛机 入库取货工位 连接2918"); //} try { // 获取跺机当前状态 string djValue = plcDj.GetPlcDBValue(1101, "Int", "0.0"); if (djValue != "10") { // 获取任务信息 //DataTable dtdj = wcsMySql.GetWCSTasks("1", "0", palletNo); //string djendLocat = dtdj.Rows[0]["EndLocat"].ToString(); //// 跺机占用 写入任务明细表 //tasksMonitor.StartLocat = "10"; //tasksMonitor.InteractiveMsg = "3号跺机有任务稍后执行!"; //tasksMonitor.PalletNo = palletNo; //tasksMonitor.EndLocat = djendLocat; //wcsMySql.AddWCSTasksMonitor(tasksMonitor); Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + dtdj.Rows[0]["TaskNo"].ToString() + "3号跺机有任务稍后执行!"); // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "3号垛机 入库取货工位 断开2944"); break; } DataTable dt02 = wcsMySql.GetWCSTasks("1", "0", palletNo); if (plcValue == "220") { dt02 = wcsMySql.GetWCSTasks("1", "0", ""); } if (dt02 == null || dt02.Rows.Count <= 0) { // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "3号垛机 入库取货工位 断开2955"); break; } string endLocat = dt02.Rows[0]["EndLocat"].ToString(); //[] locats = endLocat.Split('-'); string pai = int.Parse(endLocat.Substring(0, 2)).ToString(); string lie = int.Parse(endLocat.Substring(2, 2)).ToString(); string ceng = int.Parse(endLocat.Substring(4, 2)).ToString(); string shen = int.Parse(endLocat.Substring(6, 2)).ToString(); #region 放货工位算法 //判断排是否为单数 if (int.Parse(pai) % 2 == 0) //双数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是双数 深度为1 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } else if (shen == "2") //深度为2 { //排数是双数 深度为2 排数*2 pai = (int.Parse(pai) * 2).ToString(); } } //判断是否为双数 else//单数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是单数 深度为1 排数*2 pai = (int.Parse(pai) * 2).ToString(); } else if (shen == "2") //深度为2 { //排数是单数 深度为2 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } } //判断是否大于8 if (int.Parse(pai) > 8) { pai = (int.Parse(pai) - 8).ToString(); } //判断排数大于4 if (int.Parse(pai) > 4) //大于4 { pai = (int.Parse(pai) - 4).ToString(); } #endregion // 向跺机写入托盘号 plcDj.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo); // 向跺机写入取货地址 plcDj.SetPlcDBValue(1101, "Int", "2", "24.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", "28", "26.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", "13", "28.0", palletNo); // 向跺机写入储位地址 // 向跺机写入放货地址(储位地址) plcDj.SetPlcDBValue(1101, "Int", pai, "30.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", lie, "32.0", palletNo); plcDj.SetPlcDBValue(1101, "Int", ceng, "34.0", palletNo); // 向跺机写入控制流程字 plcDj.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo); // 向取货工位写入流程控制字 plc.SetPlcDBValue(1101, "Int", "200", "182.0", palletNo); if (plcValue == "200") { // 写入任务明细 tasksMonitor.StartLocat = "10"; tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:10工位====》" + endLocat + "储位地址!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.EndLocat = endLocat; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); } // 关闭设备连接 plcDj.ClosePlc(); //PlcCounts(0, -1, "3号垛机 入库取货工位 断开3047"); } catch { plcDj.ClosePlc(); //PlcCounts(0, -1, "3号垛机 入库取货工位 断开3053"); } } #endregion break; #endregion #region 出库放货工位 case "3": string palletNo2 = ""; if (plcValue == "290") { // 获取托盘号 string readPallet = plc.GetPlcDBValue(1101, "String", "40.0"); palletNo2 = readPallet; DataTable dt3 = wcsMySql.GetWCSTasks("1", "", readPallet); if (dt3.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error($"{readPallet}:当前托盘号不存在对应的任务", "跺机"); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; switch (taskRow["Type"].ToString()) { case "1": #region 出库任务 string num = ""; // 放货工位号 string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb, IsBeltDb, IsBaleDb; DataTable dt4 = wcsMySql.GetWCSTasks("2", "0", readPallet, "", "111"); // 判断任务类型 DataRow taskRow1 = dt4.Rows[0]; num = "3"; //交互工位 palletDb = "50.0"; //托盘号 taskDb = "64.0"; //任务类型 skuTypeDb = "66.0"; //物料类型 isPalletNoDb = "69.0"; //子母托状态 skuNumDb = "70.0"; //物料数量 qtyDb = "72.0"; //拆垛数量 IsBeltDb = "78.0"; //打包状态 IsBaleDb = "79.0"; //缠膜状态 DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'"); #region 判断物料信息 //获取绑定托盘信息 var paller = wcsMySql.GetWcsPalletBind(taskRow["PalletNo"].ToString()); paller["TaskType"] = "30"; //拆盘任务 母、木子、塑子托盘垛 if (paller["SkuType"].ToString() == "10" || paller["SkuType"].ToString() == "20" || paller["SkuType"].ToString() == "21" || paller["SkuType"].ToString() == "22" || paller["SkuType"].ToString() == "23") { paller["TaskType"] = "20"; } //且不为拆盘任务 if (paller["TaskType"].ToString() != "20") { //不缠膜 if (taskRow["IsBale"].ToString() == "0") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61") { //判断托盘信息是否为未打包缠膜状态 if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口 paller["TaskType"] = "70"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //判断托盘明细是否存在打包状态 if (paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口 paller["TaskType"] = "50"; } } } //缠膜 else if (taskRow["IsBale"].ToString() == "1") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { //缠膜不打包 //判断托盘信息是否为已缠膜 if (paller["IsBale"].ToString() == "0") { // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //缠膜打包任务 ///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜 if (paller["IsBale"].ToString() == "1") { //直接出库 // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } else { //判断是否已打包 if (paller["IsBelt"].ToString() == "1") { //已打包 未缠膜 去缠膜出库 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { //未打包缠膜 去打包缠膜 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "60"; } } } } } //判断目标工位是否为28 if (taskRow["EndLocat"].ToString() == "28") { paller["TaskType"] = "30"; } //判断其它物料类型 //if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63") //{ // paller["TaskType"] = "80"; //其它物料类型出库任务 //} //判断其它物料类型 if (paller["skuType"].ToString() == "99") { paller["TaskType"] = "30"; //其它物料类型出库任务 } //拆桶 else if (paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61" || paller["SkuType"].ToString() == "50") { //判断托盘信息是否为未打包缠膜状态 if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0") { paller["TaskType"] = "70"; } } //判断 if (!string.IsNullOrWhiteSpace(taskRow["IsStacking1"].ToString())) { if (paller["TaskType"].ToString() == "70" && taskRow["IsStacking1"].ToString() == "0") { paller["TaskType"] = "30"; } } if (paller["TaskType"].ToString() == "70" && taskRow1["StartLocat"].ToString() != "38") { paller["TaskType"] = "30"; } #endregion // 写入输送线放货工位指令 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb, readPallet); // 托盘号 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb, readPallet); // 任务类型 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb, readPallet); // 物料类型 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb, readPallet); // 是否字母托盘 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb, readPallet); // 物料数量 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBelt"].ToString(), IsBeltDb, readPallet); // 打包状态 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBale"].ToString(), IsBaleDb, readPallet); // 缠膜状态 //判断是否为拆桶任务 if (paller["TaskType"].ToString() == "70") { plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb, readPallet); // 拆跺数量 } bool inBl = plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString(), readPallet); //对应出库口输送线开始执行 if (inBl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{readPallet}:写入指令:当前工位正在输送到出库口;放货{num}工位===》出库口"; tasksMonitor.PalletNo = readPallet; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置 tasksMonitor.EndLocat = num; //目标工位 wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", readPallet); } #endregion break; default: break; } } else if (plcValue == "300") { //收到300后给plc返回310 plc.SetPlcDBValue(1101, row["PosType"].ToString(), "310", "62.0", palletNo2); break; } else if (plcValue == "310") { //不处理 break; } break; case "7": string palletNo3 = ""; if (plcValue == "290") { // 获取托盘号 string readPallet = plc.GetPlcDBValue(1101, "String", "120.0"); palletNo3 = readPallet; DataTable dt3 = wcsMySql.GetWCSTasks("1", "", readPallet); if (dt3.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error($"{readPallet}:当前托盘号不存在对应的任务", "跺机"); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; switch (taskRow["Type"].ToString()) { case "1": #region 出库任务 string num = ""; // 放货工位号 string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb, IsBeltDb, IsBaleDb; DataTable dt4 = wcsMySql.GetWCSTasks("2", "0", readPallet, "", "111"); // 判断任务类型 DataRow taskRow1 = dt4.Rows[0]; num = "7"; //交互工位 palletDb = "130.0"; //托盘号 taskDb = "144.0"; //任务类型 skuTypeDb = "146.0"; // 物料类型 isPalletNoDb = "149.0"; //子母托状态 skuNumDb = "150.0"; //物料数量 qtyDb = "152.0"; //拆垛数量 IsBeltDb = "158.0"; //打包状态 IsBaleDb = "159.0"; //缠膜状态 DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'"); #region 判断物料信息 //获取绑定托盘信息 var paller = wcsMySql.GetWcsPalletBind(taskRow["PalletNo"].ToString()); paller["TaskType"] = "30"; //拆盘任务 母、木子、塑子托盘垛 if (paller["SkuType"].ToString() == "10" || paller["SkuType"].ToString() == "20" || paller["SkuType"].ToString() == "21" || paller["SkuType"].ToString() == "22" || paller["SkuType"].ToString() == "23") { paller["TaskType"] = "20"; } //且不为拆盘任务 if (paller["TaskType"].ToString() != "20") { //不缠膜 if (taskRow["IsBale"].ToString() == "0") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61") { //判断托盘信息是否为未打包缠膜状态 if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口 paller["TaskType"] = "70"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //判断托盘明细是否存在打包状态 if (paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口 paller["TaskType"] = "50"; } } } //缠膜 else if (taskRow["IsBale"].ToString() == "1") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { //缠膜不打包 //判断托盘信息是否为已缠膜 if (paller["IsBale"].ToString() == "0") { // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //缠膜打包任务 ///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜 if (paller["IsBale"].ToString() == "1") { //直接出库 // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } else { //判断是否已打包 if (paller["IsBelt"].ToString() == "1") { //已打包 未缠膜 去缠膜出库 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { //未打包缠膜 去打包缠膜 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "60"; } } } } } //判断目标工位是否为28 if (taskRow["EndLocat"].ToString() == "28") { paller["TaskType"] = "30"; } //判断其它物料类型 //if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63") //{ // paller["TaskType"] = "80"; //其它物料类型出库任务 //} //判断其它物料类型 if (paller["skuType"].ToString() == "99") { paller["TaskType"] = "30"; //其它物料类型出库任务 } //拆桶 else if (paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61" || paller["SkuType"].ToString() == "50") { //判断托盘信息是否为未打包缠膜状态 if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0") { paller["TaskType"] = "70"; } } //判断 if (!string.IsNullOrWhiteSpace(taskRow["IsStacking1"].ToString())) { if (paller["TaskType"].ToString() == "70" && taskRow["IsStacking1"].ToString() == "0") { paller["TaskType"] = "30"; } } if (paller["TaskType"].ToString() == "70" && taskRow1["StartLocat"].ToString() != "38") { paller["TaskType"] = "30"; } #endregion // 写入输送线放货工位指令 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb, readPallet); // 托盘号 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb, readPallet); // 任务类型 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb, readPallet); // 物料类型 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb, readPallet); // 是否字母托盘 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb, readPallet); // 物料数量 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBelt"].ToString(), IsBeltDb, readPallet); // 打包状态 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBale"].ToString(), IsBaleDb, readPallet); // 缠膜状态 //判断是否为拆桶任务 if (paller["TaskType"].ToString() == "70") { plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb, readPallet); // 拆跺数量 } bool inBl = plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString(), readPallet); //对应出库口输送线开始执行 if (inBl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{readPallet}:写入指令:当前工位正在输送到出库口;放货{num}工位===》出库口"; tasksMonitor.PalletNo = readPallet; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置 tasksMonitor.EndLocat = num; //目标工位 wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", readPallet); } #endregion break; default: break; } } else if (plcValue == "300") { //收到300后给plc返回310 plc.SetPlcDBValue(1101, row["PosType"].ToString(), "310", "142.0", palletNo3); break; } else if (plcValue == "310") { //不处理 break; } break; case "11": string palletNo4 = ""; if (plcValue == "290") { // 获取托盘号 string readPallet = plc.GetPlcDBValue(1101, "String", "200.0"); palletNo4 = readPallet; DataTable dt3 = wcsMySql.GetWCSTasks("1", "", readPallet); if (dt3.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error($"{readPallet}:当前托盘号不存在对应的任务", "跺机"); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; switch (taskRow["Type"].ToString()) { case "1": #region 出库任务 string num = ""; // 放货工位号 string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb, IsBeltDb, IsBaleDb; DataTable dt4 = wcsMySql.GetWCSTasks("2", "0", readPallet, "", "111"); // 判断任务类型 DataRow taskRow1 = dt4.Rows[0]; num = "11"; //交互工位 palletDb = "210.0"; //托盘号 taskDb = "224.0"; //任务类型 skuTypeDb = "226.0"; // 物料类型 isPalletNoDb = "229.0"; //子母托状态 skuNumDb = "230.0"; //物料数量 qtyDb = "232.0"; //拆垛数量 IsBeltDb = "238.0"; //打包状态 IsBaleDb = "239.0"; //缠膜状态 DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'"); #region 判断物料信息 //获取绑定托盘信息 var paller = wcsMySql.GetWcsPalletBind(taskRow["PalletNo"].ToString()); paller["TaskType"] = "30"; //拆盘任务 母、木子、塑子托盘垛 if (paller["SkuType"].ToString() == "10" || paller["SkuType"].ToString() == "20" || paller["SkuType"].ToString() == "21" || paller["SkuType"].ToString() == "22" || paller["SkuType"].ToString() == "23") { paller["TaskType"] = "20"; } //且不为拆盘任务 if (paller["TaskType"].ToString() != "20") { //不缠膜 if (taskRow["IsBale"].ToString() == "0") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61") { //判断托盘信息是否为未打包缠膜状态 if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口 paller["TaskType"] = "70"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //判断托盘明细是否存在打包状态 if (paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口 paller["TaskType"] = "50"; } } } //缠膜 else if (taskRow["IsBale"].ToString() == "1") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { //缠膜不打包 //判断托盘信息是否为已缠膜 if (paller["IsBale"].ToString() == "0") { // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //缠膜打包任务 ///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜 if (paller["IsBale"].ToString() == "1") { //直接出库 // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } else { //判断是否已打包 if (paller["IsBelt"].ToString() == "1") { //已打包 未缠膜 去缠膜出库 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { //未打包缠膜 去打包缠膜 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "60"; } } } } } //判断目标工位是否为28 if (taskRow["EndLocat"].ToString() == "28") { paller["TaskType"] = "30"; } //判断其它物料类型 //if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63") //{ // paller["TaskType"] = "80"; //其它物料类型出库任务 //} //判断其它物料类型 if (paller["skuType"].ToString() == "99") { paller["TaskType"] = "30"; //其它物料类型出库任务 } //拆桶 else if (paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61" || paller["SkuType"].ToString() == "50") { //判断托盘信息是否为未打包缠膜状态 if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0") { paller["TaskType"] = "70"; } } //判断 //判断 if (!string.IsNullOrWhiteSpace(taskRow["IsStacking1"].ToString())) { if (paller["TaskType"].ToString() == "70" && taskRow["IsStacking1"].ToString() == "0") { paller["TaskType"] = "30"; } } if (paller["TaskType"].ToString() == "70" && taskRow1["StartLocat"].ToString() != "38") { paller["TaskType"] = "30"; } #endregion // 写入输送线放货工位指令 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb, readPallet); // 托盘号 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb, readPallet); // 任务类型 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb, readPallet); // 物料类型 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb, readPallet); // 是否字母托盘 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb, readPallet); // 物料数量 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBelt"].ToString(), IsBeltDb, readPallet); // 打包状态 plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["IsBale"].ToString(), IsBaleDb, readPallet); // 缠膜状态 //判断是否为拆桶任务 if (paller["TaskType"].ToString() == "70") { plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb, readPallet); // 拆跺数量 } bool inBl = plc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString(), readPallet); //对应出库口输送线开始执行 if (inBl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{readPallet}:写入指令:当前工位正在输送到出库口;放货{num}工位===》出库口"; tasksMonitor.PalletNo = readPallet; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置 tasksMonitor.EndLocat = num; //目标工位 wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", readPallet); } #endregion break; default: break; } } else if (plcValue == "300") { //收到300后给plc返回310 plc.SetPlcDBValue(1101, row["PosType"].ToString(), "310", "222.0",palletNo4); break; } else if (plcValue == "310") { //不处理 break; } break; #endregion case "": break; default: break; } } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "定时器错误"); throw ex; } } /// /// 跺机业务处理 /// /// /// /// private static void BllHandlerDj(PlcIO plc, string plcValue, DataRow row) { try { //WebStocket发送消息 WSChatController wSChat = new WSChatController(); DALWcsMessage wcsSql = new DALWcsMessage(); WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); TaskReques taskReques = new TaskReques(); string palletNo = string.Empty; string TargetAddre = string.Empty; string InitialAddre = string.Empty; string pai, lie, ceng, shen; switch (plcValue) { case "10": #region 出/移库 // 获取当前巷道所有任务 string stationNum = row["StationNum"].ToString(); DataTable dt2 = wcsSql.GetWCSTasks("0,5", "1,2", "", stationNum); // 判断任务类型 //判断是否存在任务 if (dt2 == null || dt2.Rows.Count == 0) { // 写入log日志 //Logger logger = LogManager.GetCurrentClassLogger(); //logger.Error(stationNum + "当前巷道无出/移库", stationNum); break; } DataRow taskRow1 = dt2.Rows[0]; switch (taskRow1["Type"].ToString()) { //出库任务 case "1": #region 出库任务 TargetAddre = dt2.Rows[0]["StartLocat"].ToString(); // 起始工位 //InitialAddre = dt2.Rows[0]["EndLocat"].ToString(); // 目标工位 palletNo = dt2.Rows[0]["PalletNo"].ToString(); // 托盘号 // 根据跺机号确认放货工位 string outStationNum = "3"; switch (stationNum) { case "R11": outStationNum = "3"; break; case "R12": outStationNum = "7"; break; case "R13": outStationNum = "11"; break; default: break; } // 读取放货工位状态 string plcStatus = ""; DataRow[] rows = PlcInfoDt.Select("Level = '2' and Type = '1' and StationNum = '" + outStationNum + "'"); PlcIO conveyorPLC = new PlcIO(rows[0]["PlcIP"].ToString(), 1, ref plcStatus); if (plcStatus.Length > 0) { break; } //else //{ // PlcCounts(1, 0, "出库任务 10 连接3187"); //} try { // 交互plc string conveyorValue = conveyorPLC.GetPlcDBValue(int.Parse(rows[0]["dbNumber"].ToString()), rows[0]["PosType"].ToString(), rows[0]["PlcPos"].ToString()); if (conveyorValue == "00" || conveyorValue == "10") // 放货工位空闲 可放货 { if (int.Parse(outStationNum) > 0) { pai = int.Parse(TargetAddre.Substring(0, 2)).ToString(); lie = int.Parse(TargetAddre.Substring(2, 2)).ToString(); ceng = int.Parse(TargetAddre.Substring(4, 2)).ToString(); shen = int.Parse(TargetAddre.Substring(6, 2)).ToString(); #region 取货工位算法 //判断排是否为单数 if (int.Parse(pai) % 2 == 0) //双数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是双数 深度为1 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } else if (shen == "2") //深度为2 { //排数是双数 深度为2 排数*2 pai = (int.Parse(pai) * 2).ToString(); } } //判断是否为双数 else//单数 { //判断深度为1 还是2 if (shen == "1") //深度为1 { //排数是单数 深度为1 排数*2 pai = (int.Parse(pai) * 2).ToString(); } else if (shen == "2") //深度为2 { //排数是单数 深度为2 排数 * 2 - 1 pai = ((int.Parse(pai) * 2) - 1).ToString(); } } //判断是否大于8 if (int.Parse(pai) > 8) { pai = (int.Parse(pai) - 8).ToString(); } //判断排数大于4 if (int.Parse(pai) > 4) //大于4 { pai = (int.Parse(pai) - 4).ToString(); } #endregion } else { // 起始储位地址为空,跳过 写入任务明细表 tasksMonitor.StartLocat = ""; tasksMonitor.InteractiveMsg = $"{palletNo}:起始储位为空!"; tasksMonitor.PalletNo = palletNo; wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //关闭连接 conveyorPLC.ClosePlc(); //PlcCounts(-1, 0, "出库任务 10 断开3261"); break; } // 写入托盘号 plc.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo); // 起始 储位 plc.SetPlcDBValue(1101, "Int", pai, "24.0", palletNo); plc.SetPlcDBValue(1101, "Int", lie, "26.0", palletNo); plc.SetPlcDBValue(1101, "Int", ceng, "28.0", palletNo); // 目标放货工位 plc.SetPlcDBValue(1101, "Int", "3", "30.0", palletNo); plc.SetPlcDBValue(1101, "Int", "28", "32.0", palletNo); plc.SetPlcDBValue(1101, "Int", "13", "34.0", palletNo); // 写入跺机任务下发完成 plc.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo); // 将出库任务待执行改为正在执行 wcsSql.SetWCSTasks(palletNo, "5", ""); //关闭连接 conveyorPLC.ClosePlc(); //PlcCounts(-1, 0, "出库任务 10 断开3285"); // 插入任务明细 // 任务明细实体类 tasksMonitor.TaskNo = dt2.Rows[0]["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}写入指令:{TargetAddre}储位====》{outStationNum}工位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = TargetAddre; //起始位置 tasksMonitor.EndLocat = outStationNum; //目标工位 wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); ////关闭连接 //conveyorPLC.ClosePlc(); //PlcCounts(-1, 0, "出库任务 10 断开3301"); } else { //关闭连接 conveyorPLC.ClosePlc(); //PlcCounts(-1, 0, "出库任务 10 断开3311"); } } catch { conveyorPLC.ClosePlc(); //PlcCounts(-1, 0, "出库任务 10 断开3307"); } #endregion break; //移库任务 case "2": #region 移库任务 TargetAddre = dt2.Rows[0]["StartLocat"].ToString(); // 起始工位 InitialAddre = dt2.Rows[0]["EndLocat"].ToString(); // 目标工位 palletNo = dt2.Rows[0]["PalletNo"].ToString(); // 托盘号 #region 取货工位算法 string qpai = int.Parse(TargetAddre.Substring(0, 2)).ToString(); string qlie = int.Parse(TargetAddre.Substring(2, 2)).ToString(); string qceng = int.Parse(TargetAddre.Substring(4, 2)).ToString(); string qshen = int.Parse(TargetAddre.Substring(6, 2)).ToString(); //判断排是否为单数 if (int.Parse(qpai) % 2 == 0) //双数 { //判断深度为1 还是2 if (qshen == "1") //深度为1 { //排数是双数 深度为1 排数 * 2 - 1 qpai = ((int.Parse(qpai) * 2) - 1).ToString(); } else if (qshen == "2") //深度为2 { //排数是双数 深度为2 排数*2 qpai = (int.Parse(qpai) * 2).ToString(); } } //判断是否为双数 else//单数 { //判断深度为1 还是2 if (qshen == "1") //深度为1 { //排数是单数 深度为1 排数*2 qpai = (int.Parse(qpai) * 2).ToString(); } else if (qshen == "2") //深度为2 { //排数是单数 深度为2 排数 * 2 - 1 qpai = ((int.Parse(qpai) * 2) - 1).ToString(); } } //判断是否大于8 if (int.Parse(qpai) > 8) { qpai = (int.Parse(qpai) - 8).ToString(); } //判断排数大于4 if (int.Parse(qpai) > 4) //大于4 { qpai = (int.Parse(qpai) - 4).ToString(); } #endregion #region 放货工位算法 string fpai = int.Parse(InitialAddre.Substring(0, 2)).ToString(); string flie = int.Parse(InitialAddre.Substring(2, 2)).ToString(); string fceng = int.Parse(InitialAddre.Substring(4, 2)).ToString(); string fshen = int.Parse(InitialAddre.Substring(6, 2)).ToString(); //判断排是否为单数 if (int.Parse(fpai) % 2 == 0) //双数 { //判断深度为1 还是2 if (fshen == "1") //深度为1 { //排数是双数 深度为1 排数 * 2 - 1 fpai = ((int.Parse(fpai) * 2) - 1).ToString(); } else if (fshen == "2") //深度为2 { //排数是双数 深度为2 排数*2 fpai = (int.Parse(fpai) * 2).ToString(); } } //判断是否为双数 else//单数 { //判断深度为1 还是2 if (fshen == "1") //深度为1 { //排数是单数 深度为1 排数*2 fpai = (int.Parse(fpai) * 2).ToString(); } else if (fshen == "2") //深度为2 { //排数是单数 深度为2 排数 * 2 - 1 fpai = ((int.Parse(fpai) * 2) - 1).ToString(); } } //判断是否大于8 if (int.Parse(fpai) > 8) { fpai = (int.Parse(fpai) - 8).ToString(); } //判断排数大于4 if (int.Parse(fpai) > 4) //大于4 { fpai = (int.Parse(fpai) - 4).ToString(); } #endregion // 写入托盘号 plc.SetPlcDBValue(1101, "String", palletNo, "14.0", palletNo); // 起始 储位 plc.SetPlcDBValue(1101, "Int", qpai, "24.0", palletNo); plc.SetPlcDBValue(1101, "Int", qlie, "26.0", palletNo); plc.SetPlcDBValue(1101, "Int", qceng, "28.0", palletNo); // 目标放货工位 plc.SetPlcDBValue(1101, "Int", fpai, "30.0", palletNo); plc.SetPlcDBValue(1101, "Int", flie, "32.0", palletNo); plc.SetPlcDBValue(1101, "Int", fceng, "34.0", palletNo); // 写入跺机任务下发完成 plc.SetPlcDBValue(1101, "Int", "10", "12.0", palletNo); // 将移库任务待执行改为正在执行 wcsSql.SetWCSTasks(palletNo, "5", ""); // 插入任务明细 // 任务明细实体类 tasksMonitor.TaskNo = dt2.Rows[0]["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:写入指令:{TargetAddre}储位====》{InitialAddre}储位"; tasksMonitor.PalletNo = palletNo; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = TargetAddre; //起始位置 tasksMonitor.EndLocat = InitialAddre; //目标位置 wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); #endregion break; default: break; } //出库任务 if (dt2.Rows.Count != 0) { } //空托盘出库 else { //DataTable dt4 = wcsSql.GetWCSSupallTasks("2", "0", ""); } #endregion break; case "20": // 跺机正在执行任务 wcs不做处理 break; case "30": // 跺机空取异常 #region 跺机空取异常 // 读取跺机托盘号 palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0"); if (string.IsNullOrWhiteSpace(palletNo)) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error($"{palletNo}:跺机空取异常,托盘号为空!", "跺机"); break; } // 写入流程控制字,结束当前任务 plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "30", "12.0", palletNo); // 将当前任务状态标记为异常结束 并且调用WNS任务反馈接口 #endregion break; case "40": // 入库放货时 重放异常 #region 入库放货时 重放异常 // 读取跺机托盘号 palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0"); if (string.IsNullOrWhiteSpace(palletNo)) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error($"{palletNo}:跺机满入异常,托盘号为空!", "跺机"); break; } // 写入流程控制字,WCS收到堆垛机双重放货,正在重新分配任务 plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "40", "12.0", palletNo); // 将当前任务状态标记为异常结束 // 并且调用WNS任务反馈接口获取新任务 // 插入到任务表 #endregion break; case "50": // 重放后 重新分配入库储位 #region 重放后 重新分配入库储位 palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0"); // 获取当前托盘新的任务 WCSPalletBind model = new WCSPalletBind(); // 获取重新分配的任务 string strMsg = wcsSql.GetLocation(palletNo, model, ref TargetAddre); if (strMsg.Contains("-1")) { break; } // 重新写入 if (TargetAddre.Length > 0) { string[] addre = TargetAddre.Split('-'); pai = int.Parse(addre[1]).ToString(); lie = int.Parse(addre[2]).ToString(); ceng = int.Parse(addre[3]).ToString(); } else { // 目标储位地址为空,跳过; break; } // 重新写入目标放货工位 plc.SetPlcDBValue(100, "Int", pai, "30.0", palletNo); plc.SetPlcDBValue(100, "Int", lie, "32.0", palletNo); plc.SetPlcDBValue(100, "Int", ceng, "34.0", palletNo); plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "50", "12.0", palletNo); #endregion break; case "100": // 跺机任务完成 // 获取当天托盘对应的任务 palletNo = plc.GetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "String", "14.0"); DataTable dt3 = wcsSql.GetWCSTasks("1,5", "", palletNo); if (dt3.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(palletNo + ":当前托盘号不存在对应的任务", "跺机"); break; } // 判断任务类型 DataRow taskRow = dt3.Rows[0]; switch (taskRow["Type"].ToString()) { case "0": // 入库任务 #region 入库任务 plc.SetPlcDBValue(1101, "Int", "100", "12.0", palletNo); wcsSql.SetWCSTasks(palletNo, "2", ""); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bl = wcsSql.RequestTasks(taskReques); if (bl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); tasksMonitor.EndLocat = taskRow["EndLocat"].ToString(); tasksMonitor.Status = "2"; wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } #endregion break; case "1": // 出库任务 #region 出库任务 // 从跺机获取巷道号 string roadway = taskRow["StartRoadway"].ToString(); string num = ""; // 放货工位号 //string palletDb, taskDb, skuTypeDb, isPalletNoDb, skuNumDb, qtyDb; //bool palletBool, taskBool, skuTypeBool, isPalletBool, skuNumBool, qtyBool, wcsBool; //string readPallet, readTask, readSkuType, readIsPallet, readSkuNum, readQty, readWcs; if (roadway == "R11") { num = "3"; //交互工位 //palletDb = "50.0"; //托盘号 //taskDb = "64.0"; //任务类型 //skuTypeDb = "66.0"; //物料类型 //isPalletNoDb = "69.0"; //子母托状态 //skuNumDb = "70.0"; //物料数量 //qtyDb = "72.0"; //拆垛数量 } else if (roadway == "R12") { num = "7"; //交互工位 //palletDb = "130.0"; //托盘号 //taskDb = "144.0"; //任务类型 //skuTypeDb = "146.0"; // 物料类型 //isPalletNoDb = "149.0"; //子母托状态 //skuNumDb = "150.0"; //物料数量 //qtyDb = "152.0"; //拆垛数量 } else { num = "11"; //交互工位 //palletDb = "210.0"; //托盘号 //taskDb = "224.0"; //任务类型 //skuTypeDb = "226.0"; // 物料类型 //isPalletNoDb = "229.0"; //子母托状态 //skuNumDb = "230.0"; //物料数量 //qtyDb = "232.0"; //拆垛数量 } DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and StationNum = '{num}'"); //string cStatus = ""; //PlcIO cPlc = new PlcIO(rows[0]["PlcIP"].ToString(), 1, ref cStatus); //if (cStatus.Length > 0) //{ // break; //} //else //{ // //PlcCounts(1, 0, "出库任务 100 连接3638"); //} try { #region 判断物料信息 /* //获取绑定托盘信息 var paller = wcsSql.GetWcsPalletBind(taskRow["PalletNo"].ToString()); paller["TaskType"] = "30"; //拆盘任务 母、木子、塑子托盘垛 if (paller["SkuType"].ToString() == "10") { paller["TaskType"] = "20"; } if (paller["SkuType"].ToString() == "20") { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "叠托机出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "20"; } if (paller["SkuType"].ToString() == "21") { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "叠托机出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "20"; } //且不为拆盘任务 if (paller["TaskType"].ToString() != "20") { //不缠膜 if (taskRow["IsBale"].ToString() == "0") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { if (paller["SkuType"].ToString() == "50" || paller["SkuType"].ToString() == "51" || paller["SkuType"].ToString() == "61") { //判断托盘信息是否为未打包缠膜状态 if (paller["IsBale"].ToString() == "0" && paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.55", "38工位 D口", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口 paller["TaskType"] = "70"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //判断托盘明细是否存在打包状态 if (paller["IsBelt"].ToString() == "0") { // Led提示给客户 //LedDisplay("192.168.8.53", "13工位 A口", "打包出库中", "桶类出入库A口 交互工位13"); //A口 paller["TaskType"] = "50"; } } } //缠膜 else if (taskRow["IsBale"].ToString() == "1") { //不打包 if (taskRow["IsBelt"].ToString() == "0") { //缠膜不打包 //判断托盘信息是否为已缠膜 if (paller["IsBale"].ToString() == "0") { // Led提示给客户 LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } } //打包 if (taskRow["IsBelt"].ToString() == "1") { //缠膜打包任务 ///先判断是否已缠膜 是 直接出库 否 判断是否已打包 是 去缠膜 否 去打包缠膜 if (paller["IsBale"].ToString() == "1") { //直接出库 // Led提示给客户 //LedDisplay("192.168.8.51", "28工位 C1口", "不打包不缠膜出库中", "人工处理/整托袋子入库交互工位28"); //C1口 paller["TaskType"] = "30"; } else { //判断是否已打包 if (paller["IsBelt"].ToString() == "1") { //已打包 未缠膜 去缠膜出库 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "40"; } else { //未打包缠膜 去打包缠膜 // Led提示给客户 //LedDisplay("192.168.8.54", "18工位 B口", "打包缠膜出库中", "吨袋入库B口 交互工位18"); //B口 paller["TaskType"] = "60"; } } } } } //判断目标工位是否为28 if (taskRow["EndLocat"].ToString() == "28") { paller["TaskType"] = "30"; } //判断其它物料类型 if (paller["SkuType"].ToString() != "10" && paller["SkuType"].ToString() != "11" && paller["SkuType"].ToString() != "20" && paller["SkuType"].ToString() != "21" && paller["SkuType"].ToString() != "30" && paller["SkuType"].ToString() != "31" && paller["SkuType"].ToString() != "40" && paller["SkuType"].ToString() != "50" && paller["SkuType"].ToString() != "51" && paller["SkuType"].ToString() != "52" && paller["SkuType"].ToString() != "53" && paller["SkuType"].ToString() != "60" && paller["SkuType"].ToString() != "61" && paller["SkuType"].ToString() != "62" && paller["SkuType"].ToString() != "63") { paller["TaskType"] = "80"; //其它物料类型出库任务 } //判断其它物料类型 //if (paller[skuType].ToString() == "99") //{ // paller["TaskType"] = "30"; //其它物料类型出库任务 //} //拆桶 else if (paller["SkuType"].ToString() == "51" && paller["SkuType"].ToString() == "61" && paller["SkuType"].ToString() == "50") { // Led提示给客户 LedDisplay("192.168.8.55", "38工位", "拆桶出库中", "整托空桶/重桶入库分拣交互工位38"); //D口 paller["TaskType"] = "70"; }*/ #endregion /* // 写入输送线放货工位指令 palletBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "String", taskRow["PalletNo"].ToString(), palletDb); // 托盘号 taskBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["TaskType"].ToString(), taskDb); // 任务类型 skuTypeBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuType"].ToString(), skuTypeDb); // 物料类型 isPalletBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SubPallet"].ToString(), isPalletNoDb); // 是否字母托盘 skuNumBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Int", paller["SkuQty"].ToString(), skuNumDb); // 物料数量 //判断是否为拆桶任务 if (paller["TaskType"].ToString() == "70") { qtyBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), "Byte", paller["SkuQty"].ToString(), qtyDb); // 拆跺数量 //拆桶数量是否写入成功 if (qtyBool) { } else { } }*/ //wcsBool = cPlc.SetPlcDBValue(int.Parse(rows[0]["DbNumber"].ToString()), rows[0]["PosType"].ToString(), "300", rows[0]["WcsPos"].ToString()); //对应出库口输送线开始执行 #region 物料信息是否写入成功 /* //托盘号是否写入成功 if (palletBool) { } else { //关闭连接 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前出库口托盘号写入失败"); cPlc.ClosePlc(); PlcCounts(-1, 0, "出库任务 100 断开3815"); break; } //任务类型是否写入成功 if (taskBool) { } else { //关闭连接 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前出库口任务类型写入失败"); cPlc.ClosePlc(); PlcCounts(-1, 0, "出库任务 100 断开3815"); break; } //物料类型是否写入成功 if (skuTypeBool) { } else { //关闭连接 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前出库口物料类型写入失败"); cPlc.ClosePlc(); PlcCounts(-1, 0, "出库任务 100 断开3815"); break; } //是否子母托是否写入成功 if (isPalletBool) { } else { //关闭连接 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前出库口是否子母托写入失败"); cPlc.ClosePlc(); PlcCounts(-1, 0, "出库任务 100 断开3815"); break; } //物料数量是否写入成功 if (skuNumBool) { } else { //关闭连接 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前出库口物料数量写入失败"); cPlc.ClosePlc(); PlcCounts(-1, 0, "出库任务 100 断开3815"); break; } //验证300是否写入成功 if (wcsBool) { } else { //关闭连接 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前出库口300写入失败"); cPlc.ClosePlc(); PlcCounts(-1, 0, "出库任务 100 断开3815"); break; }*/ #endregion // 写入跺机wcs控制字流程100 返回垛机执行完成 bool inBl = plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "100", row["WcsPos"].ToString(), palletNo); wcsSql.SetWCSTasks(palletNo, "1", ""); //关闭连接 //cPlc.ClosePlc(); //PlcCounts(-1, 0, "出库任务 100 断开3829"); if (inBl) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}写入指令:收到跺机放货完成;放货{num}工位===》出库口"; tasksMonitor.PalletNo = palletNo; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置 tasksMonitor.EndLocat = num; //目标工位 wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } } catch { //cPlc.ClosePlc(); //PlcCounts(-1, 0, "出库任务 100 断开3855"); } #endregion break; case "2": // 移库任务 #region 移库任务 plc.SetPlcDBValue(int.Parse(row["dbNumber"].ToString()), "Int", "100", "12.0", palletNo); //修改任务状态 wcsSql.SetWCSTasks(palletNo, "2", ""); // 反馈给WMS taskReques.taskNo = taskRow["TaskNo"].ToString(); taskReques.TaskType = taskRow["Type"].ToString(); taskReques.TaskStatus = taskRow["Status"].ToString(); bool bll = wcsSql.RequestTasks(taskReques); if (bll) { // 写入任务明细表 tasksMonitor.TaskNo = taskRow["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.InteractiveMsg = $"{palletNo}:任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = palletNo; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = taskRow["StartLocat"].ToString(); //起始位置 tasksMonitor.EndLocat = taskRow["EndLocat"].ToString(); //目标工位 wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 wSChat.AlarmInformation("1", palletNo); //_chat.Get(); } #endregion break; default: break; } break; default: break; } } catch (Exception ex) { throw ex; } } /// /// Led屏展示信息 /// /// 地址 /// 上方区域 /// 中间区域 /// 底部区域 private static void LedDisplay(string ip, string top, string content, string foot) { try { LedDll Led = new LedDll(); Led.LEDstr(ip, top, content, foot); } catch { } } /// /// 定时器委托任务 调用的方法 /// /// /// public static void SetContent(object source, System.Timers.ElapsedEventArgs e) { if (m_bRuning) { //return; // Parallel.For 并行for m_bRuning = false; PlcIO plc = new PlcIO("10.8.115.209", 1, ref plcSatu); // 输送线 PlcIO plcDJ = new PlcIO("10.8.115.200", 1, ref plcDjSatu); // 跺机 try { LedDll Led = new LedDll(); DALWcsMessage wcsSql = new DALWcsMessage(); if (wcsSql.GetIsWcsAutoDB1()) // 自动模式 两个服务器连接程序切换 { if (plcSatu.Length > 0 && plcDjSatu.Length > 0) { LedTopStr = "连接PLC失败,请检查网络状态!"; LedFootStr = "网络故障! "; Led.SetOnlyLed("ABC", "提示", LedTopStr, LedFootStr); return; // 连接失败,结束 } string Palno = ""; string FromPai = "", FromLie = "", FromCeng = ""; string EndPai = "", EndLie = "", EndCeng = ""; #region 入库 // 读取三个入库口;判断是否有托盘;判断当前口是否有正在执行的出库任务 #region A口 // 申请工位 string plc2Values = plc.GetPlcDBValue(600, "Int", "30.0"); switch (plc2Values) { case "0": // 恢复默认状态; plc.SetPlcDBValue(600, "Int", "0", "32.0",""); break; case "100": // 申请入库 Palno = plc.GetPlcDBValue(600, "String", "46.0"); if (Palno != null) { // 向plc写入已读取到托盘码 plc.SetPlcDBValue(600, "Int", "110", "32.0", ""); // 读取托盘高度 string height = plc.GetPlcDBValue(600, "Int", "36.0"); if (height == "799") { if (!Palno.Contains("A1")) { height = "0"; Led.SetOnlyLed("A1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 "); } } else if (height == "801") { string heightType = Palno.Substring(0, 2); switch (heightType) { case "A2": height = "1499"; break; case "A3": height = "1999"; break; default: height = "0"; Led.SetOnlyLed("A1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 "); break; } } if (height == "0") { break; } // 调用wms接口获取储位地址,并将入库任务存储到任务表 string str = wcsSql.GetLocation(Palno, height, "01"); LedTopStr = str; LedFootStr = "正常运行 "; if (str.Contains("-S1")) { LedFootStr = "托盘退回 "; // 申请储位错误,向plc写入退回指令 liudl plc.SetPlcDBValue(600, "Int", "131", "32.0", ""); } Led.SetOnlyLed("A1", "申请库位", LedTopStr, LedFootStr); } break; case "120": // if 查询任务表,判断是否存在当前口的出库任务 DataTable dt = wcsSql.GetWmsTasks("1", "out"); if (dt != null) { // 若存在出库或有退回的托盘跳过; // 等待出库任务完成或非法托盘退回后再执行入库任务。 if (dt.Rows[0]["InitialAddre"].ToString() == "1") { break; } } else { DataTable dt1 = wcsSql.GetWmsTasks("0", "in"); if (dt1 != null) { // 判断wms是否分配储位 if (dt1.Rows[0]["TargetAddre"].ToString().Length > 0) { // 是 // 向PLC写入任务 托盘由01位到04位 改变流程字 plc.SetPlcDBValue(600, "Int", "2", "42.0", ""); plc.SetPlcDBValue(600, "Int", "4", "44.0", ""); plc.SetPlcDBValue(600, "Int", "130", "32.0", ""); // 将入库任务由等待执行改为正在执行; wcsSql.SetWmsTasks(dt1.Rows[0]["Palno"].ToString(), "1"); Led.SetOnlyLed("A1", "执行入库", LedTopStr, LedFootStr); } } else { // 否 // 向plc写入wms流程字131 plc.SetPlcDBValue(600, "Int", "131", "32.0", ""); Led.SetOnlyLed("A1", "执行退回", LedTopStr, LedFootStr); } }; break; case "140": // 任务交互完毕 向plc写入wms流程字 0 plc.SetPlcDBValue(600, "Int", "0", "32.0", ""); break; case "141": // 任务交互完毕 向plc写入wms流程字 0 plc.SetPlcDBValue(600, "Int", "0", "32.0", ""); break; default: break; } // 取货工位 string plc4Values = plc.GetPlcDBValue(600, "Int", "90.0"); switch (plc4Values) { case "200": // 恢复默认状态; plc.SetPlcDBValue(600, "Int", "0", "92.0", ""); break; case "150": Palno = plc.GetPlcDBValue(600, "String", "106.0"); DataTable dt2 = wcsSql.GetWmsTasks("1", "in", Palno); string pai = "", lie = "", ceng = ""; if (dt2 != null) { string addrestr = dt2.Rows[0]["TargetAddre"].ToString(); if (addrestr.Length > 0) { string[] addre = addrestr.Split('-'); pai = int.Parse(addre[1]).ToString(); lie = int.Parse(addre[2]).ToString(); ceng = int.Parse(addre[3]).ToString(); } else { // 目标储位地址为空,跳过; break; } } else { break; } string djtype = plcDJ.GetPlcDBValue(100, "Int", "0.0"); if (djtype == "820") // 判断跺机是否空闲 { // 向跺机写入库任务 plcDJ.SetPlcDBValue(100, "Int", "10", "4.0", ""); // 任务类型 plcDJ.SetPlcDBValue(100, "Int", "1", "6.0", ""); // 取货口 1=A口 2=B口 3=C口 // 起始 plcDJ.SetPlcDBValue(100, "Int", "2", "12.0", ""); plcDJ.SetPlcDBValue(100, "Int", "1", "14.0",""); plcDJ.SetPlcDBValue(100, "Int", "1", "16.0",""); // 目标 plcDJ.SetPlcDBValue(100, "Int", pai, "18.0", ""); plcDJ.SetPlcDBValue(100, "Int", lie, "20.0",""); plcDJ.SetPlcDBValue(100, "Int", ceng, "22.0", ""); Palno = dt2.Rows[0]["Palno"].ToString(); ; plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", ""); // 向plc写入WMS流程字 plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", ""); plc.SetPlcDBValue(600, "Int", "160", "92.0", ""); } ; break; default: break; } #endregion #region B口 // 申请工位 string plc11Values = plc.GetPlcDBValue(600, "Int", "300.0"); switch (plc11Values) { case "0": // 恢复默认状态; plc.SetPlcDBValue(600, "Int", "0", "302.0", ""); break; case "100": // 申请入库 Palno = plc.GetPlcDBValue(600, "String", "316.0"); if (Palno != null) { // 向plc写入已读取到托盘码 plc.SetPlcDBValue(600, "Int", "110", "302.0", ""); // 读取托盘高度 string height = plc.GetPlcDBValue(600, "Int", "306.0"); if (height == "799") { if (!Palno.Contains("A1")) { height = "0"; Led.SetOnlyLed("B1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 "); } } else if (height == "801") { string heightType = Palno.Substring(0, 2); switch (heightType) { case "A2": height = "1499"; break; case "A3": height = "1999"; break; default: height = "0"; Led.SetOnlyLed("B1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 "); break; } } if (height == "0") { break; } // 先判断当前托盘是否已生成入库任务 string lstr = wcsSql.IsTaskMonitor(Palno); if (lstr != "") { wcsSql.SetWmsTasks(Palno, "0"); LedTopStr = lstr; LedFootStr = "正常运行 "; Led.SetOnlyLed("B1", "再次申请库位", LedTopStr, LedFootStr); break; } // 调用wms接口获取储位地址,并将入库任务存储到任务表 string str = wcsSql.GetLocation(Palno, height, "02"); LedTopStr = str; LedFootStr = "正常运行 "; if (str.Contains("-S1")) { // 申请储位错误,向plc写入退回指令 liudl plc.SetPlcDBValue(600, "Int", "131", "302.0", ""); LedFootStr = "托盘退回 "; } Led.SetOnlyLed("B1", "申请库位", LedTopStr, LedFootStr); } break; case "120": // if 查询任务表,判断是否存在当前口的出库任务 DataTable dt = wcsSql.GetWmsTasks("1", "out"); if (dt != null)//|| plc03 != "0" || plc04 != "200") { // 若存在出库或有退回的托盘跳过;等待出库任务完成或非法托盘退回后在执行入库任务。 if (dt.Rows[0]["InitialAddre"].ToString() == "2") { break; } } else { DataTable dt1 = wcsSql.GetWmsTasks("0", "in"); if (dt1 != null) { // 判断wms是否分配储位 if (dt1.Rows[0]["TargetAddre"].ToString().Length > 0) { // 是 // 向PLC写入任务 托盘由11工位到12工位 改变流程字 plc.SetPlcDBValue(600, "Int", "11", "342.0", ""); plc.SetPlcDBValue(600, "Int", "12", "344.0",""); plc.SetPlcDBValue(600, "Int", "130", "302.0", ""); // 将入库任务由等待执行改为正在执行; wcsSql.SetWmsTasks(dt1.Rows[0]["Palno"].ToString(), "1"); Led.SetOnlyLed("B1", "执行入库", LedTopStr, LedFootStr); } } else { // 否 // 向plc写入wms流程字131 plc.SetPlcDBValue(600, "Int", "131", "302.0", ""); Led.SetOnlyLed("B1", "执行退回", LedTopStr, LedFootStr); } }; break; case "140": // 任务交互完毕 向plc写入wms流程字 0 plc.SetPlcDBValue(600, "Int", "0", "302.0", ""); break; case "141": // 任务交互完毕 向plc写入wms流程字 0 plc.SetPlcDBValue(600, "Int", "0", "302.0", ""); break; default: break; } // 取货工位 string plc12Values = plc.GetPlcDBValue(600, "Int", "330.0"); switch (plc12Values) { case "200": // 恢复默认状态; plc.SetPlcDBValue(600, "Int", "0", "332.0", ""); break; case "150": Palno = plc.GetPlcDBValue(600, "String", "346.0"); DataTable dt2 = wcsSql.GetWmsTasks("1", "in", Palno); string pai = "", lie = "", ceng = ""; if (dt2 != null) { string addrestr = dt2.Rows[0]["TargetAddre"].ToString(); if (addrestr.Length > 0) { string[] addre = addrestr.Split('-'); pai = int.Parse(addre[1]).ToString(); lie = int.Parse(addre[2]).ToString(); ceng = int.Parse(addre[3]).ToString(); } else { // 目标储位地址为空,跳过; break; } } else { break; } string djtype = plcDJ.GetPlcDBValue(100, "Int", "0.0"); if (djtype == "820") // 判断跺机是否空闲 { // 向跺机写入库任务 plcDJ.SetPlcDBValue(100, "Int", "10", "4.0", ""); // 任务类型 plcDJ.SetPlcDBValue(100, "Int", "2", "6.0", ""); // 取货口 1=A口 2=B口 3=C口 // 起始 plcDJ.SetPlcDBValue(100, "Int", "2", "12.0", ""); plcDJ.SetPlcDBValue(100, "Int", "43", "14.0", ""); plcDJ.SetPlcDBValue(100, "Int", "1", "16.0", ""); // 目标 plcDJ.SetPlcDBValue(100, "Int", pai, "18.0", ""); plcDJ.SetPlcDBValue(100, "Int", lie, "20.0", ""); plcDJ.SetPlcDBValue(100, "Int", ceng, "22.0", ""); Palno = dt2.Rows[0]["Palno"].ToString(); plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", ""); // 向plc写入WMS流程字 plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", ""); plc.SetPlcDBValue(600, "Int", "160", "332.0", ""); }; break; default: break; } #endregion #region C口 // 取货工位 string plc19Values = plc.GetPlcDBValue(600, "Int", " 540.0"); switch (plc19Values) { case "0": // 恢复默认状态; plc.SetPlcDBValue(600, "Int", "0", "542.0", ""); break; case "100": // 申请入库 Palno = plc.GetPlcDBValue(600, "String", "556.0"); if (Palno != null) { // 向plc写入已读取到托盘码 plc.SetPlcDBValue(600, "Int", "110", "542.0", ""); // 读取托盘高度 string height = plc.GetPlcDBValue(600, "Int", "546.0"); if (height == "799") { if (!Palno.Contains("C1")) { height = "0"; Led.SetOnlyLed("C1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 "); } } else if (height == "801") { string heightType = Palno.Substring(0, 2); switch (heightType) { case "A2": height = "1499"; break; case "A3": height = "0"; Led.SetOnlyLed("C1", "申请库位", "禁止进入2米托盘,请从别的口进!", "停止申请库位 "); break; default: height = "0"; Led.SetOnlyLed("C1", "申请库位", "托盘高度和条码高度不符,请确认!", "停止申请库位 "); break; } } if (height == "0") { break; } // 调用wms接口获取储位地址,并将入库任务存储到任务表 string str = wcsSql.GetLocation(Palno, height, "01"); LedTopStr = str; LedFootStr = "正常运行 "; if (str.Contains("-S1")) { LedFootStr = "托盘退回 "; // 申请储位错误,向plc写入退回指令 liudl plc.SetPlcDBValue(600, "Int", "131", "542.0", ""); } Led.SetOnlyLed("C1", "申请库位", LedTopStr, LedFootStr); } break; case "120": // if 查询任务表,判断是否存在当前口的出库任务 DataTable dt = wcsSql.GetWmsTasks("3", "out"); if (dt != null) { // 若存在出库或有退回的托盘跳过; // 等待出库任务完成或非法托盘退回后再执行入库任务。 if (dt.Rows[0]["InitialAddre"].ToString() == "3") { break; } } else { DataTable dt1 = wcsSql.GetWmsTasks("0", "in"); if (dt1 != null) { // 判断wms是否分配储位 if (dt1.Rows[0]["TargetAddre"].ToString().Length > 0) { // 是 // 向PLC写入任务 托盘由01位到04位 改变流程字 plc.SetPlcDBValue(600, "Int", "19", "552.0", ""); plc.SetPlcDBValue(600, "Int", "14", "554.0", ""); plc.SetPlcDBValue(600, "Int", "130", "572.0", ""); // 将入库任务由等待执行改为正在执行; wcsSql.SetWmsTasks(dt1.Rows[0]["Palno"].ToString(), "1"); Led.SetOnlyLed("C1", "执行入库", LedTopStr, LedFootStr); } } else { // 否 // 向plc写入wms流程字131 plc.SetPlcDBValue(600, "Int", "131", "542.0", ""); Led.SetOnlyLed("C1", "执行退回", LedTopStr, LedFootStr); } }; break; case "140": // 任务交互完毕 向plc写入wms流程字 0 plc.SetPlcDBValue(600, "Int", "0", "542.0", ""); break; case "141": // 任务交互完毕 向plc写入wms流程字 0 plc.SetPlcDBValue(600, "Int", "0", "542.0", ""); break; default: break; } // 取货工位 string plc14Values = plc.GetPlcDBValue(600, "Int", "390.0"); switch (plc14Values) { case "200": // 恢复默认状态; plc.SetPlcDBValue(600, "Int", "0", "392.0", ""); break; case "150": Palno = plc.GetPlcDBValue(600, "String", "406.0"); DataTable dt2 = wcsSql.GetWmsTasks("1", "in", Palno); string pai = "", lie = "", ceng = ""; if (dt2 != null) { string addrestr = dt2.Rows[0]["TargetAddre"].ToString(); if (addrestr.Length > 0) { string[] addre = addrestr.Split('-'); pai = int.Parse(addre[1]).ToString(); lie = int.Parse(addre[2]).ToString(); ceng = int.Parse(addre[3]).ToString(); } else { // 目标储位地址为空,跳过; break; } } else { break; } string djtype = plcDJ.GetPlcDBValue(100, "Int", "0.0"); if (djtype == "820") // 判断跺机是否空闲 { // 向跺机写入库任务 plcDJ.SetPlcDBValue(100, "Int", "10", "4.0", ""); // 任务类型 plcDJ.SetPlcDBValue(100, "Int", "3", "6.0", ""); // 取货口 1=A口 2=B口 3=C口 // 起始 plcDJ.SetPlcDBValue(100, "Int", "1", "12.0", ""); plcDJ.SetPlcDBValue(100, "Int", "29", "14.0", ""); plcDJ.SetPlcDBValue(100, "Int", "1", "16.0", ""); // 目标 plcDJ.SetPlcDBValue(100, "Int", pai, "18.0", ""); plcDJ.SetPlcDBValue(100, "Int", lie, "20.0", ""); plcDJ.SetPlcDBValue(100, "Int", ceng, "22.0", ""); Palno = dt2.Rows[0]["Palno"].ToString(); ; plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", ""); // 向plc写入WMS流程字 plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", ""); plc.SetPlcDBValue(600, "Int", "160", "392.0", ""); } ; break; default: break; } #endregion #endregion #region 跺机 string DJValues = plcDJ.GetPlcDBValue(100, "Int", "0.0"); string taskTyoe = plcDJ.GetPlcDBValue(100, "Int", "4.0"); // 获取任务类型 switch (DJValues) { case "820": #region 出库 // 获取待执行出库任务 DataTable dt2 = wcsSql.GetWmsTasks("0", "out"); if (dt2 != null) { // 根据任务出库口判断目标出库口是否存在入库任务 string TargetAddre = dt2.Rows[0]["TargetAddre"].ToString(); // 目标出库口 string InitialAddre = dt2.Rows[0]["InitialAddre"].ToString(); // 起始储位 Palno = dt2.Rows[0]["Palno"].ToString(); // 托盘号 // 获取取货工位是否空闲 非空闲跳出 if (TargetAddre == "01") // A口 { string plc4Value = plc.GetPlcDBValue(600, "Int", "90.0"); string plc02 = plc.GetPlcDBValue(600, "Int", "30.0"); string plc03 = plc.GetPlcDBValue(600, "Int", "60.0"); if (plc4Value != "200" || plc02 != "0" || plc03 != "0") { break; } EndPai = "2"; EndLie = "1"; EndCeng = "1"; LedTopStr = "托盘号:" + Palno + "由库位:" + InitialAddre + "运至:A口;"; LedFootStr = "执行取货! "; Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr); } else if (TargetAddre == "02") // B口 { string plc12Value = plc.GetPlcDBValue(600, "Int", "330.0"); if (plc12Value != "200") { break; } EndPai = "2"; EndLie = "43"; EndCeng = "1"; LedTopStr = "托盘号:" + Palno + "由库位:" + InitialAddre + "运至:B口;"; LedFootStr = "执行取货! "; Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr); } else if (TargetAddre == "03") // C口 { string plc14Value = plc.GetPlcDBValue(600, "Int", "390.0"); if (plc14Value != "200") { break; } EndPai = "1"; EndLie = "29"; EndCeng = "1"; LedTopStr = "托盘号:" + Palno + "由库位:" + InitialAddre + "运至:C口;"; LedFootStr = "执行取货! "; Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr); } bool bl = wcsSql.GetTasks(TargetAddre, "in"); // 获取指定出库口入库任务 if (bl) // 没有入库任务 { string pai1 = "", lie1 = "", ceng1 = ""; if (InitialAddre.Length > 0) { string[] addre = InitialAddre.Split('-'); pai1 = int.Parse(addre[1]).ToString(); lie1 = int.Parse(addre[2]).ToString(); ceng1 = int.Parse(addre[3]).ToString(); } else { // 起始储位地址为空,跳过; break; } // 向跺机下发任务 // 向跺机写入库任务 plcDJ.SetPlcDBValue(100, "Int", "11", "4.0", ""); // 10:入库 11:出库 plcDJ.SetPlcDBValue(100, "Int", int.Parse(TargetAddre).ToString(), "6.0", ""); // 取货口 1=A口 2=B口 3=C口 // 起始 plcDJ.SetPlcDBValue(100, "Int", pai1, "12.0", ""); plcDJ.SetPlcDBValue(100, "Int", lie1, "14.0",""); plcDJ.SetPlcDBValue(100, "Int", ceng1, "16.0", ""); // 目标 plcDJ.SetPlcDBValue(100, "Int", EndPai, "18.0", ""); plcDJ.SetPlcDBValue(100, "Int", EndLie, "20.0",""); plcDJ.SetPlcDBValue(100, "Int", EndCeng, "22.0", ""); plcDJ.SetPlcDBValue(100, "String", Palno, "24.0", ""); //// 向plc写入WMS流程字 plcDJ.SetPlcDBValue(100, "Int", "830", "2.0", ""); if (TargetAddre == "01") // A口 { plc.SetPlcDBValue(600, "Int", "210", "92.0", ""); } else if (TargetAddre == "02") // B口 { plc.SetPlcDBValue(600, "Int", "210", "332.0", ""); } else if (TargetAddre == "03") // C口 { plc.SetPlcDBValue(600, "Int", "210", "392.0", ""); } // 将出库任务待执行改为正在执行 wcsSql.SetWmsTasks(Palno, "1"); } } #endregion ; break; case "840": // 跺机通知cs取货完成 switch (taskTyoe) { case "10": // 入库 string quhuokou = plcDJ.GetPlcDBValue(100, "Int", "6.0"); if (quhuokou == "1") { string pclvalue = plc.GetPlcDBValue(600, "Int", "90.0"); if (pclvalue == "170") { plc.SetPlcDBValue(600, "Int", "180", "92.0", ""); } } else if (quhuokou == "2") { // 验证输送线上一个流程字 string pclvalue = plc.GetPlcDBValue(600, "Int", "330.0"); if (pclvalue == "170") { plc.SetPlcDBValue(600, "Int", "180", "332.0", ""); } } else if (quhuokou == "3") { string pclvalue = plc.GetPlcDBValue(600, "Int", "390.0"); if (pclvalue == "170") { plc.SetPlcDBValue(600, "Int", "180", "392.0", ""); } }; // 给跺机写入取货完成 plcDJ.SetPlcDBValue(100, "Int", "850", "2.0", ""); break; case "11": // 出库 plcDJ.SetPlcDBValue(100, "Int", "850", "2.0", ""); LedFootStr = "取货完成! "; Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr); break; } break; case "860": // 跺机通知cs放货完成 switch (taskTyoe) { case "10": // 入库 // 更改入库任务状态; Palno = plcDJ.GetPlcDBValue(100, "String", "24.0"); // 获取托盘号 string pai = plcDJ.GetPlcDBValue(100, "Int", "18.0"); // 获取目标排 string lie = plcDJ.GetPlcDBValue(100, "Int", "20.0"); // 获取目标列 string ceng = plcDJ.GetPlcDBValue(100, "Int", "22.0"); // 获取目标层 if (wcsSql.SetWmsTasks(Palno, "3")) { // 调用wms接口上架完成 wcsSql.WcsinWms(Palno, "QH-" + pai + "-" + lie.PadLeft(2, '0') + "-" + ceng.PadLeft(2, '0'), "1"); plcDJ.SetPlcDBValue(100, "Int", "880", "2.0", ""); LedFootStr = "入库完成! "; string rukukou = plcDJ.GetPlcDBValue(100, "Int", "6.0"); string acd = ""; if (rukukou == "1") { acd = "A1"; } else if (rukukou == "2") { acd = "B1"; } else if (rukukou == "3") { acd = "C1"; }; Led.SetOnlyLed(acd, "入库任务", "托盘号:" + Palno + "\n目标库位:QH-" + pai + "-" + lie.PadLeft(2, '0') + "-" + ceng.PadLeft(2, '0'), LedFootStr); } ; break; case "11": // 出库 Palno = plcDJ.GetPlcDBValue(100, "String", "24.0"); // 获取托盘号 FromPai = plcDJ.GetPlcDBValue(100, "Int", "12.0"); // 获取起始排 FromLie = plcDJ.GetPlcDBValue(100, "Int", "14.0"); // 获取起始列 FromCeng = plcDJ.GetPlcDBValue(100, "Int", "16.0"); // 获取起始层 // 通知输送线卸货完成 string quhuokou = plcDJ.GetPlcDBValue(100, "Int", "6.0"); if (quhuokou == "1") { plc.SetPlcDBValue(600, "Int", "230", "92.0", ""); } else if (quhuokou == "2") { plc.SetPlcDBValue(600, "Int", "230", "332.0", ""); } else if (quhuokou == "3") { plc.SetPlcDBValue(600, "Int", "230", "392.0", ""); }; if (wcsSql.SetWmsTasks(Palno, "3")) { // 调用wms接口 出库完成 wcsSql.WcsinWms(Palno, "QH-" + FromPai + "-" + FromLie.PadLeft(2, '0') + "-" + FromCeng.PadLeft(2, '0'), "2"); string logStr = $"托盘号:{Palno};库位地址:QH-{FromPai}-{FromLie.PadLeft(2, '0')}-{FromCeng.PadLeft(2, '0')}"; Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(logStr, "记录log:"); // 跺机状态写入卸货完成 plcDJ.SetPlcDBValue(100, "Int", "880", "2.0", ""); LedFootStr = "出库完成! "; Led.SetOnlyLed("ABC", "出库任务", LedTopStr, LedFootStr); }; break; }; break; case "902": // 取货不可执行(取内库位,外库位有货) // led屏幕显示报警信息 ; break; case "903": // 卸货不可执行 满入 // led屏幕显示报警信息 ; break; case "904": // 取货不可执行 空取 // led屏幕显示报警信息 ; break; default: break; } #endregion #region 通知/报警 // 循环读取所有报警信息 bool plcDjBl = false; bool plcBl = false; try { bool[] djBls = plcDJ.GetPlcMBValues("3000.0"); // 读取垛机报警信息 bool[] Bls = plc.GetPlcMBValues("3000.0"); // 读取输送线报警信息 DataRow[] djRows = AlarmDt.Select("IPAddre = '跺机'"); for (int i = 0; i < djRows.Length; i++) { if (djBls[i] == true) { plcDjBl = true; // 验证当前报警信息是否已存在 if (wcsSql.GetErrorMessage(djRows[i]["M"].ToString())) { continue; } // 发送到LED屏幕运行状态区域 string Mstr = djRows[i]["AlarmStr"].ToString(); //string AccessCode = djRows[i]["AccessCode"].ToString(); //Led.SetMstrLeds(AccessCode, Mstr); //try //{ // //Led.SetOnlyLed("ABC", "报警", LedTopStr, "跺机报警"); //} //catch { } // 将报警信息存储到Table wcsSql.SetErrorMessage("跺机报警", djRows[i]["M"].ToString(), Mstr); // 读取M点报警信息;通知前端刷新 WSChatController wSChat = new WSChatController(); wSChat.AlarmInformation("跺机报警:" + Mstr, ""); } } DataRow[] ssxRows = AlarmDt.Select("IPAddre = '输送线'"); for (int i = 0; i < Bls.Length; i++) { if (Bls[i] == true) { plcBl = true; // 验证当前报警信息是否已存在 if (wcsSql.GetErrorMessage(ssxRows[i]["M"].ToString())) { continue; } // 发送到LED屏幕运行状态区域 string Mstr = ssxRows[i]["AlarmStr"].ToString(); string AccessCode = ssxRows[i]["AccessCode"].ToString(); //Led.SetMstrLeds(AccessCode, Mstr); try { //if (LedFootStr.Contains("A")) //{ // Led.SetOnlyLed("A1", "消息", LedTopStr, AccessCode + "口输送线报警!"); // Led.SetOnlyLed("A2", "消息", LedTopStr, AccessCode + "口输送线报警!"); //} //else if (LedFootStr.Contains("B")) //{ // Led.SetOnlyLed("B1", "消息", LedTopStr, AccessCode + "口输送线报警!"); //} //else if (LedFootStr.Contains("C")) //{ // Led.SetOnlyLed("C1", "消息", LedTopStr, AccessCode + "口输送线报警!"); // Led.SetOnlyLed("C2", "消息", LedTopStr, AccessCode + "口输送线报警!"); //} } catch { } // 将报警信息存储到Table wcsSql.SetErrorMessage("输送线报警", ssxRows[i]["M"].ToString(), Mstr); // 读取M点报警信息;通知前端刷新 WSChatController wSChat = new WSChatController(); wSChat.AlarmInformation("输送线报警:" + Mstr, ""); } } if (!plcDjBl && !plcBl) { // 删除所有报警信息 wcsSql.DelErrorMessage(); if (LedFootStr.Contains("报警")) { //Led.SetOnlyLed("ABC", "报警恢复", "", ""); } } } catch { } #endregion } else // 手动模式 { } #region 单个报警信息 liudl Edit 效率太低放弃 //foreach (DataRow row in AlarmDt.Rows) //{ // // 改为for的并循环 // string Mstr = string.Empty; // string vluestr = string.Empty; // switch (row["IPAddre"].ToString()) // { // case "跺机": // vluestr = plcDJ.GetPlcMBValue("Bit", row["M"].ToString()); // if (vluestr == "True") // { // plcDjBl = true; // // 发送到LED屏幕运行状态区域 // Mstr = row["AlarmStr"].ToString(); // string AccessCode = row["AccessCode"].ToString(); // Led.SetMstrLeds(AccessCode, Mstr); // // 将报警信息存储到Table // wcsSql.SetErrorMessage("跺机报警", row["M"].ToString(), Mstr); // // 读取M点报警信息;通知前端刷新 // WSChatController wSChat = new WSChatController(); // wSChat.AlarmInformation("跺机报警:" + Mstr); // }; // break; // case "输送线": // vluestr = plc.GetPlcMBValue("Bit", row["M"].ToString()); // if (vluestr == "True") // { // plcBl = true; // // 发送到LED屏幕运行状态区域 // Mstr = row["AlarmStr"].ToString(); // string AccessCode = row["AccessCode"].ToString(); // Led.SetMstrLeds(AccessCode, Mstr); // // 将报警信息存储到Table // wcsSql.SetErrorMessage("输送线报警", row["M"].ToString(), Mstr); // // 读取M点报警信息;通知前端刷新 // //WSChatController wSChat = new WSChatController(); // //wSChat.AlarmInformation("输送线报警:" + Mstr); // }; // break; // default:; break; // } //} //if (!plcDjBl && !plcBl) //{ // // 删除所有报警信息 // wcsSql.DelErrorMessage(); //} #endregion } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "定时器错误"); } finally { // 关闭连接 plc.ClosePlc(); plcDJ.ClosePlc(); m_bRuning = true; } } } /// /// 应用池回收的时候调用的方法 /// public static void SetContent(string type) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(type + "执行该方法:", "iis自动回收机制"); } /// /// 空托盘垛出入库输送线 /// /// /// public static void TrayConveyor(object source, System.Timers.ElapsedEventArgs e) { try { if (IsRunConveyor) { IsRunConveyor = false; #region 与PLC交互逻辑 // 获取运输线交互IP集合 DataRow[] iProws = PlcInfoDt.Select("Level = '0' and Type = '1' "); // 循环连接运输线设备 foreach (DataRow ipRow in iProws) { // 连接运输线PlC string plcIp = ipRow["PlcIP"].ToString(); string plcStatus = ""; // PLC连接状态 PlcIO plc = new PlcIO(plcIp, 1, ref plcStatus); if (plcStatus.Length > 0) { // 通知前端设备监控画面连接PLC失败 WSChatController wSChat = new WSChatController(); wSChat.AlarmInformation("连接设备失败:" + ipRow["Name"].ToString(), ""); // LED显示连连接失败 LedDll Led = new LedDll(); Led.LEDstr(ipRow["LedIP"].ToString(), "提示", "连接不上PLC,请检查网络连接!", ipRow["Name"].ToString()); } // 循环各工位与PLC进行交互 DataRow[] rows = PlcInfoDt.Select($"Level = '2' and Type = '1' and PlcIP='{plcIp}' "); foreach (DataRow row in rows) { // 读取工位流程字 string dbNumber = row["DbNumber"].ToString(); string posType = row["PosType"].ToString(); string plcPos = row["PlcPos"].ToString(); string wcsPos = row["WcsPos"].ToString(); string stationNum = row["StationNum"].ToString(); string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); //判断工位是否为23、33、41 if (stationNum == "23" || stationNum == "33" || stationNum == "41") { // 判断该工位是否有任务 0 空闲 为20申请空托盘 if (plcValue == "0") { continue; } else { TrayConveyorHandler(plc, plcValue, row); } } } // 关闭设备连接 plc.ClosePlc(); } IsRunConveyor = true; #endregion } } catch (Exception ex) { IsRunConveyor = true; throw ex; } } /// /// 空托盘垛申请运输线业务处理函数 /// /// PLC连接 /// PLC控制字 /// 工位信息 private static void TrayConveyorHandler(PlcIO plc, string plcValue, DataRow row) { try { DALWcsMessage wcsMySql = new DALWcsMessage(); DataTable dt = wcsMySql.GetWCSConveyorInfo(); string palletNo = ""; // 托盘号 string taskType = ""; // 任务类型 string skuType = ""; // 物料类型 string subPallet = ""; // 有无子托盘 0无 1有 string skuQty = ""; // 物料数量 string disQty = ""; // 拆跺数量 string skuWeight = ""; // 物料重量 string packagingStatus = ""; //打包状态 string wrappedStatus = ""; //缠膜状态 // 托盘绑定实体类 WCSPalletBind model = new WCSPalletBind(); // 任务明细实体类 WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); tasksMonitor.TaskNo = ""; tasksMonitor.PlcId = int.Parse(row["Id"].ToString()); tasksMonitor.PlcName = row["Name"].ToString(); tasksMonitor.Status = "2"; // 执行完成 switch (row["StationNum"].ToString()) { #region 申请空托盘垛 case "23": #region 23工位申请空托盘垛出库 //palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号 //taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库 //skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型 //subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有 //skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量 //disQty = plc.GetPlcDBValue(1101, "Byte", "431.0"); // 拆跺数量 //skuWeight = plc.GetPlcDBValue(1101, "Real", "432.0"); // 物料重量 //packagingStatus = plc.GetPlcDBValue(1101, "Byte", "436.0"); //打包状态 //wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "437.0"); //缠膜状态 //// 绑定托盘实体类 //model.PalletNo = palletNo; //model.TaskType = taskType; //model.SubPallet = subPallet; //model.SkuQty = int.Parse(skuQty); //model.SkuWeight = skuWeight; //model.PackagingStatus = packagingStatus; //model.WrappedStatus = wrappedStatus; //model.IsBale = packagingStatus; //model.IsBelt = wrappedStatus; //model.StationNum = "23"; //model.PlcId = row["Id"].ToString(); if (plcValue == "20") // PLC 写入申请空托盘,向WCS申请托盘,WCS向WMS申请出库任务 { //向WMS申请塑料子托盘垛 string endLocat = "23"; // 送货工位号 string strMsg = wcsMySql.GetSupperPalletLocation(out string palletNo1, "100098", endLocat); string ledStr = strMsg; //向WMS申请空托盘信息 if (strMsg.Contains("-1")) // 申请空托盘失败 { // 写入wcs控制字流程120 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "120", row["WcsPos"].ToString(), ""); // 写入任务明细表 tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = $"{palletNo1}:申请库内空托盘失败!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); } else // 申请空托盘成功 { //收到申请后给plc返回20 plc.SetPlcDBValue(1101, "Int", "20", "462.0", ""); var arr = strMsg.Split(','); //string duoji = "0"; } } else if (plcValue == "21") { // 不用管 plc处理中 break; } else if (plcValue == "22") { //收到22后 为plc确认货物到23工位 在任务明细中加入空托出库完成 // 写入wcs流程控制字 130 plc.SetPlcDBValue(int.Parse(row["DbNumber"].ToString()), row["PosType"].ToString(), "21", row["WcsPos"].ToString(), ""); tasksMonitor.StartLocat = model.StationNum; tasksMonitor.InteractiveMsg = "PLC接收到申请空托出库完成!"; tasksMonitor.PalletNo = palletNo; wcsMySql.AddWCSTasksMonitor(tasksMonitor); } #endregion break; case "33": #region 33工位申请空托盘垛出库 palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号 taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库 skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "431.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "432.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "436.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "437.0"); //缠膜状态 // 绑定托盘实体类 model.PalletNo = palletNo; model.TaskType = taskType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; model.WrappedStatus = wrappedStatus; model.IsBale = packagingStatus; model.IsBelt = wrappedStatus; model.StationNum = "33"; model.PlcId = row["Id"].ToString(); #endregion break; case "41": #region 41工位申请空托盘垛出库 palletNo = plc.GetPlcDBValue(1101, "String", "400.0"); // 托盘号 taskType = plc.GetPlcDBValue(1101, "Int", "424.0"); // 任务类型 10 入库 其它为出库 skuType = plc.GetPlcDBValue(1101, "Int", "426.0"); // 物料类型 subPallet = plc.GetPlcDBValue(1101, "Byte", "429.0"); // 有无子托盘 0无 1有 skuQty = plc.GetPlcDBValue(1101, "Int", "430.0"); // 物料数量 disQty = plc.GetPlcDBValue(1101, "Byte", "431.0"); // 拆跺数量 skuWeight = plc.GetPlcDBValue(1101, "Real", "432.0"); // 物料重量 packagingStatus = plc.GetPlcDBValue(1101, "Byte", "436.0"); //打包状态 wrappedStatus = plc.GetPlcDBValue(1101, "Byte", "437.0"); //缠膜状态 // 绑定托盘实体类 model.PalletNo = palletNo; model.TaskType = taskType; model.SubPallet = subPallet; model.SkuQty = int.Parse(skuQty); model.SkuWeight = skuWeight; model.PackagingStatus = packagingStatus; model.WrappedStatus = wrappedStatus; model.IsBale = packagingStatus; model.IsBelt = wrappedStatus; model.StationNum = "41"; model.PlcId = row["Id"].ToString(); #endregion break; #endregion } } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "定时器错误"); throw ex; } } /// /// 垛机输送线连接次数 /// /// 输送线 /// 垛机 /// 错误位置 private static void PlcCounts(int SsxNum, int DjNum, string mes) { try { Logger logger = LogManager.GetCurrentClassLogger(); if (SsxNum != 0) { PlcSsxNums += SsxNum; if (SsxNum == 1) { logger.Error("当前PLC输送线连接数:" + PlcSsxNums.ToString() + ",连接位置:" + mes); } else if (SsxNum == -1) { logger.Error("当前PLC输送线连接数:" + PlcSsxNums.ToString() + ",断开位置:" + mes); } } else if (DjNum != 0) { PlcDjNums += DjNum; if (DjNum == 1) { logger.Error("当前PLC垛机连接数:" + PlcDjNums.ToString() + ",连接位置:" + mes); } else if (DjNum == -1) { logger.Error("当前PLC垛机连接数:" + PlcDjNums.ToString() + ",断开位置:" + mes); } } //if (Num == -1) //{ // logger.Error("当前PLC断开连接:" + PlcSsxNums.ToString()); // logger.Error("当前PLC连接数:" + PlcSsxNums.ToString()); //} //else //{ // logger.Error("当前PLC连接成功:" + PlcSsxNums.ToString()); //} } catch { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前PLC输送线连接数(异常):" + PlcSsxNums.ToString() + ",异常位置:" + mes); logger.Error("当前PLC垛机连接数(异常):" + PlcDjNums.ToString() + ",异常位置:" + mes); } } } }