From d801f8999ad7cdbee7a5652b4bb512c47b9a2668 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期三, 04 六月 2025 18:05:01 +0800
Subject: [PATCH] 1.搬送条件检测,增加一个条件,必须是已加工处理完成的Glass才符合搬出条件。 2.根据1,为CGlass增加相应工位的处理标志位,及标志位在后processDataReport修改为TRUE,以符合搬出条件;
---
SourceCode/Bond/Servo/CPath.h | 3
SourceCode/Bond/Servo/CGlass.cpp | 30 +++++++
SourceCode/Bond/Servo/CEquipment.cpp | 61 +++++++++++++++
SourceCode/Bond/Servo/CGlass.h | 3
SourceCode/Bond/Servo/CPath.cpp | 14 +++
SourceCode/Bond/Servo/CRobotTask.cpp | 4
SourceCode/Bond/Servo/CMaster.cpp | 62 +++++++++++++--
SourceCode/Bond/Servo/CMaster.h | 2
SourceCode/Bond/Servo/CEquipment.h | 9 ++
SourceCode/Bond/Servo/CLoadPort.cpp | 2
SourceCode/Bond/Servo/CBakeCooling.cpp | 14 +++
11 files changed, 192 insertions(+), 12 deletions(-)
diff --git a/SourceCode/Bond/Servo/CBakeCooling.cpp b/SourceCode/Bond/Servo/CBakeCooling.cpp
index 4850fb6..cf4caf4 100644
--- a/SourceCode/Bond/Servo/CBakeCooling.cpp
+++ b/SourceCode/Bond/Servo/CBakeCooling.cpp
@@ -44,7 +44,19 @@
m_slot[0].enable();
m_slot[0].setPosition(m_nID);
m_slot[0].setNo(1);
- m_slot[0].setName("Slot 1");
+ m_slot[0].setName("Bake 1");
+ m_slot[1].enable();
+ m_slot[1].setPosition(m_nID);
+ m_slot[1].setNo(2);
+ m_slot[1].setName("Bake 2");
+ m_slot[2].enable();
+ m_slot[2].setPosition(m_nID);
+ m_slot[2].setNo(3);
+ m_slot[2].setName("Cooling 1");
+ m_slot[3].enable();
+ m_slot[3].setPosition(m_nID);
+ m_slot[3].setNo(4);
+ m_slot[3].setName("Cooling 2");
}
void CBakeCooling::onTimer(UINT nTimerid)
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index 098a942..0a7d384 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -722,6 +722,7 @@
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
if (pGlass != nullptr && compareJobDataB(pJobDataB, pGlass->getJobDataB())) {
pContext = pGlass;
+ if (pGlass != nullptr) pGlass->addRef();
m_slot[i].setContext(nullptr);
break;
}
@@ -737,7 +738,6 @@
for (int i = 0; i < SLOT_MAX; i++) {
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
if (pGlass != nullptr && compareJobDataB(pBuddy->getJobDataB(), pGlass->getJobDataB())) {
- pContext->release();
m_slot[i].setContext(nullptr);
break;
}
@@ -804,6 +804,20 @@
}
return FALSE;
+ }
+
+ CGlass* CEquipment::getGlass(const char* pszGlassId)
+ {
+ for (int i = 0; i < SLOT_MAX; i++) {
+ if (!m_slot[i].isEnable()) continue;
+ CGlass* pGlass = (CGlass*)m_slot[i].getContext();
+ if (pGlass == nullptr) continue;
+ if (pGlass->getID().compare(pszGlassId) == 0) {
+ return pGlass;
+ }
+ }
+
+ return nullptr;
}
bool CEquipment::isAlarmStep(SERVO::CStep* pStep)
@@ -1051,6 +1065,27 @@
return nullptr;
}
+ CSlot* CEquipment::getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates)
+ {
+ for (auto item : candidates) {
+ for (int i = 0; i < SLOT_MAX; i++) {
+ if (item == i + 1) {
+ if (!m_slot[i].isEnable()) continue;
+ if (m_slot[i].isLock()) continue;
+ if (!m_slot[i].isEmpty()) continue;
+
+ MaterialsType slotType = m_slot[i].getType();
+ if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue;
+ if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue;
+
+ return &m_slot[i];
+ }
+ }
+ }
+
+ return nullptr;
+ }
+
CSlot* CEquipment::getNonEmptySlot(MaterialsType putSlotType)
{
for (int i = 0; i < SLOT_MAX; i++) {
@@ -1062,6 +1097,25 @@
MaterialsType glassType = pGlass->getType();
if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
+
+ return &m_slot[i];
+ }
+
+ return nullptr;
+ }
+
+ CSlot* CEquipment::getProcessedSlot(MaterialsType putSlotType)
+ {
+ for (int i = 0; i < SLOT_MAX; i++) {
+ if (!m_slot[i].isEnable()) continue;
+ if (m_slot[i].isLock()) continue;
+ CGlass* pGlass = (CGlass*)m_slot[i].getContext();
+ if (pGlass == nullptr) continue;
+
+ MaterialsType glassType = pGlass->getType();
+ if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
+ if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
+ if (!pGlass->isProcessed(m_nID)) continue;
return &m_slot[i];
}
@@ -1384,6 +1438,11 @@
int CEquipment::onProcessData(CProcessData* pProcessData)
{
LOGI("<CEquipment-%s>onProcessData.", m_strName.c_str());
+ CGlass* pGlass = getGlass(pProcessData->getGlassId().c_str());
+ if (pGlass != nullptr) {
+ pGlass->processEnd(m_nID);
+ }
+
return 0;
}
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index df7e015..95e5555 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -151,8 +151,14 @@
// 获取一个指定物料类型(G1,G2,G1&G2)的空槽位
CSlot* getAvailableSlotForGlass(MaterialsType type);
+ // 在指定的槽列表中,获取一个指定物料类型(G1,G2,G1&G2)的空槽位
+ CSlot* getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates);
+
// 获取一个指定物料类型(G1,G2,G1&G2)的非空槽位
CSlot* getNonEmptySlot(MaterialsType type);
+
+ // 获取一个指定物料类型(G1,G2,G1&G2)的且已经加工处理的槽位
+ CSlot* getProcessedSlot(MaterialsType putSlotType);
// 获取玻璃物料
CGlass* getGlassFromSlot(int slotNo);
@@ -164,6 +170,9 @@
// 是否有玻璃
BOOL hasGlass();
+ // 获取指定ID的glass
+ CGlass * getGlass(const char* pszGlassId);
+
// 指定槽位是否可以放置玻璃
BOOL canPlaceGlassInSlot(const short slotIndex);
diff --git a/SourceCode/Bond/Servo/CGlass.cpp b/SourceCode/Bond/Servo/CGlass.cpp
index 77e292f..029f39f 100644
--- a/SourceCode/Bond/Servo/CGlass.cpp
+++ b/SourceCode/Bond/Servo/CGlass.cpp
@@ -84,6 +84,20 @@
return m_pPath;
}
+ CPath* CGlass::getPathWithSiteId(unsigned int nSiteId)
+ {
+ CPath* pTemp = m_pPath;
+ while (pTemp != nullptr) {
+ if (pTemp->getSiteID() == nSiteId) {
+ return pTemp;
+ }
+
+ pTemp = pTemp->getNext();
+ }
+
+ return nullptr;
+ }
+
void CGlass::addPath(unsigned int nSiteId)
{
CPath* pPath = new CPath(nSiteId);
@@ -182,4 +196,20 @@
{
return m_strBuddyId;
}
+
+ void CGlass::processEnd(unsigned int nSiteId)
+ {
+ CPath* pPath = getPathWithSiteID(nSiteId);
+ if (pPath != nullptr) {
+ pPath->processEnd();
+ }
+ }
+
+ BOOL CGlass::isProcessed(unsigned int nSiteId)
+ {
+ CPath* pPath = getPathWithSiteID(nSiteId);
+ if (pPath == nullptr) return FALSE;
+
+ return pPath->isProcessEnd();
+ }
}
diff --git a/SourceCode/Bond/Servo/CGlass.h b/SourceCode/Bond/Servo/CGlass.h
index be44aaa..1235c8e 100644
--- a/SourceCode/Bond/Servo/CGlass.h
+++ b/SourceCode/Bond/Servo/CGlass.h
@@ -26,6 +26,7 @@
std::string& getID();
CPath* getPathWithSiteID(unsigned int nSiteId);
CPath* getPath();
+ CPath* getPathWithSiteId(unsigned int nSiteId);
void addPath(unsigned int nSiteId);
void serialize(CArchive& ar);
void setJobDataB(CJobDataB* pJobDataB);
@@ -35,6 +36,8 @@
BOOL setBuddy(CGlass* pGlass);
CGlass* getBuddy();
std::string& getBuddyId();
+ void processEnd(unsigned int nSiteId);
+ BOOL isProcessed(unsigned int nSiteId);
private:
MaterialsType m_type;
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index 6e689a9..5217337 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1097,6 +1097,8 @@
}
CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
+ pGlass->addPath(m_nID);
+ pGlass->processEnd(m_nID);
pGlass->setID(szBuffer);
pGlass->setJobDataB(&jb);
pGlass->setType(type);
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index 2783329..4bee7eb 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -294,6 +294,7 @@
CAligner* pAligner = (CAligner*)getEquipment(EQ_ID_ALIGNER);
CBonder* pBonder1 = (CBonder*)getEquipment(EQ_ID_Bonder1);
CBonder* pBonder2 = (CBonder*)getEquipment(EQ_ID_Bonder2);
+ CBakeCooling* pBakeCooling = (CBakeCooling*)getEquipment(EQ_ID_BAKE_COOLING);
ASSERT(pLoadPort1);
ASSERT(pLoadPort2);
@@ -302,6 +303,7 @@
ASSERT(pAligner);
ASSERT(pBonder1);
ASSERT(pBonder2);
+ ASSERT(pBakeCooling);
while (1) {
// 待退出信号或时间到
@@ -365,6 +367,28 @@
}
+ // Bonder -> BakeCooling
+ m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder1, pBakeCooling, primaryType, secondaryType);
+ if (m_pActiveRobotTask != nullptr) {
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ if (m_listener.onRobotTaskEvent != nullptr) {
+ m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+ }
+ LOGI("创建新任务<%s>...", strDescription.c_str());
+ continue;
+ }
+
+ m_pActiveRobotTask = createTransferTask_bonder_to_bakecooling(pBonder2, pBakeCooling, primaryType, secondaryType);
+ if (m_pActiveRobotTask != nullptr) {
+ std::string strDescription = m_pActiveRobotTask->getDescription();
+ unlock();
+ if (m_listener.onRobotTaskEvent != nullptr) {
+ m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
+ }
+ LOGI("创建新任务<%s>...", strDescription.c_str());
+ continue;
+ }
// Aligner -> Bonder
m_pActiveRobotTask = createTransferTask(pAligner, pBonder1, primaryType, secondaryType);
@@ -469,9 +493,6 @@
LOGI("创建新任务<%s>...", strDescription.c_str());
continue;
}
-
-
- // Bonder -> BakeCooling
// BakeCooling ->Measurement
@@ -647,12 +668,11 @@
lock();
- delete m_pActiveRobotTask;
- m_pActiveRobotTask = nullptr;
-
if (m_listener.onRobotTaskEvent != nullptr) {
m_listener.onRobotTaskEvent(this, m_pActiveRobotTask, 0);
}
+ delete m_pActiveRobotTask;
+ m_pActiveRobotTask = nullptr;
}
unlock();
}
@@ -1074,10 +1094,36 @@
CRobotTask* pTask = nullptr;
CSlot* pSrcSlot, * pTarSlot;
pTarSlot = pTarEq->getAvailableSlotForGlass(primaryType);
- pSrcSlot = pSrcEq->getNonEmptySlot(primaryType);
+ pSrcSlot = pSrcEq->getProcessedSlot(primaryType);
if (pSrcSlot == nullptr || nullptr == pTarSlot) {
pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
- pSrcSlot = pSrcEq->getNonEmptySlot(secondaryType);
+ pSrcSlot = pSrcEq->getProcessedSlot(secondaryType);
+ }
+
+
+ if (pSrcSlot != nullptr && nullptr != pTarSlot) {
+ pTask = new CRobotTask();
+ pTask->setContext(pSrcSlot->getContext());
+ pTask->setRobotTransferParam(++taskSeqNo, 1, pSrcSlot->getPosition(),
+ pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
+ }
+
+
+ return pTask;
+ }
+
+ CRobotTask* CMaster::createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq,
+ MaterialsType primaryType/* = MaterialsType::G1*/, MaterialsType secondaryType/* = MaterialsType::G2*/)
+ {
+ std::vector<int> slots = {1, 2};
+
+ CRobotTask* pTask = nullptr;
+ CSlot* pSrcSlot, * pTarSlot;
+ pTarSlot = pTarEq->getAvailableSlotForGlass2(primaryType, slots);
+ pSrcSlot = pSrcEq->getProcessedSlot(primaryType);
+ if (pSrcSlot == nullptr || nullptr == pTarSlot) {
+ pTarSlot = pTarEq->getAvailableSlotForGlass(secondaryType);
+ pSrcSlot = pSrcEq->getProcessedSlot(secondaryType);
}
diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index 621a773..7eeffad 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -86,6 +86,8 @@
void setState(MASTERSTATE state);
CRobotTask* createTransferTask(CEquipment* pSrcEq, CEquipment* pTarEq,
MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2);
+ CRobotTask* createTransferTask_bonder_to_bakecooling(CEquipment* pSrcEq, CEquipment* pTarEq,
+ MaterialsType primaryType = MaterialsType::G1, MaterialsType secondaryType = MaterialsType::G2);
private:
CRITICAL_SECTION m_criticalSection;
diff --git a/SourceCode/Bond/Servo/CPath.cpp b/SourceCode/Bond/Servo/CPath.cpp
index 30c004c..1633b5a 100644
--- a/SourceCode/Bond/Servo/CPath.cpp
+++ b/SourceCode/Bond/Servo/CPath.cpp
@@ -9,6 +9,7 @@
m_nSiteID = 0;
m_timeOut = 0;
m_timeIn = CToolUnits::getTimestamp();
+ m_bProcessed = FALSE;
m_pPrev = nullptr;
m_pNext = nullptr;
}
@@ -20,6 +21,7 @@
m_timeIn = CToolUnits::getTimestamp();
m_pPrev = nullptr;
m_pNext = nullptr;
+ m_bProcessed = FALSE;
}
CPath::~CPath()
@@ -45,6 +47,7 @@
ar << m_nSiteID;
ar << m_timeIn;
ar << m_timeOut;
+ ar << m_bProcessed;
ar << (ULONGLONG)m_pNext;
if (m_pNext != nullptr) {
m_pNext->serialize(ar);
@@ -54,6 +57,7 @@
ar >> m_nSiteID;
ar >> m_timeIn;
ar >> m_timeOut;
+ ar >> m_bProcessed;
ULONGLONG ulNext;
ar >> ulNext;
if ((CPath*)ulNext != nullptr) {
@@ -85,6 +89,16 @@
return m_timeOut;
}
+ void CPath::processEnd()
+ {
+ m_bProcessed = TRUE;
+ }
+
+ BOOL CPath::isProcessEnd()
+ {
+ return m_bProcessed;
+ }
+
CPath* CPath::getPrev()
{
return m_pPrev;
diff --git a/SourceCode/Bond/Servo/CPath.h b/SourceCode/Bond/Servo/CPath.h
index f61c4c3..af53f62 100644
--- a/SourceCode/Bond/Servo/CPath.h
+++ b/SourceCode/Bond/Servo/CPath.h
@@ -21,11 +21,14 @@
ULONGLONG getInTime();
void setOutTime(ULONGLONG time);
ULONGLONG getOutTime();
+ void processEnd();
+ BOOL isProcessEnd();
private:
unsigned int m_nSiteID;
ULONGLONG m_timeIn;
ULONGLONG m_timeOut;
+ BOOL m_bProcessed;
CPath* m_pPrev;
CPath* m_pNext;
};
diff --git a/SourceCode/Bond/Servo/CRobotTask.cpp b/SourceCode/Bond/Servo/CRobotTask.cpp
index 6a223de..4b2a970 100644
--- a/SourceCode/Bond/Servo/CRobotTask.cpp
+++ b/SourceCode/Bond/Servo/CRobotTask.cpp
@@ -63,8 +63,8 @@
void CRobotTask::setContext(CContext* pContext)
{
- if (pContext != nullptr) {
- pContext->release();
+ if (m_pContext != nullptr) {
+ m_pContext->release();
}
m_pContext = pContext;
--
Gitblit v1.9.3