//执行人工上下料时AGV收到消息的处理方法 private void ManualOperate() { if (package.Head == 10003) //收到消息 { ExecuteOrder.SendAGVCmdEnable = false; MainWindow.agvUIHandle.AGV_POS_ACTION = "AGV已收到消息"; DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateAGVComState(con, package.TaskID); //更新AGV指令表中的通讯状态为【已收到】 return; } if (package.Head == 10005) //执行指令完成 { if (package.TaskStepID == 0) //执行取货任务完成 { //得到AGV的起点和终点 int StartPoint, EndPoint = 0; DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); StartPoint = db.SelectAGVStartEndPoint(con, package.TaskID, ref EndPoint); MainWindow.agvUIHandle.AGV_POS_ACTION = ConfigClass.GetMapString(StartPoint) + "取货完毕"; LogInfoHelp.GetInstance().WriteInfoToLogFile(MainWindow.agvUIHandle.AGV_POS_ACTION, LogInfoHelp.LOG_TYPE.LOG_INFO); } if (package.TaskStepID == 1) { DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); //得到AGV的起点和终点 int StartPoint, EndPoint = 0; StartPoint = db.SelectAGVStartEndPoint(con, package.TaskID, ref EndPoint); MainWindow.agvUIHandle.AGV_POS_ACTION = ConfigClass.GetMapString(EndPoint) + "卸货完毕"; LogInfoHelp.GetInstance().WriteInfoToLogFile(MainWindow.agvUIHandle.AGV_POS_ACTION, LogInfoHelp.LOG_TYPE.LOG_INFO); db.UpdateAGVWorkState(con, package.TaskID); //更新AGV指令表中的通讯状态为【完成】 ExecuteOrder.SendAGVCmdEnable = true; //AGV的起点是立库人工上料区,终点是立库入库区,则是人工上料任务,此时通知立库入库 if (StartPoint == ConfigClass.HandUpArea && EndPoint == ConfigClass.WHInlibArea) { //这里用线程,是为了防止接收到多次一样的消息从而重复通知立库的bug。 if (InformWHThreadState == false) //防止线程重复创建 { InformWHThread = new Thread(new ParameterizedThreadStart(InformInlib)); InformWHThread.IsBackground = true; InformWHThreadState = true; InformWHThread.Start(package.TaskID); InformWHThread.Priority = ThreadPriority.AboveNormal; } return; } //AGV的起点是立库出库区,终点是人工下料区,则是人工下料任务,则AGV完成完成了任务后什么也不需要干了 if (StartPoint == ConfigClass.WHOutlibArea1 && EndPoint == ConfigClass.HandDownArea) { //当前人工下料订单完成 恢复上下料的按钮功能。 UDDelegate(); return; } } } }
public static LogInfoHelp GetInstance() { if (null == _instance) { _instance = new LogInfoHelp(); } return(_instance); }
//手动操作AGV时收到消息的处理方法 private void HandOperate() { if (package.Head == 10003) //收到消息 { MainWindow.agvUIHandle.AGV_POS_ACTION = "AGV已收到消息"; LogInfoHelp.GetInstance().WriteInfoToLogFile("AGV已收到消息", LogInfoHelp.LOG_TYPE.LOG_INFO); return; } if (package.Head == 10005) //执行指令完成 { if (package.TaskStepID == 0) //执行取货任务完成 { MainWindow.agvUIHandle.AGV_POS_ACTION = "AGV取货动作完毕"; LogInfoHelp.GetInstance().WriteInfoToLogFile("AGV取货动作完毕", LogInfoHelp.LOG_TYPE.LOG_INFO); } if (package.TaskStepID == 1) //执行卸货任务完成 { MainWindow.agvUIHandle.AGV_POS_ACTION = "AGV卸货动作完毕"; LogInfoHelp.GetInstance().WriteInfoToLogFile("AGV卸货动作完毕", LogInfoHelp.LOG_TYPE.LOG_INFO); MainWindow.AGVOperState = 0; return; } } }
//执行订单(自动操作)AGV时收到消息的处理方法 private void AutoOperate() { if (package.Head == 10003) //收到消息 { ExecuteOrder.SendAGVCmdEnable = false; MainWindow.agvUIHandle.AGV_POS_ACTION = "AGV已收到消息"; LogInfoHelp.GetInstance().WriteInfoToLogFile("AGV已收到消息", LogInfoHelp.LOG_TYPE.LOG_INFO); DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateAGVComState(con, package.TaskID); //更新AGV指令表中的通讯状态为【已收到】 return; } if (package.Head == 10005) //执行指令完成 { if (package.TaskStepID == 0) //执行取货任务完成 { //得到AGV的起点和终点 int StartPoint, EndPoint = 0; DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); StartPoint = db.SelectAGVStartEndPoint(con, package.TaskID, ref EndPoint); MainWindow.agvUIHandle.AGV_POS_ACTION = ConfigClass.GetMapString(StartPoint) + "取货完毕"; LogInfoHelp.GetInstance().WriteInfoToLogFile(MainWindow.agvUIHandle.AGV_POS_ACTION, LogInfoHelp.LOG_TYPE.LOG_INFO); //如过是送往立库入库区来的,向加工PLC 装配PLC 检测PLC发布当前状态 //AGV在各个机构区域取托盘完毕 if (EndPoint == ConfigClass.WHInlibArea) { PublishAGVState(StartPoint, EndPoint); Thread t = new Thread(delegate() { Thread.Sleep(new TimeSpan(0, 0, 5)); SetNull(); }); t.Start(); t.Priority = ThreadPriority.AboveNormal; t.IsBackground = true; //判断立库表指令是否超过两条,如果超过两条则挂起,否则不挂起 Thread th = new Thread(delegate() { SendPackage pac = new SendPackage(); while (true) { bool IsNoPause = db.SelectWHCmdNum(con); //查询立库指令表是否具备AGV挂起的条件 if (IsNoPause == false) //如果指令没超过一条 { pac.Head = 10012; pac.ESSignal = 6; //解急停 sendESDelegate(pac); break; } //如果超过两条 pac.Head = 10012; pac.ESSignal = 5; //急停 sendESDelegate(pac); Thread.Sleep(TimeSpan.FromSeconds(3)); } }); th.Start(); th.Priority = ThreadPriority.AboveNormal; th.IsBackground = true; } return; } if (package.TaskStepID == 1) //执行卸货任务完成 { DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); //得到AGV的起点和终点 int StartPoint, EndPoint = 0; StartPoint = db.SelectAGVStartEndPoint(con, package.TaskID, ref EndPoint); MainWindow.agvUIHandle.AGV_POS_ACTION = ConfigClass.GetMapString(EndPoint) + "卸货完毕"; LogInfoHelp.GetInstance().WriteInfoToLogFile(MainWindow.agvUIHandle.AGV_POS_ACTION, LogInfoHelp.LOG_TYPE.LOG_INFO); db.UpdateAGVWorkState(con, package.TaskID); //更新AGV指令表中的通讯状态为【完成】 ExecuteOrder.SendAGVCmdEnable = true; //如果是从立库出库区来的,向加工PLC 装配PLC 检测PLC发布当前状态 //AGV在各个机构区域放托盘完毕 if (StartPoint == ConfigClass.WHOutlibArea1) { //发布AGV的状态给各个PLC PublishAGVState(StartPoint, EndPoint); //AGV在各工作区卸货完成后,检查是否还有订单,并且检查每个工作区是否有空闲, //如果两个条件都满足,我们就通知立库继续出库(向立库指令表中插入出库信息) //这里用线程,是为了防止接收到多次一样的消息从而重复通知立库的bug。 if (InformWHThreadState == false) //防止线程重复创建 { InformWHThread = new Thread(new ParameterizedThreadStart(CheckAndInformWH)); InformWHThread.IsBackground = true; InformWHThreadState = true; InformWHThread.Start(EndPoint); InformWHThread.Priority = ThreadPriority.AboveNormal; } return; } //如过是送往立库入库区来的,则向立库表中插入入库指令信息 if (EndPoint == ConfigClass.WHInlibArea) { //AGV在立库入库区卸货完成,然后向立库表中插入入库指令信息 if (InformWHThreadState == false) //防止线程重复创建 { InformWHThread = new Thread(new ParameterizedThreadStart(InformWHInlib)); InformWHThread.IsBackground = true; InformWHThreadState = true; InformWHThread.Start(StartPoint); InformWHThread.Priority = ThreadPriority.AboveNormal; } return; } } } }
//手动操作AGV时收到消息的处理方法 private void HandOperate() { if (package.Head == 10004) { MainWindow.whUIHandle.WH_OPER_STATE = "已收到出库指令"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到出库指令", LogInfoHelp.LOG_TYPE.LOG_INFO); return; } if (package.Head == 20004) { if (package.InlibMatchingID == 1) { MainWindow.whUIHandle.WH_OPER_STATE = "已收到入库指令"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到入库指令", LogInfoHelp.LOG_TYPE.LOG_INFO); } else { MainWindow.whUIHandle.WH_OPER_STATE = "入库托盘匹配不成功"; MessageBox.Show("入库托盘匹配不成功,请选择正确的托盘类型,或者检查托盘RFID码是否正确,否则RFID读写器可能出现异常"); LogInfoHelp.GetInstance().WriteInfoToLogFile("入库托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); } return; } if (package.Head == 30004) { MainWindow.whUIHandle.WH_OPER_STATE = "已收到侧边出库指令"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到侧边出库指令", LogInfoHelp.LOG_TYPE.LOG_INFO); return; } if (package.Head == 10005) { if (package.OutlibMatchingID == 2) { MainWindow.whUIHandle.WH_OPER_STATE = "出库托盘匹配不成功"; MessageBox.Show("出库托盘匹配不成功,请检查MES系统的托盘位置和立库实际的托盘位置是否一致,否则RFID读写器可能出现异常"); LogInfoHelp.GetInstance().WriteInfoToLogFile("出库托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); } MainWindow.whUIHandle.WH_OPER_STATE = "已出库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已出库", LogInfoHelp.LOG_TYPE.LOG_INFO); DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.SaveKuweiArray(con, MainWindow.whHandInfo.Position, 0); //更新库位表中的库位信息 db.UpdateKuweiArray(con); MainWindow.WHOperState = 0; //一个动作完成后,将手动动作置为默认 return; } if (package.Head == 20005) { MainWindow.whUIHandle.WH_OPER_STATE = "已入库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已入库", LogInfoHelp.LOG_TYPE.LOG_INFO); DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.SaveKuweiArray(con, MainWindow.whHandInfo.Position, MainWindow.whHandInfo.TrayStyle); //更新库位表中的库位信息 db.UpdateKuweiArray(con); MainWindow.WHOperState = 0; //一个动作完成后,将手动动作置为默认 return; } if (package.Head == 30005) { if (package.OutlibMatchingID == 1) { MainWindow.whUIHandle.WH_OPER_STATE = "已侧边出库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已侧边出库", LogInfoHelp.LOG_TYPE.LOG_INFO); DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.SaveKuweiArray(con, MainWindow.whHandInfo.Position, 0); //更新库位表中的库位信息 db.UpdateKuweiArray(con); MainWindow.WHOperState = 0; //一个动作完成后,将手动动作置为默认 return; } else if (package.OutlibMatchingID == 2) { MainWindow.whUIHandle.WH_OPER_STATE = "侧边托盘匹配不成功"; MessageBox.Show("侧边出库托盘匹配不成功,请检查MES系统的托盘位置和立库实际的托盘位置是否一致,否则RFID读写器可能出现异常"); LogInfoHelp.GetInstance().WriteInfoToLogFile("侧边托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); } } }
private void ManualOperate() { if (package.Head == 10004) { MainWindow.whUIHandle.WH_OPER_STATE = "已收到出库指令"; ExecuteOrder.SendWHCmdEnable = false; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到出库指令", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表通信状态为【已收到】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHComState(con, package.SerialNumber); } if (package.Head == 20004) { if (package.InlibMatchingID == 1) // 与预期的托盘号一致,匹配成功 { MainWindow.whUIHandle.WH_OPER_STATE = "已收到入库指令"; ExecuteOrder.SendWHCmdEnable = false; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到入库指令", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表通信状态为【已收到】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHComState(con, package.SerialNumber); } else { MainWindow.whUIHandle.WH_OPER_STATE = "入库托盘匹配不成功"; LogInfoHelp.GetInstance().WriteInfoToLogFile("入库托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); MessageBox.Show("入库托盘匹配不成功,请选择正确的托盘类型,或者检查托盘RFID码是否正确,否则RFID读写器可能出现异常"); ExecuteOrder.HandAndDownFlag = false; DataBaseHandle db1 = new DataBaseHandle(); SqlConnection con1 = new SqlConnection(); db1.DeleteAGVCmdTable(con1); db1.DeleteWHCmdTable(con1); } return; } if (package.Head == 10005) { if (package.OutlibMatchingID == 2) { MainWindow.whUIHandle.WH_OPER_STATE = "出库托盘匹配不成功"; LogInfoHelp.GetInstance().WriteInfoToLogFile("出库托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); MessageBox.Show("出库托盘匹配不成功,请检查MES系统的托盘位置和立库实际的托盘位置是否一致,否则RFID读写器可能出现异常"); ExecuteOrder.HandAndDownFlag = false; DataBaseHandle db1 = new DataBaseHandle(); SqlConnection con1 = new SqlConnection(); db1.DeleteAGVCmdTable(con1); db1.DeleteWHCmdTable(con1); return; } MainWindow.whUIHandle.WH_OPER_STATE = "已出库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已出库", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表工作状态为【完成】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHWorkState(con, package.SerialNumber); ExecuteOrder.SendWHCmdEnable = true; //更新库位表(根据流水号得到出库的货位ID,然后将此ID号对应的货位类型置为0,选中状态置为未选中) db.UpdateCargoInfo(con, package.SerialNumber); //通知AGV来取货物,并送往立库下料区 //(根据当前出库的托盘类型和订单类型和各个工作区的PLC状态来判断应该将货物送往哪里,然后向AGV指令表中插入数据) //防止由于连续接收到相同信息,从而导致连续插入相同的指令以及防止线程重复创建 if (InformAGVThread1State == false) { InformAGVThread1 = new Thread(new ParameterizedThreadStart(CheckAndInformAGV1)); InformAGVThread1.IsBackground = true; InformAGVThread1State = true; InformAGVThread1.Start(package); } return; } if (package.Head == 20005) { MainWindow.whUIHandle.WH_OPER_STATE = "已入库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已入库", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表工作状态为【完成】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHWorkState(con, package.SerialNumber); ExecuteOrder.SendWHCmdEnable = true; //更新库位表(根据流水号得出入库的货位ID,然后根据得到的托盘类型,将货位类型置为相应的类型。选中状态置为未选中) db.UpdateCargoInfo(con, package.SerialNumber, package.TrayStyle); //当前上料订单完成事件,恢复上下料的按钮功能。 UDDelegate(); } }
//执行订单(自动操作)AGV时收到消息的处理方法 private void AutoOperate() { if (package.Head == 30000) { MainWindow.whUIHandle.WH_OPER_STATE = "写码完成"; LogInfoHelp.GetInstance().WriteInfoToLogFile("写码完成", LogInfoHelp.LOG_TYPE.LOG_INFO); DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.InsertAGVCmd(con, ConfigClass.WHOutlibArea2, ConfigClass.WHInlibArea); return; } if (package.Head == 10004) { MainWindow.whUIHandle.WH_OPER_STATE = "已收到出库指令"; ExecuteOrder.SendWHCmdEnable = false; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到出库指令", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表通信状态为【已收到】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHComState(con, package.SerialNumber); return; } if (package.Head == 20004) { if (package.InlibMatchingID == 1) // 与预期的托盘号一致,匹配成功 { MainWindow.whUIHandle.WH_OPER_STATE = "已收到入库指令"; ExecuteOrder.SendWHCmdEnable = false; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到入库指令", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表通信状态为【已收到】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHComState(con, package.SerialNumber); } else { MainWindow.whUIHandle.WH_OPER_STATE = "入库托盘匹配不成功"; LogInfoHelp.GetInstance().WriteInfoToLogFile("入库托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); MessageBox.Show("入库托盘匹配不成功,RFID读写器可能出现异常或者出现一些不可预见因素"); ExecuteOrder.ExecuteFlag = false; DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.DeleteAGVCmdTable(con); db.DeleteWHCmdTable(con); } return; } if (package.Head == 30004) { MainWindow.whUIHandle.WH_OPER_STATE = "已收到侧边出库命令"; ExecuteOrder.SendWHCmdEnable = false; LogInfoHelp.GetInstance().WriteInfoToLogFile("已收到侧边出库命令", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表通信状态为【已收到】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHComState(con, package.SerialNumber); return; } if (package.Head == 10005) { if (package.OutlibMatchingID == 2) { MainWindow.whUIHandle.WH_OPER_STATE = "出库托盘匹配不成功"; LogInfoHelp.GetInstance().WriteInfoToLogFile("出库托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); MessageBox.Show("出库托盘匹配不成功,请检查MES系统的托盘位置和立库实际的托盘位置是否一致,否则RFID读写器可能出现异常"); ExecuteOrder.ExecuteFlag = false; DataBaseHandle db1 = new DataBaseHandle(); SqlConnection con1 = new SqlConnection(); db1.DeleteAGVCmdTable(con1); db1.DeleteWHCmdTable(con1); return; } MainWindow.whUIHandle.WH_OPER_STATE = "已出库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已出库", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表工作状态为【完成】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHWorkState(con, package.SerialNumber); ExecuteOrder.SendWHCmdEnable = true; //更新库位表(根据流水号得到出库的货位ID,然后将此ID号对应的货位类型置为0,选中状态置为未选中) db.UpdateCargoInfo(con, package.SerialNumber); //通知AGV来取货物,并送往指定位置 //(根据当前出库的托盘类型和订单类型和各个工作区的PLC状态来判断应该将货物送往哪里,然后向AGV指令表中插入数据) //防止由于连续接收到相同信息,从而导致连续插入相同的指令以及防止线程重复创建 if (InformAGVThreadState == false) { InformAGVThread = new Thread(new ParameterizedThreadStart(CheckAndInformAGV)); InformAGVThread.IsBackground = true; InformAGVThread1State = true; InformAGVThread.Start(package); InformAGVThread.Priority = ThreadPriority.AboveNormal; } return; } if (package.Head == 20005) { MainWindow.whUIHandle.WH_OPER_STATE = "已入库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已入库", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表工作状态为【完成】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHWorkState(con, package.SerialNumber); ExecuteOrder.SendWHCmdEnable = true; //更新库位表(根据流水号得出入库的货位ID,然后根据得到的托盘类型,将货位类型置为相应的类型。选中状态置为未选中) db.UpdateCargoInfo(con, package.SerialNumber, package.TrayStyle); //如果订单类型是入库订单的话,我们就根据其托盘类型更新订单表 ,然后判断立库中订单表的数量, //如果为0停止响应的机器工作 //不为0的话则通知出库。 if (UpdateOrderThreadState == false) { UpdateOrderThread = new Thread(new ParameterizedThreadStart(UpdateOrderTable)); UpdateOrderThread.IsBackground = true; UpdateOrderThreadState = true; UpdateOrderThread.Start(package.SerialNumber); UpdateOrderThread.Priority = ThreadPriority.AboveNormal; } } if (package.Head == 30005) { if (package.OutlibMatchingID == 2) { MainWindow.whUIHandle.WH_OPER_STATE = "托盘匹配不成功"; LogInfoHelp.GetInstance().WriteInfoToLogFile("侧边托盘匹配不成功", LogInfoHelp.LOG_TYPE.LOG_ERROR); MessageBox.Show("侧边出库托盘匹配不成功,请检查MES系统的托盘位置和立库实际的托盘位置是否一致,否则RFID读写器可能出现异常"); ExecuteOrder.ExecuteFlag = false; DataBaseHandle db1 = new DataBaseHandle(); SqlConnection con1 = new SqlConnection(); db1.DeleteAGVCmdTable(con1); db1.DeleteWHCmdTable(con1); return; } MainWindow.whUIHandle.WH_OPER_STATE = "已侧边出库"; LogInfoHelp.GetInstance().WriteInfoToLogFile("已侧边出库", LogInfoHelp.LOG_TYPE.LOG_INFO); //更新立库表工作状态为【完成】 DataBaseHandle db = new DataBaseHandle(); SqlConnection con = new SqlConnection(); db.UpdateWHWorkState(con, package.SerialNumber); ExecuteOrder.SendWHCmdEnable = true; //更新库位表(根据流水号得到出库的货位ID,然后将此ID号对应的货位类型置为0,选中状态置为未选中) db.UpdateCargoInfo(con, package.SerialNumber); //通知加工区机器人来取货物 DTUSendPackage.Raw_Tray_Out = 1; return; } }