1. 通信地址修改
2. 修复设置Port时,只添加了Port1
3. 搬运测试界面优化
| | |
| | | // 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; |
| | |
| | | // 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; |
| | |
| | | // 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++) { |
| | |
| | | // 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; |
| | |
| | | |
| | | { |
| | | // 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) { |
| | |
| | | // 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; |
| | |
| | | // 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), |
| | |
| | | // 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), |
| | |
| | | // 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), |
| | |
| | | // 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), |
| | |
| | | // 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), |
| | |
| | | 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); |
| | |
| | | {_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) |
| | |
| | | } |
| | | |
| | | 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 消息处理程序 |
| | |
| | | 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")); |
| | |
| | | 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 = { |
| | |
| | | } |
| | | |
| | | 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() |
| | |
| | | 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() |
| | |
| | | // 查找函数并执行 |
| | | 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); |
| | | } |
| | |
| | | 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); |
| | | } |
| | |
| | | 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: |
| | |
| | | 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; |