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)