From 867888458abdc029cbf31b6058edfefe30a20722 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期四, 12 二月 2026 16:38:24 +0800
Subject: [PATCH] 1.修复重启后,由于PJ不是列队中,导致无法创建调度任务的问题。 2.修复CPjPage2点Port2的物料类型,Port1也跟着变的问题。
---
SourceCode/Bond/Servo/CMaster.cpp | 130 ++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 126 insertions(+), 4 deletions(-)
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index c7703e4..cbdcc22 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -997,9 +997,19 @@
}
m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType, 1, m_bJobMode);
if (m_pActiveRobotTask != nullptr) {
- LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING): port=%d, primaryType=%d, preferredPort=%d",
- s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0);
CGlass* pGlass = (CGlass*)m_pActiveRobotTask->getContext();
+ CProcessJob* pPJ = (pGlass != nullptr) ? pGlass->getProcessJob() : nullptr;
+ LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING): port=%d, primaryType=%d, preferredPort=%d, glass=%s, scheduled=%d, pj=%s",
+ s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0,
+ pGlass != nullptr ? pGlass->getID().c_str() : "",
+ (pGlass != nullptr && pGlass->isScheduledForProcessing()) ? 1 : 0,
+ pPJ != nullptr ? pPJ->id().c_str() : "NULL");
+ if (pGlass == nullptr) {
+ LOGE("<Master>LoadPort->Aligner鍛戒腑(RUNNING)浣哻ontext涓虹┖锛屼换鍔″凡涓㈠純.");
+ delete m_pActiveRobotTask;
+ m_pActiveRobotTask = nullptr;
+ continue;
+ }
if (pGlass->getBuddy() != nullptr) {
delete m_pActiveRobotTask;
m_pActiveRobotTask = nullptr;
@@ -1352,9 +1362,19 @@
m_pActiveRobotTask = createTransferTask(pLoadPorts[s], pAligner, primaryType, secondaryType, 1, m_bJobMode);
if (m_pActiveRobotTask != nullptr) {
- LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING_BATCH): port=%d, primaryType=%d, preferredPort=%d",
- s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0);
auto* pGlass = static_cast<CGlass*>(m_pActiveRobotTask->getContext());
+ CProcessJob* pPJ = (pGlass != nullptr) ? pGlass->getProcessJob() : nullptr;
+ LOGI("<Master>LoadPort->Aligner鍛戒腑(RUNNING_BATCH): port=%d, primaryType=%d, preferredPort=%d, glass=%s, scheduled=%d, pj=%s",
+ s + 1, (int)primaryType, preferredPortForPrimary >= 0 ? (preferredPortForPrimary + 1) : 0,
+ pGlass != nullptr ? pGlass->getID().c_str() : "",
+ (pGlass != nullptr && pGlass->isScheduledForProcessing()) ? 1 : 0,
+ pPJ != nullptr ? pPJ->id().c_str() : "NULL");
+ if (pGlass == nullptr) {
+ LOGE("<Master>LoadPort->Aligner鍛戒腑(RUNNING_BATCH)浣哻ontext涓虹┖锛屼换鍔″凡涓㈠純.");
+ delete m_pActiveRobotTask;
+ m_pActiveRobotTask = nullptr;
+ continue;
+ }
if (pGlass->getBuddy() != nullptr) {
delete m_pActiveRobotTask; m_pActiveRobotTask = nullptr;
continue;
@@ -3361,12 +3381,51 @@
}
}
+ // 鍏堟竻绌烘墍鏈夌鍙g幓鐠冪殑璋冨害鏍囪锛岄伩鍏嶆部鐢ㄥ巻鍙� PJ 鐘舵�併��
+ int clearedGlassCount = 0;
+ for (int i = 0; i < 4; i++) {
+ auto* pPort = (CLoadPort*)getEquipment(EQ_ID_LOADPORT1 + i);
+ if (pPort == nullptr) continue;
+ for (int slot = 1; slot <= SLOT_MAX; slot++) {
+ auto* pGlass = pPort->getGlassFromSlot(slot);
+ if (pGlass == nullptr) continue;
+ pGlass->setProcessJob(nullptr);
+ pGlass->setScheduledForProcessing(FALSE);
+ clearedGlassCount++;
+ }
+ }
+ LOGI("<Master>setProcessJobs: cleared scheduling marks on %d glass(es).", clearedGlassCount);
+
+ auto toPortIndex = [](int eqid) -> int {
+ switch (eqid) {
+ case EQ_ID_LOADPORT1: return 0;
+ case EQ_ID_LOADPORT2: return 1;
+ case EQ_ID_LOADPORT3: return 2;
+ case EQ_ID_LOADPORT4: return 3;
+ default: return -1;
+ }
+ };
+
+ auto hasAnySelectedPorts = [](const PJWarp& warp) -> bool {
+ for (int p = 0; p < 4; p++) {
+ if (warp.selectedPorts[p]) return true;
+ }
+ return false;
+ };
+
+ auto hasAnyLegacyCheckedSlots = [](const PJWarp& warp) -> bool {
+ for (int s = 0; s < 8; s++) {
+ if (warp.checkSlot[s]) return true;
+ }
+ return false;
+ };
// 鏇存柊context
for (auto pj : m_processJobs) {
for (auto& c : pj->carriers()) {
auto pPort = getPortWithCarrierId(c.carrierId);
if (pPort == nullptr) continue;
+ const int portIndex = toPortIndex(pPort->getID());
short downloadMap = 0;
for (auto s : c.slots) {
@@ -3378,12 +3437,37 @@
std::vector<uint8_t> newSlots;
std::vector<void*> newContexts;
+ PJWarp& warp = pj->getPjWarp();
+ const bool useMultiPortWarp = hasAnySelectedPorts(warp);
+ const bool useLegacyWarp = !useMultiPortWarp && hasAnyLegacyCheckedSlots(warp);
for (auto s : c.slots) {
auto pGlass = pPort->getGlassFromSlot(s);
if (pGlass == nullptr) continue;
newSlots.push_back(s);
newContexts.push_back(pGlass);
+
+ // 榛樿锛欻ost 涓嬪彂浣嗘湭鎼哄甫 PJWarp 缁嗚妭鏃讹紝carrier slots 瑙嗕负搴斿姞宸ャ��
+ BOOL scheduled = TRUE;
+ int material = (pGlass->getType() == MaterialsType::G2) ? 2 : 1;
+
+ if (1 <= s && s <= 8) {
+ if (useMultiPortWarp && 0 <= portIndex && portIndex < 4 && warp.selectedPorts[portIndex]) {
+ scheduled = warp.checkSlots[portIndex][s - 1];
+ material = warp.materialSlots[portIndex][s - 1];
+ }
+ else if (useLegacyWarp) {
+ scheduled = warp.checkSlot[s - 1];
+ material = warp.material[s - 1];
+ }
+ }
+ material = (material == 2) ? 2 : 1;
+
+ pGlass->setProcessJob(pj);
+ pGlass->setScheduledForProcessing(scheduled);
+ pGlass->setType(static_cast<MaterialsType>(material));
+ LOGI("<Master>setProcessJobs bind: pj=%s, port=%d, slot=%d, glass=%s, scheduled=%d, material=%d",
+ pj->id().c_str(), portIndex + 1, (int)s, pGlass->getID().c_str(), scheduled ? 1 : 0, material);
}
pj->setCarrierSlotsAndContexts(c.carrierId, newSlots, newContexts);
@@ -3685,6 +3769,33 @@
}
m_pControlJob->setPJs(tempPjs);
+ // 閲嶅缓杩愯鎬佺紦瀛橈紝閬垮厤閲嶅惎鍚庝粎渚濊禆 Queued 閫夋嫨瀵艰嚧鎵句笉鍒板綋鍓� PJ銆�
+ m_inProcesJobs.clear();
+ m_completeProcessJobs.clear();
+ m_queueGlasses.clear();
+ m_inProcesGlasses.clear();
+ m_completeGlasses.clear();
+ for (auto pj : tempPjs) {
+ if (pj == nullptr) continue;
+ switch (pj->state()) {
+ case PJState::InProcess:
+ case PJState::Paused:
+ m_inProcesJobs.push_back(pj);
+ break;
+ case PJState::Completed:
+ case PJState::Aborted:
+ case PJState::Failed:
+ m_completeProcessJobs.push_back(pj);
+ break;
+ default:
+ break;
+ }
+ }
+ LOGI("<Master>loadState: ProcessJob rebuild done. total=%d, inProcess=%d, complete=%d",
+ (int)tempPjs.size(),
+ (int)m_inProcesJobs.size(),
+ (int)m_completeProcessJobs.size());
+
// 鏇存柊contexts
auto pjs = m_pControlJob->getPjs();
@@ -3717,14 +3828,25 @@
CProcessJob* CMaster::acquireNextProcessJob()
{
+ if (m_pControlJob == nullptr) return nullptr;
auto& pjs = m_pControlJob->getPjs();
for (const auto pj : pjs) {
if (pj->state() == PJState::Queued) {
+ LOGI("<Master>acquireNextProcessJob: start queued PJ(%s)", pj->id().c_str());
pj->start();
return pj;
}
}
+ // 鑻ユ病鏈� Queued锛岀户缁鐢ㄥ凡缁忓湪鍒�/鏆傚仠鐨� PJ锛堜緥濡� loadState 鎭㈠鍚庣殑鍦烘櫙锛夈��
+ for (const auto pj : pjs) {
+ if (pj->state() == PJState::InProcess || pj->state() == PJState::Paused) {
+ LOGI("<Master>acquireNextProcessJob: reuse PJ(%s), state=%d",
+ pj->id().c_str(), (int)pj->state());
+ return pj;
+ }
+ }
+
return nullptr;
}
--
Gitblit v1.9.3