//将装配区的状态赋给上述属性 public static void Get_A_State(DTURequestInfo requestinfo) { //状态 A_System_State = requestinfo.SystemState; A_Assembly_Area1 = (requestinfo.PartState & 1) == 1 ? 1 : 0; A_Assembly_Area2 = (requestinfo.PartState & 2) == 2 ? 1 : 0; A_Robot_State = (requestinfo.PartState & 4) == 4 ? 1 : 0; A_Cor_State = (requestinfo.PartState & 8) == 8 ? 1 : 0; A_Assembly_InArea1 = (requestinfo.PartState & 16) == 16 ? 1 : 0; A_Assembly_InArea2 = (requestinfo.PartState & 32) == 32 ? 1 : 0; if (A_System_State != 2) //如果不是系统正常,已启动这个状态的话,就退出 { return; } //动作 A_AGV_Assembly1 = (requestinfo.AGVExecuteCmd & 1) == 1 ? 1 : 0; A_AGV_Assembly2 = (requestinfo.AGVExecuteCmd & 2) == 2 ? 1 : 0; //RFID A_Assembly1_RFID = requestinfo.Assembly_Area1_RFID; if (A_Assembly1_RFID == ConfigClass.Tray_B2 && A_OnlyOnce3 == false) { SqlConnection con = new SqlConnection(); DataBaseHandle db = new DataBaseHandle(); db.SaveData(con, "拧螺丝订单", ConfigClass.GetTrayString(A_Assembly1_RFID)); A_OnlyOnce3 = true; } if (A_Assembly1_RFID != ConfigClass.Tray_B2) { A_OnlyOnce3 = false; } A_Assembly2_RFID = requestinfo.Assembly_Area2_RFID; if (A_Assembly2_RFID == ConfigClass.Tray_B2 && A_OnlyOnce4 == false) { SqlConnection con = new SqlConnection(); DataBaseHandle db = new DataBaseHandle(); db.SaveData(con, "拧螺丝订单", "缺省", ConfigClass.GetTrayString(A_Assembly1_RFID)); A_OnlyOnce4 = true; } if (A_Assembly2_RFID != ConfigClass.Tray_B2) { A_OnlyOnce4 = false; } //如果动作值为1,则通知AGV(向AGV表中插入命令)且不能重复插入 if (A_AGV_Assembly1 == 1 && A_OnlyOnce1 == false) { InformAGV(ConfigClass.AssemblyArea1); A_OnlyOnce1 = true; } if (A_AGV_Assembly1 == 0) { A_OnlyOnce1 = false; } if (A_AGV_Assembly2 == 1 && A_OnlyOnce2 == false) { InformAGV(ConfigClass.AssemblyArea2); A_OnlyOnce2 = true; } if (A_AGV_Assembly2 == 0) { A_OnlyOnce2 = false; } }
} //人工下料AGV对接台RFID识别托盘工件相关参数5 //将加工区的状态赋给上述属性 public static void Get_P_State(DTURequestInfo requestinfo) { //状态 P_System_State = requestinfo.SystemState; P_Manual_Up_Area = (requestinfo.PartState & 1) == 1 ? 1 : 0; P_Manual_Down_Area = (requestinfo.PartState & 2) == 2 ? 1 : 0; P_Process_Area1 = (requestinfo.PartState & 4) == 4 ? 1 : 0; P_Process_Area2 = (requestinfo.PartState & 8) == 8 ? 1 : 0; P_Mazak1_State = (requestinfo.PartState & 16) == 16 ? 1 : 0; P_Mazak2_State = (requestinfo.PartState & 32) == 32 ? 1 : 0; P_Big_State = (requestinfo.PartState & 64) == 64 ? 1 : 0; P_Robot_State = (requestinfo.PartState & 128) == 128 ? 1 : 0; //系统控制 P_System_Control = requestinfo.SystemControl; if (P_System_State != 2) //如果不是系统正常,已启动这个状态的话,就退出 { return; } //动作 P_Raw_Tray_Empty = (requestinfo.Raw_Tray_Empty & 1) == 1 ? 1 : 0; P_AGV_Manual_Up = (requestinfo.AGVExecuteCmd & 1) == 1 ? 1 : 0; P_AGV_Manual_Down = (requestinfo.AGVExecuteCmd & 2) == 2 ? 1 : 0; P_AGV_Process1 = (requestinfo.AGVExecuteCmd & 4) == 4 ? 1 : 0; P_AGV_Process2 = (requestinfo.AGVExecuteCmd & 8) == 8 ? 1 : 0; //RFID P_Manual_Up_RFID = requestinfo.Manual_Up_RFID; P_Manual_Down_RFID = requestinfo.Manual_Down_RFID; P_Process1_RFID = requestinfo.Process_Area1_RFID; if (P_Process1_RFID == ConfigClass.Tray_A2 && P_OnlyOnce5 == false) { SqlConnection con = new SqlConnection(); DataBaseHandle db = new DataBaseHandle(); db.SaveData(con, "加工订单", ConfigClass.GetTrayString(P_Process1_RFID)); P_OnlyOnce5 = true; } if (P_Process1_RFID != ConfigClass.Tray_A2) { P_OnlyOnce5 = false; } P_Process2_RFID = requestinfo.Process_Area2_RFID; if (P_Process2_RFID == ConfigClass.Tray_A2 && P_OnlyOnce6 == false) { SqlConnection con = new SqlConnection(); DataBaseHandle db = new DataBaseHandle(); db.SaveData(con, "加工订单", "缺省", ConfigClass.GetTrayString(P_Process2_RFID)); P_OnlyOnce6 = true; } if (P_Process2_RFID != ConfigClass.Tray_A2) { P_OnlyOnce6 = false; } //数据 UP_C_D_Number = (int)requestinfo.Manual_Up_CD_Number; Down_C_D_Number = (int)requestinfo.Manual_Down_CD_Number; Down_RFID_Para1 = requestinfo.Manual_Down_Para1; Down_RFID_Para2 = requestinfo.Manual_Down_Para2; Down_RFID_Para3 = requestinfo.Manual_Down_Para3; Down_RFID_Para4 = requestinfo.Manual_Down_Para4; Down_RFID_Para5 = requestinfo.Manual_Down_Para5; //如果动作值为1,则通知AGV(向AGV表中插入命令),且不能重复插入 if (P_Raw_Tray_Empty == 1 && P_OnlyOnce1 == false) { WHSendPackage package = new WHSendPackage(); package.Head = 29000; package.TrayID = 0; package.WHPostion = 0; package.SerialNumber = 0; if (MainWindow.WHDISCONNECTED == false) { sendWHMsgDel(package); P_OnlyOnce1 = true; } } if (P_Raw_Tray_Empty == 0) { P_OnlyOnce1 = false; } if (P_AGV_Process1 == 1 && P_OnlyOnce2 == false) { InformAGV(ConfigClass.ProcessArea1); P_OnlyOnce2 = true; } if (P_AGV_Process1 == 0) { P_OnlyOnce2 = false; } if (P_AGV_Process2 == 1 && P_OnlyOnce3 == false) { InformAGV(ConfigClass.ProcessArea2); P_OnlyOnce3 = true; } if (P_AGV_Process2 == 0) { P_OnlyOnce3 = false; } if (P_AGV_Manual_Up == 1 && P_OnlyOnce4 == false) { InformAGV(ConfigClass.HandUpArea, P_Manual_Up_RFID); P_OnlyOnce4 = true; } if (P_AGV_Manual_Up == 0) { P_OnlyOnce4 = false; } }
//将检测区的状态赋给上述属性 public static void Get_D_State(DTURequestInfo requestinfo) { //状态 D_System_State = requestinfo.SystemState; D_Detection_Area1 = (requestinfo.PartState & 1) == 1 ? 1 : 0; D_Detection_Area2 = (requestinfo.PartState & 2) == 2 ? 1 : 0; D_Marking_State = (requestinfo.PartState & 4) == 4 ? 1 : 0; D_Robot_State = (requestinfo.PartState & 8) == 8 ? 1 : 0; if (D_System_State != 2) //如果不是系统正常,已启动这个状态的话,就退出 { return; } //动作 D_AGV_Detection1 = (requestinfo.AGVExecuteCmd & 1) == 1 ? 1 : 0; D_AGV_Detection2 = (requestinfo.AGVExecuteCmd & 2) == 2 ? 1 : 0; //RFID D_Detection1_RFID = requestinfo.Detection_Area1_RFID; if (D_Detection1_RFID == ConfigClass.Tray_A3 && D_OnlyOnce3 == false) { D_AGV_Detection1_Para1 = requestinfo.Detection_Area1_Parameter1; D_AGV_Detection1_Para2 = requestinfo.Detection_Area1_Parameter2; D_AGV_Detection1_Para3 = requestinfo.Detection_Area1_Parameter3; D_AGV_Detection1_Para4 = requestinfo.Detection_Area1_Parameter4; D_AGV_Detection1_Para5 = requestinfo.Detection_Area1_Parameter5; SqlConnection con = new SqlConnection(); DataBaseHandle db = new DataBaseHandle(); db.SaveData(con, "检测订单", ConfigClass.GetTrayString(D_Detection1_RFID), ConfigClass.GetTrayString(D_Detection2_RFID), D_AGV_Detection1_Para1, D_AGV_Detection1_Para2, D_AGV_Detection1_Para3, D_AGV_Detection1_Para4, D_AGV_Detection1_Para5); D_OnlyOnce3 = true; } if (D_Detection1_RFID != ConfigClass.Tray_A3) { D_OnlyOnce3 = false; } D_Detection2_RFID = requestinfo.Detection_Area2_RFID; if (D_Detection2_RFID == ConfigClass.Tray_A3 && D_OnlyOnce4 == false) { D_AGV_Detection2_Para1 = requestinfo.Detection_Area2_Parameter1; D_AGV_Detection2_Para2 = requestinfo.Detection_Area2_Parameter2; D_AGV_Detection2_Para3 = requestinfo.Detection_Area2_Parameter3; D_AGV_Detection2_Para4 = requestinfo.Detection_Area2_Parameter4; D_AGV_Detection2_Para5 = requestinfo.Detection_Area2_Parameter5; SqlConnection con = new SqlConnection(); DataBaseHandle db = new DataBaseHandle(); db.SaveData(con, "检测订单", ConfigClass.GetTrayString(D_Detection1_RFID), ConfigClass.GetTrayString(D_Detection2_RFID), D_AGV_Detection1_Para1, D_AGV_Detection1_Para2, D_AGV_Detection1_Para3, D_AGV_Detection1_Para4, D_AGV_Detection1_Para5); D_OnlyOnce4 = true; } if (D_Detection2_RFID != ConfigClass.Tray_A3) { D_OnlyOnce4 = false; } //如果动作值为1,则通知AGV(向AGV表中插入命令)且不能重复插入 if (D_AGV_Detection1 == 1 && D_OnlyOnce1 == false) { InformAGV(ConfigClass.DetectionArea1); D_OnlyOnce1 = true; } if (D_AGV_Detection1 == 0) { D_OnlyOnce1 = false; } if (D_AGV_Detection2 == 1 && D_OnlyOnce2 == false) { InformAGV(ConfigClass.DetectionArea2); D_OnlyOnce2 = true; } if (D_AGV_Detection2 == 0) { D_OnlyOnce2 = false; } }
//执行订单(自动操作)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; } } } }