From e9c66dce803984d9eb0c026df8f50ad196fd0650 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期二, 22 七月 2025 16:20:25 +0800
Subject: [PATCH] 1.将原来的设置CassetteType更新到EFEM的功能,修改为本地保存,因为EFEM不需要这些数据; 2.配置是否需要比较map的一致性; 3.收到EFEM的PortStarus,INUSE状态时,弹出配置对话框;打勾选择要加工的产品;
---
SourceCode/Bond/Servo/CLoadPort.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 90 insertions(+), 18 deletions(-)
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index b5d4af4..5de17db 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -16,6 +16,7 @@
m_bEnable = FALSE;
m_bAutoChangeEnable = FALSE;
m_nNextCassetteSequenceNo = 0;
+ m_isCompareMapsBeforeProceeding = FALSE;
}
CLoadPort::~CLoadPort()
@@ -134,7 +135,7 @@
CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
[&](void* pFrom, int code, const char* pszData, size_t size) -> int {
if (code == ROK && pszData != nullptr && size > 0) {
- m_cassetteType = (CassetteType)CToolUnits::toInt16(pszData);
+ //m_cassetteType = (CassetteType)CToolUnits::toInt16(pszData);
}
return 0;
});
@@ -347,6 +348,21 @@
void CLoadPort::onTimer(UINT nTimerid)
{
CEquipment::onTimer(nTimerid);
+
+ // 模拟测试
+ if (m_nIndex == 0) {
+ static int ii = 0;
+ ii++;
+ if (ii == 50) {
+ char szBuffer[64];
+ CStep* pStep = getStepWithName(STEP_EQ_PORT1_INUSE);
+ CPortStatusReport portStatusReport;
+ portStatusReport.setPortStatus(PORT_INUSE);
+ portStatusReport.setJobExistenceSlot(0xf);
+ int nRet = portStatusReport.serialize(szBuffer, 64);
+ decodePortStatusReport(pStep, szBuffer, 64);
+ }
+ }
}
void CLoadPort::serialize(CArchive& ar)
@@ -887,17 +903,27 @@
// 当port状态为InUse, 比较map
if (m_portStatusReport.getPortStatus() == PORT_INUSE) {
- short scanMap = m_portStatusReport.getJobExistenceSlot();
- short downMap = getCassetteMap();
- if (scanMap == downMap) {
- this->sendCassetteCtrlCmd(CCC_PROCESS_START, nullptr, 0, 0, 0, nullptr, nullptr);
+ if (m_isCompareMapsBeforeProceeding) {
+ short scanMap = getScanCassetteMap();
+ short downloadMap = getDownloadCassetteMap();
+ if (scanMap == downloadMap) {
+ generateGlassList(scanMap);
+ this->sendCassetteCtrlCmd(CCC_PROCESS_START, nullptr, 0, 0, 0, nullptr, nullptr);
+ }
+ else {
+ this->sendCassetteCtrlCmd(CCC_PROCESS_CANCEL, nullptr, 0, 0, 0, nullptr, nullptr);
+
+ // 抛出到应用层做提示
+ if (m_listener.onMapMismatch != nullptr) {
+ m_listener.onMapMismatch(this, scanMap, downloadMap);
+ }
+ }
}
else {
- this->sendCassetteCtrlCmd(CCC_PROCESS_CANCEL, nullptr, 0, 0, 0, nullptr, nullptr);
-
- // 抛出到应用层做提示
- if (m_listener.onMapMismatch != nullptr) {
- m_listener.onMapMismatch(this, scanMap, downMap);
+ // 抛出到应用层做选择要加工的片子
+ generateGlassList(getScanCassetteMap());
+ if (m_listener.onPortInUse != nullptr) {
+ m_listener.onPortInUse(this, getScanCassetteMap());
}
}
}
@@ -1011,6 +1037,7 @@
int CLoadPort::setCassetteType(CassetteType type, ONWRITED onWritedBlock/* = nullptr*/)
{
+ m_cassetteType = type;
static char* pszName[] = { STEP_PORT1_CASSETTE_TYPE_CHANGE, STEP_PORT2_CASSETTE_TYPE_CHANGE, STEP_PORT3_CASSETTE_TYPE_CHANGE, STEP_PORT4_CASSETTE_TYPE_CHANGE };
SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(pszName[m_nIndex]);
if (pStep == nullptr) {
@@ -1023,7 +1050,6 @@
// test
code = WOK;
if (code == WOK) {
- m_cassetteType = type;
LOGI("<CLoadPort-%d>设置Cassette Type成功.", m_nIndex);
}
else {
@@ -1126,15 +1152,15 @@
m_bAutoChangeEnable = bEnable;
}
- short CLoadPort::getCassetteMap()
+ short CLoadPort::getScanCassetteMap()
{
- short map = 0;
- for (int i = 0; i < SLOT_MAX; i++) {
- if (!m_slot[i].isEnable()) continue;
- if (m_slot[i].getContext() == nullptr) continue;
- map |= (1 << i);
- }
+ return m_portStatusReport.getJobExistenceSlot();
+ }
+ short CLoadPort::getDownloadCassetteMap()
+ {
+ // 暂时未实现此功能
+ short map = 0;
return map;
}
@@ -1176,6 +1202,47 @@
return 0;
}
+ /*
+ * 根据efem扫描到的map,生成玻璃列表
+ */
+ int CLoadPort::generateGlassList(short map)
+ {
+ // 先释放较早前的数据
+ Lock();
+ for (int i = 0; i < SLOT_MAX; i++) {
+ m_slot[i].setContext(nullptr);
+ }
+ Unlock();
+
+
+ // 根据map生成新的
+ char szBuffer[64];
+ for (int i = 0; i < SLOT_MAX; i++) {
+ if (!m_slot[i].isEnable()) continue;
+ if (!(map >> i) & 1) continue;
+
+ CJobDataS js;
+ js.setCassetteSequenceNo(getNextCassetteSequenceNo());
+ js.setJobSequenceNo(m_slot[i].getNo());
+ sprintf_s(szBuffer, 64, "%05d%05d", js.getCassetteSequenceNo(), js.getJobSequenceNo());
+ js.setJobType(1);
+ js.setMaterialsType((int)m_cassetteType);
+
+ CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
+ pGlass->setOriginPort(m_nIndex, i);
+ pGlass->setScheduledForProcessing(i % 2 == 1);
+ pGlass->addPath(m_nID, 0);
+ pGlass->processEnd(m_nID, 0);
+ pGlass->setID(szBuffer);
+ pGlass->setType(m_cassetteType);
+ pGlass->setJobDataS(&js);
+ m_slot[i].setContext(pGlass);
+ }
+
+ return 0;
+ }
+
+
int CLoadPort::testGenerateGlassListFromConfig(const SERVO::PortConfig& config)
{
char szBuffer[64];
@@ -1215,4 +1282,9 @@
return 0;
}
+
+ void CLoadPort::setCompareMapsBeforeProceeding(BOOL bCompare)
+ {
+ m_isCompareMapsBeforeProceeding = bCompare;
+ }
}
--
Gitblit v1.9.3