LAPTOP-SNT8I5JK\Boounion
2024-12-02 df0863b2c29fa227d186e6b8aeb4a856dcae12f3
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
@@ -5,6 +5,7 @@
#include "BondEq.h"
#include "afxdialogex.h"
#include "IOMonitoringDlg.h"
#include "ToolUnits.h"
#define TIMER_INIT            1
#define TIMER_READ_PLC_DATA      2
@@ -53,6 +54,12 @@
   // 计算页数
   m_nCurrentPage = 1;
   m_nTotalPages = (m_displayData.size() + m_nRowsPerPage - 1) / m_nRowsPerPage;
}
void CIOMonitoringDlg::SetPLC(CPLC* pPLC)
{
   ASSERT(pPLC);
   m_pPLC = pPLC;
}
CFont* CIOMonitoringDlg::GetOrCreateFont(int nFontSize)
@@ -185,13 +192,33 @@
         CString currentText;
         pControl->GetWindowText(currentText);
         BOOL bOn = FALSE;
         if (currentText == _T("OFF")) {
            pControl->SetBkColor(RGB(0, 255, 0)); // 绿色背景
            pControl->SetText(_T("ON"));          // 更新文本为 ON
            //pControl->SetBkColor(RGB(0, 255, 0)); // 绿色背景
            //pControl->SetText(_T("ON"));          // 更新文本为 ON
            bOn = TRUE;
         }
         else {
            pControl->SetBkColor(RGB(255, 0, 0)); // 红色背景
            pControl->SetText(_T("OFF"));         // 更新文本为 OFF
            //pControl->SetBkColor(RGB(255, 0, 0)); // 红色背景
            //pControl->SetText(_T("OFF"));         // 更新文本为 OFF
            bOn = FALSE;
         }
         pControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 4]);
         pControl->GetWindowText(currentText);
         int nAddress;
         MC::SOFT_COMPONENT component;
         if (ParsePLCAddress(currentText, component, nAddress) && m_pPLC) {
            TRACE("地址解析成功: %s\n", currentText);
            m_pPLC->writeBit(component, nAddress, bOn, [](IMcChannel* pChannel, int addr, DWORD value, int flag) {
               if (flag == 0) {
                  TRACE("写入成功: 地址: %d, 值: %lu\n", addr, value);
               }
               else {
                  TRACE("写入失败: 地址: %d, 错误码: %d\n", addr, flag);
               }
            });
         }
      });
      x += colWidthSmall;
