| | |
| | | #include "BondEq.h" |
| | | #include "afxdialogex.h" |
| | | #include "AxisSettingsDlg.h" |
| | | #include "AxisDetailSettingsDlg.h" |
| | | #include "ToolUnits.h" |
| | | #include <cctype> |
| | | #include <algorithm> |
| | |
| | | m_bReady = FALSE; |
| | | m_bBusy = FALSE; |
| | | m_bErr = FALSE; |
| | | |
| | | for (int i = 0; i < BTN_MAX; i++) { |
| | | m_pBlBtns[i] = new CBlButton(); |
| | | } |
| | | |
| | | for (int i = 0; i < EDIT_MAX; i++) { |
| | | m_pRegexEdit[i] = new CRegexEdit(); |
| | | } |
| | | |
| | | for (int i = 0; i < LABEL_MAX; i++) { |
| | |
| | | |
| | | for (int i = 0; i < BTN_MAX; i++) { |
| | | delete m_pBlBtns[i]; |
| | | } |
| | | |
| | | for (int i = 0; i < EDIT_MAX; i++) { |
| | | delete m_pRegexEdit[i]; |
| | | } |
| | | |
| | | for (int i = 0; i < LABEL_MAX; i++) { |
| | |
| | | DDX_Control(pDX, IDC_STATIC_AXIS_NUMBER, m_staticAxisNO); |
| | | DDX_Control(pDX, IDC_STATIC_AXIS_DESCRIP, m_staticAxisDescription); |
| | | DDX_Control(pDX, IDC_STATIC_START_ADDRESS, m_staticStartAddress); |
| | | DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_POS, m_editManualSpeed); |
| | | DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_AUTO_SPEED, m_editAutoSpeed); |
| | | DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_ACCE_TIME, m_editAccelerationTime); |
| | | DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_DECE_TIME, m_editDecelerationTime); |
| | | DDX_Control(pDX, IDC_EDIT_AXIS_MODITFY_MICROMENTUM, m_editJogDistance); |
| | | } |
| | | |
| | | UINT CAxisSettingsDlg::FindIDByName(const CString& strControlID) |
| | |
| | | SetLabelColorBasedOnState(*m_pBlLabels[LABEL_ERR], m_bErr, COLOR_RED, COLOR_GREEN_OFF); |
| | | } |
| | | |
| | | void CAxisSettingsDlg::UpdateRegexEdit(CRegexEdit* pRegexEdit, const ValueRange& range, const CString& title) |
| | | { |
| | | auto formatDouble = [](double value) -> CString { |
| | | CString str; |
| | | str.Format(_T("%.3f"), value); |
| | | return str; |
| | | }; |
| | | |
| | | pRegexEdit->SetWindowText(formatDouble(range.currentValue)); |
| | | pRegexEdit->SetRegexType(RegexType::Decimal); |
| | | pRegexEdit->SetValueRange(range.minValue, range.maxValue); |
| | | pRegexEdit->SetInvalidInputCallback([title, range]() { |
| | | CString strError; |
| | | strError.Format(_T("%s的值必须在 %.3f 和 %.3f 之间!"), title, range.minValue, range.maxValue); |
| | | AfxMessageBox(strError); |
| | | }); |
| | | } |
| | | |
| | | void CAxisSettingsDlg::updatePageButtonStates() |
| | | { |
| | | for (int i = 0; i < AXIS_PAGE_SIZE; ++i) { |
| | |
| | | RecipeManager& recipeManager = RecipeManager::getInstance(); |
| | | if (m_strRecipeName.IsEmpty() || !recipeManager.loadRecipe(std::string(CT2A(m_strRecipeName)))) { |
| | | AfxMessageBox(_T("加载配方失败!")); |
| | | recipeManager.saveRecipe(std::string(CT2A(m_strRecipeName))); |
| | | return; |
| | | } |
| | | |
| | |
| | | }; |
| | | |
| | | // 更新控件显示 |
| | | m_staticAxisNO.SetWindowText(CString(axisDetails.number.c_str())); // 轴编号 |
| | | m_staticAxisDescription.SetWindowText(CString(axisDetails.description.c_str())); // 轴描述 |
| | | m_staticStartAddress.SetWindowText(CString(axisDetails.startAddress.c_str())); // 起始地址 |
| | | m_editJogDistance.SetWindowText(formatDouble(axisDetails.jogDistance.currentValue)); // 微动量 |
| | | m_editManualSpeed.SetWindowText(formatDouble(axisDetails.manualSpeed.currentValue)); // 手动速度 |
| | | m_editAutoSpeed.SetWindowText(formatDouble(axisDetails.autoSpeed.currentValue)); // 自动速度 |
| | | m_editAccelerationTime.SetWindowText(formatDouble(axisDetails.accelerationTime.currentValue)); // 加速时间 |
| | | m_editDecelerationTime.SetWindowText(formatDouble(axisDetails.decelerationTime.currentValue)); // 减速时间 |
| | | m_staticAxisNO.SetWindowText(CString(axisDetails.number.c_str())); // 轴编号 |
| | | m_staticAxisDescription.SetWindowText(CString(axisDetails.description.c_str())); // 轴描述 |
| | | m_staticStartAddress.SetWindowText(CString(axisDetails.startAddress.c_str())); // 起始地址 |
| | | |
| | | UpdateRegexEdit(m_pRegexEdit[EDIT_MICROMENTUM], axisDetails.jogDistance, _T("微动量")); |
| | | UpdateRegexEdit(m_pRegexEdit[EDIT_MANUAL_SPEED], axisDetails.manualSpeed, _T("手动速度")); |
| | | UpdateRegexEdit(m_pRegexEdit[EDIT_AUTO_SPEED], axisDetails.autoSpeed, _T("自动速度")); |
| | | UpdateRegexEdit(m_pRegexEdit[EDIT_ACCE_TIME], axisDetails.accelerationTime, _T("加速时间")); |
| | | UpdateRegexEdit(m_pRegexEdit[EDIT_DECE_TIME], axisDetails.decelerationTime, _T("减速时间")); |
| | | } |
| | | |
| | | void CAxisSettingsDlg::refreshPositionDetails(int nAxisId, int pageNumber) |
| | |
| | | // 显示定位点的当前位置 |
| | | CString value; |
| | | value.Format(_T("%.3f"), position.range.currentValue); |
| | | if (pPositionCtrl) pPositionCtrl->SetWindowText(value); |
| | | if (pPositionCtrl) { |
| | | pPositionCtrl->SetWindowText(value); |
| | | pPositionCtrl->EnableWindow(position.isEnable); |
| | | |
| | | if (position.isEnable) { |
| | | CString strError; |
| | | strError.Format(_T("定位点%d"), i + 1); |
| | | UpdateRegexEdit((CRegexEdit*)pPositionCtrl, position.range, strError); |
| | | } |
| | | } |
| | | } |
| | | else { |
| | | // 清空控件内容 |
| | | if (pDescriptionCtrl) pDescriptionCtrl->SetWindowText(_T("")); |
| | | if (pPositionCtrl) pPositionCtrl->SetWindowText(_T("")); |
| | | if (pDescriptionCtrl) { |
| | | pDescriptionCtrl->SetWindowText(_T("")); |
| | | pDescriptionCtrl->EnableWindow(FALSE); |
| | | } |
| | | |
| | | if (pPositionCtrl) { |
| | | pPositionCtrl->SetWindowText(_T("")); |
| | | pPositionCtrl->EnableWindow(FALSE); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | // 获取界面上的修改参数 |
| | | CString text; |
| | | m_editManualSpeed.GetWindowText(text); |
| | | m_pRegexEdit[EDIT_MANUAL_SPEED]->GetWindowText(text); |
| | | axisData.manualSpeed.currentValue = _ttof(text); |
| | | |
| | | m_editAutoSpeed.GetWindowText(text); |
| | | m_pRegexEdit[EDIT_AUTO_SPEED]->GetWindowText(text); |
| | | axisData.autoSpeed.currentValue = _ttof(text); |
| | | |
| | | m_editAccelerationTime.GetWindowText(text); |
| | | m_pRegexEdit[EDIT_ACCE_TIME]->GetWindowText(text); |
| | | axisData.accelerationTime.currentValue = _ttof(text); |
| | | |
| | | m_editDecelerationTime.GetWindowText(text); |
| | | m_pRegexEdit[EDIT_DECE_TIME]->GetWindowText(text); |
| | | axisData.decelerationTime.currentValue = _ttof(text); |
| | | |
| | | m_editJogDistance.GetWindowText(text); |
| | | m_pRegexEdit[EDIT_MICROMENTUM]->GetWindowText(text); |
| | | axisData.jogDistance.currentValue = _ttof(text); |
| | | |
| | | // 更新定位点数据 |
| | |
| | | |
| | | if (index < axisData.positions.size()) { |
| | | // 构建控件名称 |
| | | CString descriptionName, positionName, minValueName, maxValueName; |
| | | CString descriptionName, positionName; |
| | | descriptionName.Format(_T("IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP%d"), i + 1); |
| | | positionName.Format(_T("IDC_EDIT_AXIS_ANCHOR_POINT%d"), i + 1); |
| | | |
| | |
| | | CEdit* pPositionEdit = (CEdit*)GetDlgItem(FindIDByName(positionName)); |
| | | |
| | | if (pDescriptionEdit && pPositionEdit) { |
| | | CString description, positionValue, minValue, maxValue; |
| | | CString description, positionValue; |
| | | |
| | | // 获取控件中的文本 |
| | | pDescriptionEdit->GetWindowText(description); |
| | |
| | | m_nBtnsFlashState8 = ((BYTE)pData[b + 4] | (BYTE)pData[b + 5] << 8); |
| | | m_nBtnsFlashState8 |= ((BYTE)pData[b + 6] << 16 | (BYTE)pData[b + 7] << 24); |
| | | |
| | | AxisInfo axisInfo = RecipeManager::getInstance().getAxis(nAxisId); |
| | | axisInfo.autoSpeed.currentValue = m_fAutoSpeed; // 自动速度 |
| | | axisInfo.manualSpeed.currentValue = m_fManualSpeed; // 手动速度 |
| | | axisInfo.jogDistance.currentValue = CToolUnits::toInt32(&pData[81 * 2]) * 0.001; // 微动量 |
| | | axisInfo.accelerationTime.currentValue = CToolUnits::toInt32(&pData[62 * 2]) * 0.001; // 加速时间 |
| | | axisInfo.decelerationTime.currentValue = CToolUnits::toInt32(&pData[64 * 2]) * 0.001; // 减速时间 |
| | | |
| | | // 读取定位点数据 |
| | | AxisInfo axisInfo = RecipeManager::getInstance().getAxis(nAxisId); |
| | | for (int i = 0; i < axisInfo.positions.size(); ++i) { |
| | | unsigned int positionAddress = 100 + (i * 2); |
| | | axisInfo.positions[i].range.currentValue = CToolUnits::toInt32(&pData[positionAddress * 2]) * 0.001; |
| | | if (axisInfo.positions[i].isEnable == FALSE) { |
| | | unsigned int positionAddress = 100 + (i * 2); |
| | | //axisInfo.positions[i].range.minValue = CToolUnits::toInt32(&pData[positionAddress * 2]) * 0.001; |
| | | axisInfo.positions[i].range.currentValue = CToolUnits::toInt32(&pData[positionAddress * 2]) * 0.001; |
| | | //axisInfo.positions[i].range.maxValue = CToolUnits::toInt32(&pData[positionAddress * 2]) * 0.001; |
| | | } |
| | | } |
| | | RecipeManager::getInstance().updateAxis(axisInfo); |
| | | |
| | |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_ANCHOR_POINT5, &CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPoint5) |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_TEST_OPR, &CAxisSettingsDlg::OnBnClickedButtonAxisTestOpr) |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_TEST_STOP, &CAxisSettingsDlg::OnBnClickedButtonAxisTestStop) |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_SEV, &CAxisSettingsDlg::OnBnClickedButtonAxisSev) |
| | | ON_CBN_SELCHANGE(IDC_COMBO_AXIS_NAME, &CAxisSettingsDlg::OnSelchangeComboAxisName) |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_SAVE, &CAxisSettingsDlg::OnBnClickedButtonAxisSave) |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_UPDATE_UI, &CAxisSettingsDlg::OnBnClickedButtonAxisUpdateUi) |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_DETAIL_SETTINGS, &CAxisSettingsDlg::OnBnClickedButtonAxisDetailSettings) |
| | | ON_MESSAGE(ID_MSG_UPDATA_DATA_TO_UI, &CAxisSettingsDlg::OnUpdateDataToUI) |
| | | ON_WM_SIZE() |
| | | ON_WM_CTLCOLOR() |
| | | ON_WM_SIZING() |
| | | ON_WM_TIMER() |
| | | ON_WM_CLOSE() |
| | | ON_BN_CLICKED(IDC_BUTTON_AXIS_SEV, &CAxisSettingsDlg::OnBnClickedButtonAxisSev) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | |
| | | SetWindowText(strTitle); |
| | | |
| | | // 隐藏光标 |
| | | //HideEditCursor(IDC_EDIT_AXIS_CURR_POS); |
| | | HideEditCursor(IDC_EDIT_AXIS_CURR_POS); |
| | | HideEditCursor(IDC_EDIT_AXIS_CURR_MANUAL_SPEED); |
| | | HideEditCursor(IDC_EDIT_AXIS_CURR_AUTO_SPEED); |
| | | HideEditCursor(IDC_EDIT_AXIS_CURR_ROTA_SPEED); |
| | | HideEditCursor(IDC_EDIT_AXIS_CURR_LOAD); |
| | | HideEditCursor(IDC_EDIT_AXIS_CURR_ERROR_NUMBER); |
| | | HideEditCursor(IDC_EDIT_AXIS_CURR_ALARM_NUMBER); |
| | | |
| | | // 测试 |
| | | { |
| | | CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_AXIS_CURR_POS); |
| | | pEdit->EnableWindow(TRUE); |
| | | pEdit->SetReadOnly(FALSE); |
| | | } |
| | | |
| | | // 设置测试状态 |
| | | m_pBlLabels[LABEL_FLS]->SubclassDlgItem(IDC_STATIC_AXIS_TEST_FLS, this); |
| | |
| | | pLabel->SetDynamicFont(TRUE); |
| | | } |
| | | |
| | | // 初始化编辑框 |
| | | m_pRegexEdit[EDIT_MANUAL_SPEED]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_MANUAL_SPEED, this); |
| | | m_pRegexEdit[EDIT_AUTO_SPEED]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_AUTO_SPEED, this); |
| | | m_pRegexEdit[EDIT_ACCE_TIME]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_ACCE_TIME, this); |
| | | m_pRegexEdit[EDIT_DECE_TIME]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_DECE_TIME, this); |
| | | m_pRegexEdit[EDIT_MICROMENTUM]->SubclassDlgItem(IDC_EDIT_AXIS_MODITFY_MICROMENTUM, this); |
| | | m_pRegexEdit[EDIT_ANCHOR_POINT1]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT1, this); |
| | | m_pRegexEdit[EDIT_ANCHOR_POINT2]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT2, this); |
| | | m_pRegexEdit[EDIT_ANCHOR_POINT3]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT3, this); |
| | | m_pRegexEdit[EDIT_ANCHOR_POINT4]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT4, this); |
| | | m_pRegexEdit[EDIT_ANCHOR_POINT5]->SubclassDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT5, this); |
| | | |
| | | // 按钮初始化 |
| | | m_pBlBtns[BTN_PAGE1]->SubclassDlgItem(IDC_BUTTON_AXIS_ANCHOR_POINT_GROUP1, this); |
| | | m_pBlBtns[BTN_PAGE2]->SubclassDlgItem(IDC_BUTTON_AXIS_ANCHOR_POINT_GROUP2, this); |
| | |
| | | CWnd* pWnd = CWnd::FromHandle(pMsg->hwnd); |
| | | |
| | | if (pWnd) { |
| | | if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { |
| | | // 阻止回车键默认处理,防止对话框关闭 |
| | | return TRUE; |
| | | } |
| | | |
| | | // 判断鼠标是否进入指定控件区域 |
| | | if (pWnd->GetSafeHwnd() == GetDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP1)->m_hWnd || |
| | | pWnd->GetSafeHwnd() == GetDlgItem(IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP2)->m_hWnd || |
| | |
| | | handleAxisOperation(AxisOperationType::POSITION_1, true); |
| | | Sleep(200); |
| | | handleAxisOperation(AxisOperationType::POSITION_1, false); |
| | | m_pBlBtns[BTN_POINT1]->Flash(1000); |
| | | m_pBlBtns[BTN_POINT1]->Flash(500); |
| | | } |
| | | |
| | | void CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPoint2() |
| | |
| | | updateDataFromUI(axisId); |
| | | if (RecipeManager::getInstance().saveRecipe(std::string(CT2A(m_strRecipeName)))) { |
| | | writeAxisDataToPLC(axisId); |
| | | |
| | | cstrMessage.Format(_T("保存轴 [%d] 参数成功!"), axisId); |
| | | SystemLogManager::getInstance().log(SystemLogManager::LogType::Operation, std::string(CT2A(cstrMessage))); |
| | | } |
| | |
| | | } |
| | | |
| | | AfxMessageBox(cstrMessage); |
| | | } |
| | | |
| | | void CAxisSettingsDlg::OnBnClickedButtonAxisUpdateUi() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | int axisId = getCurrentSelectedAxisID(); |
| | | if (axisId == -1) { |
| | | AfxMessageBox(_T("请选择一个有效的轴编号!")); |
| | | return; |
| | | } |
| | | |
| | | refreshAxisDetails(axisId); |
| | | refreshPositionDetails(axisId, m_currentPage); |
| | | } |
| | | |
| | | void CAxisSettingsDlg::OnBnClickedButtonAxisDetailSettings() |
| | | { |
| | | // TODO: 在此添加控件通知处理程序代码 |
| | | int nAxisId = getCurrentSelectedAxisID(); |
| | | if (nAxisId == -1) { |
| | | AfxMessageBox(_T("请选择一个有效的轴编号!")); |
| | | return; |
| | | } |
| | | |
| | | CAxisDetailSettingsDlg dlg(m_strRecipeName, nAxisId, this); |
| | | dlg.SetPLC(m_pPLC); |
| | | dlg.DoModal(); |
| | | |
| | | refreshAxisDetails(nAxisId); |
| | | refreshPositionDetails(nAxisId, m_currentPage); |
| | | } |
| | | |
| | | LRESULT CAxisSettingsDlg::OnUpdateDataToUI(WPARAM wParam, LPARAM lParam) |
| | |
| | | |
| | | // 更新Labels状态 |
| | | UpdateLabels(); |
| | | |
| | | // 更新定位点 |
| | | //refreshPositionDetails(getCurrentSelectedAxisID(), m_currentPage); |
| | | |
| | | // 更新不可写的定位点数据 |
| | | RecipeManager& recipeManager = RecipeManager::getInstance(); |
| | | for (int i = 0; i < AXIS_PAGE_SIZE; ++i) { |
| | | PositionRange position = recipeManager.getPositionByIndex(getCurrentSelectedAxisID(), m_currentPage, AXIS_PAGE_SIZE, 0); |
| | | if (position.isEnable) { |
| | | continue; |
| | | } |
| | | |
| | | CString positionName; |
| | | positionName.Format(_T("IDC_EDIT_AXIS_ANCHOR_POINT%d"), i + 1); |
| | | |
| | | CEdit* pPositionEdit = (CEdit*)GetDlgItem(FindIDByName(positionName)); |
| | | if (pPositionEdit) { |
| | | CString positionValue; |
| | | positionValue.Format(_T("%.3f"), position.range.currentValue); |
| | | pPositionEdit->GetWindowText(positionValue); |
| | | } |
| | | } |
| | | |
| | | // OPR按钮是否要闪烁或停止闪烁 |
| | | // 06.0和08.0 |
| | | if (m_nBtnsFlashState6 & 0x01) { |
| | | // 06.0 |
| | | if (!m_pBlBtns[BTN_JOG_OPR]->IsFlash()) { |
| | | m_pBlBtns[BTN_JOG_OPR]->Flash(1000); |
| | | m_pBlBtns[BTN_JOG_OPR]->Flash(500); |
| | | } |
| | | } |
| | | else if (m_nBtnsFlashState8 & 0x01) { |
| | |
| | | |
| | | if (m_nBtnsFlashState6 & v) { |
| | | if (!m_pBlBtns[BTN_POINT1]->IsFlash()) { |
| | | m_pBlBtns[BTN_POINT1]->Flash(1000); |
| | | m_pBlBtns[BTN_POINT1]->Flash(500); |
| | | } |
| | | } |
| | | else if (m_nBtnsFlashState8 & v) { |
| | |
| | | |
| | | if (m_nBtnsFlashState6 & (v << 1)) { |
| | | if (!m_pBlBtns[BTN_POINT2]->IsFlash()) { |
| | | m_pBlBtns[BTN_POINT2]->Flash(1000); |
| | | m_pBlBtns[BTN_POINT2]->Flash(500); |
| | | } |
| | | } |
| | | else if (m_nBtnsFlashState8 & (v << 1)) { |
| | |
| | | |
| | | if (m_nBtnsFlashState6 & (v << 2)) { |
| | | if (!m_pBlBtns[BTN_POINT3]->IsFlash()) { |
| | | m_pBlBtns[BTN_POINT3]->Flash(1000); |
| | | m_pBlBtns[BTN_POINT3]->Flash(500); |
| | | } |
| | | } |
| | | else if (m_nBtnsFlashState8 & (v << 2)) { |
| | |
| | | |
| | | if (m_nBtnsFlashState6 & (v << 3)) { |
| | | if (!m_pBlBtns[BTN_POINT4]->IsFlash()) { |
| | | m_pBlBtns[BTN_POINT4]->Flash(1000); |
| | | m_pBlBtns[BTN_POINT4]->Flash(500); |
| | | } |
| | | } |
| | | else if (m_nBtnsFlashState8 & (v << 3)) { |
| | |
| | | |
| | | if (m_nBtnsFlashState6 & (v << 4)) { |
| | | if (!m_pBlBtns[BTN_POINT5]->IsFlash()) { |
| | | m_pBlBtns[BTN_POINT5]->Flash(1000); |
| | | m_pBlBtns[BTN_POINT5]->Flash(500); |
| | | } |
| | | } |
| | | else if (m_nBtnsFlashState8 & (v << 4)) { |