1.配方管理类中定位点添加标识符 2.axis设定读取不可写的定位点数据,并且刷新 3. 完善axis细部设定界面资源
已删除2个文件
已修改7个文件
1427 ■■■■ 文件已修改
SourceCode/Bond/BondEq/AxisSettingsDlg.cpp 1116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/AxisSettingsDlg.h 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEq.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/FileManager/RecipeManager.cpp 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/FileManager/RecipeManager.h 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/Resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisDetailSettingsDlg.cpp 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisDetailSettingsDlg.h 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/AxisSettingsDlg.cpp
ÎļþÒÑɾ³ý
SourceCode/Bond/BondEq/AxisSettingsDlg.h
ÎļþÒÑɾ³ý
SourceCode/Bond/BondEq/BondEq.rc
Binary files differ
SourceCode/Bond/BondEq/FileManager/RecipeManager.cpp
@@ -37,6 +37,8 @@
        axisInfo.number = axisNode.attribute("number").value();
        axisInfo.description = axisNode.attribute("description").value();
        axisInfo.startAddress = axisNode.attribute("start_address").value();
        axisInfo.maxPositioningSpeed = axisNode.attribute("maxPositioningSpeed").as_double();
        axisInfo.maxManualSpeed = axisNode.attribute("maxManualSpeed").as_double();
        // åŠ è½½ ValueRange å€¼
        axisInfo.jogDistance = ValueRange(
@@ -66,7 +68,9 @@
        );
        // åŠ è½½ PositionRange å€¼
        axisInfo.positioningPointCount = axisNode.child("Positions").attribute("positioningPointCount").as_int();
        for (auto positionNode : axisNode.child("Positions").children("Position")) {
            bool isEnable = positionNode.attribute("isEnable").as_bool();
            std::string description = positionNode.attribute("description").value();
            ValueRange positionRange(
                positionNode.attribute("min").as_double(),
@@ -74,7 +78,7 @@
                positionNode.attribute("current").as_double()
            );
            axisInfo.positions.emplace_back(PositionRange(description, positionRange));
            axisInfo.positions.emplace_back(PositionRange(isEnable, description, positionRange));
        }
        m_axes[axisInfo.id] = axisInfo;
@@ -111,6 +115,8 @@
        axisNode.append_attribute("number") = axisInfo.number.c_str();
        axisNode.append_attribute("description") = axisInfo.description.c_str();
        axisNode.append_attribute("start_address") = axisInfo.startAddress.c_str();
        axisNode.append_attribute("maxPositioningSpeed") = axisInfo.maxPositioningSpeed;
        axisNode.append_attribute("maxManualSpeed") = axisInfo.maxManualSpeed;
        // ä¿å­˜ ValueRange å€¼
        auto jog_distance = axisNode.append_child("jog_distance");
