From e370d743235b6c182a62e15fb3efe764103ad8ef Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期六, 07 六月 2025 11:53:33 +0800
Subject: [PATCH] 1.流程中断后,物料的人工搬出机制,用于恢复流程,保证数据同步;
---
SourceCode/Bond/Servo/Context.cpp | 27 +++++++++++++
SourceCode/Bond/Servo/CEquipmentPage2.cpp | 56 +++++++++++++++-------------
SourceCode/Bond/Servo/CEquipment.cpp | 16 +++++++
SourceCode/Bond/Servo/CEquipment.h | 2 +
SourceCode/Bond/Servo/CEquipmentPage2.h | 1
SourceCode/Bond/Servo/CLoadPort.cpp | 1
6 files changed, 75 insertions(+), 28 deletions(-)
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index f5cfa15..35c81b8 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -47,7 +47,6 @@
for (int i = 0; i < SLOT_MAX; i++) {
CContext* pContext = m_slot[i].getContext();
if (pContext != nullptr) {
- pContext->release();
m_slot[i].setContext(nullptr);
}
}
@@ -1237,6 +1236,21 @@
return TRUE;
}
+ int CEquipment::removeGlass(int slotNo)
+ {
+ CSlot* pSlot = nullptr;
+ for (int i = 0; i < SLOT_MAX; i++) {
+ if (!m_slot[i].isEnable()) continue;
+ if (m_slot[i].getNo() != slotNo) continue;
+ pSlot = &m_slot[i];
+ break;
+ }
+
+ if (pSlot == nullptr) return -1;
+ pSlot->setContext(nullptr);
+ return 0;
+ }
+
short CEquipment::decodeRecipeListReport(const char* pszData, size_t size)
{
return m_recipesManager.decodeRecipeListReport(pszData, size);
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index 8152520..da67314 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -185,6 +185,8 @@
// 指定槽位是否可以放置玻璃
BOOL canPlaceGlassInSlot(const short slotIndex);
+ // 手动移除物料
+ int removeGlass(int slotNo);
// 以下为从CC-Link读取到的Bit标志位检测函数
public:
diff --git a/SourceCode/Bond/Servo/CEquipmentPage2.cpp b/SourceCode/Bond/Servo/CEquipmentPage2.cpp
index 0a09494..14b46ac 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage2.cpp
+++ b/SourceCode/Bond/Servo/CEquipmentPage2.cpp
@@ -82,24 +82,7 @@
ASSERT(m_pEquipment);
- for (int i = 0; i < SLOT_MAX; i++) {
- SERVO::CSlot* pSlot = m_pEquipment->getSlot(i);
- if (pSlot != nullptr && pSlot->isEnable()) {
- int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
- m_listCtrl.SetItemData(index, (DWORD_PTR)pSlot);
- m_listCtrl.SetItemText(index, 1, std::to_string(pSlot->getNo()).c_str());
- m_listCtrl.SetItemText(index, 2, pSlot->getName().c_str());
-
- SERVO::CGlass* pGlass = (SERVO::CGlass*)pSlot->getContext();
- if (pGlass != nullptr) {
- m_listCtrl.SetItemText(index, 3, pGlass->getID().c_str());
- SERVO::CGlass* pBuddy = pGlass->getBuddy();
- if (pBuddy != nullptr) {
- m_listCtrl.SetItemText(index, 4, pBuddy->getID().c_str());
- }
- }
- }
- }
+ UpdateSlots();
return TRUE; // return TRUE unless you set the focus to a control
// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
@@ -173,16 +156,37 @@
void CEquipmentPage2::OnBnClickedButtonRemove()
{
- /*
int index = GetSelectedItemIndex();
if (index >= 0) {
- SERVO::CGlass* pGlass = (SERVO::CGlass*)m_listCtrl.GetItemData(index);
- ASSERT(m_pEquipment);
- BOOL bRet = m_pEquipment->removeClass(pGlass);
- if (bRet) {
- pGlass->release();
- m_listCtrl.DeleteItem(index);
+ SERVO::CSlot* pSlot = (SERVO::CSlot*)m_listCtrl.GetItemData(index);
+ ASSERT(pSlot);
+ int bRet = m_pEquipment->removeGlass(pSlot->getNo());
+ if (bRet == 0) {
+ UpdateSlots();
}
}
- */
}
+
+void CEquipmentPage2::UpdateSlots()
+{
+ m_listCtrl.DeleteAllItems();
+ for (int i = 0; i < SLOT_MAX; i++) {
+ SERVO::CSlot* pSlot = m_pEquipment->getSlot(i);
+ if (pSlot != nullptr && pSlot->isEnable()) {
+ int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
+ m_listCtrl.SetItemData(index, (DWORD_PTR)pSlot);
+ m_listCtrl.SetItemText(index, 1, std::to_string(pSlot->getNo()).c_str());
+ m_listCtrl.SetItemText(index, 2, pSlot->getName().c_str());
+
+ SERVO::CGlass* pGlass = (SERVO::CGlass*)pSlot->getContext();
+ if (pGlass != nullptr) {
+ m_listCtrl.SetItemText(index, 3, pGlass->getID().c_str());
+ SERVO::CGlass* pBuddy = pGlass->getBuddy();
+ if (pBuddy != nullptr) {
+ m_listCtrl.SetItemText(index, 4, pBuddy->getID().c_str());
+ }
+ }
+ }
+ }
+}
+
diff --git a/SourceCode/Bond/Servo/CEquipmentPage2.h b/SourceCode/Bond/Servo/CEquipmentPage2.h
index 99a7596..c20331a 100644
--- a/SourceCode/Bond/Servo/CEquipmentPage2.h
+++ b/SourceCode/Bond/Servo/CEquipmentPage2.h
@@ -18,6 +18,7 @@
private:
int GetSelectedItemIndex();
+ void UpdateSlots();
private:
SERVO::CEquipment* m_pEquipment;
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index 895ca1e..7e73a0a 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -1103,7 +1103,6 @@
pGlass->setJobDataB(&jb);
pGlass->setType(type);
pGlass->setJobDataS(&js);
- pGlass->addRef();
m_slot[i].setContext(pGlass);
}
diff --git a/SourceCode/Bond/Servo/Context.cpp b/SourceCode/Bond/Servo/Context.cpp
index d71cf34..dff60f2 100644
--- a/SourceCode/Bond/Servo/Context.cpp
+++ b/SourceCode/Bond/Servo/Context.cpp
@@ -1,7 +1,34 @@
#include "stdafx.h"
#include "Context.h"
+#include <dbghelp.h>
+
+#pragma comment(lib, "dbghelp.lib")
+void PrintStackTrace()
+{
+ void* stack[62]; // 最多抓62层
+ USHORT frames = CaptureStackBackTrace(0, 62, stack, NULL);
+
+ HANDLE process = GetCurrentProcess();
+ SymInitialize(process, NULL, TRUE);
+ for (USHORT i = 0; i < frames; ++i) {
+ DWORD64 address = (DWORD64)(stack[i]);
+ char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
+ PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer;
+ symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
+ symbol->MaxNameLen = MAX_SYM_NAME;
+
+ if (SymFromAddr(process, address, 0, symbol)) {
+ TRACE(">>>> name:%s\n", symbol->Name);
+ }
+ else {
+ TRACE(">>>> name:%s\n", "SymFromAddr failed");
+ }
+ }
+
+ SymCleanup(process);
+}
CContext::CContext()
{
m_onReleaseCallback = nullptr;
--
Gitblit v1.9.3