LAPTOP-SNT8I5JK\Boounion
2025-05-10 1e8e3473cb124f9e51dfc1ca35e5cb13b1668bdc
SourceCode/Bond/BondEq/CProjectPageMain.cpp
@@ -22,10 +22,16 @@
   m_crBkgnd = PROPAGE_BACKGROUND_COLOR;
   m_hbrBkgnd = nullptr;
   m_pObserver = nullptr;
   for (int i = 0; i < BTN_MAX; i++) {
      m_pBlBtns[i] = new CBlButton();
   }
}
CProjectPageMain::~CProjectPageMain()
{
   for (int i = 0; i < BTN_MAX; i++) {
      delete m_pBlBtns[i];
   }
}
void CProjectPageMain::SetPLC(CPLC* pPLC)
@@ -48,42 +54,43 @@
void CProjectPageMain::WriteOperationDataToPLC(OperationType eOpType, bool bPressed)
{
   MC::SOFT_COMPONENT enComponent = MC::ZR;
   int nStartAddress = 10000;
   int nEndAddress = nStartAddress + 300;
   int nSize = (nEndAddress - nStartAddress + 1) * 2;
   if (m_pPLC == nullptr || !m_pPLC->isConnected()) {
      return;
   }
   MC::SOFT_COMPONENT enComponent = MC::M;
   int nStartAddress = 1000;
   // 根据操作类型计算目标地址
   int bitIndex = 0;
   char szWrite[4] = { 0x0, 0x0, 0x0, 0x0 };
   switch (eOpType) {
   case OperationType::RUN:
      nStartAddress += 0;  // RUN 信号地址 0,闪动信息06.0
      szWrite[0] = bPressed ? 0x1 : 0;
      nStartAddress = 1002;  // RUN   信号地址 M1002,闪动信息 M1103
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::AUTO:
      nStartAddress += 01; // AUTO 信号地址 c
      szWrite[1] = bPressed ? 0x10 : 0;
      nStartAddress = 1000; // AUTO   信号地址 M1000,闪动信息 M1100
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::PUASE:
      nStartAddress += 01; // PUASE 信号地址 d
      szWrite[1] = bPressed ? 0x20 : 0;
      nStartAddress = 1004; // PUASE  信号地址 M1004,闪动信息 M1104
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::MANUAL:
      nStartAddress += 05; // MANUAL 信号地址 5.e
      szWrite[1] = bPressed ? 0x40 : 0;
      nStartAddress = 1001; // MANUAL 信号地址 M1001,闪动信息 M1100
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::MUTE:
      nStartAddress += 01; // MUTE 信号地址 1.a
      szWrite[1] = bPressed ? 0x04 : 0;
      nStartAddress = 1003; // MUTE   信号地址 M1003,闪动信息 M1003
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::OPR:
      nStartAddress += 01; // OPR 信号地址 1.a
      szWrite[1] = bPressed ? 0x04 : 0;
      nStartAddress = 1050; // OPR    信号地址 M1050,闪动信息 M1150
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::STOP:
      nStartAddress += 01; // STOP 信号地址 1.a
      szWrite[1] = bPressed ? 0x04 : 0;
      nStartAddress = 1114; // STOP   信号地址 M1114,闪动信息 M1114
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   default:
      AfxMessageBox(_T("未知操作类型!"));
@@ -99,27 +106,6 @@
         TRACE("操作失败:类型=%d,地址=%d,错误码=%d\n", static_cast<int>(eOpType), nAddr, nFlag);
      }
   });
}
void CProjectPageMain::ReadPLCDataToUI()
{
   MC::SOFT_COMPONENT enComponent = MC::ZR;
   int nStartAddress = 10000;
   int nEndAddress = nStartAddress + 300;
   int nSize = (nEndAddress - nStartAddress + 1) * 2;
   auto funOnReadData = [this, nStartAddress, nSize](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) -> void {
      if (nDataSize == nSize && flag == 0 && ::IsWindow(m_hWnd)) {
         dVelocityRatio = CToolUnits::toInt32(&pData[20 * 2]) * 0.001;
         dTactTime = CToolUnits::toInt32(&pData[82 * 2]) * 0.001;
         nDayShiftCapacity = CToolUnits::toInt16(&pData[84 * 2]) * 0.001;
         nNightShiftCapacity = CToolUnits::toInt16(&pData[50 * 2]) * 0.1;
         PostMessage(ID_MSG_UPDATA_DATA_TO_UI);
      }
   };
   // m_pPLC->readData(enComponent, nStartAddress, nSize, funOnReadData);
}
BEGIN_MESSAGE_MAP(CProjectPageMain, CDialogEx)
@@ -138,7 +124,6 @@
   ON_MESSAGE(ID_MSG_UPDATA_DATA_TO_UI, &CProjectPageMain::OnUpdateDataToUI)
