From 3a9d54f7454c6085cdd9fde71ea8e321b9ac0402 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期五, 12 九月 2025 11:50:01 +0800
Subject: [PATCH] 1.PanelDataReport事件上抛,以便上层检测到AOI 检测NG后停机; 2.CessetteSn种子数设定,保存到配置,以便程序关闭重开后,CessetteSn也能继续; 3.AOI增加工艺参数,修改解释规则;
---
SourceCode/Bond/Servo/CMaster.cpp | 76 ++++++++++++++++++++++++++++++++++++-
1 files changed, 73 insertions(+), 3 deletions(-)
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 3b2d01f..e93c06e 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -53,7 +53,7 @@
m_ullRunTime = 0;
m_state = MASTERSTATE::READY;
m_pActiveRobotTask = nullptr;
- m_nLastError = 0;
+ m_nLastError = ER_CODE_NOERROR;
m_isCompareMapsBeforeProceeding = FALSE;
m_bJobMode = FALSE;
m_bEnableEventReport = true;
@@ -307,7 +307,7 @@
return 0;
}
- int CMaster::stop()
+ int CMaster::stop(int nErCode/* = ER_CODE_NOERROR*/)
{
// 运行时间为累加结果,本次停止时刷新;
lock();
@@ -321,6 +321,7 @@
// 更新状态
+ m_nLastError = nErCode;
setState(MASTERSTATE::STOPPING);
@@ -423,6 +424,7 @@
});
if (nRet != 0) {
LOGE("<Master>EFEM切换Start状态失败");
+ m_nLastError = ER_CODE_OPERATION_MODE_FAIL;
m_strLastError = "EFEM切换Start状态失败.";
goto WAIT;
}
@@ -436,6 +438,7 @@
});
if (nRet != 0) {
LOGE("<Master>Bonder1切换Start状态失败");
+ m_nLastError = ER_CODE_BONDER_OPERATION_MODE_FAIL;
m_strLastError = "Bonder1切换Start状态失败.";
goto WAIT;
}
@@ -449,6 +452,7 @@
});
if (nRet != 0) {
LOGE("<Master>Bonder2切换Start状态失败");
+ m_nLastError = ER_CODE_BONDER_OPERATION_MODE_FAIL;
m_strLastError = "Bonder2切换Start状态失败.";
goto WAIT;
}
@@ -462,6 +466,7 @@
});
if (nRet != 0) {
LOGE("<Master>BakeCooling切换Start状态失败");
+ m_nLastError = ER_CODE_OPERATION_MODE_FAIL;
m_strLastError = "BakeCooling切换Start状态失败.";
goto WAIT;
}
@@ -475,6 +480,7 @@
});
if (nRet != 0) {
LOGE("<Master>VacuumBake切换Start状态失败");
+ m_nLastError = ER_CODE_OPERATION_MODE_FAIL;
m_strLastError = "VacuumBake切换Start状态失败.";
goto WAIT;
}
@@ -488,6 +494,7 @@
});
if (nRet != 0) {
LOGE("<Master>Measurement切换Start状态失败");
+ m_nLastError = ER_CODE_OPERATION_MODE_FAIL;
m_strLastError = "Measurement切换Start状态失败.";
goto WAIT;
}
@@ -546,6 +553,7 @@
});
if (nRet != 0) {
LOGE("<Master>%s切换Stop状态发送失败", pEq[i]->getName().c_str());
+ m_nLastError = ER_CODE_OPERATION_MODE_FAIL;
m_strLastError = pEq[i]->getName() + "切换Stop状态发送失败.";
bIomcOk[i] = FALSE;
promises[i].set_value(); // 避免 wait 阻塞
@@ -570,7 +578,11 @@
}
LOGI("<Master>所有设备成功切换到 Stop 模式");
- setState(MASTERSTATE::READY);
+ if(m_nLastError == ER_CODE_NOERROR)
+ setState(MASTERSTATE::READY);
+ else
+ setState(MASTERSTATE::ATHERERROR);
+
continue;
}
@@ -774,6 +786,7 @@
continue;
}
+ pGlass->queue();
pGlass->start();
pEFEM->setContext(m_pActiveRobotTask->getContext());
goto PORT_GET;
@@ -1450,6 +1463,8 @@
if (m_pActiveRobotTask->getSrcPosition() == EQ_ID_MEASUREMENT) {
CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
pGlass->complete();
+ CGlass* pBuddy = pGlass->getBuddy();
+ if (pBuddy != nullptr) pBuddy->complete();
this->saveState();
bool bMoved = glassFromInPorcessToComplete(pGlass);
if (bMoved) {
@@ -1572,6 +1587,25 @@
strOut.append(szBuffer);
}
LOGD("<CMaster-%s>SVDataReport:%s", ((CEquipment*)pEquipment)->getName().c_str(), strOut.c_str());
+ };
+ listener.onPanelDataReport = [&](void* pEquipment, void* pContext) {
+ LOGD("<CMaster-%s>onPanelDataReport", ((CEquipment*)pEquipment)->getName().c_str());
+
+ CEquipment* pEq = (CEquipment*)pEquipment;
+ CGlass* pGlass = (CGlass*)pContext;
+
+ // 如果AOI检测失败,要停机
+ if (pEq->getID() == EQ_ID_MEASUREMENT) {
+ LOGD("<CMaster-%s>onPanelDataReport 01", ((CEquipment*)pEquipment)->getName().c_str());
+ if (pGlass->getAOIInspResult() == InspResult::Fail) {
+ LOGD("<CMaster-%s>onPanelDataReport 02", ((CEquipment*)pEquipment)->getName().c_str());
+ if (stop() == 0) {
+ m_nLastError = ER_CODE_AOI_NG;
+ m_strLastError = "AOI检测未通过.";
+ }
+ }
+ }
+
};
pEquipment->setListener(listener);
pEquipment->setCcLink(&m_cclink);
@@ -1833,6 +1867,8 @@
if (!m_inProcesGlasses.empty()) {
CGlass* pGlass = m_inProcesGlasses.front();
pGlass->complete();
+ CGlass* pBuddy = pGlass->getBuddy();
+ if (pBuddy != nullptr) pBuddy->complete();
glassFromInPorcessToComplete(pGlass);
this->saveState();
@@ -2279,6 +2315,22 @@
pPort->localEanblePort(bEnable);
}
+ int CMaster::getPortCassetteSnSeed(int port)
+ {
+ ASSERT(1 <= port && port <= 4);
+ int eqid[] = { EQ_ID_LOADPORT1, EQ_ID_LOADPORT2, EQ_ID_LOADPORT3, EQ_ID_LOADPORT4 };
+ CLoadPort* pPort = (CLoadPort*)getEquipment(eqid[port - 1]);
+ return pPort->getPortCassetteSnSeed();
+ }
+
+ void CMaster::setPortCassetteSnSeed(int port, int seed)
+ {
+ ASSERT(1 <= port && port <= 4);
+ int eqid[] = { EQ_ID_LOADPORT1, EQ_ID_LOADPORT2, EQ_ID_LOADPORT3, EQ_ID_LOADPORT4 };
+ CLoadPort* pPort = (CLoadPort*)getEquipment(eqid[port - 1]);
+ return pPort->setPortCassetteSnSeed(seed);
+ }
+
void CMaster::setCompareMapsBeforeProceeding(BOOL bCompare)
{
m_isCompareMapsBeforeProceeding = bCompare;
@@ -2712,4 +2764,22 @@
return (int)glasses.size();
}
+
+ int CMaster::getLastError()
+ {
+ return m_nLastError;
+ }
+
+ std::string& CMaster::getLastErrorText()
+ {
+ return m_strLastError;
+ }
+
+ void CMaster::test()
+ {
+ if (stop() == 0) {
+ m_nLastError = ER_CODE_AOI_NG;
+ m_strLastError = "AOI检测未通过.";
+ }
+ }
}
--
Gitblit v1.9.3