LAPTOP-T815PCOQ\25526
2024-11-25 66786f85648c3c81b932decba339ffb359a7bf25
1.完成初版轴管理类 2.实现基本的轴设定界面的交互
已修改7个文件
267 ■■■■■ 文件已修改
SourceCode/Bond/BondEq/BondEq.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEq.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEqDlg.cpp 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisSettingsDlg.h 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/stdafx.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/Config/BondEq.db 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/BondEq.rc
Binary files differ
SourceCode/Bond/BondEq/BondEq.vcxproj
@@ -217,6 +217,7 @@
    <ClInclude Include="Common.h" />
    <ClInclude Include="Configuration.h" />
    <ClInclude Include="CPanelProject.h" />
    <ClInclude Include="DBManager\AxisManager.h" />
    <ClInclude Include="DBManager\SystemLogManager.h" />
    <ClInclude Include="DBManager\UserManager.h" />
    <ClInclude Include="EQState.h" />
@@ -280,6 +281,7 @@
    <ClCompile Include="CProjectPageRemoteEqs.cpp" />
    <ClCompile Include="Configuration.cpp" />
    <ClCompile Include="CPanelProject.cpp" />
    <ClCompile Include="DBManager\AxisManager.cpp" />
    <ClCompile Include="DBManager\SystemLogManager.cpp" />
    <ClCompile Include="DBManager\UserManager.cpp" />
    <ClCompile Include="EQState.cpp" />
