LAPTOP-SNT8I5JK\Boounion
2025-06-20 2abde7163867930b35d4288546e4fb02bdec064f
1.对方JobDataRequest没有带参数,因此在从loadPort取料时,先缓存Cassette Sequence No和Job Sequence No,以作为下一次JobDataRequest的参数
已修改5个文件
58 ■■■■ 文件已修改
SourceCode/Bond/Servo/CEFEM.cpp 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.h 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEqReadStep.cpp 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoCommo.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp
@@ -26,17 +26,30 @@
        m_robotData.position = ROBOT_POSITION::Port1;
        m_robotData.armState[0] = FALSE;
        m_robotData.armState[1] = FALSE;
        m_pActiveContext = nullptr;
    }
    CEFEM::~CEFEM()
    {
        if (m_pActiveContext != nullptr) {
            m_pActiveContext->release();
            m_pActiveContext = nullptr;
        }
    }
    const char* CEFEM::getClassName()
    {
        static char* pszName = "CEFEM";
        return pszName;
    }
    void CEFEM::setContext(CContext* pContext)
    {
        if (m_pActiveContext != nullptr) {
            m_pActiveContext->release();
        }
        m_pActiveContext = pContext;
        m_pActiveContext->addRef();
    }
    void CEFEM::setPort(unsigned int index, CLoadPort* pPort)
@@ -698,21 +711,28 @@
        {
            // JOB Data Request
            CEqReadStep* pStep = new CEqReadStep(0x617d, 2 * 2,
            CEqReadStep* pStep = new CEqReadStep(0x0, 0,
                [&](void* pFrom, int code, const char* pszData, size_t size) -> int {
                    if (code == ROK && pszData != nullptr && size > 0) {
                        decodeJobDataRequest((CStep*)pFrom, pszData, size);
                        // 由于EFEM没有发送参数到master, 我们只需要返回数据
                        // Cassette Sequence No和Job Sequence No根据上一次调试缓存而来
                        // decodeJobDataRequest((CStep*)pFrom, pszData, size);
                        // efme, 获取数据后返回
                        // Cassette Sequence No        1W
                        // Job Sequence No            1W
                        // Job DataS                256W
                        // 获取数据后返回给EFEM
                        // Job DataS                320W
                        // ACK                        1W
                        // Reserved                    15W
                        short ack = (short)JobDataRequestAck::NG;        // 不存在jobData
                        char szBuffer[1024] = { 0 };
                        CJobDataS* pJobDataS = m_pPort[3]->getJobDataSWithCassette(4001, 1);
                        if (pJobDataS != nullptr) {
                            int size = pJobDataS->serialize(szBuffer, 1024);
                            ((CEqReadStep*)pFrom)->setReturnData(szBuffer, size);
                        if (m_pActiveContext != nullptr) {
                            CJobDataS* pJobDataS = ((CGlass*)m_pActiveContext)->getJobDataS();
                            if (pJobDataS != nullptr) {
                                pJobDataS->serialize(szBuffer, 1024);
                                ack = (short)JobDataRequestAck::OK;
                            }
                        }
                        memcpy(&szBuffer[320 * 2], &ack, sizeof(short));
                        ((CEqReadStep*)pFrom)->setReturnData(szBuffer, 336 * 2);
                    }
                    return -1;
                });
SourceCode/Bond/Servo/CEFEM.h
@@ -4,6 +4,7 @@
#include "CAligner.h"
#include "CFliper.h"
#include "CArmTray.h"
#include "Context.h"
namespace SERVO {
@@ -33,6 +34,7 @@
        virtual int getIndexerOperationModeBaseValue();
    public:
        void setContext(CContext* pContext);
        void setPort(unsigned int index, CLoadPort* pPort);
        void setAligner(CAligner* pAligner);
        void setFliper(CFliper* pFliper);
@@ -64,6 +66,7 @@
        CFliper* m_pFliper;
        CArmTray* m_pArmTray[2];
        RMDATA m_robotData;
        CContext* m_pActiveContext;
    };
}
SourceCode/Bond/Servo/CEqReadStep.cpp
@@ -38,6 +38,17 @@
        CReadStep::onReadData();
        // 20250620新增,有些场景是不需要读数据的,只要检测到信息就写数据给机器
        if (m_nReadSize == 0) {
            if (m_onReadBlock != nullptr) {
                m_onReadBlock(this, ROK, nullptr, 0);
            }
            return 0;
        }
        // 读数据
        char szBuffer[READ_BUFFER_MAX];
        int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nDataDev,
            (long)min(READ_BUFFER_MAX, m_nReadSize), szBuffer);
SourceCode/Bond/Servo/CMaster.cpp
@@ -729,6 +729,7 @@
                        && pEqLoadPort[s]->getPortMode() == PortMode::ReadyToLoad) {
                        m_pActiveRobotTask = createTransferTask(pEqLoadPort[s], pAligner, primaryType, secondaryType);
                        if (m_pActiveRobotTask != nullptr) {
                            pEFEM->setContext(m_pActiveRobotTask->getContext());
                            goto PORT_GET;
                        }
                    }
SourceCode/Bond/Servo/ServoCommo.h
@@ -13,6 +13,7 @@
        OK = 1,
        NG,
    };
    typedef RET JobDataRequestAck;
    enum class PortType {
        Loading = 1,