END_MESSAGE_MAP()
// CProjectPageMain 消息处理程序
void CProjectPageMain::InitRxWindows()
@@ -152,9 +137,81 @@
         // onNext
         pAny->addRef();
         int code = pAny->getCode();
         //if (true) {
         //}
         if (RX_CODE_BONDER_BEEP == code) {
            bool bMute = theApp.m_model.getBonder().isMute();
            GetDlgItem(IDC_BUTTON_SOUND_OFF)->SetWindowText(bMute ? _T("静音") : _T("声音"));
         }
         else if (RX_CODE_BONDER_VELOCITY_RATIO == code) {
            int nVelocityRatio;
            if (pAny->getIntValue("exCode", nVelocityRatio)) {
               CString strText;
               strText.Format(_T("%d %s"), nVelocityRatio, _T("%"));
               GetDlgItem(IDC_EDIT_VELOCITY_RATIO)->SetWindowText(strText);
            }
         }
         else if (RX_CODE_BONDER_TACT_TIME == code) {
            double dTactTime;
            if (pAny->getDoubleValue("value", dTactTime)) {
               CString strText;
               strText.Format(_T("%.2f"), dTactTime);
               GetDlgItem(IDC_EDIT_TACT_TIME)->SetWindowText(strText);
            }
         }
         else if (RX_CODE_BONDER_DAY_SHIFT_CAPACTITY == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetDlgItemInt(IDC_EDIT_DAY_SHIFT_CAPACITY, capactity);
            }
         }
         else if (RX_CODE_BONDER_NIGHT_SHIFT_CAPACTITY == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetDlgItemInt(IDC_EDIT_NIGHT_SHIFT_CAPACITY, capactity);
            }
         }
         // 临时添加
         else if (RX_CODE_BONDER_STATES_BTN0 == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_RUN], capactity == 0);
            }
         }
         else if (RX_CODE_BONDER_STATES_BTN1 == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_AUTO], capactity == 0);
            }
         }
         else if (RX_CODE_BONDER_STATES_BTN2 == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_PUASE], capactity == 0);
            }
         }
         else if (RX_CODE_BONDER_STATES_BTN3 == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_MANUAL], capactity == 0);
            }
         }
         else if (RX_CODE_BONDER_STATES_BTN4 == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_MUTE], capactity == 0);
            }
         }
         else if (RX_CODE_BONDER_STATES_BTN5 == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_OPR], capactity == 0);
            }
         }
         else if (RX_CODE_BONDER_STATES_BTN6 == code) {
            int capactity;
            if (pAny->getIntValue("exCode", capactity)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_STOP], capactity == 0);
            }
         }
         pAny->release();
      }, [&]() -> void {
         // onComplete
@@ -168,12 +225,49 @@
   }
}
void CProjectPageMain::SetButtonBackgroundColors(CBlButton* btn, bool bOff)
{
   if (bOff) {
      btn->SetBkgndColor(BS_NORMAL, BTN_SOUND_OFF_BKGND_NORMAL);
      btn->SetBkgndColor(BS_HOVER, BTN_SOUND_OFF_BKGND_HOVER);
      btn->SetBkgndColor(BS_PRESS, BTN_SOUND_OFF_BKGND_PRESS);
      btn->Invalidate();
   }
   else {
      btn->SetBkgndColor(BS_NORMAL, BTN_SOUND_ON_BKGND_NORMAL);
      btn->SetBkgndColor(BS_HOVER, BTN_SOUND_ON_BKGND_HOVER);
      btn->SetBkgndColor(BS_PRESS, BTN_SOUND_ON_BKGND_PRESS);
      btn->Invalidate();
   }
}
BOOL CProjectPageMain::OnInitDialog()
{
   CDialogEx::OnInitDialog();
   InitRxWindows();
   SetTimer(TIMER_READ_PLC_DATA, 500, nullptr);
   // 按钮初始化
   m_pBlBtns[BTN_RUN]->SubclassDlgItem(IDC_BUTTON_ACTIVATE, this);
   m_pBlBtns[BTN_AUTO]->SubclassDlgItem(IDC_BUTTON_AUTO, this);
   m_pBlBtns[BTN_PUASE]->SubclassDlgItem(IDC_BUTTON_PUASE, this);
   m_pBlBtns[BTN_MANUAL]->SubclassDlgItem(IDC_BUTTON_MANUAL_OPERATION, this);
   m_pBlBtns[BTN_MUTE]->SubclassDlgItem(IDC_BUTTON_SOUND_OFF, this);
   m_pBlBtns[BTN_OPR]->SubclassDlgItem(IDC_BUTTON_RESETTING, this);
   m_pBlBtns[BTN_STOP]->SubclassDlgItem(IDC_BUTTON_STOP, this);
   for (int i = 0; i < BTN_MAX; i++) {
      m_pBlBtns[i]->SetFrameColor(BS_NORMAL, BTN_SOUND_OFF_FRAME_NORMAL);
      m_pBlBtns[i]->SetFrameColor(BS_HOVER, BTN_SOUND_OFF_FRAME_HOVER);
      m_pBlBtns[i]->SetFrameColor(BS_PRESS, BTN_SOUND_OFF_FRAME_PRESS);
   }
   // 初始值
   SetDlgItemText(IDC_EDIT_VELOCITY_RATIO, _T("0 %"));
   SetDlgItemText(IDC_EDIT_TACT_TIME, _T("0.00"));
   SetDlgItemText(IDC_EDIT_DAY_SHIFT_CAPACITY, _T("0"));
   SetDlgItemText(IDC_EDIT_NIGHT_SHIFT_CAPACITY, _T("0"));
   return TRUE;  // return TRUE unless you set the focus to a control
   // 异常: OCX 属性页应返回 FALSE
}
@@ -216,14 +310,6 @@
void CProjectPageMain::OnTimer(UINT_PTR nIDEvent)
{
   if (TIMER_READ_PLC_DATA == nIDEvent) {
      ASSERT(m_pPLC);
      if (m_pPLC != nullptr) {
         ReadPLCDataToUI();
      }
   }
   CDialogEx::OnTimer(nIDEvent);
}
@@ -262,7 +348,8 @@
void CProjectPageMain::OnBnClickedButtonSoundOff()
{
   // TODO: 在此添加控件通知处理程序代码
   HandleOperation(OperationType::MUTE);
   bool bMute = theApp.m_model.getBonder().isMute();
   WriteOperationDataToPLC(OperationType::MUTE, !bMute);
}
void CProjectPageMain::OnBnClickedButtonResetting()
@@ -279,15 +366,5 @@
LRESULT CProjectPageMain::OnUpdateDataToUI(WPARAM wParam, LPARAM lParam)
{
   CString strText;
   strText.Format(_T("%.3f %"), dVelocityRatio);
   GetDlgItem(IDC_EDIT_VELOCITY_RATIO)->SetWindowText(strText);
   strText.Format(_T("%.3f"), dTactTime);
   GetDlgItem(IDC_EDIT_TACT_TIME)->SetWindowText(strText);
   SetDlgItemInt(IDC_EDIT_DAY_SHIFT_CAPACITY, nDayShiftCapacity);
   SetDlgItemInt(IDC_EDIT_NIGHT_SHIFT_CAPACITY, nNightShiftCapacity);
   return 0;
}