mrDarker
2025-06-16 817d91396abc1cca6f1ef5abb1fd5fbfd3511268
1. 通信地址修改
2. 修复设置Port时,只添加了Port1
3. 搬运测试界面优化
已修改5个文件
199 ■■■■ 文件已修改
SourceCode/Bond/Servo/CEFEM.cpp 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CLoadPort.cpp 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotCmdTestDlg.cpp 164 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotCmdTestDlg.h 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp
@@ -357,7 +357,7 @@
            // Eq mode
            CEqModeStep* pStep = new CEqModeStep();
            pStep->setName(STEP_MODE);
            pStep->setWriteSignalDev(0x50);
            pStep->setWriteSignalDev(0x40);
            pStep->setModeDev(0x5d7d);
            if (addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
                delete pStep;
@@ -368,7 +368,7 @@
            // Eq Status
            CEqStatusStep* pStep = new CEqStatusStep();
            pStep->setName(STEP_STATUS);
            pStep->setWriteSignalDev(0x51);
            pStep->setWriteSignalDev(0x41);
            pStep->setStatusDev(0x5d59);
            if (addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
                delete pStep;
@@ -379,7 +379,7 @@
            // Eq Alarm
            static char* pszName[] = { STEP_ALARM_BLOCK1, STEP_ALARM_BLOCK2, STEP_ALARM_BLOCK3, STEP_ALARM_BLOCK4, STEP_ALARM_BLOCK5 };
            static int dev[] = { 0x5f0e , 0x5f3b, 0x5f68, 0x5f95, 0x5fc2 };
            static int writeSignalDev[] = { 0x52, 0x53, 0x54, 0x55, 0x56 };
            static int writeSignalDev[] = { 0x42, 0x43, 0x44, 0x45, 0x46 };
            static int addr[] = { STEP_ID_EQALARM1, STEP_ID_EQALARM2, STEP_ID_EQALARM3, STEP_ID_EQALARM4, STEP_ID_EQALARM5 };
            for (int i = 0; i < 5; i++) {
@@ -398,7 +398,7 @@
            // eq process
            CEqProcessStep* pStep = new CEqProcessStep();
            pStep->setName(STEP_PROCESS);
            pStep->setWriteSignalDev(0x57);
            pStep->setWriteSignalDev(0x47);
            pStep->setProcessDev(0x6b55);
            if (addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
                delete pStep;
@@ -430,7 +430,7 @@
        {
            // CIM Message Confirm
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x5f80);
            CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x5d80);
            pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
            pStep->setWriteSignalDev(0x49);
            if (addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
@@ -493,7 +493,7 @@
            // eq mode change
            CEqModeChangeStep* pStep = new CEqModeChangeStep();
            pStep->setName(STEP_EQ_MODE_CHANGE);
            pStep->setWriteSignalDev(0x65);
            pStep->setWriteSignalDev(0x40);
            pStep->setEqModeDev(0x1E);
            if (addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
                delete pStep;
SourceCode/Bond/Servo/CLoadPort.cpp
@@ -111,7 +111,7 @@
            // Type
            static char* pszName[] = { STEP_EQ_PORT1_TYPE, STEP_EQ_PORT2_TYPE, STEP_EQ_PORT3_TYPE, STEP_EQ_PORT4_TYPE };
            static int dev[] = { 0x6010 , 0x6020, 0x6030, 0x6040 };
            static int writeSignalDev[] = { 0xa0, 0xa1, 0xa2, 0xa3 };
            static int writeSignalDev[] = { 0x90, 0x91, 0x92, 0x93 };
            static int addr[] = { STEP_ID_PORT1_TYPE_CHANGE, STEP_ID_PORT2_TYPE_CHANGE, STEP_ID_PORT3_TYPE_CHANGE, STEP_ID_PORT4_TYPE_CHANGE };
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
@@ -132,7 +132,7 @@
            // Mode
            static char* pszName[] = { STEP_EQ_PORT1_MODE, STEP_EQ_PORT2_MODE, STEP_EQ_PORT3_MODE, STEP_EQ_PORT4_MODE };
            static int dev[] = { 0x6011, 0x6021, 0x6031, 0x6041 };
            static int writeSignalDev[] = { 0xa8, 0xa9, 0xaa, 0xab };
            static int writeSignalDev[] = { 0x98, 0x99, 0x9a, 0x9b };
            static int addr[] = { STEP_ID_PORT1_MODE_CHANGE, STEP_ID_PORT2_MODE_CHANGE, STEP_ID_PORT3_MODE_CHANGE, STEP_ID_PORT4_MODE_CHANGE };
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
@@ -153,7 +153,7 @@
            // Cassette type
            static char* pszName[] = { STEP_EQ_PORT1_CASSETTE_TYPE, STEP_EQ_PORT2_CASSETTE_TYPE, STEP_EQ_PORT3_CASSETTE_TYPE, STEP_EQ_PORT4_CASSETTE_TYPE };
            static int dev[] = { 0x6012, 0x6022, 0x6032, 0x6042 };
            static int writeSignalDev[] = { 0xb0, 0xb1, 0xb2, 0xb3 };
            static int writeSignalDev[] = { 0xa0, 0xa1, 0xa2, 0xa3 };
            static int addr[] = { STEP_ID_PORT1_CASSETTE_TYPE_CHANGE, STEP_ID_PORT2_CASSETTE_TYPE_CHANGE, STEP_ID_PORT3_CASSETTE_TYPE_CHANGE, STEP_ID_PORT4_CASSETTE_TYPE_CHANGE };
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
@@ -174,7 +174,7 @@
            // Transfer type
            static char* pszName[] = { STEP_EQ_PORT1_TRANSFER_MODE, STEP_EQ_PORT2_TRANSFER_MODE, STEP_EQ_PORT3_TRANSFER_MODE, STEP_EQ_PORT4_TRANSFER_MODE };
            static int dev[] = { 0x6014, 0x6024, 0x6034, 0x6044 };
            static int writeSignalDev[] = { 0xb8, 0xb9, 0xba, 0xbb };
            static int writeSignalDev[] = { 0xa8, 0xa9, 0xaa, 0xab };
            static int addr[] = { STEP_ID_PORT1_TRANSFER_MODE_CHANGE, STEP_ID_PORT2_TRANSFER_MODE_CHANGE, STEP_ID_PORT3_TRANSFER_MODE_CHANGE, STEP_ID_PORT4_TRANSFER_MODE_CHANGE };
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
@@ -195,7 +195,7 @@
            // Port enable
            static char* pszName[] = { STEP_EQ_PORT1_ENABLE, STEP_EQ_PORT2_ENABLE, STEP_EQ_PORT3_ENABLE, STEP_EQ_PORT4_ENABLE };
            static int dev[] = { 0x6015, 0x6025, 0x6035, 0x6045 };
            static int writeSignalDev[] = { 0xc0, 0xc1, 0xc2, 0xc3 };
            static int writeSignalDev[] = { 0xb0, 0xb1, 0xb2, 0xb3 };
            static int addr[] = { STEP_ID_PORT1_ENABLE_MODE_CHANGE, STEP_ID_PORT2_ENABLE_MODE_CHANGE, STEP_ID_PORT3_ENABLE_MODE_CHANGE, STEP_ID_PORT4_ENABLE_MODE_CHANGE };
            CEqReadStep* pStep = new CEqReadStep(dev[m_nIndex], sizeof(short),
SourceCode/Bond/Servo/CMaster.cpp
@@ -160,9 +160,9 @@
        ASSERT(pMeasurement);
        pEfem->setPort(0, pPort1);
        pEfem->setPort(1, pPort1);
        pEfem->setPort(2, pPort1);
        pEfem->setPort(3, pPort1);
        pEfem->setPort(1, pPort2);
        pEfem->setPort(2, pPort3);
        pEfem->setPort(3, pPort4);
        pEfem->setFliper(pFliper);
        pEfem->setAligner(pAligner);
        pEfem->setArmTray(0, pArmTray1);
SourceCode/Bond/Servo/CRobotCmdTestDlg.cpp
@@ -32,6 +32,28 @@
    {_T("SendPutAndHome"),       {true,  false, false, true,  true }}
};
std::map<CString, int> g_mapDeviceSlotCount = {
    {_T("Port1"), 8},
    {_T("Port2"), 8},
    {_T("Port3"), 8},
    {_T("Port4"), 8},
    {_T("RB1"), 1},
    {_T("RB2"), 1},
    {_T("AL"), 1},
    {_T("FLIP"), 1},
    {_T("Bonder1-上产品"), 1},
    {_T("Bonder1-下产品"), 1},
    {_T("Bonder2-上产品"), 1},
    {_T("Bonder2-下产品"), 1},
    {_T("VacBakeA腔"), 1},
    {_T("VacBakeB腔"), 1},
    {_T("BakecCoolingA烘烤"), 1},
    {_T("BakecCoolingA冷却"), 1},
    {_T("BakecCoolingB烘烤"), 1},
    {_T("BakecCoolingB冷却"), 1},
    {_T("Measurement"), 1}
};
// CRobotCmdTestDlg 对话框
IMPLEMENT_DYNAMIC(CRobotCmdTestDlg, CDialogEx)
@@ -64,8 +86,10 @@
}
BEGIN_MESSAGE_MAP(CRobotCmdTestDlg, CDialogEx)
    ON_CBN_SELCHANGE(IDC_COMBO_CMD_TYPE, &CRobotCmdTestDlg::OnCbnSelchangeComboCmdType)
    ON_BN_CLICKED(IDC_BUTTON_EXECUTE, &CRobotCmdTestDlg::OnBnClickedButtonExecute)
    ON_CBN_SELCHANGE(IDC_COMBO_CMD_TYPE, &CRobotCmdTestDlg::OnSelchangeComboCmdType)
    ON_CBN_SELCHANGE(IDC_COMBO_GET_POS, &CRobotCmdTestDlg::OnSelchangeComboGetPos)
    ON_CBN_SELCHANGE(IDC_COMBO_PUT_POS, &CRobotCmdTestDlg::OnSelchangeComboPutPos)
END_MESSAGE_MAP()
// CRobotCmdTestDlg 消息处理程序
@@ -80,11 +104,6 @@
        m_comboCmdType.AddString(pair.first);
    }
    m_comboCmdType.SetCurSel(0);
    // 初始化命令输入控件
    if (!g_mapQuickCmd.empty()) {
        UpdateCommandInputUI(g_mapQuickCmd.begin()->first);
    }
    // 初始化 Arm No(1:Arm#1,2:Arm#2)
    m_comboArmNo.AddString(_T("1"));
@@ -121,15 +140,16 @@
    m_comboGetPos.SetCurSel(0);
    m_comboPutPos.SetCurSel(0);
    // 初始化 Slot(默认从 1 到 25)
    for (int i = 1; i < 26; ++i) {
        CString str;
        str.Format(_T("%d"), i);
        m_comboGetSlot.AddString(str);
        m_comboPutSlot.AddString(str);
    // 初始化 Slot
    m_comboGetPos.SetCurSel(0);
    m_comboPutPos.SetCurSel(0);
    UpdateSlotList(&m_comboGetPos, &m_comboGetSlot);
    UpdateSlotList(&m_comboPutPos, &m_comboPutSlot);
    // 初始化命令输入控件
    if (!g_mapQuickCmd.empty()) {
        UpdateCommandInputUI(g_mapQuickCmd.begin()->first);
    }
    m_comboGetSlot.SetCurSel(0);
    m_comboPutSlot.SetCurSel(0);
    // 快捷命令执行映射表
    m_mapCmdExec = {
@@ -210,11 +230,16 @@
    }
    const QuickCmdFieldMask& mask = it->second;
    GetDlgItem(IDC_COMBO_ARM_NO)->EnableWindow(mask.useArm);
    GetDlgItem(IDC_COMBO_GET_POS)->EnableWindow(mask.useGetPos);
    GetDlgItem(IDC_COMBO_GET_SLOT)->EnableWindow(mask.useGetSlot);
    GetDlgItem(IDC_COMBO_PUT_POS)->EnableWindow(mask.usePutPos);
    GetDlgItem(IDC_COMBO_PUT_SLOT)->EnableWindow(mask.usePutSlot);
    m_comboArmNo.SetCurSel(0);
    m_comboArmNo.EnableWindow(mask.useArm);
    m_comboGetPos.SetCurSel(0);
    m_comboGetPos.EnableWindow(mask.useGetPos);
    m_comboGetSlot.SetCurSel(0);
    m_comboGetSlot.EnableWindow(mask.useGetSlot);
    m_comboPutPos.SetCurSel(0);
    m_comboPutPos.EnableWindow(mask.usePutPos);
    m_comboPutSlot.SetCurSel(0);
    m_comboPutSlot.EnableWindow(mask.usePutSlot);
}
void CRobotCmdTestDlg::AppendLogLineBatchBegin()
@@ -302,19 +327,73 @@
    m_editLog.SetSel(-1, 0);
}
void CRobotCmdTestDlg::OnCbnSelchangeComboCmdType()
void CRobotCmdTestDlg::UpdateSlotList(CComboBox* pComboDevice, CComboBox* pComboSlot)
{
    int nSel = m_comboCmdType.GetCurSel();
    if (nSel < 0) {
    if (pComboDevice == nullptr || pComboSlot == nullptr) {
        return;
    }
    CString str;
    m_comboCmdType.GetLBText(nSel, str);
    UpdateCommandInputUI(str);
    int nSelIndex = pComboDevice->GetCurSel();
    if (nSelIndex < 0) {
        return;
    }
    str.Format(_T("切换当前命令类型:%s"), str);
    AppendLogLineRichStyled(str, LOG_COLOR_NORMAL);
    CString strDeviceName;
    pComboDevice->GetLBText(nSelIndex, strDeviceName);
    int nMaxSlot = 1; // 默认槽位数
    auto it = g_mapDeviceSlotCount.find(strDeviceName);
    if (it != g_mapDeviceSlotCount.end()) {
        nMaxSlot = it->second;
    }
    else {
        CString strLog;
        strLog.Format(_T("设备 %s 未定义槽位数,使用默认值 1"), strDeviceName.GetString());
        AppendLogLineRichStyled(strLog, LOG_COLOR_WARNING);
    }
    // 清空并添加槽号
    pComboSlot->ResetContent();
    for (int i = 1; i <= nMaxSlot; ++i) {
        CString str;
        str.Format(_T("%d"), i);
        pComboSlot->AddString(str);
    }
    pComboSlot->SetCurSel(0);
    pComboSlot->EnableWindow(1 != nMaxSlot);
}
void CRobotCmdTestDlg::UpdateArmList(CComboBox* pComboDevice, CComboBox* pComboArm)
{
    if (pComboDevice == nullptr || pComboArm == nullptr) {
        return;
    }
    int nSelIndex = pComboDevice->GetCurSel();
    if (nSelIndex < 0) {
        return;
    }
    CString strDeviceName;
    pComboDevice->GetLBText(nSelIndex, strDeviceName);
    if (IsDualArmSupported(strDeviceName)) {
        pComboArm->EnableWindow(TRUE);
    }
    else {
        pComboArm->EnableWindow(FALSE);
    }
    pComboArm->SetCurSel(0);
}
bool CRobotCmdTestDlg::IsDualArmSupported(const CString& strDeviceName)
{
    // 注意匹配规则是否区分“-上产品”、“-下产品”等后缀
    if (strDeviceName.Find(_T("FLIP")) >= 0) return true;
    if (strDeviceName.Find(_T("Bonder1")) >= 0) return true;
    if (strDeviceName.Find(_T("Bonder2")) >= 0) return true;
    return false;
}
void CRobotCmdTestDlg::OnBnClickedButtonExecute()
@@ -339,7 +418,7 @@
    // 查找函数并执行
    auto it = m_mapCmdExec.find(cmdName);
    if (it != m_mapCmdExec.end() && nullptr != m_pEFEM) {
        int ret = it->second(1, armNo, getPos, getSlot, putPos, putSlot, [&](int code) -> int {
        int ret = it->second(1, armNo, getPos, putPos, getSlot, putSlot, [&](int code) -> int {
            if (code == WOK) {
                AppendLogLineRichStyled(_T("已收到Robot回应!"), LOG_COLOR_SUCCESS);
            }
@@ -366,3 +445,32 @@
        AppendLogLineRichStyled(log, LOG_COLOR_ERROR);
    }
}
void CRobotCmdTestDlg::OnSelchangeComboCmdType()
{
    int nSel = m_comboCmdType.GetCurSel();
    if (nSel < 0) {
        return;
    }
    CString str;
    m_comboCmdType.GetLBText(nSel, str);
    UpdateCommandInputUI(str);
    str.Format(_T("切换当前命令类型:%s"), str);
    AppendLogLineRichStyled(str, LOG_COLOR_NORMAL);
}
void CRobotCmdTestDlg::OnSelchangeComboGetPos()
{
    // TODO: 在此添加控件通知处理程序代码
    UpdateSlotList(&m_comboGetPos, &m_comboGetSlot);
    UpdateArmList(&m_comboGetPos, &m_comboArmNo);
}
void CRobotCmdTestDlg::OnSelchangeComboPutPos()
{
    // TODO: 在此添加控件通知处理程序代码
    UpdateSlotList(&m_comboPutPos, &m_comboPutSlot);
    UpdateArmList(&m_comboPutPos, &m_comboArmNo);
}
SourceCode/Bond/Servo/CRobotCmdTestDlg.h
@@ -35,8 +35,10 @@
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
    virtual BOOL OnInitDialog();
    afx_msg void OnCbnSelchangeComboCmdType();
    afx_msg void OnBnClickedButtonExecute();
    afx_msg void OnSelchangeComboCmdType();
    afx_msg void OnSelchangeComboGetPos();
    afx_msg void OnSelchangeComboPutPos();
    DECLARE_MESSAGE_MAP()
private:
@@ -46,6 +48,9 @@
    void TrimRichEditLineLimit(int maxLines = 100);
    void AppendLogLineRichStyled(const CString& content, COLORREF color = RGB(0, 0, 0));
    void HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight = RGB(255, 165, 0));
    void UpdateSlotList(CComboBox* pComboDevice, CComboBox* pComboSlot);
    void UpdateArmList(CComboBox* pComboDevice, CComboBox* pComboArm);
    bool IsDualArmSupported(const CString& strDeviceName);
    // 控件
    CComboBox m_comboCmdType;