mrDarker
6 天以前 829fe6c6bc33d53fda9c31fd45a37e1df87befff
SourceCode/Bond/BoounionPLC/PlcView.cpp
@@ -15,11 +15,23 @@
   m_crBkgnd = PLC_VIEW_BACKGROUND;
   m_hbrBkgnd = nullptr;
   m_pPlc = nullptr;
}
   for (int i = 0; i < BTN_MAX; i++) {
      m_pBlBtns[i] = new CBlButton();
   }
   m_crPlcNameBack = RGB(228, 228, 228);
}
CPlcView::~CPlcView()
{
   for (int i = 0; i < BTN_MAX; i++) {
      delete m_pBlBtns[i];
   }
   if (m_hbrPlcName != nullptr) {
      ::DeleteObject(m_hbrPlcName);
      m_hbrPlcName = nullptr;
   }
}
void CPlcView::DoDataExchange(CDataExchange* pDX)
@@ -27,11 +39,19 @@
   CBaseView::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CPlcView, CBaseView)
   ON_WM_CTLCOLOR()
   ON_WM_DESTROY()
   ON_WM_SIZE()
   ON_WM_CLOSE()
   ON_BN_CLICKED(IDC_BUTTON_ACTIVATE, &CPlcView::OnBnClickedButtonActivate)
   ON_BN_CLICKED(IDC_BUTTON_AUTO, &CPlcView::OnBnClickedButtonAuto)
   ON_BN_CLICKED(IDC_BUTTON_PUASE, &CPlcView::OnBnClickedButtonPuase)
   ON_BN_CLICKED(IDC_BUTTON_MANUAL_OPERATION, &CPlcView::OnBnClickedButtonManualOperation)
   ON_BN_CLICKED(IDC_BUTTON_SOUND_OFF, &CPlcView::OnBnClickedButtonSoundOff)
   ON_BN_CLICKED(IDC_BUTTON_RESETTING, &CPlcView::OnBnClickedButtonResetting)
   ON_BN_CLICKED(IDC_BUTTON_STOP, &CPlcView::OnBnClickedButtonStop)
   ON_WM_TIMER()