@@ -140,8 +146,10 @@
        // ä¿å­˜ PositionRange å€¼
        auto positionsNode = axisNode.append_child("Positions");
        positionsNode.append_attribute("positioningPointCount") = axisInfo.positioningPointCount;
        for (const auto& position : axisInfo.positions) {
            auto positionNode = positionsNode.append_child("Position");
            positionNode.append_attribute("isEnable") = position.isEnable;
            positionNode.append_attribute("description") = position.description.c_str();
            positionNode.append_attribute("min") = position.range.minValue;
            positionNode.append_attribute("max") = position.range.maxValue;
@@ -160,6 +168,9 @@
    for (int axisId = 1; axisId <= 12; ++axisId) {
        AxisInfo axisInfo;
        axisInfo.id = axisId;
        axisInfo.positioningPointCount = 25;
        axisInfo.maxPositioningSpeed = 100.0;
        axisInfo.maxManualSpeed = 100.0;
        axisInfo.number = "M100-M" + std::to_string(axisId);
        axisInfo.description = "Default_Axis" + std::to_string(axisId);
        axisInfo.startAddress = "ZR" + std::to_string(10000 + (axisId - 1) * 300);
@@ -172,10 +183,10 @@
        axisInfo.decelerationTime = ValueRange(1.0, 10.0, 1.0);
        // æ·»åŠ å®šä½ç‚¹å¹¶è®¾ç½®é»˜è®¤çš„æœ€å°å€¼å’Œæœ€å¤§å€¼
        for (int posId = 1; posId <= 25; ++posId) {
            double minPos = posId * 5.0;
            double maxPos = posId * 20.0;
            axisInfo.positions.emplace_back(PositionRange("Position " + std::to_string(posId), ValueRange(minPos, maxPos, posId * 10.0)));
        for (int posId = 0; posId < axisInfo.positioningPointCount; ++posId) {
            double minPos = (posId + 1) * 5.0;
            double maxPos = (posId + 1) * 20.0;
            axisInfo.positions.emplace_back(PositionRange(TRUE, "Position " + std::to_string(posId + 1), ValueRange(minPos, maxPos, (posId + 1) * 10.0)));
        }
        m_axes[axisId] = axisInfo;
@@ -195,7 +206,7 @@
    }
    // å¦‚果没有找到该轴,返回一个默认的无效 AxisInfo
    return AxisInfo{ -1, "", "", "", ValueRange(), ValueRange(), ValueRange(), ValueRange(), ValueRange(), {} };
    return AxisInfo{ -1, 0, 0.0, 0.0, "", "", "", ValueRange(), ValueRange(), ValueRange(), ValueRange(), ValueRange(), {} };
}
// æ›´æ–°è½´ä¿¡æ¯
SourceCode/Bond/BondEq/FileManager/RecipeManager.h
@@ -17,17 +17,21 @@
};
struct PositionRange {
    BOOL isEnable;            // æ˜¯å¦å¯ç”¨
    std::string description;  // å®šä½ç‚¹æè¿°
    ValueRange range;         // ä½ç½®çš„æœ€å°å€¼ã€æœ€å¤§å€¼å’Œå½“前值
    // æž„造函数初始化
    PositionRange(const std::string& desc = "", const ValueRange& r = ValueRange())
        : description(desc), range(r) {}
    PositionRange(BOOL b = TRUE, const std::string& desc = "", const ValueRange& r = ValueRange())
        :isEnable(b), description(desc), range(r) {}
};
// è½´ä¿¡æ¯ç»“构体
struct AxisInfo {
    int id;                                    // è½´ID
    int positioningPointCount;                 // å®šä½ç‚¹æ•°
    double maxPositioningSpeed;                // å®šä½é€Ÿåº¦ä¸Šé™
    double maxManualSpeed;                     // æ‰‹åŠ¨é€Ÿåº¦ä¸Šé™
    std::string number;                        // è½´ç¼–号
    std::string description;                   // è½´æè¿°
    std::string startAddress;                  // èµ·å§‹åœ°å€
SourceCode/Bond/BondEq/Resource.h
Binary files differ
SourceCode/Bond/BondEq/View/AxisDetailSettingsDlg.cpp
@@ -32,16 +32,70 @@
    m_pPLC = pPLC;
}
void CAxisDetailSettingsDlg::UpdateAxisDetailSettings()
{
    // èŽ·å–è½´æ•°æ®
    RecipeManager& recipeManager = RecipeManager::getInstance();
    auto axisDetails = recipeManager.getAxis(m_nAxisNO);
    auto formatDouble = [](double value) -> CString {
        CString str;
        str.Format(_T("%.3f"), value);
        return str;
    };
    auto formatInt = [](int value) -> CString {
        CString str;
        str.Format(_T("%d"), value);
        return str;
    };
    m_staticAxisNO.SetWindowText(CString(axisDetails.number.c_str()));                                // è½´ç¼–号
    m_staticAxisDescription.SetWindowText(CString(axisDetails.description.c_str()));                // è½´æè¿°
    m_staticStartAddress.SetWindowText(CString(axisDetails.startAddress.c_str()));                    // èµ·å§‹åœ°å€
    GetDlgItem(IDC_EDIT_AXIS_POSITIONING_SPEED_LIMIT)->SetWindowText(formatDouble(axisDetails.maxPositioningSpeed));    // å®šä½é€Ÿåº¦ä¸Šé™
    GetDlgItem(IDC_EDIT_AXIS_JOG_SPEED_LIMIT)->SetWindowText(formatDouble(axisDetails.maxManualSpeed));                    // æ‰‹åŠ¨é€Ÿåº¦ä¸Šé™
    GetDlgItem(IDC_EDIT_AXIS_POSITIONING_POINTS)->SetWindowText(formatInt(axisDetails.positioningPointCount));            // å®šä½ç‚¹æ•°
    // å¾®åŠ¨é‡
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_MICROMENTUM_MIN)->SetWindowText(formatDouble(axisDetails.jogDistance.minValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_MICROMENTUM)->SetWindowText(formatDouble(axisDetails.jogDistance.currentValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_MICROMENTUM_MAX)->SetWindowText(formatDouble(axisDetails.jogDistance.maxValue));
    // æ‰‹åŠ¨é€Ÿåº¦
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_POS_MIN)->SetWindowText(formatDouble(axisDetails.manualSpeed.minValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_POS)->SetWindowText(formatDouble(axisDetails.manualSpeed.currentValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_POS_MAX)->SetWindowText(formatDouble(axisDetails.manualSpeed.maxValue));
    // è‡ªåŠ¨é€Ÿåº¦
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_AUTO_SPEED_MIN)->SetWindowText(formatDouble(axisDetails.autoSpeed.minValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_AUTO_SPEED)->SetWindowText(formatDouble(axisDetails.autoSpeed.currentValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_AUTO_SPEED_MAX)->SetWindowText(formatDouble(axisDetails.autoSpeed.maxValue));
    // åŠ é€Ÿæ—¶é—´
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_ACCE_TIME_MIN)->SetWindowText(formatDouble(axisDetails.accelerationTime.minValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_ACCE_TIME)->SetWindowText(formatDouble(axisDetails.accelerationTime.currentValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_ACCE_TIME_MAX)->SetWindowText(formatDouble(axisDetails.accelerationTime.maxValue));
    // å‡é€Ÿæ—¶é—´
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_DECE_TIME_MIN)->SetWindowText(formatDouble(axisDetails.decelerationTime.minValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_DECE_TIME)->SetWindowText(formatDouble(axisDetails.decelerationTime.currentValue));
    GetDlgItem(IDC_EDIT_AXIS_MODITFY_DECE_TIME_MAX)->SetWindowText(formatDouble(axisDetails.decelerationTime.maxValue));
}
void CAxisDetailSettingsDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    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_CUSTOM_AXIS_ANCHOR_POINT, m_gridAxisDetailSettings);
}
BEGIN_MESSAGE_MAP(CAxisDetailSettingsDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON_AXIS_DETAIL_SETTINGS_SAVE, &CAxisDetailSettingsDlg::OnBnClickedButtonAxisDetailSettingsSave)
END_MESSAGE_MAP()
@@ -67,10 +121,14 @@
        return FALSE;
    }
    m_staticAxisNO.SetWindowText(CString(axisDetails.number.c_str()));                                // è½´ç¼–号
    m_staticAxisDescription.SetWindowText(CString(axisDetails.description.c_str()));                // è½´æè¿°
    m_staticStartAddress.SetWindowText(CString(axisDetails.startAddress.c_str()));                    // èµ·å§‹åœ°å€
    UpdateAxisDetailSettings();
    return TRUE;  // return TRUE unless you set the focus to a control
    // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
void CAxisDetailSettingsDlg::OnBnClickedButtonAxisDetailSettingsSave()
{
    // TODO: åœ¨æ­¤æ·»åŠ æŽ§ä»¶é€šçŸ¥å¤„ç†ç¨‹åºä»£ç 
    EndDialog(IDOK);
}
SourceCode/Bond/BondEq/View/AxisDetailSettingsDlg.h
@@ -1,5 +1,6 @@
#pragma once
#include "afxdialogex.h"
#include "GridCtrl.h"
// CAxisDetailSettingsDlg å¯¹è¯æ¡†
@@ -21,6 +22,10 @@
#endif
private:
    void UpdateAxisDetailSettings();
private:
    CPLC* m_pPLC;
    int m_nInitialWidth;
    int m_nInitialHeight;
@@ -31,9 +36,11 @@
    // æŽ§ä»¶
    CStatic m_staticAxisNO, m_staticAxisDescription, m_staticStartAddress;
    CGridCtrl m_gridAxisDetailSettings;
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    virtual BOOL OnInitDialog();
    afx_msg void OnBnClickedButtonAxisDetailSettingsSave();
    DECLARE_MESSAGE_MAP()
};
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp
@@ -277,6 +277,7 @@
    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;
    }
