From a2e03f3ddd4809b2c3915883d9b98bc56196f471 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 05 十二月 2024 09:13:22 +0800
Subject: [PATCH] 1.恢复原前一页下一页按钮禁用状态变化; 2.修复读PLC数据时如超时回调,窗口不存在会造成闪退的问题;
---
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++---------------
SourceCode/Bond/BondEq/View/IOMonitoringDlg.h | 2 ++
2 files changed, 44 insertions(+), 15 deletions(-)
diff --git a/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp b/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
index ad1e83d..d72dd77 100644
--- a/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
+++ b/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];
// 璁剧疆鍐呭鍜岃儗鏅鑹�
- 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));
+ 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;
+ }
- 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));
+ 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)
diff --git a/SourceCode/Bond/BondEq/View/IOMonitoringDlg.h b/SourceCode/Bond/BondEq/View/IOMonitoringDlg.h
index 6c75c0d..5c04590 100644
--- a/SourceCode/Bond/BondEq/View/IOMonitoringDlg.h
+++ b/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 鍦板潃
--
Gitblit v1.9.3