using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using HslCommunication.Profinet.Siemens; using HslCommunication; using WZ.Useful.Commons; using System.Diagnostics; using System.Threading; using yunneiWCS.EnumDefine; using System.ServiceModel; using yunneiWCS.ORM; using Newtonsoft.Json; using System.Data.Entity; using yunneiWCS.wcf; using yunneiWCS.data; using yunneiWCS.mes; using yunneiWCS.ExtendFunction; using yunneiWCS.EnumDefine.InStockOrder; using yunneiWCS.EnumDefine.Device; using yunneiWCS.DataAccess; using yunneiWCS.Common; using yunneiWCS.SystemInteraction.tianyong; using yunneiWCS.PLC.Srm; using yunneiWCS.SystemInteraction.mes2.dto; using yunneiWCS.ThreadTask; namespace yunneiWCS { public partial class Form1 : Form { /// 虚拟模式 /// /// // bool isvirtual = false;//虚拟模式调试的时候使用 public static bool isvirtual = ConfigHelper.GetConfigBool("IsVirtualMode");//修改为配置文件 【EditBy shaocx,2022-01-27】 public static Mutex single_convIsLock_GG = new Mutex(); public static Mutex single_convIsLock_GT = new Mutex(); /// /// wcf服务变量 /// ServiceHost myWcf; public static srmDB srmdb = new srmDB(); public static convEntity conv1 = new convEntity(); public static convEntity conv2 = new convEntity(); public static convEntity conv3 = new convEntity(); public static convEntity conv4 = new convEntity(); public static List convs = new List { conv1, conv2, conv3, conv4 }; public static srmEntity srm = new srmEntity(); //agvS状态 public static List agvs = new List(); public static SiemensS7Net siemensTcpNet_srm;//声明一个类型为PLC的内部变量 public static SiemensS7Net siemensTcpNet_tran;//声明一个类型为PLC的内部变量 public static Mutex single = new Mutex(); HTTPService api = new HTTPService("http://192.168.0.2:6546/api/v2/");//AGVapi基地址 int deviceOpcInitTime = 0;//设备初始化次数 public static string[] agvSendStatus = { "无任务发送", "无任务发送" }; public static string agvInfo = ""; ///// ///// 缸盖上线站点号 ///// //public static List GGstations = new List { "GGU1", "GGU2", "GGU3" }; public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } private void Form1_Load(object sender, EventArgs e) { #region 只允许单启动和绑定电脑 Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(current.ProcessName); foreach (Process process in processes) { if (process.Id != current.Id) { if (process.MainModule.FileName == current.MainModule.FileName) { MessageBox.Show("不允许重复开启!"); Environment.Exit(0); return; } } } //string computerName = Environment.GetEnvironmentVariable("ComputerName");//获取电脑用户名 //if (computerName != "DESKTOP-0IQRMAE" && computerName != "WIN-7P7ASICT4UL" && computerName != "XMZ1") //{ // MessageBox.Show("非法主机!无权限运行"); // Environment.Exit(0); //} #endregion myWcf = new ServiceHost(typeof(yunneiWCS.wcf.yunneiWcf)); myWcf.Open();//开启wcf服务 #region 设备链接初始化 if (!isvirtual) { //设备链接初始化 Thread deviceth = new Thread(deviceOpcInit); StartThread(deviceth); //给设备实体赋值 } if (isvirtual) { this.label_title.Text = "虚拟模式不可用于生产"; this.label_title.BackColor = Color.Red; } #endregion //检测并发送任务 Thread sendtask = new Thread(sendTaskForHasIssued); StartThread(sendtask); Thread _sendTaskForNoIssued = new Thread(sendTaskForNoIssuedForGT); StartThread(_sendTaskForNoIssued); Thread _sendTaskForNoIssuedForGG = new Thread(sendTaskForNoIssuedForGG); StartThread(_sendTaskForNoIssuedForGG); StartThread(new Thread(sendTaskForPick)); //堆垛机任务确认 Thread TaskConfirm = new Thread(SrmfinishConfirm); StartThread(TaskConfirm); //设备心跳丢失自动初始化 Thread checkHandShake = new Thread(checkPlcHandShake); StartThread(checkHandShake); //入库单转成入库任务 Thread inStockTask = new Thread(inStockCodeToTask); StartThread(inStockTask); Thread mesSendData = new Thread(mesDataTranffic); StartThread(mesSendData); new Thread(mesDataTranfficForRealMes.Handler).Start(); new Thread(RefershData).Start(); new Thread(HandleOutStockList).Start(); new Thread(CalcQty).Start(); new Thread(DeleteData).Start(); } /// 设备初始化 /// 设备初始化 /// private void deviceOpcInit() { if (!isvirtual) { deviceOpcInitTime++; bool plcOK = true; siemensTcpNet_srm = new SiemensS7Net(SiemensPLCS.S1500, "192.168.0.10"); siemensTcpNet_srm.IpAddress = "192.168.0.10";//ip // siemensTcpNet_srm.Port =Convert.ToInt16(4840);//堆垛机PC端口号 //siemensTcpNet_srm.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt"); OperateResult operateResultSrm = siemensTcpNet_srm.ConnectServer(); if (!operateResultSrm.IsSuccess)//判断是否链接PLC成功 { this.label_PLC.Text = "第" + deviceOpcInitTime + "次初始化-堆垛机未链接"; this.label_PLC.BackColor = Color.Red; plcOK = false; } else { this.label_PLC.Text = "第" + deviceOpcInitTime + "次初始化-堆垛机已链接"; this.label_PLC.BackColor = Color.FromArgb(0x404040); //写给堆垛机心跳 Thread wSRM = new Thread(writeSrmHandShake); wSRM.Start(); } siemensTcpNet_tran = new SiemensS7Net(SiemensPLCS.S1500, "192.168.0.21"); siemensTcpNet_tran.IpAddress = "192.168.0.21";//DB块 // siemensTcpNet_tran.Port = Convert.ToInt16(4840);//输送线PLC端口号 // siemensTcpNet_tran.LogNet = new HslCommunication.LogNet.LogNetSingle("logs.txt"); OperateResult operateResultTran = siemensTcpNet_tran.ConnectServer(); if (!operateResultTran.IsSuccess)//判断是否链接PLC成功 { this.label_PLC.Text = this.label_PLC.Text + "-输送线未链接"; this.label_PLC.BackColor = Color.Red; plcOK = false; } else { this.label_PLC.Text = this.label_PLC.Text + "-输送线已链接"; this.label_PLC.BackColor = Color.FromArgb(0x404040); } if (plcOK) { Thread shou = new Thread(shouEntity_Srm); StartThread(shou); Thread shou2 = new Thread(shouEntity_Convs); StartThread(shou2); Thread shou3 = new Thread(shouEntity_Agvs); StartThread(shou3); } } } /// 堆垛机显示服务和设备状态状态 /// /// private void shouEntity_Srm() { string srmState = ""; string srmTaskExcute = ""; while (true) { //Thread.Sleep(1000);//1秒执行一次 Thread.Sleep(500);//时间缩短 【Editby shaocx,2024-10-09】 try { srmState = ""; srmTaskExcute = ""; srm.handShake = siemensTcpNet_srm.ReadInt16(srmdb.R_handShake).Content.ToString(); srm.mode = siemensTcpNet_srm.ReadInt16(srmdb.R_mode).Content.ToString() == "2" ? "自动" : "非自动"; //优化 //srm.state = siemensTcpNet_srm.ReadInt16(srmdb.R_state).Content.ToString() == "1" ? "待机" : "执行中"; var _db_state = siemensTcpNet_srm.ReadInt16(srmdb.R_state).Content.ToString(); var _state_name = "未知"; if (_db_state == "1") { _state_name = "待机"; } else if (_db_state == "2") { _state_name = "执行中"; } else if (_db_state == "3") { _state_name = "暂停中"; } else if (_db_state == "4") { _state_name = "报警"; } srm.state = _state_name; srm.stb = siemensTcpNet_srm.ReadInt16(srmdb.R_stb).Content.ToString() == "1" ? "是" : "否"; string fin = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString(); srm.posY = siemensTcpNet_srm.ReadInt16(srmdb.W_sourcePosX).Content.ToString(); srm.posZ = siemensTcpNet_srm.ReadInt16(srmdb.W_sourcePosZ).Content.ToString(); string Finish = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString(); srm.taskFinish = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString() == "6" ? "完成" : "未完成"; srm.TaskID = siemensTcpNet_srm.ReadInt32(srmdb.R_TaskID).Content; //修复报警信息取值不对的问题 //int Alarm = siemensTcpNet_srm.ReadInt16(srmdb.W_alarmAck).Content; int Alarm = siemensTcpNet_srm.ReadInt16(srmdb.R_Alarm_number).Content; srm.Alarm_info = Enum.GetName(typeof(srmAlarm), Alarm); srm.haveGoods = siemensTcpNet_srm.ReadBool(srmdb.R_haveGoods).Content == true ? "有货" : "没货"; //显示设备状态 srmState = siemensTcpNet_srm.ReadInt16(srmdb.R_state).Content.ToString(); srm.stateDetailName = Enum.GetName(typeof(srmStatus), Convert.ToInt32(srmState)); //显示设备任务执行 srmTaskExcute = siemensTcpNet_srm.ReadInt16(srmdb.R_taskFinish).Content.ToString(); srm.srmTaskExcuteName = Enum.GetName(typeof(srmTaskExcute), Convert.ToInt32(srmTaskExcute)); SystemWarningMsg.Thread_lbl_shouEntity_Srm = "成功"; } catch (Exception ex) { SystemWarningMsg.Thread_lbl_shouEntity_Srm = "异常:" + ex.Message; } } } /// 输送线显示服务和设备状态状态 /// /// private void shouEntity_Convs() { bool bian = true; while (true) { Thread.Sleep(1000);//1秒执行一次 try { //Thread.Sleep(1000); bian = !bian; label_title.BackColor = bian ? Color.Blue : Color.Yellow; for (int i = 0; i < 4; i++) { convs[i].check = siemensTcpNet_tran.ReadByte(convDBS.convDBs[i].R_check).Content == 0 ? "正常" : "外形超限"; convs[i].handShake = siemensTcpNet_tran.ReadInt16(convDBS.convDBs[i].R_handShake).Content.ToString(); convs[i].isAlarm = siemensTcpNet_tran.ReadBool(convDBS.convDBs[i].R_isAlarm).Content == true ? "故障" : "正常"; convs[i].mode = siemensTcpNet_tran.ReadByte(convDBS.convDBs[i].R_mode).Content == 2 ? "自动" : "手动"; convs[i].position = siemensTcpNet_tran.ReadByte(convDBS.convDBs[i].R_position).Content.ToString(); convs[i].taskId = siemensTcpNet_tran.ReadInt32(convDBS.convDBs[i].R_taskId).Content; convs[i].W_GJJY = siemensTcpNet_tran.ReadBool(convDBS.convDBs[i].W_GJJY).Content; convs[i].W_LoadMaterialConfirm = siemensTcpNet_tran.ReadBool(convDBS.convDBs[i].W_LoadMaterialConfirm).Content; } } catch (Exception) { } } } /// 输送线显示服务和设备状态状态 /// /// private void shouEntity_Agvs() { while (true) { Thread.Sleep(2000);//1秒执行一次 try { try { var agvstatus = baseData.readAgvs(); if (agvstatus != null && agvstatus.Count == 4) { agvs = agvstatus; } } catch (Exception) { } } catch (Exception) { } } } /// 设备心跳丢失自动初始化 /// /// private void checkPlcHandShake() { while (true) { Thread.Sleep(60000); if ((srm.handShake == null || conv1.handShake == null) && isvirtual == false) { deviceOpcInit(); } } } /// 写给堆垛机心跳 /// /// private void writeSrmHandShake() { int handShake = 0; while (true) { handShake++; if (handShake > 10000) { handShake = 0; } Thread.Sleep(2000); short MyData = Convert.ToInt16(handShake); var iss = siemensTcpNet_srm.Write(srmdb.W_handShake, MyData); } } /// 开启线程 /// /// private void StartThread(Thread thread) { if (thread != null) { thread.IsBackground = true; thread.Start(); } } #region 找空库位 【重要!!!!!】 /// 找空库位 /// /// /// 库位类型,库口=0,空库位=1,缸体=2,缸盖=3 /// public static string findStorage(int positionType) { //库位类型,库口=0,空库位=1,缸体=2,缸盖=3,缸体空托盘=4,缸盖空托盘=5,空托盘=6 string toPlace = ""; if (single.WaitOne())//增加线程锁防止并发 { if (positionType != 2 && positionType != 3) { return "参数异常"; } try { using (dbmodel mod = new dbmodel()) { //寻找所有的空库位 List findPosition = mod.position.Where(x => x.positionType == 1 && x.isfree == false && x.isLock == false && x.enable == true && (x.positionName != "2-27-5" && x.positionName != "2-12-5") //2-27-5 和2-12-5 是除湿机放的位置 【EditBy shaocx,2022-03-29】 ).ToList(); //增加对库存数据的查询过滤 【2022-03-26】 findPosition = MyExtendHelper.FilterEmptyPosition(mod, findPosition); if (findPosition.Count < 1) { return ""; } List outPosition = new List(); if (positionType == 2) { outPosition = findPosition.Where(x => x.col > 19).OrderBy(x => x.layer).ThenByDescending(x => x.col).ToList(); //outPosition.Clear(); //满了就借用缸盖库位 if (outPosition.Count < 1) { outPosition = findPosition.Where(x => x.col < 20).OrderByDescending(x => x.col).ThenBy(x => x.layer).ToList(); } } if (positionType == 3) { outPosition = findPosition.Where(x => x.col < 20).OrderBy(x => x.layer).ThenBy(x => x.col).ToList(); // outPosition.Clear(); //满了就借用缸体库位 if (outPosition.Count < 1) { outPosition = findPosition.Where(x => x.col > 19).OrderBy(x => x.col).ThenBy(x => x.layer).ToList(); } } if (outPosition.Count > 0) { toPlace = outPosition[0].positionName + "/" + outPosition[0].positionId; //outPosition[0].isLock = true; PositionHandler.Lock(true, outPosition[0], "找空库位", SysGloble.WCSNAME, null); } int res = mod.SaveChanges(); if (res < 1) { res = mod.SaveChanges(); if (res < 1) { res = mod.SaveChanges(); if (res < 1) { toPlace = ""; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "findStorage", "保存失败"); } } } } } catch (Exception ex) { toPlace = ""; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "findStorage", ex.ToString()); } finally { single.ReleaseMutex(); }//一轮结束 } return toPlace; } #endregion #region 消费Task任务数据线程 【EditBy shaocx,2022-02-06】 #region 原先的方法 ///// 发送任务给设备 ///// ///// //private void sendTask() //{ // while (true) // { // Thread.Sleep(2000); // try // { // int ishaveTask = 0; // using (dbmodel mod = new dbmodel()) // { // //area=1是缸体侧,area=2是缸盖侧 // //先处理任务中的任务(在输送线上的) // List FinishTasking = mod.task.Where(x => x.taskStatus == 3).ToList(); // if (FinishTasking.Count > 0) // { // List bobyTask = FinishTasking.Where(x => x.area == 1).ToList(); // #region 处理缸体未完成任务 // if (bobyTask.Count > 0) // { // foreach (var item in bobyTask) // { // string SourcePlace = ""; // if (!isvirtual) // { // #region 判断输送线任务id,赋值SourcePlace // if (conv1.taskId == item.taskId) // { // SourcePlace = "2-39-1"; // } // if (conv2.taskId == item.taskId) // { // SourcePlace = "1-39-1"; // } // #endregion // } // if (item.taskType == 3 || item.taskType == 5) // {//呼叫空托 或 缸体上线 // #region 发送rgv任务 // if (SourcePlace != "") // { // bool isReadAgv = false; // if (!isvirtual) // { // #region 判断AGV是否空闲 // if (agvs.Count == 4) // { // string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1); // if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1); // if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // } // #endregion // } // if (isReadAgv) // { // #region 发送AGV任务 并清空库存 // string res = "失败"; // if (!isvirtual) // { // res = baseData.sendAgvTask(item.taskId, SourcePlace, item.toPlace, 1); // } // string tasktype = "缸体呼叫空托盘/缸体上线"; // if (res == "") // { // #region 清空库存更新状态 // item.taskStatus = (int)taskStatus.完成; // mod.SaveChanges(); // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId; // //库存位 // position positions = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace); // //上下线站点位 // //解锁输送线 // position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace); // convs.isLock = false; // if (positions != null) // { // #region 清空库位 // productStock stock = mod.productStock.FirstOrDefault(x => x.positionId == positions.positionId); // if (stock != null) // { // if (item.taskType == 5)//上线就把数据放到上线站点上 // { // position positionStation = mod.position.FirstOrDefault(x => x.positionName == item.toPlace); // if (positionStation != null) // { // stock.positionId = positionStation.positionId; // positionStation.isfree = true; // } // List stocklist = mod.productStockList.Where(x => x.stockId == positions.positionId).ToList(); // if (stocklist.Count > 0) // { // foreach (var itemList in stocklist) // { // itemList.stockId = positionStation.positionId; // } // } // } // else//呼叫空托就清空库存 // { // mod.productStock.Remove(stock); // } // positions.isfree = false; // positions.isLock = false; // positions.quantity = 0; // positions.positionType = 1; // } // else // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "任务ID" + item.taskId + "-" + tasktype + "查找库存失败"); // } // #endregion // } // else // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "任务ID" + item.taskId + "-" + tasktype + "查找库位失败"); // } // #endregion // } // else // { // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败,任务ID:" + item.taskId; // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", tasktype + "发送RGV任务失败"); // } // #endregion // int saveRes = mod.SaveChanges(); // #region 验证是否保存成功 // for (int i = 0; i < 4; i++) // { // if (saveRes < 1) // { // saveRes = mod.SaveChanges(); // } // else // { // break; // } // } // if (saveRes < 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); // } // #endregion // } // else // { // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-ARV繁忙,任务ID:" + item.taskId; // } // } // else // { // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId; // } // #endregion // } // else //taskType 1缸体下线和6空托回库 // { // #region 发送堆垛机任务 // if (SourcePlace != "") // { // if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机") // { // #region 发送堆垛机任务 // if (!isvirtual) // { // baseData.sendSrmTask(item.taskId, SourcePlace, item.toPlace, 1); // } // position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace); // convs.isLock = false; // item.taskStatus = (int)taskStatus.待完成; // #endregion // int saveRes = mod.SaveChanges(); // #region MyRegion // for (int i = 0; i < 4; i++) // { // if (saveRes < 1) // { // saveRes = mod.SaveChanges(); // } // else // { // break; // } // } // if (saveRes < 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); // } // #endregion // } // } // #endregion // } // } // } // else // { // agvSendStatus[1] = ""; // } // #endregion // List lidTask = FinishTasking.Where(x => x.area == 2).ToList(); // #region 处理缸盖未完成任务 // if (lidTask.Count > 0) // { // foreach (var item in lidTask) // { // string SourcePlace = ""; // if (!isvirtual) // { // #region 判断输送线任务id,赋值SourcePlace // if (conv3.taskId == item.taskId) // { // SourcePlace = "1-0-1"; // } // if (conv4.taskId == item.taskId) // { // SourcePlace = "2-0-1"; // } // #endregion // } // if (SourcePlace != "") // { // if (item.taskType == 3 || item.taskType == 4)// // { // #region 发送AGV任务 // bool isReadAgv = false; // if (!isvirtual) // { // if (agvs.Count == 4) // { // #region 判断AGV是否空闲 // string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1); // if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1); // if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // #endregion // } // } // if (isReadAgv) // { // string res = "失败"; // if (!isvirtual) // { // res = baseData.sendAgvTask(item.taskId, SourcePlace, item.toPlace, 1); // } // if (res == "") // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId; // #region 发送AGV任务 // item.taskStatus = (int)taskStatus.完成; // int ishave = mod.SaveChanges(); // position delPosition = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace); // //清除库存 需要改,RGV // if (delPosition != null) // { // #region MyRegion // productStock stock = mod.productStock.FirstOrDefault(x => x.positionId == delPosition.positionId); // if (item.taskType == 3)//呼叫空托盘就把数据删了 // { // mod.productStock.Remove(stock); // } // else//上线就把数据放到上线站点上 // { // position positionStation = mod.position.FirstOrDefault(x => x.positionName == item.toPlace); // if (positionStation != null) // { // stock.positionId = positionStation.positionId; // positionStation.isfree = true; // } // List stocklist = mod.productStockList.Where(x => x.stockId == delPosition.positionId).ToList(); // if (stocklist.Count > 0) // { // foreach (var itemList in stocklist) // { // itemList.stockId = positionStation.positionId; // } // } // } // delPosition.isfree = false; // delPosition.isLock = false; // delPosition.positionType = 1; // #endregion // } // // // #region 输送线复位 // position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace); // convs.isLock = false; // int saveRes = mod.SaveChanges(); // for (int i = 0; i < 4; i++) // { // if (saveRes < 1) // { // saveRes = mod.SaveChanges(); // } // else // { // break; // } // } // if (saveRes < 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); // } // #endregion // #endregion // } // else // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发失败,任务ID:" + item.taskId; // } // } // else // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-ARV繁忙,任务ID:" + item.taskId; // } // #endregion // } // else // { // if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机") // { // #region 发送堆垛机任务 // if (!isvirtual) // { // baseData.sendSrmTask(item.taskId, SourcePlace, item.toPlace, 1); // //恢复输送线锁定状态 // } // position convs = mod.position.FirstOrDefault(x => x.positionName == SourcePlace); // if (convs != null) // { // convs.isLock = false; // } // item.taskStatus = (int)taskStatus.待完成; // #endregion // int saveRes = mod.SaveChanges(); // #region MyRegion // for (int i = 0; i < 4; i++) // { // if (saveRes < 1) // { // saveRes = mod.SaveChanges(); // } // else // { // break; // } // } // if (saveRes < 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); // } // #endregion // } // } // } // else // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId; // } // } // } // else // { // agvSendStatus[0] = "无任务"; // } // #endregion // } // else // { // ishaveTask = 1; // } // //处理未下发的任务 // List noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList(); // if (noFinishTask.Count > 0) // { // #region 未下发的任务 // List bobyTask = noFinishTask.Where(x => x.area == 1).ToList(); // //处理缸体未下发任务 // if (bobyTask.Count > 0) // { // foreach (var item in bobyTask) // { // //找空闲输送线 // #region 处理缸体未下发任务 // if (item.taskType == 1 || item.taskType == 6 || item.taskType == 7) // { // #region 发送agv任务 // bool isReadAgv = false; // if (!isvirtual) // { // if (agvs.Count == 4) // { // #region 判断AGV是否空闲 // string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1); // if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1); // if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // #endregion // } // } // if (isReadAgv) // { // string toplace = convIsLock(1); // #region MyRegion // if (toplace != "") // { // #region 发送AGV任务 // string res = "失败"; // if (!isvirtual) // { // res = baseData.sendAgvTask(item.taskId, item.sourcePlace, toplace, 1); // } // if (res == "") // { // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId; // item.middlePlace = toplace; // item.taskStatus = 3; // position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace); // if (unlockPosition != null) // { // unlockPosition.isLock = true; // } // int saveRes = mod.SaveChanges(); // #region 检验保存是否成功 // for (int i = 0; i < 4; i++) // { // if (saveRes < 1) // { // saveRes = mod.SaveChanges(); // } // else // { // break; // } // } // if (saveRes < 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); // } // #endregion // #endregion // } // else // { // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败,任务ID:" + item.taskId; // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送失败! 任务id:" + item.taskId); // } // } // else // { // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败输送线都被占用,任务ID:" + item.taskId; // } // #endregion // } // else // { // agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId; // } // #endregion // } // else // { // #region 发送堆垛机任务 // if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机") // { // string toplace = convIsLock(1); // if (toplace != "") // { // #region 发送堆垛机任务 // if (!isvirtual) // { // baseData.sendSrmTask(item.taskId, item.sourcePlace, toplace, 1); // } // position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace); // if (unlockPosition != null) // { // unlockPosition.isLock = true; // } // //保存任务记录 // item.middlePlace = toplace; // item.taskStatus = 3; // //增加出库单 状态更改 // #endregion // int saveRes = mod.SaveChanges(); // for (int i = 0; i < 4; i++) // { // if (saveRes < 1) // { // saveRes = mod.SaveChanges(); // } // else // { // break; // } // } // if (saveRes < 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); // } // } // else // { // } // } // #endregion // } // #endregion // } // } // else // { // agvSendStatus[0] = "无任务发送"; // } // //处理缸盖未下发任务 // List lidTask = noFinishTask.Where(x => x.area == 2).ToList(); // if (lidTask.Count > 0) // { // foreach (var item in lidTask) // { // //找空闲输送线 // string toplace = convIsLock(3); // #region 处理缸盖未下发任务 // if (toplace != "") // { // if (item.taskType == 2 || item.taskType == 6 || item.taskType == 7) // { // bool isReadAgv = false; // if (!isvirtual) // { // if (agvs.Count == 4) // { // #region 判断AGV是否空闲 // string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1); // if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1); // if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) // { // isReadAgv = true; // } // #endregion // } // } // if (isReadAgv) // { // #region 处理缸盖未下发任务 // string res = "失败"; // if (!isvirtual) // { // res = baseData.sendAgvTask(item.taskId, item.sourcePlace, toplace, 1); // } // if (res == "") // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId; // item.middlePlace = toplace; // item.taskStatus = 3; // position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace); // if (unlockPosition != null) // { // unlockPosition.isLock = true; // } // } // else // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败,任务ID:" + item.taskId; // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送失败! 任务id:" + item.taskId); // } // #endregion // } // else // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-RGV繁忙,任务ID:" + item.taskId; // } // } // else // { // if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机") // { // #region 发送堆垛机任务 // if (!isvirtual) // { // baseData.sendSrmTask(item.taskId, item.sourcePlace, toplace, 1); // } // position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == toplace); // if (unlockPosition != null) // { // unlockPosition.isLock = true; // } // item.middlePlace = toplace; // item.taskStatus = 3; // #endregion // } // } // int saveRes = mod.SaveChanges(); // #region 验证发送是否成功 // for (int i = 0; i < 4; i++) // { // if (saveRes < 1) // { // saveRes = mod.SaveChanges(); // } // else // { // break; // } // } // if (saveRes < 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); // } // #endregion // } // else // { // agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId; // } // #endregion // } // } // else // { // agvSendStatus[1] = "无任务发送"; // } // #endregion // } // else // { // #region 更改信息状态 // if (ishaveTask == 1) // { // agvSendStatus[0] = "无任务发送"; // agvSendStatus[1] = "无任务发送"; // } // #endregion // } // } // } // catch (Exception ex) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", ex.ToString()); // } // } //} #endregion #region 现在的方法 /// /// 处理未下发的任务(缸体) /// private void sendTaskForNoIssuedForGT() { while (true) { Thread.Sleep(2000); try { using (dbmodel mod = new dbmodel()) { //area=1是缸体侧,area=2是缸盖侧 //处理未下发的任务 var queryStatus_NoIssue = (int)taskStatus.未下发; List noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList(); //List noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList(); if (noFinishTask.Count > 0) { #region 未下发的任务 List bobyTask = noFinishTask.Where(x => x.area == 1).ToList(); //处理缸体未下发任务 if (bobyTask.Count > 0) { foreach (var item in bobyTask) { #region 处理缸体未下发任务 //if (item.taskType == 1 || item.taskType == 6 || item.taskType == 7) if (item.taskType == (int)taskType.缸体下线 || item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.空托下线入库 || item.taskType == (int)taskType.余料回库) { #region 发送agv任务 bool isReadAgv = false; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { if (agvs.Count == 4) { #region 判断AGV是否空闲 string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1); if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1); if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } #endregion } } else {//虚拟模式或强制完成 isReadAgv = true; } if (isReadAgv) { //string convPlace = convIsLock(1, item, TaskAreaEnum.缸体侧); string convPlace = convIsLock_GT(1, item); #region MyRegion if (convPlace != "") { string res = "失败"; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { res = baseData.sendAgvTask(item, item.taskId, item.sourcePlace, convPlace, 1); } else {//虚拟模式或强制完成 res = ""; } if (res == "") { SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId; item.middlePlace = convPlace; //item.taskStatus = 3; item.taskStatus = (int)taskStatus.已下发; item.remark = "已下发"; item.remark = "发送AGV任务成功"; position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == convPlace); if (unlockPosition != null) { //unlockPosition.isLock = true; PositionHandler.Lock(true, unlockPosition, "处理未下发的任务(缸体)", SysGloble.WCSNAME, item); } //起点库位解锁、设置无货 【EditBy shaocx,2022-03-23】 position _sourcePlace = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace); PositionHandler.LockAndFree(false, false, _sourcePlace, "处理未下发的任务(缸体),修改起点", SysGloble.WCSNAME, item); int saveRes = mod.SaveChanges(); #region 检验保存是否成功 for (int i = 0; i < 4; i++) { if (saveRes < 1) { saveRes = mod.SaveChanges(); } else { break; } } if (saveRes < 1) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); } #endregion } else { //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "发送AGV任务失败:" + res; mod.SaveChanges(); SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送失败!" + res + " 任务id:" + item.taskId); } } else { agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送失败输送线都被占用,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "发送失败输送线都被占用"; mod.SaveChanges(); } #endregion } else { SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "没发送任务-AGV繁忙"; mod.SaveChanges(); } #endregion } else if (item.taskType == (int)taskType.旁路工位缸体空托回库 || item.taskType == (int)taskType.旁路工位缸体余料回库) { string convPlace = item.middlePlace;//这个输送线站点是工人自己选的 SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = MyExtend.HandlerNoIssuedTaskFor旁路工位缸体空托或余料回库(mod, convPlace, item, agvSendStatus); } else if (item.taskType == (int)taskType.缸体下线直接去上线点) {//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】 SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg = MyExtend.HandleTaskForNoIssuedForDirectOnLinePoint(mod, agvs, item, agvSendStatus); } else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣 || item.taskType == (int)taskType.空托人工出库 ) {//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】 var errMsg = ""; MyExtend.HandleTaskForutStoreBySrm(mod, item, ref errMsg); if (!string.IsNullOrEmpty(errMsg)) { SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = errMsg; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = errMsg; mod.SaveChanges(); } } else if (item.taskType == (int)taskType.缸体上线去旁路工位)//增加 缸体上线去旁路工位 的分支 【EditBy shaocx,2022-04-24】 { //string convPlace = convIsLock(1, item, TaskAreaEnum.缸体侧); string convPlace = convIsLock_GT(1, item); if (convPlace != "") { TaskHelper.sendTaskForNoIssuedFor发送堆垛机任务(mod, item, convPlace); } else { SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "未找到空闲的输送线站点"; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg; mod.SaveChanges(); } } else if (item.taskType == (int)taskType.手动入库 || item.taskType == (int)taskType.空托手动入库) {//增加手动入库的分支 【EditBy shaocx,2022-03-16】 var errMsg = ""; MyExtend.HandleTaskForHandInStore(mod, item, ref errMsg); if (!string.IsNullOrEmpty(errMsg)) { SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = errMsg; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = errMsg; mod.SaveChanges(); } } else { //string convPlace = convIsLock(1, item, TaskAreaEnum.缸体侧); string convPlace = convIsLock_GT(1, item); if (convPlace != "") { TaskHelper.sendTaskForNoIssuedFor发送堆垛机任务(mod, item, convPlace); } else { SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "未找到空闲的输送线站点"; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg; mod.SaveChanges(); } } #endregion } } else { agvSendStatus[0] = "无任务发送"; } #endregion } else { SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "没有要处理的状态为未下发的任务"; } } } catch (Exception ex) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForNoIssued", ex.ToString()); SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex); } } } /// /// 处理未下发的任务(缸盖) /// private void sendTaskForNoIssuedForGG() { while (true) { Thread.Sleep(2000); try { using (dbmodel mod = new dbmodel()) { //area=1是缸体侧,area=2是缸盖侧 //处理未下发的任务 var queryStatus_NoIssue = (int)taskStatus.未下发; List noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList(); //List noFinishTask = mod.task.Where(x => x.taskStatus == 2).ToList(); if (noFinishTask.Count > 0) { #region 未下发的任务 //处理缸盖未下发任务 List lidTask = noFinishTask.Where(x => x.area == 2).ToList(); if (lidTask.Count > 0) { foreach (var item in lidTask) { //if (item.taskType == 2 || item.taskType == 6 || item.taskType == 7) if (item.taskType == (int)taskType.缸盖下线 || item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.空托下线入库 || item.taskType == (int)taskType.余料回库) {//缸盖下线=2, 空托回库=6, 余料回库=7, bool isReadAgv = false; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { if (agvs.Count == 4) { #region 判断AGV是否空闲 string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1); if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1); if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } #endregion } else { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + ",读取AGV个数不是4个,应该是AGV不在线,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "读取AGV个数不是4个,应该是AGV不在线"; mod.SaveChanges(); } } else {//虚拟模式或强制完成 isReadAgv = true; } if (isReadAgv) { string convPlace = ""; convPlace = findConvPlaceFor_sendTaskForNoIssuedForGG(mod, item); if (string.IsNullOrEmpty(convPlace)) { break;//跳出循环 } #region 处理缸盖未下发任务的数据保存 string res = "失败"; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { res = baseData.sendAgvTask(item, item.taskId, item.sourcePlace, convPlace, 1); } else {//虚拟模式或强制完成 res = ""; } if (res == "") { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId; item.middlePlace = convPlace; //item.taskStatus = 3; item.taskStatus = (int)taskStatus.已下发; item.remark = "已下发"; position unlockPosition = mod.position.FirstOrDefault(x => x.positionName == convPlace); if (unlockPosition != null) { // unlockPosition.isLock = true; PositionHandler.Lock(true, unlockPosition, "处理未下发的任务(缸盖)", SysGloble.WCSNAME, item); } //起点库位解锁、设置无货 【EditBy shaocx,2022-03-23】 position _sourcePlace = mod.position.FirstOrDefault(x => x.positionName == item.sourcePlace); PositionHandler.LockAndFree(false, false, _sourcePlace, "处理未下发的任务(缸盖),修改起点", SysGloble.WCSNAME, item); if (item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.余料回库) {//给天永发信号 TianYongSystem.UpdateStoreByTaskID(mod, item, item.toPlace, (int)item.taskId, item.taskTypeName + ",离开天永站点"); } int saveRes = mod.SaveChanges(); #region 验证发送是否成功 if (saveRes < 1) { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "数据库保存失败! 任务id:" + item.taskId; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); } else {//保存成功 } #endregion } else { //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "发送AGV任务失败:" + res; mod.SaveChanges(); SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "RGV任务发送发送AGV任务失败:" + res + ", 任务id:" + item.taskId); } #endregion } else { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId; item.remark = "AGV繁忙"; mod.SaveChanges(); } } else if (item.taskType == (int)taskType.缸盖下线直接去上线点) {//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】 SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg = MyExtend.HandleTaskForNoIssuedForDirectOnLinePoint(mod, agvs, item, agvSendStatus); item.remark = SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg; mod.SaveChanges(); } else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣 || item.taskType == (int)taskType.空托人工出库 ) {//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】 var errMsg = ""; MyExtend.HandleTaskForutStoreBySrm(mod, item, ref errMsg); if (!string.IsNullOrEmpty(errMsg)) { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = errMsg; item.remark = errMsg; mod.SaveChanges(); } } else if (item.taskType == (int)taskType.缸体上线去旁路工位) {//增加 缸体下线直接去旁路工位 的分支 【EditBy shaocx,2022-04-24】 SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + ",缸体上线去旁路工位,物料不应该是缸盖,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "缸体上线去旁路工位,物料不应该是缸盖"; mod.SaveChanges(); } else if (item.taskType == (int)taskType.手动入库 || item.taskType == (int)taskType.空托手动入库) {//增加手动入库的分支 【EditBy shaocx,2022-03-16】 var errMsg = ""; MyExtend.HandleTaskForHandInStore(mod, item, ref errMsg); if (!string.IsNullOrEmpty(errMsg)) { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = errMsg; item.remark = errMsg; mod.SaveChanges(); } } else { string toplace = ""; toplace = findConvPlaceFor_sendTaskForNoIssuedForGG(mod, item); if (string.IsNullOrEmpty(toplace)) { break;//跳出循环 } TaskHelper.sendTaskForNoIssuedFor发送堆垛机任务(mod, item, toplace); } } } else { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "无任务发送"; } #endregion } else { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "没有要处理的状态为未下发的任务"; } } } catch (Exception ex) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForNoIssued", ex.ToString()); SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex); } } } /// /// 寻找目标点(输送线站点) /// /// /// private string findConvPlaceFor_sendTaskForNoIssuedForGG(dbmodel mod, task item) { //找空闲输送线 //string convPlace = convIsLock(3, item, TaskAreaEnum.缸盖侧); string convPlace = convIsLock_GG(3, item); if (convPlace != "") { } else { SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用(或是被锁定,或是输送线上有货),任务ID:" + item.taskId; item.remark = "输送线都被占用(或是被锁定,或是输送线上有货)"; mod.SaveChanges(); } return convPlace; } /// 处理已下发的任务 /// 处理已下发的任务 /// private void sendTaskForHasIssued() { while (true) { Thread.Sleep(2000); try { int ishaveTask = 0; using (dbmodel mod = new dbmodel()) { //area=1是缸体侧,area=2是缸盖侧 //先处理任务中的任务(在输送线上的) var queryStatus = (int)taskStatus.已下发; List FinishTasking = mod.task.Where(x => x.taskStatus == queryStatus).ToList(); //List FinishTasking = mod.task.Where(x => x.taskStatus == 3).ToList(); if (FinishTasking.Count > 0) { //List bobyTask = FinishTasking.Where(x => x.area == 1).ToList(); var queryTaskAreaEnum = (int)TaskAreaEnum.缸体侧; List bobyTask = FinishTasking.Where(x => x.area == queryTaskAreaEnum).ToList(); #region 处理缸体未完成任务 if (bobyTask.Count > 0) { foreach (var item in bobyTask) { string convPlace = ""; convPlace = MyExtendHelper.GetConvPlace(conv1, conv2, conv3, conv4, item, TaskAreaEnum.缸体侧); //if (item.taskType == 3 || item.taskType == 5) if (item.taskType == (int)taskType.呼叫空托 || item.taskType == (int)taskType.缸体上线) {//呼叫空托 或 缸体上线 #region 发送rgv任务 if (convPlace != "") { bool isReadAgv = false; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { #region 判断AGV是否空闲 if (agvs.Count == 4) { string isP = agvs[2].orderId == null ? "" : agvs[2].orderId.Substring(agvs[2].orderId.Length - 1, 1); if (agvs[2].operatingMode == 2 && agvs[2].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } isP = agvs[3].orderId == null ? "" : agvs[3].orderId.Substring(agvs[3].orderId.Length - 1, 1); if (agvs[3].operatingMode == 2 && agvs[3].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } } #endregion } else {//虚拟模式或强制完成 isReadAgv = true; } if (isReadAgv) { #region 发送AGV任务 并处理库存 string res = "失败"; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { res = baseData.sendAgvTask(item, item.taskId, convPlace, item.toPlace, 1); } else {//虚拟模式或强制完成 res = ""; } string tasktype = "缸体呼叫空托盘/缸体上线"; if (res == "") { TaskHelper.sendTaskForHasIssuedFor呼叫空托And缸体上线And缸盖上线(mod, item, convPlace, tasktype); } else { //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "发送AGV任务失败:" + res; mod.SaveChanges(); agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", tasktype + "发送AGV任务失败:" + res); } #endregion } else { agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "AGV繁忙"; mod.SaveChanges(); } } else { agvSendStatus[0] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "输送线都被占用"; mod.SaveChanges(); } #endregion } else if (item.taskType == (int)taskType.缸体上线去旁路工位) {//增加 缸体上线去旁路工位 的分支判断 【EditBy shaocx,2022-04-23】 } else if (item.taskType == (int)taskType.缸体下线直接去上线点) {//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】 } else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣 || item.taskType == (int)taskType.空托人工出库) {//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】 } else if (item.taskType == (int)taskType.手动入库 || item.taskType == (int)taskType.空托手动入库) {//增加手动入库的分支 【EditBy shaocx,2022-03-16】 } else if (item.taskType == (int)taskType.缸体下线 || item.taskType == (int)taskType.空托回库 || item.taskType == (int)taskType.空托下线入库 || item.taskType == (int)taskType.余料回库 ) {//taskType 1缸体下线和6空托回库 7余料回库 TaskHelper.sendTaskForHasIssuedFor发送堆垛机任务(mod, item, convPlace); } else if (item.taskType == (int)taskType.旁路工位缸体空托回库 || item.taskType == (int)taskType.旁路工位缸体余料回库 ) { TaskHelper.sendTaskForHasIssuedFor发送堆垛机任务(mod, item, item.middlePlace); } else //其他任务类型 { } } } else { agvSendStatus[1] = ""; } #endregion // List lidTask = FinishTasking.Where(x => x.area == 2).ToList(); queryTaskAreaEnum = (int)TaskAreaEnum.缸盖侧; List lidTask = FinishTasking.Where(x => x.area == queryTaskAreaEnum).ToList(); #region 处理缸盖未完成任务 if (lidTask.Count > 0) { foreach (var item in lidTask) { string convPlace = ""; convPlace = MyExtendHelper.GetConvPlace(conv1, conv2, conv3, conv4, item, TaskAreaEnum.缸盖侧); if (convPlace != "") { if (item.taskType == (int)taskType.呼叫空托 || item.taskType == (int)taskType.缸盖上线) {//呼叫空托=3, 缸盖上线=4, #region 发送AGV任务 bool isReadAgv = false; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { if (agvs.Count == 4) { #region 判断AGV是否空闲 string isP = agvs[0].orderId == null ? "" : agvs[0].orderId.Substring(agvs[0].orderId.Length - 1, 1); if (agvs[0].operatingMode == 2 && agvs[0].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } isP = agvs[1].orderId == null ? "" : agvs[1].orderId.Substring(agvs[1].orderId.Length - 1, 1); if (agvs[1].operatingMode == 2 && agvs[1].battery > 0.4 && MyExtendHelper.ValidateAgvNoParting(isP)) { isReadAgv = true; } #endregion } } else {//虚拟模式或强制完成 isReadAgv = true; } if (isReadAgv) { string res = "失败"; if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { res = baseData.sendAgvTask(item, item.taskId, convPlace, item.toPlace, 1); } else {//虚拟模式或强制完成 res = ""; } if (res == "") { agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送成功,任务ID:" + item.taskId; #region 发送AGV任务成功后 TaskHelper.sendTaskForHasIssuedFor呼叫空托And缸体上线And缸盖上线(mod, item, convPlace, ""); #endregion } else { //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "发送AGV任务失败:" + res; mod.SaveChanges(); agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "发送AGV任务失败:" + res + ",任务ID:" + item.taskId; } } else { agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-AGV繁忙,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "AGV繁忙"; mod.SaveChanges(); } #endregion } else if (item.taskType == (int)taskType.缸盖下线直接去上线点) {//增加 缸体下线直接去上线点的分支判断 【EditBy shaocx,2022-02-06】 } else if (item.taskType == (int)taskType.手动出库 || item.taskType == (int)taskType.出库分拣 || item.taskType == (int)taskType.空托人工出库) {//增加 手动出库的分支判断 【EditBy shaocx,2022-03-02】 } else if (item.taskType == (int)taskType.手动入库 || item.taskType == (int)taskType.空托手动入库) {//增加手动入库的分支 【EditBy shaocx,2022-03-16】 } else if (item.taskType == (int)taskType.缸体上线去旁路工位) {//增加 缸体上线去旁路工位 的分支判断 【EditBy shaocx,2022-04-23】 } else { TaskHelper.sendTaskForHasIssuedFor发送堆垛机任务(mod, item, convPlace); } } else { agvSendStatus[1] = DateTime.Now.ToString("dd日HH:mm:ss") + "没发送任务-输送线都被占用,任务ID:" + item.taskId; //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "输送线都被占用"; mod.SaveChanges(); } } } else { agvSendStatus[0] = "无任务"; } #endregion } else { SystemWarningMsg.Thread_SendTask_ErrMsg = "没有要处理的状态为已下发的任务"; ishaveTask = 1; } #region 更改信息状态 if (ishaveTask == 1) { agvSendStatus[0] = "无任务发送"; agvSendStatus[1] = "无任务发送"; } #endregion } } catch (Exception ex) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForHasIssued", ex.ToString()); SystemWarningMsg.Thread_SendTask_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex); } } } /// /// 处理分拣完成的任务 /// private void sendTaskForPick() { while (true) { Thread.Sleep(2000); try { using (dbmodel mod = new dbmodel()) { var queryStatus_NoIssue = (int)taskStatus.分拣完成; List noFinishTask = mod.task.Where(x => x.taskStatus == queryStatus_NoIssue).ToList(); if (noFinishTask.Count > 0) { var item = noFinishTask[0]; #region 发送堆垛机任务 if (!MyExtendHelper.IsAllowSimulatorHandle(item)) { //if (srm.mode == "自动" && srm.Alarm_info == "无故障" && srm.state == "待机") if (MyExtendHelper.IsAllowSendNewTaskToSrm()) { #region 发送输送线放料完成信号任务 TransEnum _TransEnum = MyExtendHelper.GetTransByPlace(item.toPlace); TransService.LoadMaterialConfirm(Convert.ToInt32(_TransEnum) - 1); #endregion baseData.sendSrmTask(item, item.taskId, item.toPlace, item.sourcePlace, 1); } else { //保存失败信息到任务表中 【EditBy shaocx,2022-03-16】 item.remark = "堆垛机不是自动,无故障,待机状态,不能下发堆垛机任务!!!!"; mod.SaveChanges(); SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "堆垛机不是自动,无故障,待机状态,不能下发堆垛机任务"; continue; } } else {//虚拟模式或强制完成 } //保存任务记录 item.taskStatus = (int)taskStatus.分拣完成后下发设备任务; item.remark = "分拣完成后下发设备任务"; //增加出库单 状态更改 #endregion int saveRes = mod.SaveChanges(); for (int i = 0; i < 4; i++) { if (saveRes < 1) { saveRes = mod.SaveChanges(); } else { break; } } if (saveRes < 1) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTask", "数据库保存失败! 任务id:" + item.taskId); SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "数据库保存失败! 任务id:" + item.taskId; } } else { SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "没有要处理的状态为未下发的任务"; } } } catch (Exception ex) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "sendTaskForPick", ex.ToString()); SystemWarningMsg.Thread_sendTaskForPick_ErrMsg = "出现异常:" + JsonConvert.SerializeObject(ex); } } } #endregion #endregion #region 处理新建的出库表单[缸体上线、缸盖上线] /// /// 处理新建的出库表单[缸体上线、缸盖上线] /// public void HandleOutStockList() { while (true) { Thread.Sleep(2000); try { var errMsg = ""; var queryStatus1 = (int)taskStatus.新建; var _taskType1 = (int)taskType.缸体上线; var _taskType2 = (int)taskType.缸盖上线; var _taskType3 = (int)taskType.缸体上线去旁路工位;//增加 缸体上线去旁路工位 的分支 【EditBy shaocx,2022-04-23】 List taskList = null; using (dbmodel mod = new dbmodel()) { taskList = mod.task.Where(x => x.taskStatus == queryStatus1 && (x.taskType == _taskType1 || x.taskType == _taskType2 || x.taskType == _taskType3) ).OrderBy(x => x.createTime).ToList(); if (taskList != null && taskList.Count > 0) { foreach (var item in taskList) { bool result = MyExtend.DoHandleOutStockList(mod, item, ref errMsg); if (result == false) { SystemWarningMsg.Thread_HandleOutStockList_Msg = "返回错误:" + errMsg + ",任务ID:" + item.taskId; } } } else { SystemWarningMsg.Thread_HandleOutStockList_Msg = "没有要处理的新建的出库表单"; } } } catch (Exception ex) { SystemWarningMsg.Thread_HandleOutStockList_Msg = "异常" + ex.ToString(); } } } #endregion /// 堆垛机完成确认 /// /// public void SrmfinishConfirm() { while (true) { // 库位类型,库口=0,空库位=1,缸体=2,缸盖=3,缸体空托盘=4,缸盖空托盘=5,空托盘=6 Thread.Sleep(2000); string plc_taskID = "";//PLC任务号 try { var errMsg = ""; //增加查询条件 [EditBy shaocx,2022-03-02] var queryStatus1 = (int)taskStatus.完成; var queryStatus2 = (int)taskStatus.作废; var queryStatus3 = (int)taskStatus.新建; task finishTask = null; using (dbmodel mod = new dbmodel()) { if (!isvirtual) {//正式环境 //首先读取那些被强制完成的任务 finishTask = mod.task.FirstOrDefault(x => (x.isForceComplete == 1 && x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2 && x.taskStatus != queryStatus3)); if (finishTask != null) { bool result = MyExtend.HandleSrmfinishConfirm(mod, finishTask, ref errMsg); if (result == false) { SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "返回错误:" + errMsg + ",任务号:" + finishTask.taskId; } else { SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "正式环境下,处理任务成功,任务号:" + finishTask.taskId; } } else { SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "正式环境下,没有任务要处理"; } finishTask = null; if (srm.taskFinish == "完成") { plc_taskID = srm.TaskID.ToString(); finishTask = mod.task.FirstOrDefault(x => x.PlcTaskNo == plc_taskID && (x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2 && x.taskStatus != queryStatus3)); if (finishTask != null) { bool result = MyExtend.HandleSrmfinishConfirm(mod, finishTask, ref errMsg); if (result == false) { SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "返回错误:" + errMsg + ",任务号:" + finishTask.taskId; } else {//保存数据成功 if (!MyExtendHelper.IsAllowSimulatorHandle(finishTask)) { siemensTcpNet_srm.Write(srmdb.W_Task_Finish_ACK, Convert.ToInt16(1));//确认任务 } SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "处理任务成功,任务号:" + finishTask.taskId; } } else { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "SrmfinishConfirm", "PLC任务ID:" + plc_taskID + "数据库找不到状态不是已完成或作废的此任务"); SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "PLC任务ID:" + plc_taskID + "数据库找不到状态不是已完成或作废的此任务"; if (!MyExtendHelper.IsAllowSimulatorHandle(finishTask)) { siemensTcpNet_srm.Write(srmdb.W_Task_Finish_ACK, Convert.ToInt16(1));//确认任务 } } } else { if (!MyExtendHelper.IsAllowSimulatorHandle(finishTask)) { siemensTcpNet_srm.Write(srmdb.W_Task_Finish_ACK, Convert.ToInt16(0));//没完成就0 堆垛机plc需要 } } } else {//虚拟模式 finishTask = mod.task.FirstOrDefault(x => (x.taskStatus != queryStatus1 && x.taskStatus != queryStatus2 && x.taskStatus != queryStatus3)); if (finishTask != null) { bool result = MyExtend.HandleSrmfinishConfirm(mod, finishTask, ref errMsg); if (result == false) { SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "返回错误:" + errMsg + ",任务号:" + finishTask.taskId; } else { SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "模拟环境下!!!,处理任务成功,任务号:" + finishTask.taskId; } } else { SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "模拟环境下!!!,没有任务要处理"; } } } } catch (Exception ex) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "finishConfirm", "PLC任务ID:" + plc_taskID + ex.ToString()); SystemWarningMsg.Thread_SrmfinishConfirm_Msg = "PLC任务ID:" + plc_taskID + ex.ToString(); } } } /// /// MES数据推送 /// public void mesDataTranffic() { while (true) { //SystemWarningMsg.msg_mesDataTranffic = ""; try { Thread.Sleep(3000); using (dbmodel mod = new dbmodel()) { List sendMesData = mod.task.Where(x => x.sendMesed == 1).ToList(); //增加任务状态的过滤 【EditBy shaocx,2022-02-06】 var queryStatus = (int)taskStatus.完成; sendMesData = sendMesData.Where(x => x.taskStatus == queryStatus).ToList(); if (sendMesData.Count > 0) { foreach (var itemTask in sendMesData) { try { mesMsg res = null; if (isvirtual) {//模拟环境 res = new mesMsg(); res.ErrorCode = 0; res.ErrorMsg = "模拟环境下,模拟发送"; } else {//正式环境 switch (itemTask.taskType) { case (int)taskType.缸盖上线: res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity); break; case (int)taskType.缸盖下线: res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-缸盖线", (decimal)itemTask.quantity, itemTask.materialCode); break; case (int)taskType.缸体上线: case (int)taskType.缸体上线去旁路工位://增加 缸体上线去旁路工位 的分支 【EditBy shaocx,2022-04-23】 res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity); break; case (int)taskType.缸体下线: res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-机体线", (decimal)itemTask.quantity, itemTask.materialCode); break; case (int)taskType.余料回库: res = mesDataManipulation.OUTStockSend("1", itemTask.materialCode, (decimal)itemTask.quantity); break; //增加推送类型 【EditBy shaocx,2022-02-06】 case (int)taskType.缸盖下线直接去上线点: //缸盖下线 res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-缸盖线", (decimal)itemTask.quantity, itemTask.materialCode); //缸盖上线 res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity); break; case (int)taskType.缸体下线直接去上线点: //缸体下线 res = mesDataManipulation.InStockSend("0", "汽油机车间-机加工-机体线", (decimal)itemTask.quantity, itemTask.materialCode); //缸体上线 res = mesDataManipulation.OUTStockSend("0", itemTask.materialCode, (decimal)itemTask.quantity); break; default: break; } } if (res != null) { if (res.ErrorCode < 3) { itemTask.sendMesed = res.ErrorCode == 0 ? 2 : 3; //1=未发送,2=发送成功,3=发送失败,o是空托盘不参与对接 itemTask.mesReply = res.ErrorMsg; mod.SaveChanges(); } } } catch (Exception ex) { SystemWarningMsg.msg_mesDataTranffic = "推送给MES数据异常:" + JsonConvert.SerializeObject(ex); WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "mesDataTranffic", SystemWarningMsg.msg_mesDataTranffic); } } } else { SystemWarningMsg.msg_mesDataTranffic = "没有数据要推送给MES!"; } } } catch (Exception ex) { SystemWarningMsg.msg_mesDataTranffic = "数据要推送给MES出现异常:" + ex.Message; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "mesDataTranffic数据要推送给MES出现异常:", SystemWarningMsg.msg_mesDataTranffic + "," + JsonConvert.SerializeObject(ex)); } } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Environment.Exit(0);//退出本进程所有线程 } #region 组盘下发后,生成下线入库任务 #region 原先的旧方法 ///// 生成下线入库任务 ///// ///// //private void inStockCodeToTask() //{ // while (true) // { // Thread.Sleep(3000); // using (dbmodel mod = new dbmodel()) // { // //EF事务 // //using (DbContextTransaction transaction = mod.Database.BeginTransaction()) // //{ // try // { // inStockOrder inTask = mod.inStockOrder.FirstOrDefault(x => x.status == 2); // if (inTask != null) // { // int tasktype = inTask.siteCode.Substring(0, 2) == "GT" ? 1 : 2; // //寻找空库位 2是缸体,3是缸盖 // #region 生成任务 // inTask.status = 3; // int saveRes = mod.SaveChanges(); // if (saveRes == 1) // { // string toPlace = findStorage(tasktype + 1); // if (toPlace == "") // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库找不到库位 入库表单号:" + inTask.orderCode); // continue; // } // saveRes = 0; // task newInTask = new task(); // newInTask.area = tasktype;//1是缸体侧 2是缸盖 // newInTask.createListCode = inTask.orderCode; // newInTask.createTime = DateTime.Now; // newInTask.priority = 1; // newInTask.sourcePlace = inTask.siteCode; // newInTask.taskName = tasktype == 1 ? "缸体入库" : "缸盖入库"; // newInTask.taskStatus = 2; // newInTask.taskType = tasktype; // newInTask.toPlace = toPlace.Split('/')[0]; // newInTask.materialCode = inTask.productCode; // newInTask.materialName = inTask.productName; // newInTask.quantity = inTask.quantity; // newInTask.sendMesed = 1;//1=未发送,2=发送成功,3=发送失败 // newInTask.mesReply = "未发送"; // newInTask.supplier = inTask.supplier;//供应商 【EditBy shaocx,2022-01-15】 // newInTask.containerCode = inTask.containerCode;//托盘号 【EditBy shaocx,2022-01-15】 // mod.task.Add(newInTask); // saveRes = mod.SaveChanges(); // if (saveRes != 1) // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库保存任务失败入库表单号:" + inTask.orderCode); // } // saveRes = 0; // } // else // { // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库状态修改失败表单号:" + inTask.orderCode); // } // #endregion // } // //transaction.Commit(); // } // catch (Exception ex) // { // //保存失败 抛异常 回滚 // // transaction.Rollback(); // WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", ex.ToString()); // } // //} // } // } //} #endregion #region 新方法 /// 组盘下发后,生成下线入库任务 /// /// private void inStockCodeToTask() { while (true) { Thread.Sleep(3000); SystemWarningMsg.Thread_inStockCodeToTask_ErrMsg = ""; using (dbmodel mod = new dbmodel()) { var queryStatus = (int)InStockOrderStatus.待下发; inStockOrder inTask = mod.inStockOrder.FirstOrDefault(x => x.status == queryStatus); //inStockOrder inTask = mod.inStockOrder.FirstOrDefault(x => x.status == 2); if (inTask != null) { #region 事务处理 using (var trans = mod.Database.BeginTransaction()) { try { taskType tasktype = MyExtendHelper.GetTaskTypeForInStockOrder(inTask); //寻找空库位 2是缸体,3是缸盖 #region 生成任务 //inTask.status = 3; inTask.status = (int)InStockOrderStatus.已下发; int saveRes = mod.SaveChanges(); if (saveRes == 1) { //增加 toStieCode的判断 【EditBy shaocx,2022-02-06】 string taskName = ""; string toPlace = FindToPlaceForInStockOrder(inTask, (int)tasktype, ref taskName); if (string.IsNullOrEmpty(toPlace)) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库找不到库位 入库表单号:" + inTask.orderCode); throw new Exception("下线入库找不到立库空库位 入库表单号:" + inTask.orderCode); } saveRes = 0; task newInTask = new task(); newInTask.area = MyExtendHelper.GetTaskAreaForInStockOrder(inTask);//1是缸体侧 2是缸盖 newInTask.createListCode = inTask.orderCode; newInTask.createTime = DateTime.Now; newInTask.priority = 1; newInTask.sourcePlace = inTask.siteCode; newInTask.taskType = (int)tasktype; newInTask.taskTypeName = tasktype.ToString(); newInTask.taskName = taskName; //newInTask.taskStatus = 2; newInTask.taskStatus = (int)taskStatus.未下发; newInTask.remark = "未下发"; newInTask.toPlace = toPlace; newInTask.materialCode = inTask.productCode; newInTask.materialName = inTask.productName; newInTask.quantity = inTask.quantity; newInTask.sendMesed = 1;//1=未发送,2=发送成功,3=发送失败 newInTask.mesReply = "未发送"; newInTask.supplier = inTask.supplier;//供应商 【EditBy shaocx,2022-01-15】 newInTask.containerCode = inTask.containerCode;//托盘号 【EditBy shaocx,2022-01-15】 newInTask.version = inTask.version;//机型 newInTask.creator = SysGloble.WCSNAME; //记录PLC任务号和AGV任务号 【EditBy shaocx,2022-03-28】 newInTask.PlcTaskNo = TaskNoHelper.CreatePlcTaskIdForSrmTaskPublic(1); newInTask.AgvTaskNo = TaskNoHelper.CreateTaskIdForAgvTask(newInTask.PlcTaskNo); mod.task.Add(newInTask); saveRes = mod.SaveChanges(); if (saveRes != 1) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库保存任务失败入库表单号:" + inTask.orderCode); throw new Exception("下线入库保存任务失败入库表单号:" + inTask.orderCode); } trans.Commit(); saveRes = 0; } else { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库状态修改失败表单号:" + inTask.orderCode); throw new Exception("修改入库单状态为已下发失败" + inTask.orderCode); } #endregion } catch (Exception ex) { SystemWarningMsg.Thread_inStockCodeToTask_ErrMsg = ex.Message; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", ex.ToString()); trans.Rollback(); } } #endregion } } } } /// /// 处理入库单,寻找最终的目标库位 【EditBy shaocx,2022-02-06】 /// /// /// /// private string FindToPlaceForInStockOrder(inStockOrder inTask, int tasktype, ref string taskName) { taskType _taskType = (taskType)Enum.Parse(typeof(taskType), tasktype.ToString()); //增加 toStieCode的判断 【EditBy shaocx,2022-02-06】 string toPlace = string.Empty; if (string.IsNullOrEmpty(inTask.toStieCode)) { //toPlace = findStorage(tasktype + 1); positionType _positionType = default(positionType); // inTask.orderType = isGT == true ? 1 : 2;//1=缸体,2=缸盖 _positionType = inTask.orderType == 1 ? positionType.缸体 : positionType.缸盖; toPlace = findStorage((int)_positionType); //taskName = tasktype == 1 ? "缸体入库" : "缸盖入库"; taskName = _taskType.ToString(); } else {//表示不入立体库,直接去天永机器人那里 toPlace = inTask.toStieCode; taskName = _taskType.ToString(); } if (toPlace == "") { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "inStockCodeToTask", "下线入库找不到库位 入库表单号:" + inTask.orderCode); return toPlace; } //格式化数据 if (string.IsNullOrEmpty(inTask.toStieCode)) { toPlace = toPlace.Split('/')[0]; } return toPlace; } #endregion #endregion #region 寻找库位 /// /// 缸盖寻找空输送线站点 /// /// /// /// /// private string convIsLock_GG(int convCode, task _task) { if (single_convIsLock_GG.WaitOne())//增加线程锁防止并发 { try { return convIsLock(convCode, _task, TaskAreaEnum.缸盖侧); } catch (Exception ex) { throw ex; } finally { single_convIsLock_GG.ReleaseMutex(); }//一轮结束 } return ""; } /// /// 缸体寻找空输送线站点 /// /// /// /// /// private string convIsLock_GT(int convCode, task _task) { if (single_convIsLock_GT.WaitOne())//增加线程锁防止并发 { try { return convIsLock(convCode, _task, TaskAreaEnum.缸体侧); } catch (Exception ex) { throw ex; } finally { single_convIsLock_GT.ReleaseMutex(); }//一轮结束 } return ""; } /// 判断输送线是否都锁定和是否有货 /// /// /// 1=1,2号输送线/缸体侧,3=3,4号输送线/缸盖侧 /// private string convIsLock(int convCode, task _task, TaskAreaEnum _TaskAreaEnum) { //2021-11月24改任务发送成功后再锁定 这里不锁定 string convPlace = ""; if (MyExtendHelper.IsAllowSimulatorHandle(_task)) {//虚拟模式或者是强制完成 switch (_TaskAreaEnum) { case TaskAreaEnum.缸体侧: convPlace = "2-39-1";//写死 break; case TaskAreaEnum.缸盖侧: convPlace = "1-0-1";//写死 break; } return convPlace; } try { long num1 = convCode == 3 ? (long)1 : (long)230; long num2 = convCode == 3 ? (long)231 : (long)460; using (dbmodel mod = new dbmodel()) { //3,4号输送线 库位ID----1号=460(2-39-1) 2号230(1-39-1) 3号1(1-0-1) 4号231(2-0-1) List pos = mod.position.Where(x => x.positionId == num1 || x.positionId == num2).ToList(); if (convCode == 3) { #region 缸盖测 if (pos[0].isLock == false && conv3.position == "0") { convPlace = pos[0].positionName; } else { if (pos[1].isLock == false && conv4.position == "0") { convPlace = pos[1].positionName; } } #endregion } else { #region 缸体侧 if (pos[0].isLock == false && conv2.position == "0") { convPlace = pos[0].positionName; } else { if (pos[1].isLock == false && conv1.position == "0") { convPlace = pos[1].positionName; } } #endregion } //增加校验,如果该点有未结束的任务占用,则抛异常 【Editby shaocx,2024-10-09】 if (!string.IsNullOrEmpty(convPlace)) { var isStationHasDoingTaskResult = MyExtendHelper.IsStationHasDoingTaskForMiddlePlace(mod, convPlace); if (isStationHasDoingTaskResult.result == false) { // throw new Exception(isStationHasDoingTaskResult.resMsg); return string.Empty; } //*/ } } } catch (Exception ex) { convPlace = ""; WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "convIsLock", ex.ToString()); } return convPlace; } #endregion #region 辅助 ///// ///// 生存库位 ///// //public void posiont() //{ // using (dbmodel mod = new dbmodel()) // { // for (byte i = 1; i < 3; i++) // { // for (byte j = 0; j < 40; j++) // { // for (byte k = 1; k < 7; k++) // { // if (j == 0 || j == 39) // { // if (k > 1) // { // continue; // } // } // position addp = new position(); // addp.positionName = i + "-" + j + "-" + k; // addp.row = i; // addp.col = j; // addp.layer = k; // addp.isLock = false; // addp.isfree = false; // addp.positionType = 1; // addp.enable = true; // mod.position.Add(addp); // } // } // } // int aa = mod.SaveChanges(); // MessageBox.Show("写入" + aa + "条"); // } //} #endregion #region 定时删除数据 /// /// 定时删除数据 /// public void DeleteData() { while (true) { try { LogTextHelper.BatchDeleteLog(); LogTextHelper.BatchDeleteLog(@"H:\\api\\YUN\\Log"); LogTextHelper.BatchDeleteLog(@"H:\\api\\YUN\\Log");//移除log4日志 ClearDataHandler.Delete_System_TianYongLog(7); ClearDataHandler.Delete_StockClearLog(30); ClearDataHandler.Delete_taskRecord(30); ClearDataHandler.Delete_System_TianYongEmptyBackLog(7); ClearDataHandler.Delete_serialNumberHistory(30); SystemWarningMsg.Thread_lbl_ClearDataMsg = "成功"; } catch (Exception ex) { SystemWarningMsg.Thread_lbl_ClearDataMsg = ex.Message; } finally { Thread.Sleep(24 * 60 * 60 * 1000);//每天一次 } } } #endregion #region 定时刷新数据 /// /// 定时刷新数据 /// public void RefershData() { while (true) { try { var showNowTime = "(" + DateTimeHelper.ConvertToStringForOnlyShowTime(DateTime.Now) + ")"; this.lbl_sendTask_errMsg.Text = showNowTime + SystemWarningMsg.Thread_SendTask_ErrMsg; this.lbl_inStockCodeToTask_errMsg.Text = showNowTime + SystemWarningMsg.Thread_inStockCodeToTask_ErrMsg; this.lbl_NoIssueTaskMsg_GT.Text = showNowTime + SystemWarningMsg.Thread_SendTask_NoIssue_GT_ErrMsg; this.lbl_NoIssueTaskMsg_GG.Text = showNowTime + SystemWarningMsg.Thread_SendTask_NoIssue_GG_ErrMsg; this.lbl_Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg.Text = showNowTime + SystemWarningMsg.Thread_HandleTaskForNoIssuedForDirectOnLinePoint__ErrMsg; this.lbl_msg_mesDataTranffic.Text = showNowTime + SystemWarningMsg.msg_mesDataTranffic; this.lbl_msg_mesDataTranffic_V2.Text = showNowTime + SystemWarningMsg.msg_mesDataTranfficForRealMes; this.lbl_sendTaskForPick_ErrMsg.Text = showNowTime + SystemWarningMsg.Thread_sendTaskForPick_ErrMsg; this.lbl_ClearDataMsg.Text = showNowTime + SystemWarningMsg.Thread_lbl_ClearDataMsg; this.lbl_Thread_lbl_shouEntity_Srm.Text = showNowTime + SystemWarningMsg.Thread_lbl_shouEntity_Srm; this.lbl_agvSendStatus1.Text = showNowTime + agvSendStatus[0]; this.lbl_agvSendStatu2.Text = showNowTime + agvSendStatus[1]; this.lbl_SrmfinishConfirm_Msg.Text = showNowTime + SystemWarningMsg.Thread_SrmfinishConfirm_Msg; this.lbl_Thread_HandleOutStockList_Msg.Text = showNowTime + SystemWarningMsg.Thread_HandleOutStockList_Msg; } catch (Exception ex) { } finally { Thread.Sleep(1000); } } } #endregion #region 计算产量,并写入PLC /// /// 计算产量,并写入PLC /// public void CalcQty() { while (true) { try { MyExtend.CalcQty(); WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "CalcQty", "计算产量,并写入PLC成功"); } catch (Exception ex) { WZ.Useful.Commons.LogTextHelper.WriteLine("Form1", "CalcQty", "计算产量,并写入PLC失败:" + ex.Message + ex.ToString()); } finally { Thread.Sleep(6 * 60 * 60 * 1000);//6小时一次 } } } #endregion } }