END_MESSAGE_MAP()
// CComponentData1Dlg 消息处理程序
@@ -55,7 +75,77 @@
         // onNext
         pAny->addRef();
         int code = pAny->getCode();
         if (RX_CODE_ACTIVATE == code) {
            int nValue = 0;
            if (pAny->getIntValue("exCode", nValue)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_RUN], nValue == 0);
            }
         }
         else if (RX_CODE_AUTO == code) {
            int nValue = 0;
            if (pAny->getIntValue("exCode", nValue)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_AUTO], nValue == 0);
            }
         }
         else if (RX_CODE_PUASE == code) {
            int nValue = 0;
            if (pAny->getIntValue("exCode", nValue)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_PUASE], nValue == 0);
            }
         }
         else if (RX_CODE_MANUAL == code) {
            int nValue = 0;
            if (pAny->getIntValue("exCode", nValue)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_MANUAL], nValue == 0);
            }
         }
         else if (RX_CODE_BEEP == code) {
            int nValue = 0;
            if (pAny->getIntValue("exCode", nValue)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_MUTE], nValue == 0);
               GetDlgItem(IDC_BUTTON_SOUND_OFF)->SetWindowText(nValue == 0 ? _T("静音") : _T("声音"));
            }
         }
         else if (RX_CODE_RESETTING == code) {
            int nValue = 0;
            if (pAny->getIntValue("exCode", nValue)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_OPR], nValue == 0);
            }
         }
         else if (RX_CODE_STOP == code) {
            int nValue = 0;
            if (pAny->getIntValue("exCode", nValue)) {
               SetButtonBackgroundColors(m_pBlBtns[BTN_STOP], nValue == 0);
            }
         }
         else if (RX_CODE_VELOCITY_RATIO == code) {
            int nVelocityRatio = 0;
            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_TACT_TIME == code) {
            double dTactTime = 0.00;
            if (pAny->getDoubleValue("value", dTactTime)) {
               CString strText;
               strText.Format(_T("%.2f"), dTactTime);
               GetDlgItem(IDC_EDIT_TACT_TIME)->SetWindowText(strText);
            }
         }
         else if (RX_CODE_DAY_SHIFT_CAPACTITY == code) {
            int nCapactity = 0;
            if (pAny->getIntValue("exCode", nCapactity)) {
               SetDlgItemInt(IDC_EDIT_DAY_SHIFT_CAPACITY, nCapactity);
            }
         }
         else if (RX_CODE_NIGHT_SHIFT_CAPACTITY == code) {
            int nCapactity;
            if (pAny->getIntValue("exCode", nCapactity)) {
               SetDlgItemInt(IDC_EDIT_NIGHT_SHIFT_CAPACITY, nCapactity);
            }
         }
         pAny->release();
      }, [&]() -> void {
         // onComplete
@@ -69,6 +159,99 @@
   }
}
void CPlcView::Resize()
{
   int y = 12;
   int x = 0;
   CRect rcClient, rcItem;
   CWnd* pItem;
   GetClientRect(&rcClient);
}
void CPlcView::SetButtonBackgroundColors(CBlButton* btn, bool bOff)
{
   if (bOff) {
      btn->SetBkgndColor(BS_NORMAL, BTN_PLCVIEW_OFF_BKGND_NORMAL);
      btn->SetBkgndColor(BS_HOVER, BTN_PLCVIEW_OFF_BKGND_HOVER);
      btn->SetBkgndColor(BS_PRESS, BTN_PLCVIEW_OFF_BKGND_PRESS);
      btn->Invalidate();
   }
   else {
      btn->SetBkgndColor(BS_NORMAL, BTN_PLCVIEW_ON_BKGND_NORMAL);
      btn->SetBkgndColor(BS_HOVER, BTN_PLCVIEW_ON_BKGND_HOVER);
      btn->SetBkgndColor(BS_PRESS, BTN_PLCVIEW_ON_BKGND_PRESS);
      btn->Invalidate();
   }
}
void CPlcView::HandleOperation(OperationType eOpType)
{
   WriteOperationDataToPLC(eOpType, true);
   Sleep(200);
   WriteOperationDataToPLC(eOpType, false);
}
void CPlcView::WriteOperationDataToPLC(OperationType eOpType, bool bPressed)
{
   if (m_pContext == nullptr) {
      return;
   }
   CPLC* pPlc = (CPLC*)m_pContext;
   if (pPlc == nullptr || !pPlc->isConnected()) {
      return;
   }
   MC::SOFT_COMPONENT enComponent = MC::M;
   int nStartAddress = 1000;
   // 根据操作类型计算目标地址
   char szWrite[4] = { 0x0, 0x0, 0x0, 0x0 };
   switch (eOpType) {
   case OperationType::RUN:
      nStartAddress = 1002;  // RUN   信号地址 M1002,闪动信息 M1103
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::AUTO:
      nStartAddress = 1000; // AUTO   信号地址 M1000,闪动信息 M1100
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::PUASE:
      nStartAddress = 1004; // PUASE  信号地址 M1004,闪动信息 M1104
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::MANUAL:
      nStartAddress = 1001; // MANUAL 信号地址 M1001,闪动信息 M1100
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::MUTE:
      nStartAddress = 1003; // MUTE   信号地址 M1003,闪动信息 M1003
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::OPR:
      nStartAddress = 1050; // OPR    信号地址 M1050,闪动信息 M1150
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   case OperationType::STOP:
      nStartAddress = 1114; // STOP   信号地址 M1114,闪动信息 M1114
      szWrite[0] = bPressed ? 0x01 : 0;
      break;
   default:
      AfxMessageBox(_T("未知操作类型!"));
      return;
   }
   // 向 PLC 写入信号
   pPlc->writeData(enComponent, nStartAddress, szWrite, 2, [eOpType, nStartAddress, bPressed](IMcChannel* pChannel, int nAddr, DWORD nValue, int nFlag) {
      if (nFlag == 0) {
         TRACE("操作成功:类型=%d,地址=%d,值=%d\n", static_cast<int>(eOpType), nAddr, bPressed);
      }
      else {
         TRACE("操作失败:类型=%d,地址=%d,错误码=%d\n", static_cast<int>(eOpType), nAddr, nFlag);
      }
   });
}
BOOL CPlcView::OnInitDialog()
{
   CBaseView::OnInitDialog();
@@ -77,17 +260,48 @@
      SetDlgItemText(IDC_LABEL_PLC_NAME, ((CPLC*)m_pContext)->getName().c_str());
   }
   // 按钮初始化
   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_PLCVIEW_FRAME_NORMAL);
      m_pBlBtns[i]->SetFrameColor(BS_HOVER, BTN_PLCVIEW_FRAME_HOVER);
      m_pBlBtns[i]->SetFrameColor(BS_PRESS, BTN_PLCVIEW_FRAME_PRESS);
      SetButtonBackgroundColors(m_pBlBtns[i], false);
   }
   // 初始值
   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"));
   SetTimer(1, 1000, nullptr);
   return TRUE;  // return TRUE unless you set the focus to a control
              // 异常: OCX 属性页应返回 FALSE
}
HBRUSH CPlcView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   HBRUSH hbr = CBaseView::OnCtlColor(pDC, pWnd, nCtlColor);
   int nCtrlId = pWnd->GetDlgCtrlID();
   if (nCtlColor == CTLCOLOR_STATIC) {
      pDC->SetBkColor(m_crBkgnd);
   }
   if (IDC_LABEL_PLC_NAME == nCtrlId) {
      pDC->SetBkColor(m_crPlcNameBack);
      m_hbrPlcName = CreateSolidBrush(m_crPlcNameBack);
      return m_hbrPlcName;
   }
   if (m_hbrBkgnd == nullptr) {
@@ -116,11 +330,69 @@
   CBaseView::OnSize(nType, cx, cy);
}
void CPlcView::Resize()
void CPlcView::OnClose()
{
   int y = 12;
   int x = 0;
   CRect rcClient, rcItem;
   CWnd* pItem;
   GetClientRect(&rcClient);
}
   // TODO: 在此添加消息处理程序代码和/或调用默认值
   CDialogEx::OnClose();
}
void CPlcView::OnBnClickedButtonActivate()
{
   // TODO: 在此添加控件通知处理程序代码
   HandleOperation(OperationType::RUN);
}
void CPlcView::OnBnClickedButtonAuto()
{
   // TODO: 在此添加控件通知处理程序代码
   HandleOperation(OperationType::AUTO);
}
void CPlcView::OnBnClickedButtonPuase()
{
   // TODO: 在此添加控件通知处理程序代码
   HandleOperation(OperationType::PUASE);
}
void CPlcView::OnBnClickedButtonManualOperation()
{
   // TODO: 在此添加控件通知处理程序代码
   HandleOperation(OperationType::MANUAL);
}
void CPlcView::OnBnClickedButtonSoundOff()
{
   // TODO: 在此添加控件通知处理程序代码
   bool bMute = false;//theApp.m_model.getBonder().isMute();
   WriteOperationDataToPLC(OperationType::MUTE, !bMute);
}
void CPlcView::OnBnClickedButtonResetting()
{
   // TODO: 在此添加控件通知处理程序代码
   HandleOperation(OperationType::OPR);
}
void CPlcView::OnBnClickedButtonStop()
{
   // TODO: 在此添加控件通知处理程序代码
   HandleOperation(OperationType::STOP);
}
void CPlcView::OnTimer(UINT_PTR nIDEvent)
{
   if (1 == nIDEvent) {
      ASSERT(m_pContext);
      CPLC* pPlc = ((CPLC*)m_pContext);
      CString strText;
      strText.Format(_T("%d %s"), pPlc->getVelocityRatio(), _T("%"));
      GetDlgItem(IDC_EDIT_VELOCITY_RATIO)->SetWindowText(strText);
      strText.Format(_T("%.2f"), pPlc->getTackTime() * 0.01);
      GetDlgItem(IDC_EDIT_TACT_TIME)->SetWindowText(strText);
      SetDlgItemInt(IDC_EDIT_DAY_SHIFT_CAPACITY, pPlc->getDayShiftCapacity());
      SetDlgItemInt(IDC_EDIT_NIGHT_SHIFT_CAPACITY, pPlc->getNightShiftCapacity());
   }
   CBaseView::OnTimer(nIDEvent);
}