SourceCode/Bond/BondEq/BondEqDlg.cpp
@@ -191,13 +191,36 @@
    // 初始化运行日志表
    try {
        if (!logManager.initializeLogTable()) {
            AfxMessageBox("初始化系统日志表失败!");
            AfxMessageBox("初始化系统日志模块失败!");
            return FALSE;
        }
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("初始化系统日志表失败:%s"), CString(ex.what()));
        errorMsg.Format(_T("初始化系统日志模块失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
        return FALSE;
    }
    // 设置轴设定模块的数据库连接
    AxisManager& axisManager = AxisManager::getInstance();
    axisManager.setDatabase(db.get());
    // 初始化轴设定表
    try {
        if (!axisManager.initializeTables()) {
            AfxMessageBox("创建轴设定表失败!");
            return FALSE;
        }
        if (!axisManager.initializeDefaultData()) {
            AfxMessageBox("初始化轴设定默认数据失败!");
            return FALSE;
        }
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("初始化轴设定模块失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
        return FALSE;
    }
SourceCode/Bond/BondEq/View/AxisSettingsDlg.cpp
@@ -48,6 +48,41 @@
    DDX_Control(pDX, IDC_STATIC_AXIS_TEST_READY, m_staticReady);
    DDX_Control(pDX, IDC_STATIC_AXIS_TEST_BUSY, m_staticBusy);
    DDX_Control(pDX, IDC_STATIC_AXIS_TEST_ERR, m_staticErr);
    DDX_Control(pDX, IDC_COMBO_AXIS_NAME, m_comboAxisNO);
    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)
{
    // 将资源文件中定义的控件名称和 ID 加载到一个映射中
    static const std::map<CString, UINT> controlIdMap = {
        {"IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP1", IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP1},
        {"IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP2", IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP2},
        {"IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP3", IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP3},
        {"IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP4", IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP4},
        {"IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP5", IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP5},
        {"IDC_EDIT_AXIS_ANCHOR_POINT1", IDC_EDIT_AXIS_ANCHOR_POINT1},
        {"IDC_EDIT_AXIS_ANCHOR_POINT2", IDC_EDIT_AXIS_ANCHOR_POINT2},
        {"IDC_EDIT_AXIS_ANCHOR_POINT3", IDC_EDIT_AXIS_ANCHOR_POINT3},
        {"IDC_EDIT_AXIS_ANCHOR_POINT4", IDC_EDIT_AXIS_ANCHOR_POINT4},
        {"IDC_EDIT_AXIS_ANCHOR_POINT5", IDC_EDIT_AXIS_ANCHOR_POINT5}
        // 可以继续添加其他控件名称和 ID
    };
    // 查找控件名称是否在映射中
    auto it = controlIdMap.find(strControlID);
    if (it != controlIdMap.end()) {
        return it->second;
    }
    return 0;
}
CFont* CAxisSettingsDlg::GetOrCreateFont(int nFontSize)
@@ -155,6 +190,128 @@
    label.UpdateWindow();            // 立即刷新
}
void CAxisSettingsDlg::initializeAxisIDCombo()
{
    // 获取所有轴的轴NO
    auto axisNumbers = AxisManager::getInstance().getUsedAxisIds();
    // 清空下拉框
    m_comboAxisNO.ResetContent();
    // 填充数据到下拉框
    for (const auto& axisID : axisNumbers) {
        CString axisCString;
        axisCString.Format(_T("%d"), axisID);
        m_comboAxisNO.AddString(axisCString);
    }
    // 默认选择第一项
    if (m_comboAxisNO.GetCount() > 0) {
        m_comboAxisNO.SetCurSel(0);
    }
}
void CAxisSettingsDlg::refreshAxisDetails()
{
    // 获取当前选中的轴ID
    int currentIndex = m_comboAxisNO.GetCurSel();
    if (currentIndex == CB_ERR) {
        AfxMessageBox(_T("请选择一个有效的轴编号!"));
        return;
    }
    CString axisIDStr;
    m_comboAxisNO.GetLBText(currentIndex, axisIDStr);
    int axisId = _ttoi(axisIDStr);
    // 获取轴信息
    auto axisDetails = AxisManager::getInstance().getAxis(axisId);
    if (axisDetails.empty()) {
        AfxMessageBox(_T("未找到轴信息!"));
        return;
    }
    // 格式化浮点数为 3 位小数的 CString
    auto formatDouble = [](const std::string& value) -> CString {
        char buffer[32];
        snprintf(buffer, sizeof(buffer), "%.3f", std::stod(value));
        return CString(buffer);
    };
    // 刷新界面控件数据
    m_staticAxisNO.SetWindowText(CString(axisDetails[1].c_str()));            // 轴NO
    m_staticAxisDescription.SetWindowText(CString(axisDetails[2].c_str())); // 轴描述
    m_staticStartAddress.SetWindowText(CString(axisDetails[3].c_str()));    // 起始地址
    m_editJogDistance.SetWindowText(formatDouble(axisDetails[4]));            // 微动量
    m_editManualSpeed.SetWindowText(formatDouble(axisDetails[5]));            // 手动速度
    m_editAutoSpeed.SetWindowText(formatDouble(axisDetails[8]));            // 自动速度
    m_editAccelerationTime.SetWindowText(formatDouble(axisDetails[11]));    // 加速时间
    m_editDecelerationTime.SetWindowText(formatDouble(axisDetails[12]));    // 减速时间
}
void CAxisSettingsDlg::refreshPositionDetails(int pageNumber)
{
    // 每页显示的定位点数量
    const int pageSize = 5;
    // 获取当前选中的轴ID
    int currentIndex = m_comboAxisNO.GetCurSel();
    if (currentIndex == CB_ERR) {
        AfxMessageBox(_T("请选择一个有效的轴编号!"));
        return;
    }
    CString axisIDStr;
    m_comboAxisNO.GetLBText(currentIndex, axisIDStr);
    int axisId = _ttoi(axisIDStr);
    // 获取定位点数据
    auto positions = AxisManager::getInstance().getPositions(axisId, pageNumber, pageSize);
    for (int i = 0; i < pageSize; ++i) {
        // 动态构造控件名称
        CString descriptionName;
        CString positionName;
        // IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP1;
        // IDC_EDIT_AXIS_ANCHOR_POINT1;
        descriptionName.Format(_T("IDC_EDIT_AXIS_ANCHOR_POINT_DESCRIP%d"), i + 1);
        positionName.Format(_T("IDC_EDIT_AXIS_ANCHOR_POINT%d"), i + 1);
        // 获取控件指针
        UINT unDescription = FindIDByName(descriptionName);
        UINT unPosition = FindIDByName(positionName);
        TRACE("CAxisSettingsDlg::refreshPositionDetails %unDescription[%d], unPosition[%d]\n", unDescription, unPosition);
        if (unDescription == 0 || unPosition == 0) {
            continue;
        }
        CWnd* pDescription = GetDlgItem(unDescription);
        CWnd* pPosition = GetDlgItem(unPosition);
        if (i < positions.size()
            && !positions[i][2].empty()
            && !positions[i][3].empty()) {
            // 有数据,刷新描述和位置
            CString description = CString(positions[i][2].c_str()); // 定位点描述
            CString positionValue;
            // 保留3位小数
            char buffer[32];
            snprintf(buffer, sizeof(buffer), "%.3f", std::stod(positions[i][3]));
            positionValue = CString(buffer);
            if (pDescription) pDescription->SetWindowText(description);
            if (pPosition) pPosition->SetWindowText(positionValue);
        }
        else {
            // 无数据,清空控件内容
            if (pDescription) pDescription->SetWindowText(_T(""));
            if (pPosition) pPosition->SetWindowText(_T(""));
        }
    }
}
BEGIN_MESSAGE_MAP(CAxisSettingsDlg, CDialogEx)
    ON_BN_CLICKED(IDC_BUTTON_AXIS_LAST, &CAxisSettingsDlg::OnBnClickedButtonAxisLast)
