mrDarker
2025-10-22 e8a27bb203fe2aff70390a5eca002d7438da9b0f
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
@@ -25,7 +25,7 @@
{
   m_nCurrentPage = 1;
   m_nTotalPages = 1;
   m_nRowsPerPage = 10;
   m_nRowsPerPage = 16;
   m_nCols = 6;
}
@@ -59,7 +59,7 @@
   // 计算页数
   m_nCurrentPage = 1;
   m_nTotalPages = (m_displayData.size() + m_nRowsPerPage - 1) / m_nRowsPerPage;
   m_nTotalPages = ((int)m_displayData.size() + m_nRowsPerPage - 1) / m_nRowsPerPage;
}
void CIOMonitoringDlg::SetPLC(CPLC* pPLC)
@@ -161,7 +161,7 @@
   ScreenToClient(&nextButtonRect);
   int buttonHeight = prevButtonRect.Height();     // 按钮的高度
   int topMargin = rect.Height() * 0.05;           // 顶部保留 5% 的高度
   int topMargin = int(rect.Height() * 0.05);      // 顶部保留 5% 的高度
   int bottomMargin = buttonHeight + topMargin;    // 底部保留按钮高度加间距
   int sideMargin = topMargin;                     // 左右间距与顶部间距相同
   int groupSpacing = 20;                          // 两组之间的间距
@@ -214,8 +214,8 @@
   // 创建动态控件
   CBLLabel* pStatic = new CBLLabel();
   DWORD style = WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE; // 确保垂直居中
   if (hasBorder) {
      style |= WS_BORDER; // 添加边框
   if (!hasBorder) {
      pStatic->DisableBorder();
   }
   pStatic->Create(text, style, CRect(x, y, x + width, y + height), this, id);
@@ -230,8 +230,12 @@
   pStatic->SetDynamicFont(TRUE);
   // 设置回调
   if (clickCallback) {
   UserManager& userManager = UserManager::getInstance();
   UserRole enRole = userManager.getCurrentUserRole();
   if (clickCallback && (enRole == UserRole::SuperAdmin || enRole == UserRole::Operator)) {
      pStatic->SetClickCallback(clickCallback);
      pStatic->SetRoundedCorners(TRUE, 5);
      pStatic->DisableBorder();
   }
   // 存储控件指针
@@ -270,6 +274,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 +284,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,19 +479,20 @@
   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;
            if (nOffset >= 0 && nOffset < nDataSize) {
            int nOffset = nAddress - inputStartAddr;
            if (nOffset >= 0 && nOffset < (int)nDataSize) {
               int byteIndex = nOffset / 8;
               int bitIndex = nOffset % 8;
               data.bInputStates = CToolUnits::getBit(pData[byteIndex], bitIndex);
@@ -491,17 +502,18 @@
   });
   // 读取输出数据
   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;
            if (nOffset >= 0 && nOffset < nDataSize) {
            int nOffset = nAddress - outputStartAddr;
            if (nOffset >= 0 && nOffset < (int)nDataSize) {
               int byteIndex = nOffset / 8;
               int bitIndex = nOffset % 8;
               data.bOutputStates = CToolUnits::getBit(pData[byteIndex], bitIndex);
@@ -523,11 +535,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;
         }
      }
   }
}
@@ -586,8 +606,8 @@
   }
   GetWindowRect(&dlgRect);
   int dlgWidth = dlgRect.Width() * 2;
   int dlgHeight = dlgRect.Height() * 2;
   int dlgWidth = dlgRect.Width() * 3;
   int dlgHeight = dlgRect.Height() * 3;
   if (dlgWidth > screenRect.Width()) {
      dlgWidth = screenRect.Width();
@@ -602,6 +622,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 +659,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 +674,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)