@@ -353,12 +354,22 @@
            // æ˜¾ç¤ºå®šä½ç‚¹çš„当前位置
            CString value;
            value.Format(_T("%.3f"), position.range.currentValue);
            if (pPositionCtrl) pPositionCtrl->SetWindowText(value);
            if (pPositionCtrl) {
                pPositionCtrl->SetWindowText(value);
                pPositionCtrl->EnableWindow(position.isEnable);
            }
        }
        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);
            }
        }
    }
}
@@ -455,7 +466,7 @@
        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);
@@ -464,7 +475,7 @@
            CEdit* pPositionEdit = (CEdit*)GetDlgItem(FindIDByName(positionName));
            if (pDescriptionEdit && pPositionEdit) {
                CString description, positionValue, minValue, maxValue;
                CString description, positionValue;
                // èŽ·å–æŽ§ä»¶ä¸­çš„æ–‡æœ¬
                pDescriptionEdit->GetWindowText(description);
@@ -770,19 +781,17 @@
            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;        // å‡é€Ÿæ—¶é—´
            // è¯»å–定位点数据
            //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;
            //}
            //RecipeManager::getInstance().updateAxis(axisInfo);
            AxisInfo axisInfo = RecipeManager::getInstance().getAxis(nAxisId);
            for (int i = 0; i < axisInfo.positions.size(); ++i) {
                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);
            PostMessage(ID_MSG_UPDATA_DATA_TO_UI);
        }
