1.恢复原前一页下一页按钮禁用状态变化;
2.修复读PLC数据时如超时回调,窗口不存在会造成闪退的问题;
已修改2个文件
51 ■■■■ 文件已修改
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/IOMonitoringDlg.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
@@ -230,7 +230,9 @@
    pStatic->SetDynamicFont(TRUE);
    // 设置回调
    if (clickCallback) {
    UserManager& userManager = UserManager::getInstance();
    UserRole enRole = userManager.getCurrentUserRole();
    if (clickCallback && (enRole == UserRole::SuperAdmin || enRole == UserRole::Operator)) {
        pStatic->SetClickCallback(clickCallback);
    }
@@ -270,6 +272,8 @@
    int startIndex = (m_nCurrentPage - 1) * m_nRowsPerPage;
    int endIndex = min(startIndex + m_nRowsPerPage, static_cast<int>(m_displayData.size()));
    m_inputStates.clear();
    m_outputStates.clear();
    m_inputPLCAddresses.clear();
    m_outputPLCAddresses.clear();
@@ -278,6 +282,10 @@
        if (startIndex + i < endIndex) {
            const auto& data = m_displayData[startIndex + i];
            // 添加状态到容器中
            m_inputStates.push_back(FALSE);        // 0 列
            m_outputStates.push_back(FALSE);    // 3 列
            // 添加 PLC 地址到容器中
            m_inputPLCAddresses.push_back(CString(data.inputAddress.c_str()));        // 1 列
@@ -469,18 +477,19 @@
    auto startData = m_displayData.front();
    auto endData = m_displayData.back();
    MC::SOFT_COMPONENT startSoftComponent, endSoftComponent;
    int startAddr, endAddr;
    ParsePLCAddress(CString(startData.inputAddress.c_str()), startSoftComponent, startAddr);
    ParsePLCAddress(CString(endData.inputAddress.c_str()), endSoftComponent, endAddr);
    int inputStartAddr, inputEndAddr;
    ParsePLCAddress(CString(startData.inputAddress.c_str()), startSoftComponent, inputStartAddr);
    ParsePLCAddress(CString(endData.inputAddress.c_str()), endSoftComponent, inputEndAddr);
    ASSERT(startSoftComponent == endSoftComponent);
    // 读取输入数据
    ReadPLCData(startSoftComponent, startAddr, endAddr, [this, startAddr](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
    ReadPLCData(startSoftComponent, inputStartAddr, inputEndAddr, [this, inputStartAddr](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
        if (!::IsWindow(m_hWnd)) return;
        for (auto& data : m_displayData) {
            int nAddress;
            MC::SOFT_COMPONENT enComponent;
            if (ParsePLCAddress(CString(data.inputAddress.c_str()), enComponent, nAddress)) {
                int nOffset = nAddress - startAddr;
                int nOffset = nAddress - inputStartAddr;
                if (nOffset >= 0 && nOffset < nDataSize) {
                    int byteIndex = nOffset / 8;
                    int bitIndex = nOffset % 8;
@@ -491,16 +500,17 @@
    });
    // 读取输出数据
    int startAddr2, endAddr2;
    ParsePLCAddress(CString(startData.outputAddress.c_str()), startSoftComponent, startAddr2);
    ParsePLCAddress(CString(endData.outputAddress.c_str()), endSoftComponent, endAddr2);
    int outputStartAddr, outputEndAddr;
    ParsePLCAddress(CString(startData.outputAddress.c_str()), startSoftComponent, outputStartAddr);
    ParsePLCAddress(CString(endData.outputAddress.c_str()), endSoftComponent, outputEndAddr);
    ASSERT(startSoftComponent == endSoftComponent);
    ReadPLCData(startSoftComponent, startAddr2, endAddr2, [this, startAddr2](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
    ReadPLCData(startSoftComponent, outputStartAddr, outputEndAddr, [this, outputStartAddr](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
        if (!::IsWindow(m_hWnd)) return;
        for (auto& data : m_displayData) {
            int nAddress;
            MC::SOFT_COMPONENT enComponent;
            if (ParsePLCAddress(CString(data.outputAddress.c_str()), enComponent, nAddress)) {
                int nOffset = nAddress - startAddr2;
                int nOffset = nAddress - outputStartAddr;
                if (nOffset >= 0 && nOffset < nDataSize) {
                    int byteIndex = nOffset / 8;
                    int bitIndex = nOffset % 8;
@@ -523,11 +533,19 @@
        if (startIndex + i < endIndex) {
            const auto& data = m_displayData[startIndex + i];
            // 设置内容和背景颜色
            if (m_inputStates[i] != data.bInputStates)
            {
            m_staticControls[row * m_nCols + 0]->SetText(data.bInputStates ? _T("ON") : _T("OFF"));
            m_staticControls[row * m_nCols + 0]->SetBkColor(data.bInputStates ? RGB(0, 255, 0) : RGB(255, 0, 0));
                m_inputStates[i] = data.bInputStates;
            }
            if (m_outputStates[i] != data.bOutputStates)
            {
            m_staticControls[row * m_nCols + 3]->SetText(data.bOutputStates ? _T("ON") : _T("OFF"));
            m_staticControls[row * m_nCols + 3]->SetBkColor(data.bOutputStates ? RGB(0, 255, 0) : RGB(255, 0, 0));
                m_outputStates[i] = data.bOutputStates;
            }
        }
    }
}
@@ -603,6 +621,9 @@
    CreateDynamicControls();
    DisplayCurrentPage();
    GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurrentPage > 1);
    GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurrentPage < m_nTotalPages);
    SetTimer(TIMER_READ_PLC_DATA, 500, nullptr);
    SetTimer(TIMER_READ_UPDATE, 200, nullptr);
@@ -636,6 +657,9 @@
    else {
        AfxMessageBox(_T("已经是第一页!"));
    }
    GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurrentPage > 1);
    GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurrentPage < m_nTotalPages);
}
void CIOMonitoringDlg::OnBnClickedButtonNextPage()
@@ -648,6 +672,9 @@
    else {
        AfxMessageBox(_T("已经是最后一页!"));
    }
    GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurrentPage > 1);
    GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurrentPage < m_nTotalPages);
}
LRESULT CIOMonitoringDlg::OnIoClicked(WPARAM wParam, LPARAM lParam)
SourceCode/Bond/BondEq/View/IOMonitoringDlg.h
@@ -53,6 +53,8 @@
    std::map<int, CFont*> m_mapFonts;        // 字体映射
    std::map<int, CRect> m_mapCtrlLayouts;    // 控件布局映射
    std::vector<IOData> m_displayData;        // 当前显示的数据
    std::vector<BOOL> m_inputStates;        // 输入状态
    std::vector<BOOL> m_outputStates;        // 输出状态
    std::vector<CString> m_inputPLCAddresses;  // 存储 1 列 PLC 地址
    std::vector<CString> m_outputPLCAddresses; // 存储 4 列 PLC 地址