using MesServerWork; using MisDataFunDll; using System; using System.Collections.Generic; using System.Threading; using System.Xml.Linq; namespace MesServerFunctions { public partial class FunctionMES { private readonly object lockFunWork = new object(); //public void FunWork(DeviceDriver_BasicData.CustomeEvetnArgs e) public void FunWork(string recData) { 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; string OpName = m_OpName; 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:点对点 // 500:AGV请求下降 // 501:AGV请求举升 // 550:允许AGV下降 // 551:允许AGV举升 // 请求叫料 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; // 允许AGV下降 case "550": fun_AllowAGVLower(e); break; // 允许AGV举升 case "551": fun_AllowAGVRaise(e); break; // AGV插头完成 case "400": break; // AGV拔插头完成 case "401": break; // MES允许开始磨合 case "402": break; // MES反馈磨合结束 case "403": break; // 托盘压紧气缸压紧 case "404": if (tagValue == "1") MIS_BASE.WritePLC(405, OpName, false); break; // 托盘压紧气缸松开 case "405": if (tagValue == "1") MIS_BASE.WritePLC(404, OpName, false); break; // 插头推靠气缸推靠 case "406": if (tagValue == "1") MIS_BASE.WritePLC(407, OpName, false); break; // 插头推靠气缸退回 case "407": if (tagValue == "1") MIS_BASE.WritePLC(406, OpName, false); break; // 自动模式 case "408": if (tagValue == "1") MIS_BASE.WritePLC(409, OpName, false); // 自动掉手动模式 break; // 手动模式 case "409": if (tagValue == "1") MIS_BASE.WritePLC(408, OpName, false); // 自动掉自动模式 break; // 请求上线 case "450": MisDataFun.Rrunning_UpdateOpCallStatus(OpName, Convert.ToInt32(tagValue)); // 更新至数据库库位状态 break; // 请求下线 case "451": break; // 请求插插头 case "452": if (tagValue == "1") fun_TcsAgvDispatch(e, "插"); else MIS_BASE.WritePLC(400, OpName, false); break; // 请求拔插头 case "453": if (tagValue == "1") fun_TcsAgvDispatch(e, "拔"); else MIS_BASE.WritePLC(401, OpName, false); break; // 开始磨合 case "454": break; // 磨合完成 case "455": break; // 推靠气缸原位 case "456": break; // 推靠气缸到位 case "457": break; // 压紧气缸原位 case "458": break; // 压紧气缸到位 case "459": 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); } /// /// 允许AGV下降 /// public void fun_AllowAGVLower(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(AllowAGVLower, e); } /// /// 允许AGV举升 /// public void fun_AllowAGVRaise(DeviceDriver_BasicData.CustomeEvetnArgs e) { ThreadPool.QueueUserWorkItem(AllowAGVRaise, 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); } } }