@@ -1290,20 +1299,16 @@
    if (ret != IDOK) {
        return;
    }
    writeAxisDataToPLC(axisId);
    //Sleep(2000);
    //refreshAxisDetails(axisId);
    //refreshPositionDetails(axisId, m_currentPage);
    updateDataFromUI(axisId);
    if (RecipeManager::getInstance().saveRecipe(std::string(CT2A(m_strRecipeName)))) {
        cstrMessage.Format(_T("保存轴 [%d] å‚数到文件成功!"), axisId);
        SystemLogManager::getInstance().log(SystemLogManager::LogType::Operation, std::string(CT2A(cstrMessage)));
        writeAxisDataToPLC(axisId);
        updateDataFromUI(axisId);
        cstrMessage.Format(_T("保存轴 [%d] å‚数成功!"), axisId);
        SystemLogManager::getInstance().log(SystemLogManager::LogType::Operation, std::string(CT2A(cstrMessage)));
    }
    else {
        cstrMessage.Format(_T("保存轴 [%d] å‚数到文件失败!"), axisId);
        cstrMessage.Format(_T("保存轴 [%d] å‚数失败!"), axisId);
        SystemLogManager::getInstance().log(SystemLogManager::LogType::Error, std::string(CT2A(cstrMessage)));
    }
@@ -1335,6 +1340,9 @@
    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)
@@ -1349,6 +1357,25 @@
    // æ›´æ–°Labels状态
    UpdateLabels();
    // æ›´æ–°ä¸å¯å†™çš„定位点数据
    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