From 30847e604bbf072a0b6a4577cf395ff1a617bac3 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 24 七月 2025 08:51:17 +0800
Subject: [PATCH] 1.LoadPort状态变为InUse的时候不自动弹出LoadPort配置对话框; 2.修改调度逻辑,G2和G1分别进入Bonder的间隔不要太长,防止G2先进入Bonder,等待烘烤中的G1太久,在高温Bonder下出问题;
---
SourceCode/Bond/Servo/CMaster.cpp | 148 +++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 130 insertions(+), 18 deletions(-)
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 6fd1c50..5b6d6e9 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -51,6 +51,7 @@
m_state = MASTERSTATE::READY;
m_pActiveRobotTask = nullptr;
m_nLastError = 0;
+ m_isCompareMapsBeforeProceeding = FALSE;
InitializeCriticalSection(&m_criticalSection);
}
@@ -659,8 +660,10 @@
// Fliper(G2) -> Bonder
// VacuumBake(G1) -> Bonder
+ SERVO::CRobotTask* tempTask[2] = {nullptr, nullptr};
if (!rmd.armState[1] && !pBonder1->hasBondClass()) {
- m_pActiveRobotTask = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
+ tempTask[0] = createTransferTask(pFliper, pBonder1, primaryType, secondaryType, 2);
+ /*
if (m_pActiveRobotTask != nullptr) {
m_pActiveRobotTask->pick();
std::string strDescription = m_pActiveRobotTask->getDescription();
@@ -671,24 +674,12 @@
LOGI("创建新任务<%s>...", strDescription.c_str());
continue;
}
- }
-
- if (!rmd.armState[1] && !pBonder2->hasBondClass()) {
- m_pActiveRobotTask = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
- if (m_pActiveRobotTask != nullptr) {
- m_pActiveRobotTask->pick();
- std::string strDescription = m_pActiveRobotTask->getDescription();
- unlock();
- if (m_listener.onRobotTaskEvent != nullptr) {
- m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
- }
- LOGI("创建新任务<%s>...", strDescription.c_str());
- continue;
- }
+ */
}
if (!rmd.armState[0] && !pBonder1->hasBondClass()) {
- m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
+ tempTask[1] = createTransferTask(pVacuumBake, pBonder1, primaryType, secondaryType);
+ /*
if (m_pActiveRobotTask != nullptr) {
m_pActiveRobotTask->pick();
std::string strDescription = m_pActiveRobotTask->getDescription();
@@ -699,10 +690,51 @@
LOGI("创建新任务<%s>...", strDescription.c_str());
continue;
}
+ */
+ }
+
+ if (tempTask[1] != nullptr && pBonder1->hasG2Class()) {
+ m_pActiveRobotTask = tempTask[1];
+ if(tempTask[0] != nullptr) delete tempTask[0];
+ }
+ else if (tempTask[0] != nullptr && tempTask[1] != nullptr) {
+ m_pActiveRobotTask = tempTask[0];
+ delete tempTask[1];
+ }
+ if (m_pActiveRobotTask != nullptr) {
+ m_pActiveRobotTask->pick();
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ if (m_listener.onRobotTaskEvent != nullptr) {
+ m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+ }
+ LOGI("创建新任务<%s>...", strDescription.c_str());
+ continue;
+ }
+
+ if (tempTask[0] != nullptr) delete tempTask[0];
+ if (tempTask[1] != nullptr) delete tempTask[1];
+ tempTask[0] = nullptr;
+ tempTask[1] = nullptr;
+ if (!rmd.armState[1] && !pBonder2->hasBondClass()) {
+ tempTask[0] = createTransferTask(pFliper, pBonder2, primaryType, secondaryType, 2);
+ /*
+ if (m_pActiveRobotTask != nullptr) {
+ m_pActiveRobotTask->pick();
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ if (m_listener.onRobotTaskEvent != nullptr) {
+ m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+ }
+ LOGI("创建新任务<%s>...", strDescription.c_str());
+ continue;
+ }
+ */
}
if (!rmd.armState[0] && !pBonder2->hasBondClass()) {
- m_pActiveRobotTask = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
+ tempTask[1] = createTransferTask(pVacuumBake, pBonder2, primaryType, secondaryType);
+ /*
if (m_pActiveRobotTask != nullptr) {
m_pActiveRobotTask->pick();
std::string strDescription = m_pActiveRobotTask->getDescription();
@@ -713,8 +745,31 @@
LOGI("创建新任务<%s>...", strDescription.c_str());
continue;
}
+ */
}
+ if (tempTask[1] != nullptr && pBonder1->hasG2Class()) {
+ m_pActiveRobotTask = tempTask[1];
+ if (tempTask[0] != nullptr) delete tempTask[0];
+ }
+ else if (tempTask[0] != nullptr && tempTask[1] != nullptr) {
+ m_pActiveRobotTask = tempTask[0];
+ delete tempTask[1];
+ }
+ if (m_pActiveRobotTask != nullptr) {
+ m_pActiveRobotTask->pick();
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ if (m_listener.onRobotTaskEvent != nullptr) {
+ m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, ROBOT_EVENT_CREATE);
+ }
+ LOGI("创建新任务<%s>...", strDescription.c_str());
+ continue;
+ }
+ if (tempTask[0] != nullptr) delete tempTask[0];
+ if (tempTask[1] != nullptr) delete tempTask[1];
+ tempTask[0] = nullptr;
+ tempTask[1] = nullptr;
// Aligner -> Fliper(G2)
// Aligner -> VacuumBake(G1)
@@ -1012,6 +1067,16 @@
listener.onProcessStateChanged = [&](void* pEquipment, PROCESS_STATE state) -> void {
LOGI("<Master>onProcessStateChanged<%d>", (int)state);
};
+ listener.onMapMismatch = [&](void* pEquipment, short scanMap, short downMap) {
+ LOGE("<Master-%s>Port InUse, map(%d!=%d)不一致,请检查。",
+ ((CEquipment*)pEquipment)->getName().c_str(), scanMap, downMap);
+ };
+ listener.onPortInUse = [&](void* pEquipment, short scanMap) {
+ LOGE("<Master-%s>Port InUse。scanMap=%d", ((CEquipment*)pEquipment)->getName().c_str(), scanMap);
+ if (m_listener.onLoadPortInUse != nullptr) {
+ m_listener.onLoadPortInUse(this, (CEquipment*)pEquipment, scanMap);
+ }
+ };
pEquipment->setListener(listener);
pEquipment->setCcLink(&m_cclink);
m_listEquipment.push_back(pEquipment);
@@ -1049,6 +1114,7 @@
pEquipment->setID(EQ_ID_LOADPORT1 + index);
pEquipment->setName(szName);
pEquipment->setDescription(szName);
+ pEquipment->setCompareMapsBeforeProceeding(m_isCompareMapsBeforeProceeding);
addToEquipmentList(pEquipment);
@@ -1405,6 +1471,10 @@
MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/,
int armNo/* = 1*/)
{
+ if (!pSrcEq->IsEnabled()) {
+ return nullptr;
+ }
+
CRobotTask* pTask = nullptr;
CSlot* pSrcSlot, * pTarSlot;
pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
@@ -1429,6 +1499,10 @@
CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq)
{
+ if (!pSrcEq->IsEnabled()) {
+ return nullptr;
+ }
+
std::vector<int> slots = {1, 3};
CRobotTask* pTask = nullptr;
@@ -1450,6 +1524,10 @@
CRobotTask* CMaster::createTransferTask_bake_to_cooling(CEquipment* pSrcEq)
{
+ if (!pSrcEq->IsEnabled()) {
+ return nullptr;
+ }
+
std::vector<int> slotsTar = { 2, 4 };
std::vector<int> slotsSrc = { 1, 3 };
@@ -1472,6 +1550,10 @@
CRobotTask* CMaster::createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq)
{
+ if (!pSrcEq->IsEnabled()) {
+ return nullptr;
+ }
+
std::vector<int> slots = { 2, 4 };
CRobotTask* pTask = nullptr;
@@ -1493,6 +1575,10 @@
CRobotTask* CMaster::createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts)
{
+ if (!pEqSrc->IsEnabled()) {
+ return nullptr;
+ }
+
CRobotTask* pTask = nullptr;
CSlot* pSrcSlot, * pTarSlot = nullptr, * pTempSlot;
pSrcSlot = pEqSrc->getInspFailSlot();
@@ -1543,7 +1629,8 @@
unlock();
// 当前任务手动中止后,停止调度,需要操作员在解决问题后,重新启动
- stop();
+ // 25年7月23日后修改为不停止任务
+ // stop();
return 0;
}
@@ -1553,6 +1640,18 @@
lock();
if (m_pActiveRobotTask != nullptr) {
m_pActiveRobotTask->restore();
+ }
+ unlock();
+
+
+ return 0;
+ }
+
+ int CMaster::resendCurrentTask()
+ {
+ lock();
+ if (m_pActiveRobotTask != nullptr) {
+ m_pActiveRobotTask->resend();
}
unlock();
@@ -1573,4 +1672,17 @@
pPort->localSetTransferMode((SERVO::TransferMode)transferMode);
pPort->localAutoChangeEnable(autoChangeEnable);
}
+
+ void CMaster::setPortCassetteType(unsigned int index, SERVO::CassetteType type)
+ {
+ ASSERT(index < 4);
+ int eqid[] = { EQ_ID_LOADPORT1, EQ_ID_LOADPORT2, EQ_ID_LOADPORT3, EQ_ID_LOADPORT4 };
+ CLoadPort* pPort = (CLoadPort*)getEquipment(eqid[index]);
+ pPort->localSetCessetteType(type);
+ }
+
+ void CMaster::setCompareMapsBeforeProceeding(BOOL bCompare)
+ {
+ m_isCompareMapsBeforeProceeding = bCompare;
+ }
}
--
Gitblit v1.9.3