private void ThreadOpenStoveLid() { while (true) { Thread.Sleep(100); if (!GenericOp.AutoMode) continue; // 只有在龙门不再炉盖附近时,才允许打开,否则很危险。 if (ABTask.loadPoints == null) continue; // 安全规则判断 if ((GenericOp.xPos < ABTask.loadPoints[openStoveLidPos].X + 1200) && (GenericOp.xPos > ABTask.loadPoints[openStoveLidPos].X - 1200)) { SerialManual.StopStoveLidCmd(openStoveLidPos);// 如果在龙门附近打开盖子,就停止所有盖子的动作。 } if ((GenericOp.xPos < ABTask.loadPoints[closeStoveLidPos].X + 1200) && (GenericOp.xPos > ABTask.loadPoints[closeStoveLidPos].X - 1200)) { SerialManual.StopStoveLidCmd(closeStoveLidPos);// 如果在龙门附近打开盖子,就停止所有盖子的动作。 } // -------------------------------------------------------------- // 打开、关闭、停止炉盖动作 // // 需要打开炉盖的炉子有 _ _ _ 3、4、5、6 _ _ _ _、11、12 int tmpPos; for (int i = 0; i < 7; i++) { if (stoveLidAction[i] == STOVE_LID_ACTION.CLOSE) { tmpPos = GetPos_fromStoveLidIndex(i); if ((GenericOp.xPos < ABTask.loadPoints[tmpPos].X + 1200) && (GenericOp.xPos > ABTask.loadPoints[tmpPos].X - 1200)) { continue;// 夹爪在炉子上方,就忽略关闭命令 } SerialManual.CloseStoveLid(i);// 关闭炉盖 } else if (stoveLidAction[i] == STOVE_LID_ACTION.OPEN) { tmpPos = GetPos_fromStoveLidIndex(i); if ((GenericOp.xPos < ABTask.loadPoints[tmpPos].X + 1200) && (GenericOp.xPos > ABTask.loadPoints[tmpPos].X - 1200)) { continue;// 夹爪在炉子上方,就忽略打开命令 } SerialManual.OpenStoveLid(i);// 打开炉盖 } if (stoveLidAction[i] == STOVE_LID_ACTION.NO_ACTION) { SerialManual.StopStoveLidCmd(i);// 停止炉盖动作 } } } }
private void ThreadAB() { while (true) { Thread.Sleep(100); // 执行任务列表中的任务,执行完成的,就从任务列表中删除。 if (currTask != null) { // --------------------------------------------------- // 根据任务状态执行任务 // if (currTask.taskStatus == ABTask.STATUS.IDLE) { // if (currTask.AB_TASK_A == hyWorkFlow.POS_LOAD) { // 如果是新的任务(新的夹具),那么就添加到夹具列表 shareCarrierRes.mutex.WaitOne(); //申请(互斥,互锁) carrierList.Add(currTask.carrier); shareCarrierRes.mutex.ReleaseMutex(); // 释放 } // currTask.taskStatus = ABTask.STATUS.PREA;// 更新任务状态 currCarrier = currTask.carrier; // 更新任务信息,记录到xml中 UpdateXmlNodeTaskInfo(ABTask.STATUS.PREA, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.PREA) { if (((GenericOp.xPos < 4275)) || ((GenericOp.xPos > 11955) && (GenericOp.xPos < 16105))) { for (int a = 0; a < 6; a++) //检查炉盖是否都已经关闭 关闭才允许运行 { SerialManual.STOVE_LID_STATE state; state = SerialManual.stoveLidState[a]; while (state != SerialManual.STOVE_LID_STATE.CLOSED) { Thread.Sleep(500); state = SerialManual.stoveLidState[a]; SerialManual.CloseStoveLid(a); } } } // 炉盖打开任务 int i = GetStoveLidIndex(currTask.AB_TASK_A); if (i >= 0) { stoveLidAction[i] = STOVE_LID_ACTION.OPEN;// 要打开 A pos 的炉盖 } int b = currTask.AB_TASK_A; switch (b)//关闭前一个水槽搅拌 { case 0: SerialManual.CloseStoveLid(8); break; case 1: SerialManual.CloseStoveLid(9); break; case 2: SerialManual.CloseStoveLid(10); break; case 3: SerialManual.CloseStoveLid(11); break; case 8: SerialManual.CloseStoveLid(12); break; case 9: SerialManual.CloseStoveLid(13); break; case 10: SerialManual.CloseStoveLid(14); break; default: break; } // PRE_A_DOING(); currTask.taskStatus = ABTask.STATUS.CLAMPA;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.CLAMPA, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.CLAMPA) { CLAMPA_DOING(); currTask.taskStatus = ABTask.STATUS.PREB;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.PREB, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.PREB) { // 炉盖关闭任务 int i = GetStoveLidIndex(currTask.AB_TASK_A); if (i >= 0) { stoveLidAction[i] = STOVE_LID_ACTION.CLOSE;// 要关闭 A pos 的炉盖 } // 炉盖打开任务 i = GetStoveLidIndex(currTask.AB_TASK_B); if (i >= 0) { stoveLidAction[i] = STOVE_LID_ACTION.OPEN;// 要打开 B pos 的炉盖 } int b = currTask.AB_TASK_B; switch (b)//打开水槽搅拌等 { case 0: SerialManual.OpenStoveLid(8); break; case 1: SerialManual.OpenStoveLid(9); break; case 2: SerialManual.OpenStoveLid(10); break; case 3: SerialManual.OpenStoveLid(11); break; case 8: SerialManual.OpenStoveLid(12); break; case 9: SerialManual.OpenStoveLid(13); break; case 10: SerialManual.OpenStoveLid(14); break; default: break; } PRE_B_DOING(); currTask.taskStatus = ABTask.STATUS.RELAXB;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.RELAXB, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.RELAXB) { RELAXB_DOING(); currTask.taskStatus = ABTask.STATUS.AFTERB;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.AFTERB, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.AFTERB) { // 炉盖关闭任务 int i = GetStoveLidIndex(currTask.AB_TASK_B); if (i >= 0) { stoveLidAction[i] = STOVE_LID_ACTION.CLOSE;// 要关闭 B pos 的炉盖 } AFTER_B_DOING(); if (currTask.AB_TASK_B == hyWorkFlow.POS_UNLOAD) { // 如果到达了卸载位,就移除夹具 SerialWireless.gtryCmd = SerialWireless.GTYRY_CMD.UN_LOAD; shareCarrierRes.mutex.WaitOne(); //申请(互斥,互锁) carrierList.Remove(currTask.carrier); shareCarrierRes.mutex.ReleaseMutex(); // 释放 } currTask.taskStatus = ABTask.STATUS.STOP;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.STOP, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } } } }
private void ThreadAB() { while (true) { Thread.Sleep(100); // 执行任务列表中的任务,执行完成的,就从任务列表中删除。 if (currTask != null) { // --------------------------------------------------- // 根据任务状态执行任务 // if (currTask.taskStatus == ABTask.STATUS.IDLE) {// if (currTask.AB_TASK_A == hyWorkFlow.POS_LOAD) {// 如果是新的任务(新的夹具),那么就添加到夹具列表 shareCarrierRes.mutex.WaitOne();//申请(互斥,互锁) carrierList.Add(currTask.carrier); shareCarrierRes.mutex.ReleaseMutex();// 释放 } // currTask.taskStatus = ABTask.STATUS.PREA;// 更新任务状态 currCarrier = currTask.carrier; // 更新任务信息,记录到xml中 UpdateXmlNodeTaskInfo(ABTask.STATUS.PREA, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.PREA) { /* if (((GenericOp.xPos < 4360)) || ((GenericOp.xPos > 13965) && (GenericOp.xPos < 21478))) { for (int a = 0; a < 7; a++) //检查炉盖是否都已经关闭 关闭才允许运行 { SerialManual.STOVE_LID_STATE state; state = SerialManual.stoveLidState[a]; if (state != SerialManual.STOVE_LID_STATE.CLOSED) { SerialManual.CloseStoveLid(a); } while (state != SerialManual.STOVE_LID_STATE.CLOSED) { Thread.Sleep(500); state = SerialManual.stoveLidState[a]; } } } */ // 炉盖打开任务 int i = GetStoveLidIndex(currTask.AB_TASK_A); if (i >= 0) { stoveLidAction[i] = STOVE_LID_ACTION.OPEN;// 要打开 A pos 的炉盖 } //SerialManual.CloseStoveLid(8);//关闭后门 /*if (currTask.AB_TASK_A == hyWorkFlow.POS_LOAD)//打开前门 { SerialManual.STOVE_LID_STATE state; SerialManual.CloseStoveLid(7);//打开前门 state = SerialManual.stoveLidState[8];// 查看前门的状态 while (state != SerialManual.STOVE_LID_STATE.ERROR) {// 等待炉盖打开到位信号。 Thread.Sleep(100);// 等待前门打开 state = SerialManual.stoveLidState[8];// 查看前门状态 // 超时处理 // TODO: 如果60秒都没有打开的话,需要给出提示信息。告诉用户炉盖故障:接近开关故障。 timeout_openStoveLid++; if (timeout_openStoveLid > 600) { GenericOp.errCode |= 0x01; } } }*/ if (GenericOp.GREASEnum > 7)//注油 润滑 { SerialWireless.gtryCmd = SerialWireless.GTYRY_CMD.GREASE; } // PRE_A_DOING(); currTask.taskStatus = ABTask.STATUS.CLAMPA;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.CLAMPA, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.CLAMPA) { CLAMPA_DOING(); currTask.taskStatus = ABTask.STATUS.PREB;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.PREB, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.PREB) { // 炉盖关闭任务 int i = GetStoveLidIndex(currTask.AB_TASK_A); if (i >= 0) { stoveLidAction[i] = STOVE_LID_ACTION.CLOSE; // 要关闭 A pos 的炉盖 } /*if (currTask.AB_TASK_B == hyWorkFlow.POS_UNLOAD) //打开后门 { SerialManual.OpenStoveLid(8); SerialManual.STOVE_LID_STATE state; state = SerialManual.stoveLidState[7];// 查看后门的状态 while (state != SerialManual.STOVE_LID_STATE.ERROR) {// 等待炉盖打开到位信号。 Thread.Sleep(100);// 等待前门打开 state = SerialManual.stoveLidState[7];// 查看hou门状态 // 超时处理 // TODO: 如果60秒都没有打开的话,需要给出提示信息。告诉用户炉盖故障:接近开关故障。 timeout_openStoveLid++; if (timeout_openStoveLid > 600) { GenericOp.errCode |= 0x01; } } } */ // 炉盖打开任务 i = GetStoveLidIndex(currTask.AB_TASK_B); if (i >= 0) { stoveLidAction[i] = STOVE_LID_ACTION.OPEN;// 要打开 B pos 的炉盖 } PRE_B_DOING(); currTask.taskStatus = ABTask.STATUS.RELAXB;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.RELAXB, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.RELAXB) { if (currTask.AB_TASK_A == hyWorkFlow.POS_LOAD)//关闭前门 { SerialManual.OpenStoveLid(7); } RELAXB_DOING(); currTask.taskStatus = ABTask.STATUS.AFTERB;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.AFTERB, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } else if (currTask.taskStatus == ABTask.STATUS.AFTERB) { // 炉盖关闭任务 int i = GetStoveLidIndex(currTask.AB_TASK_B); if (i >= 0) { switch (i) { case 3: stoveLidAction[i] = STOVE_LID_ACTION.OPEN; break; default: stoveLidAction[i] = STOVE_LID_ACTION.CLOSE; break; } // 要关闭 B pos 的炉盖 4号炉不关闭 } AFTER_B_DOING(); //if (currTask.AB_TASK_B == hyWorkFlow.POS_UNLOAD)//到达卸载位卸货 if(currTask.AB_TASK_B==9)//到达9号水槽及卸货 {// 如果到达了卸载位,就移除夹具 shareCarrierRes.mutex.WaitOne();//申请(互斥,互锁) carrierList.Remove(currTask.carrier); shareCarrierRes.mutex.ReleaseMutex();// 释放 } currTask.taskStatus = ABTask.STATUS.STOP;// 更新任务状态 UpdateXmlNodeTaskInfo(ABTask.STATUS.STOP, currTask.AB_TASK_A, currTask.AB_TASK_B, currTask.carrier.id); } } } }