From cb9456e93002220b7247fadac088c7bddf6908d3 Mon Sep 17 00:00:00 2001
From: chenluhua1980 <Chenluhua@qq.com>
Date: 星期日, 01 二月 2026 21:03:23 +0800
Subject: [PATCH] 1.LoadPort1装G1,LoadPort2装G2, LoadPort3装G1, LoadPort4装G4, 加工完成回到G1的原位。按此增加生产模式的调度和连接图;
---
SourceCode/Bond/Servo/Configuration.h | 1
SourceCode/Bond/x64/Debug/EqsGraph.ini | 58 +++++-----
SourceCode/Bond/Servo/CAligner.cpp | 2
SourceCode/Bond/Servo/CMaster.cpp | 165 ++++++++++++++++++++++++++++-----
SourceCode/Bond/Servo/Configuration.cpp | 6 +
SourceCode/Bond/Servo/CMaster.h | 10 ++
SourceCode/Bond/Servo/Model.cpp | 4
7 files changed, 192 insertions(+), 54 deletions(-)
diff --git a/SourceCode/Bond/Servo/CAligner.cpp b/SourceCode/Bond/Servo/CAligner.cpp
index e15bfe0..ebbfd1a 100644
--- a/SourceCode/Bond/Servo/CAligner.cpp
+++ b/SourceCode/Bond/Servo/CAligner.cpp
@@ -35,6 +35,8 @@
LOGD("<CAligner>initPins");
addPin(SERVO::PinType::INPUT, _T("In1"));
addPin(SERVO::PinType::INPUT, _T("In2"));
+ addPin(SERVO::PinType::INPUT, _T("In3"));
+ addPin(SERVO::PinType::INPUT, _T("In4"));
addPin(SERVO::PinType::OUTPUT, _T("Out1"));
addPin(SERVO::PinType::OUTPUT, _T("Out2"));
}
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index d9fb326..707f808 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -63,6 +63,7 @@
m_ullRunTime = 0;
m_state = MASTERSTATE::READY;
m_curveMode = CurveMode::Production;
+ m_schedulingMode = SchedulingMode::Production;
m_pActiveRobotTask = nullptr;
m_nLastError = ER_CODE_NOERROR;
m_isCompareMapsBeforeProceeding = FALSE;
@@ -310,6 +311,17 @@
CurveMode CMaster::getCurveMode() const
{
return m_curveMode;
+ }
+
+ void CMaster::setSchedulingMode(SchedulingMode mode)
+ {
+ m_schedulingMode = mode;
+ LOGI("<Master>SchedulingMode=%s", mode == SchedulingMode::Production ? "Production" : "Tuning");
+ }
+
+ SchedulingMode CMaster::getSchedulingMode() const
+ {
+ return m_schedulingMode;
}
int CMaster::term()
@@ -746,14 +758,22 @@
// Measurement -> LoadPort
- for (int s = 0; s < 4; s++) {
- PortType pt = pLoadPorts[s]->getPortType();
- if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
- && (pt == PortType::Unloading || pt == PortType::Both)
- && pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
- m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
- if (m_pActiveRobotTask != nullptr) {
- goto PORT_PUT;
+ if (m_schedulingMode == SchedulingMode::Production) {
+ if (!rmd.armState[0]) {
+ m_pActiveRobotTask = createTransferTask_returnOrigin(pMeasurement, pLoadPorts);
+ CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
+ }
+ }
+ else {
+ for (int s = 0; s < 4; s++) {
+ PortType pt = pLoadPorts[s]->getPortType();
+ if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
+ && (pt == PortType::Unloading || pt == PortType::Both)
+ && pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
+ m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
+ if (m_pActiveRobotTask != nullptr) {
+ goto PORT_PUT;
+ }
}
}
}
@@ -1008,19 +1028,27 @@
// 缁勬暟闂ㄩ檺锛氣墺2 缁勬椂涓嶅啀浠� LP 涓婄墖锛岄伩鍏嶅爢绉紙涓庡崟鐗囦竴鑷达級
bool blockLoadFromLP = (nGlassGroup >= 2);
- // 7) Measurement -> LoadPort锛堝浐瀹氾細G1 浼樺厛鍥� LP锛�
+ // 7) Measurement -> LoadPort
if (rmd.armState[0] || rmd.armState[1]) {
LOGD("Arm1 %s, Arm2 %s.",
rmd.armState[0] ? _T("涓嶅彲鐢�") : _T("鍙敤"),
rmd.armState[1] ? _T("涓嶅彲鐢�") : _T("鍙敤"));
}
- for (int s = 0; s < 4; s++) {
- PortType pt = pLoadPorts[s]->getPortType();
- if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
- && (pt == PortType::Unloading || pt == PortType::Both)
- && pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
- m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
- if (m_pActiveRobotTask != nullptr) { goto BATCH_PORT_PUT; }
+ if (m_schedulingMode == SchedulingMode::Production) {
+ if (!rmd.armState[0]) {
+ m_pActiveRobotTask = createTransferTask_returnOrigin(pMeasurement, pLoadPorts);
+ CHECK_RUN_ACTIVE_ROBOT_TASK(m_pActiveRobotTask);
+ }
+ }
+ else {
+ for (int s = 0; s < 4; s++) {
+ PortType pt = pLoadPorts[s]->getPortType();
+ if (!rmd.armState[0] && pLoadPorts[s]->isEnable()
+ && (pt == PortType::Unloading || pt == PortType::Both)
+ && pLoadPorts[s]->getPortStatus() == PORT_INUSE) {
+ m_pActiveRobotTask = createTransferTask(pMeasurement, pLoadPorts[s], MaterialsType::G1, secondaryType);
+ if (m_pActiveRobotTask != nullptr) { goto BATCH_PORT_PUT; }
+ }
}
}
@@ -2449,11 +2477,19 @@
nRet = pLoadPort1->getPin("Out")->connectPin(pAligner->getPin("In1"));
if (nRet < 0) {
- LOGE("杩炴帴LoadPort1-Fliper澶辫触");
+ LOGE("杩炴帴LoadPort1-Aligner澶辫触");
}
nRet = pLoadPort2->getPin("Out")->connectPin(pAligner->getPin("In2"));
if (nRet < 0) {
- LOGE("杩炴帴LoadPort1-Fliper澶辫触");
+ LOGE("杩炴帴LoadPort2-Aligner澶辫触");
+ }
+ nRet = pLoadPort3->getPin("Out")->connectPin(pAligner->getPin("In3"));
+ if (nRet < 0) {
+ LOGE("杩炴帴LoadPort3-Aligner澶辫触");
+ }
+ nRet = pLoadPort4->getPin("Out")->connectPin(pAligner->getPin("In4"));
+ if (nRet < 0) {
+ LOGE("杩炴帴LoadPort4-Aligner澶辫触");
}
nRet = pAligner->getPin("Out1")->connectPin(pFliper->getPin("In"));
@@ -2498,14 +2534,29 @@
LOGE("杩炴帴BakeCooling-LoadPort3澶辫触");
}
- nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort3->getPin("In"));
- if (nRet < 0) {
- LOGE("杩炴帴BakeCooling-LoadPort3澶辫触");
- }
+ if (m_schedulingMode == SchedulingMode::Production) {
+ // 鐢熶骇妯″紡锛氭祴閲忚緭鍑哄洖鍒� G1 鍘熶綅锛堥粯璁� Port1 / Port3锛�
+ nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort1->getPin("In"));
+ if (nRet < 0) {
+ LOGE("杩炴帴Measurement-LoadPort1澶辫触");
+ }
- nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort4->getPin("In"));
- if (nRet < 0) {
- LOGE("杩炴帴BakeCooling-LoadPort4澶辫触");
+ nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort3->getPin("In"));
+ if (nRet < 0) {
+ LOGE("杩炴帴Measurement-LoadPort3澶辫触");
+ }
+ }
+ else {
+ // 璋冩満妯″紡锛氱淮鎸佸師杩炴帴锛圤ut1->Port3, Out2->Port4锛�
+ nRet = pMeasurement->getPin("Out1")->connectPin(pLoadPort3->getPin("In"));
+ if (nRet < 0) {
+ LOGE("杩炴帴Measurement-LoadPort3澶辫触");
+ }
+
+ nRet = pMeasurement->getPin("Out2")->connectPin(pLoadPort4->getPin("In"));
+ if (nRet < 0) {
+ LOGE("杩炴帴Measurement-LoadPort4澶辫触");
+ }
}
}
@@ -2735,6 +2786,57 @@
return pTask;
}
+ CRobotTask* CMaster::createTransferTask_returnOrigin(CEquipment* pEqSrc, CLoadPort** pPorts)
+ {
+ if (!pEqSrc->IsEnabled()) {
+ return nullptr;
+ }
+
+ CSlot* pSrcSlot = pEqSrc->getProcessedSlot(MaterialsType::G1, m_bJobMode);
+ if (pSrcSlot == nullptr) {
+ return nullptr;
+ }
+
+ CGlass* pGlass = (CGlass*)pSrcSlot->getContext();
+ if (pGlass == nullptr) {
+ return nullptr;
+ }
+
+ int port = 0, slot = 0;
+ pGlass->getOrginPort(port, slot);
+ if (port < 0 || port >= 4 || slot < 0 || slot >= SLOT_MAX) {
+ return nullptr;
+ }
+
+ CLoadPort* pPort = pPorts[port];
+ if (pPort == nullptr || !pPort->isEnable()) {
+ return nullptr;
+ }
+ PortType pt = pPort->getPortType();
+ if (!(pt == PortType::Unloading || pt == PortType::Both)) {
+ return nullptr;
+ }
+ if (pPort->getPortStatus() != PORT_INUSE) {
+ return nullptr;
+ }
+
+ CSlot* pTarSlot = pPort->getSlot(slot);
+ if (pTarSlot == nullptr) {
+ return nullptr;
+ }
+ if (!pTarSlot->isEnable() || pTarSlot->isLock() || pTarSlot->getContext() != nullptr) {
+ return nullptr;
+ }
+
+ CRobotTask* pTask = new CRobotTask();
+ pTask->setContext(pSrcSlot->getContext());
+ pTask->setEFEM((CEFEM*)getEquipment(EQ_ID_EFEM));
+ taskSeqNo = pTask->setRobotTransferParam(taskSeqNo, 1, pSrcSlot->getPosition(),
+ pTarSlot->getPosition(), pSrcSlot->getNo(), pTarSlot->getNo());
+
+ return pTask;
+ }
+
CRobotTask* CMaster::createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot,
CEquipment* pTarEq, int nTarSlot, int armNo/* = 1*/)
{
@@ -2844,6 +2946,19 @@
pPort->localSetCessetteType(type);
}
+ void CMaster::applySchedulingModePortMapping()
+ {
+ // 鐢熶骇妯″紡锛氬浐瀹� Port1/Port3 涓� G1锛孭ort2/Port4 涓� G2锛圙4 鏈畾涔夛紝鎸� G2 澶勭悊锛�
+ if (m_schedulingMode != SchedulingMode::Production) {
+ return;
+ }
+
+ setPortCassetteType(0, SERVO::CassetteType::G1);
+ setPortCassetteType(1, SERVO::CassetteType::G2);
+ setPortCassetteType(2, SERVO::CassetteType::G1);
+ setPortCassetteType(3, SERVO::CassetteType::G2);
+ }
+
void CMaster::setPortEnable(unsigned int index, BOOL bEnable)
{
ASSERT(index < 4);
diff --git a/SourceCode/Bond/Servo/CMaster.h b/SourceCode/Bond/Servo/CMaster.h
index 20d4c3d..856dde3 100644
--- a/SourceCode/Bond/Servo/CMaster.h
+++ b/SourceCode/Bond/Servo/CMaster.h
@@ -59,6 +59,11 @@
EmptyChamber
};
+ enum class SchedulingMode {
+ Production = 0, // 鐢熶骇妯″紡锛堟寜瀹㈡埛鎸囧畾Port鏄犲皠锛�
+ Tuning = 1 // 璋冩満妯″紡锛堝師鏈夎皟搴﹂�昏緫锛�
+ };
+
typedef std::function<void(void* pMaster, MASTERSTATE state)> ONMASTERSTATECHANGED;
typedef std::function<void(void* pMaster, CEquipment* pEiuipment, BOOL bAlive)> ONEQALIVE;
typedef std::function<void(CStep* pStep, int code, void* pData)> ONEQSTEPEVENT;
@@ -124,6 +129,9 @@
MASTERSTATE getState();
void setCurveMode(CurveMode mode);
CurveMode getCurveMode() const;
+ void setSchedulingMode(SchedulingMode mode);
+ SchedulingMode getSchedulingMode() const;
+ void applySchedulingModePortMapping();
unsigned DispatchProc();
unsigned ReadBitsProc();
void onTimer(UINT nTimerid);
@@ -194,6 +202,7 @@
CRobotTask* createTransferTask_bake_to_cooling(CEquipment* pSrcEq);
CRobotTask* createTransferTask_bakecooling_to_measurement(CEquipment* pSrcEq, CEquipment* pTarEq);
CRobotTask* createTransferTask_restore(CEquipment* pEqSrc, CLoadPort** pPorts);
+ CRobotTask* createTransferTask_returnOrigin(CEquipment* pEqSrc, CLoadPort** pPorts);
CRobotTask* createTransferTask_continuous_transfer(CEquipment* pSrcEq, int nSrcSlot,
CEquipment* pTarEq, int nTarSlot, int armNo = 1);
@@ -278,6 +287,7 @@
// 鍦ㄥ紑濮嬪伐鑹哄墠鏄惁闇�瑕佸厛姣旇緝 map
BOOL m_isCompareMapsBeforeProceeding;
BOOL m_bJobMode;
+ SchedulingMode m_schedulingMode;
// 鍗冧紶鍦堟暟璁℃暟
int m_nContinuousTransferCount;
diff --git a/SourceCode/Bond/Servo/Configuration.cpp b/SourceCode/Bond/Servo/Configuration.cpp
index a2434b1..285cfa3 100644
--- a/SourceCode/Bond/Servo/Configuration.cpp
+++ b/SourceCode/Bond/Servo/Configuration.cpp
@@ -175,6 +175,12 @@
return GetPrivateProfileInt(_T("Master"), _T("JobMode"), 0, m_strFilepath);
}
+int CConfiguration::getSchedulingMode()
+{
+ // 0: Production, 1: Tuning (default to Production)
+ return GetPrivateProfileInt(_T("Master"), _T("SchedulingMode"), 0, m_strFilepath);
+}
+
void CConfiguration::setContinuousTransferCount(int round)
{
WritePrivateProfileString(_T("Master"), _T("CTRound"),
diff --git a/SourceCode/Bond/Servo/Configuration.h b/SourceCode/Bond/Servo/Configuration.h
index 9c6aaf7..323a227 100644
--- a/SourceCode/Bond/Servo/Configuration.h
+++ b/SourceCode/Bond/Servo/Configuration.h
@@ -29,6 +29,7 @@
BOOL setPortEnable(unsigned int index, BOOL bEnable);
BOOL isCompareMapsBeforeProceeding();
BOOL isJobMode();
+ int getSchedulingMode();
void setContinuousTransferCount(int round);
int getContinuousTransferCount();
int getPortCassetteSnSeed(int port);
diff --git a/SourceCode/Bond/Servo/Model.cpp b/SourceCode/Bond/Servo/Model.cpp
index 358a582..ce8ee46 100644
--- a/SourceCode/Bond/Servo/Model.cpp
+++ b/SourceCode/Bond/Servo/Model.cpp
@@ -272,6 +272,9 @@
int seed = m_configuration.getPortCassetteSnSeed(i + 1);
m_master.setPortCassetteSnSeed(i + 1, seed);
}
+
+ // 鎸夎皟搴︽ā寮忚鍐欑敓浜х鍙i厤缃�
+ m_master.applySchedulingModePortMapping();
}
void CModel::setPortType(unsigned int index, SERVO::PortType type)
@@ -1129,6 +1132,7 @@
m_master.setCacheFilepath((LPTSTR)(LPCTSTR)strMasterDataFile);
m_master.setCompareMapsBeforeProceeding(m_configuration.isCompareMapsBeforeProceeding());
m_master.setJobMode(m_configuration.isJobMode());
+ m_master.setSchedulingMode((SERVO::SchedulingMode)m_configuration.getSchedulingMode());
// 鍔犳埅Job
strMasterDataFile.Format(_T("%s\\MasterState.dat"), (LPTSTR)(LPCTSTR)m_strWorkDir);
diff --git a/SourceCode/Bond/x64/Debug/EqsGraph.ini b/SourceCode/Bond/x64/Debug/EqsGraph.ini
index 8a58491..4dada3b 100644
--- a/SourceCode/Bond/x64/Debug/EqsGraph.ini
+++ b/SourceCode/Bond/x64/Debug/EqsGraph.ini
@@ -1,51 +1,51 @@
[LoadPort 1]
-Left=23
-Top=87
+Left=44
+Top=64
[LoadPort 2]
-Left=23
-Top=437
+Left=30
+Top=317
[LoadPort 3]
-Left=1253
-Top=297
+Left=70
+Top=615
[LoadPort 4]
-Left=1253
-Top=457
+Left=57
+Top=466
[EFEM(ROBOT)]
-Left=294
-Top=63
+Left=381
+Top=42
[Bonder 1]
-Left=659
-Top=297
+Left=762
+Top=317
[Bonder 2]
-Left=659
-Top=437
+Left=781
+Top=504
[Fliper]
Left=279
Top=297
[Aligner]
-Left=210
+Left=320
Top=317
[VacuumBake]
Left=279
Top=437
[BakeCooling]
-Left=853
-Top=363
+Left=994
+Top=317
[ARM]
-Left=628
-Top=63
+Left=722
+Top=42
[Arm Tray1]
-Left=467
-Top=63
+Left=554
+Top=42
[Arm Tray2]
-Left=467
-Top=167
+Left=554
+Top=141
[Fliper(G2)]
-Left=413
-Top=285
+Left=529
+Top=317
[VacuumBake(G1)]
-Left=413
-Top=437
+Left=529
+Top=466
[Measurement]
-Left=1041
-Top=363
+Left=1207
+Top=317
--
Gitblit v1.9.3