using BLL; using BLL.DAL; using Commom.DotNetDevices; using ICSharpCode.SharpZipLib.Zip; using Microsoft.AspNet.SignalR.Hosting; using Model; using Model.MessageModel; using Newtonsoft.Json; using NLog; using System; using System.Data; using System.Text; using wms.Controllers; using wms.Task; namespace wms.Task { public class PlcInteraction { /// /// 托盘输送线交互(自动模式) PlcIO plc,string ipStr /// public void ConveyorsInteraction2(DataRow row, DataTable PlcInfoDt, PlcIO plc, PlcIO plcDj1, PlcIO plcDj2) { try { string plcStatus = ""; DALWcsMessage wcsMySql = new DALWcsMessage(); WSChatController wSChat = new WSChatController(); DataRow[] plcRows = PlcInfoDt.Select($"Level = '2' and PlcIP={row["Id"].ToString()} "); foreach (DataRow plcRow in plcRows) { string PalletNo = "", EndLocat = "", TaskNo = "", plcValue = ""; // 读取工位流程字 string dbNumber = plcRow["DbNumber"].ToString();//DB块值 string posType = plcRow["PosType"].ToString();//流程字类型 string plcPos = plcRow["PlcPos"].ToString();//plc流程字值 string wcsPos = plcRow["WcsPos"].ToString(); string stationNum = plcRow["StationNum"].ToString();//工位 plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); // 无流程的工位跳出 if (plcValue == "0") { continue; } // 读取当前工位各偏移量值 DataTable posDt = wcsMySql.GetPlcPos(plcRow["Id"].ToString()); DataRow posRosPlcPallet = posDt.Select($"Name = 'PlcPalletNo' ")[0];// 托盘号 PalletNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRosPlcPallet["PosType"].ToString(), posRosPlcPallet["PlcPos"].ToString()); DataRow posRosPlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号 TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRosPlcTask["PosType"].ToString(), posRosPlcTask["PlcPos"].ToString()); WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); switch (plcValue) { case "820": // 申请储位 #region 入库取货工位 //LED屏幕显示申请信息 LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "申请储位", "托盘号:" + PalletNo); string strMsg = ""; if (TaskAction.tuoji) { // 向WMS申请储位信息 strMsg = wcsMySql.GetLocations(PalletNo, stationNum, ref EndLocat, ref TaskNo); } else { //需判断一下是否为叠拖机工位 // WCS自申请储位 strMsg = wcsMySql.GetWcsLocations(PalletNo, stationNum, ref EndLocat, ref TaskNo); } if (strMsg.Contains("-1")) // 申请储位失败 { var strMsg2 = strMsg.Substring(2); //LED屏幕显示申请失败信息 LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "申请储位", "托盘号:" + PalletNo + "申请储位失败," + strMsg2 + " "); //托盘号 var posRos103 = posDt.Select($"Name = 'PalletNo' ")[0]; var a10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos103["PosType"].ToString(), PalletNo, posRos103["PlcPos"].ToString()); if (a10) { plc.SetPlcDBValue(int.Parse(dbNumber), posType, "11", wcsPos, true); } break; } else // 申请储位成功 { //修改任务状态为正在执行 wcsMySql.SetWCSTasks(PalletNo, "1", "", TaskNo); // 写入起始工位 var posRos101 = posDt.Select($"Name = 'StartLocatNo' ")[0]; var a10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos101["PosType"].ToString(), stationNum, posRos101["PlcPos"].ToString()); // 写入目的工位 var posRos102 = posDt.Select($"Name = 'EndLocatNo' ")[0]; var b10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos102["PosType"].ToString(), EndLocat, posRos102["PlcPos"].ToString()); //写入托盘号 var posRos103 = posDt.Select($"Name = 'PalletNo' ")[0];// 托盘号 var c10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos103["PosType"].ToString(), PalletNo, posRos103["PlcPos"].ToString()); //写入任务号 var posRos104 = posDt.Select($"Name = 'TaskNo' ")[0]; var d10 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos104["PosType"].ToString(), TaskNo, posRos104["PlcPos"].ToString()); if (a10 && b10 && c10 && d10) { // 写入wcs控制字流程10 bool inBl10 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "10", wcsPos, true); if (inBl10)//判断是否写入成功 { // 写入任务明细表 tasksMonitor.TaskNo = TaskNo; tasksMonitor.StartLocat = stationNum; tasksMonitor.InteractiveMsg = $"写入指令:{stationNum}====》{EndLocat}工位"; tasksMonitor.PalletNo = PalletNo; tasksMonitor.EndLocat = EndLocat; tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());//工位ID tasksMonitor.PlcName = plcRow["Text"].ToString(); //工位描述 wcsMySql.AddWCSTasksMonitor(tasksMonitor); //通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } // Led提示给客户 LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "入库中" + $"储位地址:{strMsg}", "托盘号:" + PalletNo); } } } #endregion break; case "860": // 到达出库口 #region 出库完成 DataTable dt20 = wcsMySql.GetWCSTasks("1", "1", "", "", TaskNo); if (dt20 == null || dt20.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前托盘号不存在对应的任务", "跺机"); break; } // 判断任务类型 DataRow taskRow20 = dt20.Rows[0]; var posRosWcsTask = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号 var a20 = plc.SetPlcDBValue(int.Parse(dbNumber), posRosWcsTask["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRosWcsTask["PlcPos"].ToString()); if (a20) { //写入plc控制字 plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true); wcsMySql.SetWCSTasks("", "2", "", TaskNo); // 反馈给WMS TaskReques taskReques = new TaskReques(); taskReques.taskNo = taskRow20["TaskNo"].ToString(); taskReques.TaskType = taskRow20["Type"].ToString(); taskReques.TaskStatus = taskRow20["Status"].ToString(); bool inBl20 = wcsMySql.RequestTasks(taskReques); if (inBl20) { string roadway = taskRow20["StartRoadway"].ToString(); string num = ""; // 放货工位号 if (roadway == "R01") { num = "11"; //交互工位 } else if (roadway == "R02") { num = "7"; //交互工位 } //修改储位信息 任务类型 执行状态 起始位置 目标位置 wcsMySql.EditLocaetStatus("1", "2", taskRow20["StartLocat"].ToString(), ""); // 写入任务明细表 tasksMonitor.TaskNo = taskRow20["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString()); tasksMonitor.PlcName = plcRow["Text"].ToString(); tasksMonitor.InteractiveMsg = $"任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = taskRow20["PalletNo"].ToString(); tasksMonitor.StartLocat = num; tasksMonitor.EndLocat = taskRow20["EndLocat"].ToString(); tasksMonitor.Status = "2"; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } } LedDisplay(plcRow["LedIP"].ToString(), "工位:" + stationNum, "出完成" + $"储位地址:{taskRow20["StartLocat"].ToString()}", "托盘号:" + taskRow20["PalletNo"].ToString()); } #endregion break; case "100": // 堆垛机可以取货 case "320": // 组盘完成 // 读取托盘号 // 向WMS申请储位(带着托箱支关系) // 向PLC写入流程字 ; break; #region 入库取货处理 // 查询当前托盘对应的任务 DataTable dt100 = wcsMySql.GetWCSTasks("1", "0", "", "", TaskNo); if (dt100 == null || dt100.Rows.Count <= 0) { break; } DataRow taskRow100 = dt100.Rows[0]; string EndRoadway = taskRow100["EndRoadway"].ToString(); // 根据任务判断目标巷道确认跺机 string dJIP100 = ""; PlcIO plcDj = plcDj1; if (EndRoadway == "R01") { dJIP100 = "192.168.21.30"; plcDj = plcDj1; } else if (EndRoadway == "R02") { dJIP100 = "192.168.21.40"; plcDj = plcDj2; } else { break; } var s = wcsMySql.GetPlcIps(); DataRow plcIp = s.Select($"IP = '{dJIP100}' ")[0]; DataRow plcIpRow = PlcInfoDt.Select($"Level = '0' and PlcIP={plcIp["Id"].ToString()} ")[0]; // 获取跺机当前状态 string djValue = plcDj.GetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), plcIpRow["PosType"].ToString(), plcIpRow["PlcPos"].ToString()); if (djValue != "10") { Logger logger = LogManager.GetLogger("LogFile1"); logger.Info("报警:" + DateTime.Now.ToString("当前时间:" + "yyyy年MM月dd日 dddd tt HH:mm:ss"), "任务:" + taskRow100["TaskNo"].ToString() + "跺机有任务稍后执行!"); break; } DataTable posDjDt = wcsMySql.GetPlcPos(plcIpRow["Id"].ToString()); DataRow posDjRos1 = posDjDt.Select($"Name = 'TaskNo' ")[0];// 任务号 DataRow posDjRos2 = posDjDt.Select($"Name = 'PalletNo' ")[0];// 托盘号 DataRow posDjRos3 = posDjDt.Select($"Name = 'StartRow' ")[0];// 起始排 DataRow posDjRos4 = posDjDt.Select($"Name = 'StartColumn' ")[0];// 起始列 DataRow posDjRos5 = posDjDt.Select($"Name = 'StartLayer' ")[0];// 起始层 DataRow posDjRos6 = posDjDt.Select($"Name = 'EndRow' ")[0];// 目的排 DataRow posDjRos7 = posDjDt.Select($"Name = 'EndColumn' ")[0];// 目的层 DataRow posDjRos8 = posDjDt.Select($"Name = 'EndLayer' ")[0];// 目的层 string endLocat = taskRow100["EndLocat"].ToString(); 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(); #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(); //} //判断排数大于2 if (int.Parse(pai) > 2) //大于4 { pai = (int.Parse(pai) - 2).ToString(); } #endregion // 向跺机写入任务号 var a100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos1["PosType"].ToString(), taskRow100["TaskNo"].ToString(), posDjRos1["PlcPos"].ToString()); // 向跺机写入托盘号 var b100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos2["PosType"].ToString(), taskRow100["PalletNo"].ToString(), posDjRos2["PlcPos"].ToString()); // 向跺机写入取货地址 var c100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos3["PosType"].ToString(), "2", posDjRos3["PlcPos"].ToString()); var d100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos4["PosType"].ToString(), "100", posDjRos4["PlcPos"].ToString()); var e100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos5["PosType"].ToString(), "1", posDjRos5["PlcPos"].ToString()); // 向跺机写入放货地址(储位地址) var f100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos6["PosType"].ToString(), pai, posDjRos6["PlcPos"].ToString()); var g100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos7["PosType"].ToString(), lie, posDjRos7["PlcPos"].ToString()); var h100 = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), posDjRos8["PosType"].ToString(), ceng, posDjRos8["PlcPos"].ToString()); if (a100 && b100 && c100 && d100 && e100 && f100 && g100 && h100) { // 向跺机写入控制流程字 var bl = plcDj.SetPlcDBValue(int.Parse(plcIpRow["DbNumber"].ToString()), plcIpRow["PosType"].ToString(), "10", plcIpRow["WcsPos"].ToString(), true); if (bl) { // 写入任务明细 tasksMonitor.TaskNo = taskRow100["TaskNo"].ToString(); tasksMonitor.StartLocat = stationNum; tasksMonitor.InteractiveMsg = $"写入指令:{stationNum}工位====》" + endLocat + "储位地址!"; tasksMonitor.PalletNo = taskRow100["PalletNo"].ToString(); tasksMonitor.EndLocat = endLocat; tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());//工位ID tasksMonitor.PlcName = plcRow["Text"].ToString(); //工位描述 tasksMonitor.Status = "2"; wcsMySql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } } } #endregion break; case "120":// 扫描到箱码 ; break; case "130"://请求拆垛 //获取托盘信息 var cdpallno = posDt.Select($"Name = 'PalletNo' ")[0].ToString();//托盘号 DataTable cdinfo = wcsMySql.GetWCSTasks("", "", cdpallno, "", ""); var cdno = cdinfo.Rows[0]["拆垛箱数"].ToString();//拆垛箱数 var SkuNo = cdinfo.Rows[0]["SkuNo"].ToString(); var dx = wcsMySql.GetWCSDX(SkuNo);//垛型 //向PLC写入当前托盘需拆箱数和垛型 //…… //plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true); //wcsMySql.SetWCSTasks("", "2", "", TaskNo); break; case "140":// 拆垛申请组盘回库 //流程未定 //获取托盘信息 var zppallno = posDt.Select($"Name = 'PalletNo' ")[0].ToString();//托盘号 DataTable zpinfo = wcsMySql.GetWCSTasks("", "", zppallno, "", ""); //回传WMS组盘完成 //…… //向PLC写入当前工位组盘完成信号 //…… ; break; case "150":// 拆垛成空托盘 //流程未定 //回传当前工位托盘组盘完成给WMS //向PLC写入完成信号 //…… ; break; default: if (plcValue != "11" && plcValue != "120") { throw new Exception("读取值异常"); } break; } } return; } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "读写plc错误"); throw ex; } } /// /// 件箱输送线交互(自动模式) PlcIO plc,string ipStr /// public void BoxConveyorsInteraction2(DataRow row, DataTable PlcInfoDt, PlcIO plc) { try { string plcStatus = ""; DALWcsMessage wcsMySql = new DALWcsMessage(); WSChatController wSChat = new WSChatController(); Logger logger = LogManager.GetCurrentClassLogger(); DataRow[] plcRows = PlcInfoDt.Select($"Level = '2' and PlcIP={row["Id"].ToString()} "); foreach (DataRow plcRow in plcRows) { string PalletNo = "", EndLocat = "", TaskNo = "", plcValue = ""; // 读取工位流程字 string dbNumber = plcRow["DbNumber"].ToString();//DB块值 string posType = plcRow["PosType"].ToString();//流程字类型 string plcPos = plcRow["PlcPos"].ToString();//plc流程字值 string wcsPos = plcRow["WcsPos"].ToString();//wcs流程字值 string stationNum = plcRow["StationNum"].ToString();//工位 string boxNo = plcRow["boxNo"].ToString();//箱码 plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); // 无流程的工位跳出 if (plcValue == "0") { continue; } // 读取当前工位各偏移量值 DataTable posDt = wcsMySql.GetPlcPos(plcRow["Id"].ToString()); DataRow posRosPlcPallet = posDt.Select($"Name = '箱码' ")[0];// 托盘号 PalletNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRosPlcPallet["PosType"].ToString(), posRosPlcPallet["PlcPos"].ToString()); WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); switch (plcValue) { case "10":// 箱码读到信号——扫码分道 if (TaskAction.Demo) { //演示模式直接随机下发分道 Random random = new Random(); int daohao = random.Next(0, 4); } // 向赋码系统获取箱码信息 接口 var GetLine = wcsMySql.GetBarcodeAndRoute(plcValue); switch (GetLine) { case "0": //成功后的处理 break; case "1": //未获取到该品种码垛规则,需要人工维护 logger.Error("未获取到该品种码垛规则,需要人工维护", "件箱线"); break; case "2": //码垛工位已满 logger.Error("码垛工位已满", "件箱线"); break; case "3": //写入任务失败 logger.Error("写入任务失败", "件箱线"); break; case "4": //更改任务状态为预结批失败 logger.Error("更改任务状态为预结批失败", "件箱线"); break; case "5": //新箱码,需要从赋码系统中获取箱支关系 logger.Error("获取赋码系统箱支关系失败", "件箱线"); break; } break; case "20": // 件箱到达抓取位——机器人抓箱插码 if (TaskAction.Demo) { //演示模式直接给PLC成功信号 } // 判断到达的箱数 var GetIN = wcsMySql.GetBarcodeIN(plcValue, PalletNo); switch (GetIN) { case "0": //成功后的处理 // 向PLC写入可以抓取流程字…… break; case "1": //托盘号错误 logger.Error("托盘号错误", "件箱线"); break; case "2": //箱码重复 logger.Error("检测到箱码重复", "件箱线"); break; case "3": //修改插码状态失败 logger.Error("修改插码状态失败", "件箱线"); break; } break; case "30": // 完成抓取——箱码组盘(建立托盘号与箱码关系) // 读取托盘号 和 完成抓取的箱码号 if (TaskAction.Demo) { //演示模式下的组盘申请储位 } if (wcsMySql.GroupPallno(stationNum, PalletNo)) { //组盘成功后的处理 // 向PLC写入下一步流程字 } break; case "120":// 扫描到箱码(分拣出库) //1、向WMS请求箱码信息 //2、通过箱码信息查询当前绑定分道 //3、向PLC写入当前箱码对应分拣道号 ; break; default: if (plcValue != "11" && plcValue != "120") { throw new Exception("读取值异常"); } break; } } return; } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error(ex.Message, "读写plc错误"); throw ex; } } /// /// 跺机业务处理 /// /// /// /// public void StackersInteraction2(DataRow row, DataTable PlcInfoDt, PlcIO plc, PlcIO conveyorPLC) { try { string plcStatus = ""; DALWcsMessage wcsSql = new DALWcsMessage(); WSChatController wSChat = new WSChatController(); DataRow[] plcRows = PlcInfoDt.Select($"Level = '0' and PlcIP={row["Id"].ToString()} "); foreach (DataRow plcRow in plcRows) { string PalletNo = "", StartLocat = "", EndLocat = "", TaskNo = "", pai, lie, ceng, shen; // 读取跺机流程字 string dbNumber = plcRow["DbNumber"].ToString(); string posType = plcRow["PosType"].ToString(); string plcPos = plcRow["PlcPos"].ToString(); string wcsPos = plcRow["WcsPos"].ToString(); string stationNum = plcRow["StationNum"].ToString(); string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); // 无流程的跺机跳出 if (plcValue == "0") { continue; } // 读取当前工位各偏移量值 DataTable posDt = wcsSql.GetPlcPos(plcRow["Id"].ToString()); WCSTasksMonitor tasksMonitor = new WCSTasksMonitor(); switch (plcValue) { case "820": #region 出库任务 (请求任务) // 获取当前跺机对应的出库任务 0 入库任务 1 出库任务 2 移库任务 3 PLC申请入库 DataTable dt10 = wcsSql.GetWCSTasks("0", "1", "", stationNum, "", ""); if (dt10 == null || dt10.Rows.Count <= 0) { break; } StartLocat = dt10.Rows[0]["StartLocat"].ToString(); // 起始工位 EndLocat = dt10.Rows[0]["EndLocat"].ToString(); // 目标工位 PalletNo = dt10.Rows[0]["PalletNo"].ToString(); // 托盘号 TaskNo = dt10.Rows[0]["TaskNo"].ToString(); // 任务号 // 根据跺机号确认放货工位 string outStationNum = "0"; string endPai = "", endLie = "", endCeng = ""; switch (stationNum) { case "R01": outStationNum = "11"; endPai = "1"; endLie = "100"; endCeng = "1"; break; case "R02": outStationNum = "7"; endPai = "1"; endLie = "100"; endCeng = "1"; break; default: break; } // 读取放货工位状态 DataRow[] rows = PlcInfoDt.Select("Level = '2' and StationNum = '" + outStationNum + "'"); // 交互plc string conveyorValue = conveyorPLC.GetPlcDBValue(int.Parse(rows[0]["dbNumber"].ToString()), rows[0]["PosType"].ToString(), rows[0]["PlcPos"].ToString()); if (conveyorValue == "120") // 放货工位空闲 可放货 { if (int.Parse(outStationNum) > 0) { pai = int.Parse(StartLocat.Substring(0, 2)).ToString(); lie = int.Parse(StartLocat.Substring(2, 2)).ToString(); ceng = int.Parse(StartLocat.Substring(4, 2)).ToString(); shen = int.Parse(StartLocat.Substring(6, 2)).ToString(); if (int.Parse(pai) > 2) //大于4 { pai = (int.Parse(pai) - 2).ToString(); } } else { // 起始储位地址为空,跳过 写入任务明细表 tasksMonitor.StartLocat = ""; tasksMonitor.InteractiveMsg = "起始储位为空!"; tasksMonitor.PalletNo = PalletNo; wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } break; } // 任务号 DataRow posRos10Task = posDt.Select($"Name = 'TaskNo' ")[0]; string palletNoPos = posRos10Task["PlcPos"].ToString(); // 任务号偏移量 string palletNoPosType = posRos10Task["PosType"].ToString(); // 任务号类型 var a10 = plc.SetPlcDBValue(int.Parse(dbNumber), palletNoPosType, TaskNo, palletNoPos); // 托盘号 DataRow posRos10Pln = posDt.Select($"Name = 'PalletNo' ")[0]; var taskNoPos = posRos10Pln["PlcPos"].ToString(); // 托盘号偏移量 var taskNoPosType = posRos10Pln["PosType"].ToString(); // 托盘号类型 var b10 = plc.SetPlcDBValue(int.Parse(dbNumber), taskNoPosType, PalletNo, taskNoPos); // 起始排 DataRow posRos10StartPai = posDt.Select($"Name = 'StartRow' ")[0]; var sPaiPos = posRos10StartPai["PlcPos"].ToString(); // 偏移量 var sPaiPosType = posRos10StartPai["PosType"].ToString(); // 类型 var c10 = plc.SetPlcDBValue(int.Parse(dbNumber), sPaiPosType, pai, sPaiPos); // 起始列 DataRow posRos10StartLie = posDt.Select($"Name = 'StartColumn' ")[0]; var sLiePos = posRos10StartLie["PlcPos"].ToString(); // 偏移量 var sLiePosType = posRos10StartLie["PosType"].ToString(); // 类型 var d10 = plc.SetPlcDBValue(int.Parse(dbNumber), sLiePosType, lie, sLiePos); // 起始层 DataRow posRos10StartCeng = posDt.Select($"Name = 'StartLayer' ")[0]; var sCengPos = posRos10StartCeng["PlcPos"].ToString(); // 偏移量 var sCengPosType = posRos10StartCeng["PosType"].ToString(); // 类型 var e10 = plc.SetPlcDBValue(int.Parse(dbNumber), sCengPosType, ceng, sCengPos); // 目标放货工位 DataRow posRos10EndPai = posDt.Select($"Name = 'EndRow' ")[0]; var ePaiPos = posRos10EndPai["PlcPos"].ToString(); // 偏移量 var ePaiPosType = posRos10EndPai["PosType"].ToString(); // 类型 var f10 = plc.SetPlcDBValue(int.Parse(dbNumber), ePaiPosType, endPai, ePaiPos); DataRow posRos10EndLie = posDt.Select($"Name = 'EndColumn' ")[0]; var eLiePos = posRos10EndLie["PlcPos"].ToString(); // 偏移量 var eLiePosType = posRos10EndLie["PosType"].ToString(); // 类型 var g10 = plc.SetPlcDBValue(int.Parse(dbNumber), eLiePosType, endLie, eLiePos); DataRow posRos10EndCeng = posDt.Select($"Name = 'EndLayer' ")[0]; var eCengPos = posRos10EndCeng["PlcPos"].ToString(); // 偏移量 var eCengPosType = posRos10EndCeng["PosType"].ToString(); // 类型 var h10 = plc.SetPlcDBValue(int.Parse(dbNumber), eCengPosType, endCeng, eCengPos); if (a10 && b10 && c10 && d10 && e10 && f10 && g10 && h10) { // 写入跺机任务下发完成 plc.SetPlcDBValue(int.Parse(dbNumber), posType, "10", wcsPos, true); //判断是出库还是移库(与plc对接时修改 if (true) { //修改储位信息 任务类型 执行状态 起始位置 目标位置 wcsSql.EditLocaetStatus("1", "1", StartLocat, ""); } else if (true) { //修改储位信息 任务类型 执行状态 起始位置 目标位置 wcsSql.EditLocaetStatus("2", "1", StartLocat, EndLocat); } // 将出库任务待执行改为正在执行 wcsSql.SetWCSTasks(PalletNo, "1", "", TaskNo); // 插入任务明细 // 任务明细实体类 tasksMonitor.TaskNo = dt10.Rows[0]["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString()); tasksMonitor.PlcName = plcRow["Text"].ToString(); tasksMonitor.InteractiveMsg = $"写入指令:{StartLocat}储位====》{outStationNum}工位"; tasksMonitor.PalletNo = PalletNo; tasksMonitor.Status = "2"; tasksMonitor.StartLocat = StartLocat; //起始位置 tasksMonitor.EndLocat = outStationNum; //目标工位 wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and StationNum = '{EndLocat}'")[0]; LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo); } } #endregion ; break; case "20": #region 取货完成 DataRow posRos20PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号 DataRow posRos20Task = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号 TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos20PlcTask["PosType"].ToString(), posRos20PlcTask["PlcPos"].ToString()); DataTable dt20 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo); if (dt20.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前托盘号不存在对应的任务", "跺机"); break; } // 判断任务类型 DataRow taskRow20 = dt20.Rows[0]; switch (taskRow20["Type"].ToString()) { case "0": // 入库任务 #region 入库任务 // 向跺机写入控制流程字 var a20 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos20Task["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRos20Task["PlcPos"].ToString()); // 向跺机写入控制流程字 plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true); // 根据跺机号确认取货工位 string outStationNum20r = "0"; switch (stationNum) { case "R01": outStationNum20r = "10"; break; case "R02": outStationNum20r = "6"; break; default: break; } // 读取取货工位状态 DataRow[] rows2 = PlcInfoDt.Select("Level = '2' and StationNum = '" + outStationNum20r + "'"); DataTable posDt20 = wcsSql.GetPlcPos(rows2[0]["Id"].ToString());//获取工位偏移量 DataRow posRos20gwTask = posDt20.Select($"Name = 'TaskNo' ")[0];// 工位任务号 // 向取货工位写入任务号 conveyorPLC.SetPlcDBValue(int.Parse(rows2[0]["dbNumber"].ToString()), posRos20gwTask["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRos20gwTask["PlcPos"].ToString()); // 向取货工位写入流程控制字 var bl = conveyorPLC.SetPlcDBValue(int.Parse(rows2[0]["dbNumber"].ToString()), rows2[0]["PosType"].ToString(), "100", rows2[0]["WcsPos"].ToString(), true); // 写入任务明细表 tasksMonitor.TaskNo = taskRow20["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(rows2[0]["Id"].ToString()); tasksMonitor.PlcName = rows2[0]["Text"].ToString(); tasksMonitor.InteractiveMsg = $"跺机取货完成!"; tasksMonitor.PalletNo = taskRow20["PalletNo"].ToString(); tasksMonitor.StartLocat = outStationNum20r; tasksMonitor.EndLocat = taskRow20["EndLocat"].ToString(); tasksMonitor.Status = "2"; wcsSql.AddWCSTasksMonitor(tasksMonitor); if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } #endregion break; case "1": // 出库任务 #region 出库任务 // 向跺机写入控制流程字 var a20c = plc.SetPlcDBValue(int.Parse(dbNumber), posRos20Task["PosType"].ToString(), taskRow20["TaskNo"].ToString(), posRos20Task["PlcPos"].ToString()); if (!a20c) { break; } // 向跺机写入控制流程字 var b20c = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "20", wcsPos, true); if (!b20c) { break; } // 根据跺机号确认取货工位 string outStationNum20c = "0"; switch (stationNum) { case "R01": outStationNum20c = "11"; break; case "R02": outStationNum20c = "7"; break; default: break; } tasksMonitor.TaskNo = taskRow20["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString()); tasksMonitor.PlcName = plcRow["Text"].ToString(); tasksMonitor.InteractiveMsg = $"跺机取货完成!"; tasksMonitor.PalletNo = taskRow20["PalletNo"].ToString(); tasksMonitor.StartLocat = taskRow20["StartLocat"].ToString(); tasksMonitor.EndLocat = outStationNum20c; tasksMonitor.Status = "2"; wcsSql.AddWCSTasksMonitor(tasksMonitor); if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } #endregion break; default: break; } #endregion break; case "30": #region 操作完成(放货完成) DataRow posRos30PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号 TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos30PlcTask["PosType"].ToString(), posRos30PlcTask["PlcPos"].ToString()); DataTable dt30 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo); if (dt30.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前托盘号不存在对应的任务", "跺机"); break; } // 判断任务类型 DataRow taskRow30 = dt30.Rows[0]; TaskReques taskReques = new TaskReques(); switch (taskRow30["Type"].ToString()) { case "0": // 入库任务 case "3": // plc申请 #region 入库任务 DataRow posRos30Taskr = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号 //写入plc任务号 var a30 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos30Taskr["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30Taskr["PlcPos"].ToString()); if (!a30) { break; } //写入plc控制字 var b30 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "30", wcsPos, true); if (!b30) { break; } wcsSql.SetWCSTasks("", "2", "", TaskNo); // 反馈给WMS taskReques.taskNo = taskRow30["TaskNo"].ToString(); taskReques.TaskType = taskRow30["Type"].ToString(); taskReques.TaskStatus = taskRow30["Status"].ToString(); bool bl = wcsSql.RequestTasks(taskReques); if (bl) { //修改储位信息 任务类型 执行状态 起始位置 目标位置 wcsSql.EditLocaetStatus("0", "2", "", taskRow30["EndLocat"].ToString()); // 写入任务明细表 tasksMonitor.TaskNo = taskRow30["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString()); tasksMonitor.PlcName = plcRow["Text"].ToString(); tasksMonitor.InteractiveMsg = $"任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = taskRow30["PalletNo"].ToString(); tasksMonitor.StartLocat = taskRow30["StartLocat"].ToString(); tasksMonitor.EndLocat = taskRow30["EndLocat"].ToString(); tasksMonitor.Status = "2"; wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } } DataRow ConveyorsRow30r = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow30["StartLocat"].ToString()}'")[0]; LedDisplay(ConveyorsRow30r["LedIP"].ToString(), "工位:" + taskRow30["StartLocat"].ToString(), "入库完成 " + $"储位地址:{taskRow30["EndLocat"].ToString()}", "托盘号:" + taskRow30["PalletNo"].ToString()); #endregion #region 垛机入库不空跑 //入库任务完成后检测是否有同巷道出库任务 //获取当前巷道是否有未执行的出库任务 DataTable ot = wcsSql.GetWCSTasks("0", "1", "", taskRow30["EndRoadway"].ToString(), ""); if (ot.Rows.Count != 0) { if (int.Parse(ot.Select("StartLocat").ToString().Substring(6,2)) == 1) { //外侧储位:执行此储位出库任务 } else { //判断此储位对应的外储位是否无任务 DataTable otn = wcsSql.GetLocateTasks(ot.Select("StartLocat").ToString().Substring(0,6)+"01",""); if (ot.Rows.Count == 0) { //执行此内侧库位出库任务 } } } #endregion break; case "1": // 出库任务 #region 出库任务 // 从出库任务获取巷道号 string roadway = taskRow30["StartRoadway"].ToString(); string num = ""; // 放货工位号 if (roadway == "R01") { num = "11"; //交互工位 } else if (roadway == "R02") { num = "7"; //交互工位 } // 根据目标口获取目标工位 string outCode = taskRow30["EndLocat"].ToString(); // 根据工位号获取工位信息 DataRow ConveyorsRow30c = PlcInfoDt.Select($"Level = '2' and StationNum = '{num}'")[0]; // 读取当前工位各偏移量值 DataTable posDt30 = wcsSql.GetPlcPos(ConveyorsRow30c["Id"].ToString()); if (string.IsNullOrWhiteSpace(outCode)) { outCode = "-1"; } // 任务号 var posRos30GwTask = posDt30.Select($"Name = 'TaskNo' ")[0]; var a30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30GwTask["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30GwTask["PlcPos"].ToString()); // 托盘号 var posRos30Pln = posDt30.Select($"Name = 'PalletNo' ")[0]; var b30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30Pln["PosType"].ToString(), taskRow30["PalletNo"].ToString(), posRos30Pln["PlcPos"].ToString()); // 起始工位 var posRos30StartGw = posDt30.Select($"Name = 'StartLocatNo' ")[0]; var c30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30StartGw["PosType"].ToString(), num, posRos30StartGw["PlcPos"].ToString()); // 目标工位 var posRos30EndGw = posDt30.Select($"Name = 'EndLocatNo' ")[0]; var d30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), posRos30EndGw["PosType"].ToString(), outCode, posRos30EndGw["PlcPos"].ToString()); if (!a30c || !b30c || !c30c || !d30c) { break; } // 写入工位wcs控制字 var e30c = conveyorPLC.SetPlcDBValue(int.Parse(ConveyorsRow30c["DbNumber"].ToString()), ConveyorsRow30c["PosType"].ToString(), "120", ConveyorsRow30c["WcsPos"].ToString(), true); //对应出库口输送线开始执行 if (!e30c) { break; } //写入plc任务号 var posRos30Taskc = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号 var inBl30 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos30Taskc["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30Taskc["PlcPos"].ToString()); if (!inBl30) { break; } // 写入跺机wcs控制字流程30 返回垛机执行完成 bool inBl = plc.SetPlcDBValue(int.Parse(plcRow["DbNumber"].ToString()), plcRow["PosType"].ToString(), "30", plcRow["WcsPos"].ToString(), true); if (!inBl) { break; } // 写入任务明细表 tasksMonitor.TaskNo = taskRow30["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(ConveyorsRow30c["Id"].ToString()); tasksMonitor.PlcName = ConveyorsRow30c["Text"].ToString(); tasksMonitor.InteractiveMsg = $"写入指令:收到跺机放货完成;放货{num}工位===》{outCode}出库口"; tasksMonitor.PalletNo = taskRow30["PalletNo"].ToString(); tasksMonitor.Status = "2"; tasksMonitor.StartLocat = num; //起始位置 tasksMonitor.EndLocat = outCode; //目标工位 wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } #endregion #region 垛机出库不空跑 //出库完成后判断当前巷道是否存在入库任务 DataTable it = wcsSql.GetWCSTasks("0", "0", "", taskRow30["EndRoadway"].ToString(), ""); if (it.Rows.Count != 0) { //判断任务目的货位内外侧 if (int.Parse(it.Select("StartLocat").ToString().Substring(6, 2)) == 1) { //外侧储位:执行此储位入库任务 } else { //判断此托盘目标库位外侧库位是否存在任务 DataTable otn = wcsSql.GetLocateTasks("",it.Select("StartLocat").ToString().Substring(0, 6) + "01"); if (it.Rows.Count == 0) { //执行此储位入库任务 // } } } #endregion break; case "2": // 移库任务 #region 移库任务 DataRow posRos30Tasky = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号 //写入plc任务号 var a30y = plc.SetPlcDBValue(int.Parse(dbNumber), posRos30Tasky["PosType"].ToString(), taskRow30["TaskNo"].ToString(), posRos30Tasky["PlcPos"].ToString()); if (!a30y) { break; } //写入plc控制字 var b30y = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "30", wcsPos, true); if (!b30y) { break; } wcsSql.SetWCSTasks("", "2", "", TaskNo); // 反馈给WMS taskReques.taskNo = taskRow30["TaskNo"].ToString(); taskReques.TaskType = taskRow30["Type"].ToString(); taskReques.TaskStatus = taskRow30["Status"].ToString(); bool onbl = wcsSql.RequestTasks(taskReques); if (onbl) { //修改储位信息 任务类型 执行状态 起始位置 目标位置 wcsSql.EditLocaetStatus("2", "2", taskRow30["StartLocat"].ToString(), taskRow30["EndLocat"].ToString()); // 写入任务明细表 tasksMonitor.TaskNo = taskRow30["TaskNo"].ToString(); tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString()); tasksMonitor.PlcName = plcRow["Text"].ToString(); tasksMonitor.InteractiveMsg = $"任务完成,返回给WMS任务完成!"; tasksMonitor.PalletNo = taskRow30["PalletNo"].ToString(); tasksMonitor.StartLocat = taskRow30["StartLocat"].ToString(); tasksMonitor.EndLocat = taskRow30["EndLocat"].ToString(); tasksMonitor.Status = "2"; wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } } DataRow ConveyorsRow30y = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow30["StartLocat"].ToString()}'")[0]; LedDisplay(ConveyorsRow30y["LedIP"].ToString(), "工位:" + taskRow30["StartLocat"].ToString(), "入库完成 " + $"储位地址:{taskRow30["EndLocat"].ToString()}", "托盘号:" + taskRow30["PalletNo"].ToString()); #endregion break; default: break; } #endregion break; case "100": #region 空取货异常 DataRow posRos100PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号 DataRow posRos100Task = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号 TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos100PlcTask["PosType"].ToString(), posRos100PlcTask["PlcPos"].ToString()); // 向跺机写入控制流程字 var a100 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos100Task["PosType"].ToString(), TaskNo, posRos100Task["PlcPos"].ToString()); if (!a100) { break; } // 向跺机写入控制流程字 var b100 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "100", wcsPos, true); if (!b100) { break; } DataTable dt100 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo); if (dt100.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前任务号不存在对应的任务", "跺机"); break; } DataRow taskRow100 = dt100.Rows[0]; TaskReques taskReques100 = new TaskReques(); taskReques100.taskNo = taskRow100["TaskNo"].ToString(); // 写入log日志 Logger logger2 = LogManager.GetCurrentClassLogger(); //wcs任务变更为异常结束 var s = wcsSql.SetWCSTasks("", "3", "", TaskNo); logger2.Error("wcs任务变更空取异常:" + s.ToString(), "跺机"); // 向WMS反馈任务空取异常 bool bl100 = wcsSql.RequestEmptyException(taskReques100); logger2.Error("反馈WMS任务空取异常:" + bl100.ToString(), "跺机"); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } if (!string.IsNullOrWhiteSpace(taskRow100["EndLocat"].ToString()) && taskRow100["EndLocat"].ToString() != "-1") { DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow100["EndLocat"].ToString()}'")[0]; LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库空取异常 " + $"储位地址:{taskRow100["StartLocat"].ToString()}", "托盘号:" + taskRow100["PalletNo"].ToString()); } #endregion break; case "101": #region 满放货异常 DataRow posRos101PlcTask = posDt.Select($"Name = 'PlcTaskNo' ")[0];// 任务号 DataRow posRos101Task = posDt.Select($"Name = 'TaskNo' ")[0];// 任务号 DataRow posRos101Pln = posDt.Select($"Name = 'PalletNo' ")[0];// 托盘号 TaskNo = plc.GetPlcDBValue(int.Parse(dbNumber), posRos101PlcTask["PosType"].ToString(), posRos101PlcTask["PlcPos"].ToString()); DataTable dt101 = wcsSql.GetWCSTasks("1", "", "", "", TaskNo); if (dt101.Rows.Count == 0) { // 写入log日志 Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("当前任务号不存在对应的任务", "跺机"); break; } DataRow taskRow101 = dt101.Rows[0]; //wcs任务变更为异常结束 wcsSql.SetWCSTasks("", "3", "", TaskNo); PalletNo = taskRow101["PalletNo"].ToString(); TaskReques taskReques101 = new TaskReques(); taskReques101.taskNo = taskRow101["TaskNo"].ToString(); taskReques101.PalletNo = taskRow101["PalletNo"].ToString(); // 向WMS反馈任务满入异常 string strMsg = wcsSql.RequestFullException(taskReques101, taskRow101["StartLocat"].ToString(), ref TaskNo); if (strMsg.Contains("-1"))//失败 { DataRow ConveyorsRow30r = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow101["StartLocat"].ToString()}'")[0]; LedDisplay(ConveyorsRow30r["LedIP"].ToString(), "工位:" + taskRow101["StartLocat"].ToString(), "入库满入异常: " + $"储位地址:{taskRow101["EndLocat"].ToString()} 满入异常,未获取到其他空储位", "托盘号:" + taskRow101["PalletNo"].ToString()); } else //成功 { //修改任务为正在执行 wcsSql.SetWCSTasks("", "1", "", TaskNo); DataRow posDjRos3 = posDt.Select($"Name = 'StartRow' ")[0];// 起始排 DataRow posDjRos4 = posDt.Select($"Name = 'StartColumn' ")[0];// 起始列 DataRow posDjRos5 = posDt.Select($"Name = 'StartLayer' ")[0];// 起始层 DataRow posDjRos6 = posDt.Select($"Name = 'EndRow' ")[0];// 目的排 DataRow posDjRos7 = posDt.Select($"Name = 'EndColumn' ")[0];// 目的层 DataRow posDjRos8 = posDt.Select($"Name = 'EndLayer' ")[0];// 目的层 string endLocat = strMsg; string pai101 = int.Parse(endLocat.Substring(0, 2)).ToString(); string lie101 = int.Parse(endLocat.Substring(2, 2)).ToString(); string ceng101 = int.Parse(endLocat.Substring(4, 2)).ToString(); //判断排数大于2 if (int.Parse(pai101) > 2) //大于4 { pai = (int.Parse(pai101) - 2).ToString(); } // 向跺机写入任务号 var a101 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos101Task["PosType"].ToString(), TaskNo, posRos101Task["PlcPos"].ToString()); // 向跺机写入托盘号 var b101 = plc.SetPlcDBValue(int.Parse(dbNumber), posRos101Pln["PosType"].ToString(), PalletNo, posRos101Pln["PlcPos"].ToString()); // 向跺机写入取货地址 var c101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos3["PosType"].ToString(), "2", posDjRos3["PlcPos"].ToString()); var d101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos4["PosType"].ToString(), "100", posDjRos4["PlcPos"].ToString()); var e101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos5["PosType"].ToString(), "1", posDjRos5["PlcPos"].ToString()); // 向跺机写入放货地址(储位地址) var f101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos6["PosType"].ToString(), pai101, posDjRos6["PlcPos"].ToString()); var g101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos7["PosType"].ToString(), lie101, posDjRos7["PlcPos"].ToString()); var h101 = plc.SetPlcDBValue(int.Parse(dbNumber), posDjRos8["PosType"].ToString(), ceng101, posDjRos8["PlcPos"].ToString()); if (a101 && b101 && c101 && d101 && e101 && f101 && g101 && h101) { // 向跺机写入控制流程字 var bl101 = plc.SetPlcDBValue(int.Parse(dbNumber), posType, "101", wcsPos, true); if (bl101) { // 写入任务明细 tasksMonitor.TaskNo = TaskNo; tasksMonitor.StartLocat = stationNum; tasksMonitor.InteractiveMsg = $"写入指令:{stationNum}工位====》" + endLocat + "储位地址!"; tasksMonitor.PalletNo = PalletNo; tasksMonitor.EndLocat = endLocat; tasksMonitor.PlcId = int.Parse(plcRow["Id"].ToString());//工位ID tasksMonitor.PlcName = plcRow["Text"].ToString(); //工位描述 tasksMonitor.Status = "2"; wcsSql.AddWCSTasksMonitor(tasksMonitor); // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } DataRow ConveyorsRow30r = PlcInfoDt.Select($"Level = '2' and StationNum = '{taskRow101["StartLocat"].ToString()}'")[0]; LedDisplay(ConveyorsRow30r["LedIP"].ToString(), "工位:" + taskRow101["StartLocat"].ToString(), "入库位置变更: " + $"储位地址:{taskRow101["EndLocat"].ToString()} 满入异常,变更储位:为{endLocat}", "托盘号:" + taskRow101["PalletNo"].ToString()); } } } // 通知任务界面任务已存在更新 请更新界面 if (TaskAction.refresh) { wSChat.AlarmInformation("1"); } #endregion break; default: if (plcValue != "11" && plcValue != "12" && plcValue != "21" && plcValue != "22") { throw new Exception("读取值异常"); } break; } } } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("读写:" + ex.Message, "读写plc错误"); throw ex; } } /// /// 跺机位置监控 /// public void StackersAddreInteraction(DataRow row, DataTable PlcInfoDt, PlcIO plc, PlcIO conveyorPLC) { try { string plcStatus = ""; DALWcsMessage wcsSql = new DALWcsMessage(); WSChatController wSChat = new WSChatController(); DataRow[] plcRows = PlcInfoDt.Select($"Level = '0' and PlcIP={row["Id"].ToString()} "); foreach (DataRow plcRow in plcRows) { string PalletNo = "", StartLocat = "", EndLocat = "", TaskNo = "", pai, lie, ceng, shen; // 读取跺机流程字 string dbNumber = plcRow["DbNumber"].ToString(); string posType = plcRow["PosType"].ToString(); string plcPos = plcRow["PlcPos"].ToString(); string wcsPos = plcRow["WcsPos"].ToString(); string stationNum = plcRow["StationNum"].ToString(); // 获取跺机位置 string plcValue = plc.GetPlcDBValue(int.Parse(dbNumber), posType, plcPos); // 无流程的跺机跳出 if (plcValue == "0") { continue; } //读取到垛机定位 else if (plcValue == "99") { // 发送到前端更新设备位置--设备 DeviceMessage message = new DeviceMessage(); message.Message = "垛机实时"; message.Position = 30; //垛机所在绝对位置 在前端根据平均数进行相除 message.Row = 0; //排 message.Column = 0; //列 message.Layer = 0; //层 bool IsMessage = true; switch (row["IP"].ToString()) { case "192.168.21.30": //一号垛机 message.RoadwayNo = "R01"; break; case "192.168.21.40": //二号垛机 message.RoadwayNo = "R02"; break; case "192.168.21.50": //三号垛机 message.RoadwayNo = "R03"; break; case "192.168.21.60": //四号垛机 message.RoadwayNo = "R04"; break; case "192.168.21.70": //五号垛机 message.RoadwayNo = "R05"; break; case "192.168.21.80": //六号垛机 message.RoadwayNo = "R06"; break; case "192.168.21.90": //七号垛机 message.RoadwayNo = "R07"; break; default: //其它(不发送 IsMessage = false; break; } if (IsMessage) { var a = JsonConvert.SerializeObject(message); wSChat.AlarmInformation(a); } } } } catch (Exception ex) { Logger logger = LogManager.GetCurrentClassLogger(); logger.Error("读写:" + ex.Message, "读写plc错误"); throw ex; } } #region 服务方法 /// /// 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 { } } #endregion } }