LAPTOP-SNT8I5JK\Boounion
2025-06-07 e370d743235b6c182a62e15fb3efe764103ad8ef
1.流程中断后,物料的人工搬出机制,用于恢复流程,保证数据同步;
已修改6个文件
103 ■■■■ 文件已修改
SourceCode/Bond/Servo/CEquipment.cpp 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.cpp 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipmentPage2.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Context.cpp 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
SourceCode/Bond/Servo/CEquipment.h
@@ -185,6 +185,8 @@
        // 指定槽位是否可以放置玻璃
        BOOL canPlaceGlassInSlot(const short slotIndex);
        // 手动移除物料
        int removeGlass(int slotNo);
    // 以下为从CC-Link读取到的Bit标志位检测函数
    public:
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());
                }
            }
        }
    }
}
SourceCode/Bond/Servo/CEquipmentPage2.h
@@ -18,6 +18,7 @@
private:
    int GetSelectedItemIndex();
    void UpdateSlots();
private:
    SERVO::CEquipment* m_pEquipment;
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);
        }
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;