@@ -173,6 +330,7 @@
    ON_BN_CLICKED(IDC_BUTTON_AXIS_TEST_JOG_ADD, &CAxisSettingsDlg::OnBnClickedButtonAxisTestJogAdd)
    ON_BN_CLICKED(IDC_BUTTON_AXIS_TEST_JOG_SUB, &CAxisSettingsDlg::OnBnClickedButtonAxisTestJogSub)
    ON_BN_CLICKED(IDC_BUTTON_AXIS_TEST_STOP, &CAxisSettingsDlg::OnBnClickedButtonAxisTestStop)
    ON_CBN_SELCHANGE(IDC_COMBO_AXIS_NAME, &CAxisSettingsDlg::OnSelchangeComboAxisName)
    ON_WM_SIZE()
    ON_WM_CTLCOLOR()
    ON_WM_SIZING()
@@ -198,6 +356,17 @@
        pLabel->SetTextColor(RGB(255, 255, 255));
        pLabel->SetAlignment(AlignCenter);
        pLabel->SetDynamicFont(TRUE);
    }
    try {
        initializeAxisIDCombo();
        refreshAxisDetails();
        refreshPositionDetails(1);
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("初始化控件失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
    }
    CRect screenRect, dlgRect, clientRect;
@@ -306,26 +475,66 @@
void CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPointGroup1()
{
    // TODO: 在此添加控件通知处理程序代码
    try {
        refreshPositionDetails(1);
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("刷新定位组1失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
    }
}
void CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPointGroup2()
{
    // TODO: 在此添加控件通知处理程序代码
    try {
        refreshPositionDetails(2);
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("刷新定位组2失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
    }
}
void CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPointGroup3()
{
    // TODO: 在此添加控件通知处理程序代码
    try {
        refreshPositionDetails(3);
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("刷新定位组3失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
    }
}
void CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPointGroup4()
{
    // TODO: 在此添加控件通知处理程序代码
    try {
        refreshPositionDetails(4);
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("刷新定位组4失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
    }
}
void CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPointGroup5()
{
    // TODO: 在此添加控件通知处理程序代码
    try {
        refreshPositionDetails(5);
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("刷新定位组5失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
    }
}
void CAxisSettingsDlg::OnBnClickedButtonAxisAnchorPoint1()
@@ -373,6 +582,20 @@
    // TODO: 在此添加控件通知处理程序代码
}
void CAxisSettingsDlg::OnSelchangeComboAxisName()
{
    // TODO: 在此添加控件通知处理程序代码
    try {
        refreshAxisDetails();
        refreshPositionDetails(1);
    }
    catch (const std::exception& ex) {
        CString errorMsg;
        errorMsg.Format(_T("刷新控件失败:%s"), CString(ex.what()));
        AfxMessageBox(errorMsg, MB_ICONERROR);
    }
}
void CAxisSettingsDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (TIMER_READ_PLC_DATA == nIDEvent) {
SourceCode/Bond/BondEq/View/AxisSettingsDlg.h
@@ -22,12 +22,16 @@
#endif
private:
    UINT FindIDByName(const CString& strControlID);
    CFont* GetOrCreateFont(int nFontSize);
    void SetDefaultFont();
    void AdjustControls(float dScaleX, float dScaleY);
    void AdjustControlFont(CWnd* pWnd, int nWidth, int nHeight);
    void AdjustLabelFont(CBLLabel& label);
    void SetStatusColor(CBLLabel& label, BOOL bStatus);
    void initializeAxisIDCombo();
    void refreshAxisDetails();
    void refreshPositionDetails(int pageNumber);
private:
    CPLC* m_pPLC;
@@ -41,6 +45,15 @@
    CBLLabel m_staticReady;
    CBLLabel m_staticBusy;
    CBLLabel m_staticErr;
    CComboBox m_comboAxisNO;
    CStatic m_staticAxisNO;
    CStatic m_staticAxisDescription;
    CStatic m_staticStartAddress;
    CEdit m_editManualSpeed;
    CEdit m_editAutoSpeed;
    CEdit m_editAccelerationTime;
    CEdit m_editDecelerationTime;
    CEdit m_editJogDistance;
    std::map<int, CRect> m_mapCtrlLayouts;
    std::map<int, CFont*> m_mapFonts;
@@ -66,6 +79,7 @@
    afx_msg void OnBnClickedButtonAxisTestJogAdd();
    afx_msg void OnBnClickedButtonAxisTestJogSub();
    afx_msg void OnBnClickedButtonAxisTestStop();
    afx_msg void OnSelchangeComboAxisName();
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    DECLARE_MESSAGE_MAP()
};
SourceCode/Bond/BondEq/stdafx.h
@@ -49,6 +49,7 @@
// 单例模式的数据库管理类
#include "UserManager.h"
#include "AxisManager.h"
#include "SystemLogManager.h"
// 控件样式
SourceCode/Bond/x64/Debug/Config/BondEq.db
Binary files differ