using MesServerWork; using MisDataFunDll; using System.Collections.Generic; using System.Threading; using System.Xml.Linq; namespace MesServerFunctions { public partial class FunctionMES { object lockFunWork; //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e) public void FunWork(string recData) { lockFunWork = new object(); lock (lockFunWork) { List dataArray = MisDataFun.GetCmdStringList(recData); //string[] dataArray = recData.Split('|'); //if (dataArray.Count != 4) //return; //消息来源 string m_Source = dataArray[0].ToString(); //消息类型 Barcode string m_Command = dataArray[1].ToString(); //工位号 string m_OpName = dataArray[2].ToString(); //消息参数 string m_Value = dataArray[3].ToString(); DeviceDriver_BasicData.CustomeEvetnArgs e = new DeviceDriver_BasicData.CustomeEvetnArgs();// = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); string tagValue; switch (m_Source) { case "PLC": e = Newtonsoft.Json.JsonConvert.DeserializeObject(m_Value); switch (e.TagValue.ToString().ToLower()) { case "false": tagValue = "0"; break; case "true": tagValue = "1"; break; default: tagValue = e.TagValue.ToString(); break; } e.TagValue = tagValue; switch (e.TagTypeCodeID.ToString()) { // AGV相关变量类型代码处理说明: // 301:AGV请求进入 // 302:AGV器具放置完毕 // 303:AGV退出光栅 // 304:送料信息验证完成 // 305:送料信息验证结果 // 305:任务发送状态 0 没有 1 发送 2 失败 // 311:请求叫料 // 312:请求退空 // 313:请求退料 // 314:允许AGV进入 // 315:允许AGV离开 // 316:器具码扫描完毕 // 317:退回并重新配送 // 318:器具号 // 319:请求上料机型 // 320:收到状态反馈点 // 321:转序 // 322:下空托盘 // 323:上空托盘 // 324:点对点 // 请求叫料 case "311": fun_CallMaterials(e); break; // 请求退空 case "312": fun_RequestReturns(e); break; // 请求退料 case "313": fun_RequestReturnMaterial(e); break; // 允许AGV进入 case "314": fun_AllowAGVEnter(e); break; // 允许AGV离开 case "315": fun_AllowAGVLeave(e); break; // 器具码扫描完毕 case "316": fun_ToolCodeScanOver(e); break; // 退回并重新配送 case "317": fun_ReturnAndRedispatch(e); break; // 收到任务状态握手 case "320": //MIS_BASE.WritePLC(306, m_OpName, 0); break; // 转序 case "321": fun_TransferSequence(e); break; // 下空托盘 case "322": fun_UnloadEmptyTray(e); break; // 上空托盘 case "323": fun_LoadEmptyTray(e); break; // 点对点 case "324": fun_PointToPoint(e); break; } break; } } } // 叫料流程 // 1.请求叫料 收到请求叫料后 调用叫料接口 后续收到AGV的 // 2.收到工厂 请求进入接口(工厂未开发 跳过) 发给PLC AGV请求进入 // 3.收到允许AGV进入 调用接口(未开发 跳过) 允许进入 // 4.收到 器具码扫码完成 根据318器具号 调用器具号查询接口 得出校验结果 // 5.若器具码校验通过 调用 确认物料配送接口 调用成功后 给PLC发送 送料信息验证结果(1 合格 2 不合格) 和 送料信息验证完成 // 6.收到AGV请求离开接口后(未开发 跳过) 发送给PLC请求离开点位 // 7.收到PLC允许离开信号后 调用AGV允许离开接口(未开发 跳过) // 退空托流程 // 1.收到请求退空 调用退空托接口 // 2.如叫料AGV请求进入 请求离开。。。。 只不过不需要扫描器具码部分 // AGV相关方法声明(PLC触发的信号) /// /// 请求叫料 /// public void fun_CallMaterials(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(CallMaterials, e); } /// /// 请求退空 /// public void fun_RequestReturns(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(RequestReturns, e); } /// /// 请求退料 /// public void fun_RequestReturnMaterial(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(RequestReturnMaterial, e); } /// /// 允许AGV进入 /// public void fun_AllowAGVEnter(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(AllowAGVEnter, e); } /// /// 允许AGV离开 /// public void fun_AllowAGVLeave(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(AllowAGVLeave, e); } /// /// 器具码扫描完毕 /// public void fun_ToolCodeScanOver(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(ToolCodeScanOver, e); } /// /// 退回并重新配送 /// public void fun_ReturnAndRedispatch(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(ReturnAndRedispatch, e); } /// /// 转序 /// public void fun_TransferSequence(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(TransferSequence, e); } /// /// 下空托盘 /// public void fun_UnloadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(UnloadEmptyTray, e); } /// /// 上空托盘 /// public void fun_LoadEmptyTray(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(LoadEmptyTray, e); } /// /// 点对点 /// public void fun_PointToPoint(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(PointToPoint, e); } } }