@@ -291,23 +318,118 @@
   m_staticControls.clear();
}
void CIOMonitoringDlg::UpdatePLCStates()
bool CIOMonitoringDlg::ParsePLCAddress(const CString& address, MC::SOFT_COMPONENT& component, int& addr)
{
   // 随机值模拟
   for (size_t i = 0; i < m_inputPLCAddresses.size(); ++i) {
      // 模拟获取输入状态
      bool inputState = (rand() % 2 == 0); // 偶尔为 true/false
      auto* inputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 0]);
      inputControl->SetBkColor(inputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
      inputControl->SetText(inputState ? _T("ON") : _T("OFF"));
   if (address.GetLength() < 2) {
      return false;
   }
   for (size_t i = 0; i < m_outputPLCAddresses.size(); ++i) {
      // 模拟获取输出状态
      bool outputState = (rand() % 2 == 0); // 偶尔为 true/false
      auto* outputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]);
      outputControl->SetBkColor(outputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
      outputControl->SetText(outputState ? _T("ON") : _T("OFF"));
   // 提取组件类型(第一个字符)
   TCHAR componentChar = address[0];
   switch (componentChar) {
   case 'D':
      component = MC::SOFT_COMPONENT::D;
      break;
   case 'M':
      component = MC::SOFT_COMPONENT::M;
      break;
   case 'X':
      component = MC::SOFT_COMPONENT::X;
      break;
   case 'Y':
      component = MC::SOFT_COMPONENT::Y;
      break;
   default:
      return false;
   }
   CString hexAddress = address.Mid(1);
   addr = _tcstoul(hexAddress, nullptr, 16);
   return true;
}
void CIOMonitoringDlg::UpdatePLCStates()
{
   // 示例:从 PLC 获取值,这里用随机值模拟
   //for (size_t i = 0; i < m_inputPLCAddresses.size(); ++i) {
   //   // 模拟获取输入状态
   //   bool inputState = (rand() % 2 == 0); // 偶尔为 true/false
   //   auto* inputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 0]);
   //   inputControl->SetBkColor(inputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
   //   inputControl->SetText(inputState ? _T("ON") : _T("OFF"));
   //}
   //for (size_t i = 0; i < m_outputPLCAddresses.size(); ++i) {
   //   // 模拟获取输出状态
   //   bool outputState = (rand() % 2 == 0); // 偶尔为 true/false
   //   auto* outputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]);
   //   outputControl->SetBkColor(outputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
   //   outputControl->SetText(outputState ? _T("ON") : _T("OFF"));
   //}
   // 输入地址的读取
   if (!m_inputPLCAddresses.empty()) {
      // 获取起始地址和长度
      CString startAddressStr = m_inputPLCAddresses.front();
      CString endAddressStr = m_inputPLCAddresses.back();
      MC::SOFT_COMPONENT component;
      int startAddress, endAddress;
      // 解析起始和结束地址
      if (ParsePLCAddress(startAddressStr, component, startAddress) &&
         ParsePLCAddress(endAddressStr, component, endAddress)) {
         int inputSize = endAddress - startAddress + 1;
         // 回调处理输入数据
         auto funOnReadInput = [this, startAddress](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
            if (nDataSize == (unsigned int)(m_inputPLCAddresses.size()) && flag == 0) {
               for (size_t i = 0; i < m_inputPLCAddresses.size(); ++i) {
                  int offset = i;
                  int value = CToolUnits::toInt16(&pData[offset]);
                  auto* inputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 0]); // 第 0 列
                  inputControl->SetBkColor(value ? RGB(0, 255, 0) : RGB(255, 0, 0)); // 更新背景颜色
                  inputControl->SetText(value ? _T("ON") : _T("OFF"));               // 更新文本
               }
            }
         };
         // 读取输入数据
         m_pPLC->readData(component, startAddress, inputSize, funOnReadInput);
      }
   }
   // 输出地址的读取
   if (!m_outputPLCAddresses.empty()) {
      // 获取起始地址和长度
      CString startAddressStr = m_outputPLCAddresses.front();
      CString endAddressStr = m_outputPLCAddresses.back();
      MC::SOFT_COMPONENT component;
      int startAddress, endAddress;
      // 解析起始和结束地址
      if (ParsePLCAddress(startAddressStr, component, startAddress) &&
         ParsePLCAddress(endAddressStr, component, endAddress)) {
         int outputSize = endAddress - startAddress + 1;
         // 回调处理输出数据
         auto funOnReadOutput = [this, startAddress](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
            if (nDataSize == (unsigned int)(m_outputPLCAddresses.size()) && flag == 0) {
               for (size_t i = 0; i < m_outputPLCAddresses.size(); ++i) {
                  int offset = i;
                  int value = CToolUnits::toInt16(&pData[offset]);
                  auto* outputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]); // 第 3 列
                  outputControl->SetBkColor(value ? RGB(0, 255, 0) : RGB(255, 0, 0)); // 更新背景颜色
                  outputControl->SetText(value ? _T("ON") : _T("OFF"));               // 更新文本
               }
            }
         };
         // 读取输出数据
         m_pPLC->readData(component, startAddress, outputSize, funOnReadOutput);
      }
   }
}
@@ -431,7 +553,7 @@
{
   // TODO: 在此添加消息处理程序代码和/或调用默认值
   if (TIMER_READ_PLC_DATA == nIDEvent) {
      //ASSERT(m_pPLC);
      ASSERT(m_pPLC);
      UpdatePLCStates();
      Sleep(100);
   }