#include "stdafx.h" #include "PlcView.h" #include "BoounionPLC.h" #include "Common.h" // CPlcView ¶Ô»°¿ò IMPLEMENT_DYNAMIC(CPlcView, CBaseView) CPlcView::CPlcView(CWnd* pParent /*=nullptr*/) : CBaseView(IDD_VIEW_PLC, pParent) { m_pObserver = nullptr; m_crBkgnd = PLC_VIEW_BACKGROUND; m_hbrBkgnd = nullptr; m_pPlc = nullptr; for (int i = 0; i < BTN_MAX; i++) { m_pBlBtns[i] = new CBlButton(); } } CPlcView::~CPlcView() { for (int i = 0; i < BTN_MAX; i++) { delete m_pBlBtns[i]; } } void CPlcView::DoDataExchange(CDataExchange* pDX) { 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 ÏûÏ¢´¦Àí³ÌÐò void CPlcView::SetContext(void* pContext) { CBaseView::SetContext(pContext); if (::IsWindow(m_hWnd) && m_pContext != nullptr) { SetDlgItemText(IDC_LABEL_PLC_NAME, ((CPLC*)m_pContext)->getName().c_str()); } } void CPlcView::InitRxWindows() { /* code */ // ¶©ÔÄÊý¾Ý IRxWindows* pRxWindows = RX_GetRxWindows(); if (m_pObserver == NULL) { m_pObserver = pRxWindows->allocObserver([&](IAny* pAny) -> void { // 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 }, [&](IThrowable* pThrowable) -> void { // onErrorm pThrowable->printf(); }); theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) ->subscribe(m_pObserver); } } 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(eOpType), nAddr, bPressed); } else { TRACE("²Ù×÷ʧ°Ü£ºÀàÐÍ=%d£¬µØÖ·=%d£¬´íÎóÂë=%d\n", static_cast(eOpType), nAddr, nFlag); } }); } BOOL CPlcView::OnInitDialog() { CBaseView::OnInitDialog(); if (m_pContext != nullptr) { 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); if (nCtlColor == CTLCOLOR_STATIC) { pDC->SetBkColor(m_crBkgnd); } if (m_hbrBkgnd == nullptr) { m_hbrBkgnd = CreateSolidBrush(m_crBkgnd); } return m_hbrBkgnd; } void CPlcView::OnDestroy() { CBaseView::OnDestroy(); if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); } if (m_pObserver != NULL) { m_pObserver->unsubscribe(); m_pObserver = NULL; } } void CPlcView::OnSize(UINT nType, int cx, int cy) { CBaseView::OnSize(nType, cx, cy); } void CPlcView::OnClose() { // 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); }