// CProjectPageMain.cpp: 实现文件 // #include "stdafx.h" #include "BondEq.h" #include "afxdialogex.h" #include "CProjectPageMain.h" #include "ToolUnits.h" #define TIMER_INIT 1 #define TIMER_READ_PLC_DATA 2 #define ID_MSG_UPDATA_DATA_TO_UI WM_USER + 101 // CProjectPageMain 对话框 IMPLEMENT_DYNAMIC(CProjectPageMain, CDialogEx) CProjectPageMain::CProjectPageMain(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_PROJECT_PAGE_MAIN, pParent) { 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) { ASSERT(pPLC); m_pPLC = pPLC; } void CProjectPageMain::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } void CProjectPageMain::HandleOperation(OperationType eOpType) { WriteOperationDataToPLC(eOpType, true); Sleep(200); WriteOperationDataToPLC(eOpType, false); } void CProjectPageMain::WriteOperationDataToPLC(OperationType eOpType, bool bPressed) { if (m_pPLC == nullptr || !m_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 写入信号 m_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); } }); } BEGIN_MESSAGE_MAP(CProjectPageMain, CDialogEx) ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_TIMER() ON_WM_CLOSE() ON_BN_CLICKED(IDC_BUTTON_ACTIVATE, &CProjectPageMain::OnBnClickedButtonActivate) ON_BN_CLICKED(IDC_BUTTON_AUTO, &CProjectPageMain::OnBnClickedButtonAuto) ON_BN_CLICKED(IDC_BUTTON_PUASE, &CProjectPageMain::OnBnClickedButtonPuase) ON_BN_CLICKED(IDC_BUTTON_MANUAL_OPERATION, &CProjectPageMain::OnBnClickedButtonManualOperation) ON_BN_CLICKED(IDC_BUTTON_SOUND_OFF, &CProjectPageMain::OnBnClickedButtonSoundOff) ON_BN_CLICKED(IDC_BUTTON_RESETTING, &CProjectPageMain::OnBnClickedButtonResetting) ON_BN_CLICKED(IDC_BUTTON_STOP, &CProjectPageMain::OnBnClickedButtonStop) ON_MESSAGE(ID_MSG_UPDATA_DATA_TO_UI, &CProjectPageMain::OnUpdateDataToUI) END_MESSAGE_MAP() // CProjectPageMain 消息处理程序 void CProjectPageMain::InitRxWindows() { /* code */ // 订阅数据 IRxWindows* pRxWindows = RX_GetRxWindows(); pRxWindows->enableLog(5); if (m_pObserver == NULL) { m_pObserver = pRxWindows->allocObserver([&](IAny* pAny) -> void { // onNext pAny->addRef(); int code = pAny->getCode(); 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 }, [&](IThrowable* pThrowable) -> void { // onErrorm pThrowable->printf(); }); theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread()) ->subscribe(m_pObserver); } } 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(); // 按钮初始化 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 } HBRUSH CProjectPageMain::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialogEx::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 CProjectPageMain::OnDestroy() { CDialogEx::OnDestroy(); if (m_hbrBkgnd != nullptr) { ::DeleteObject(m_hbrBkgnd); } ASSERT(m_pObserver != NULL); m_pObserver->unsubscribe(); m_pObserver = NULL; } void CProjectPageMain::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); CRect rcClient; GetClientRect(&rcClient); } void CProjectPageMain::OnTimer(UINT_PTR nIDEvent) { CDialogEx::OnTimer(nIDEvent); } void CProjectPageMain::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值 KillTimer(TIMER_READ_PLC_DATA); CDialogEx::OnClose(); } void CProjectPageMain::OnBnClickedButtonActivate() { // TODO: 在此添加控件通知处理程序代码 HandleOperation(OperationType::RUN); } void CProjectPageMain::OnBnClickedButtonAuto() { // TODO: 在此添加控件通知处理程序代码 HandleOperation(OperationType::AUTO); } void CProjectPageMain::OnBnClickedButtonPuase() { // TODO: 在此添加控件通知处理程序代码 HandleOperation(OperationType::PUASE); } void CProjectPageMain::OnBnClickedButtonManualOperation() { // TODO: 在此添加控件通知处理程序代码 HandleOperation(OperationType::MANUAL); } void CProjectPageMain::OnBnClickedButtonSoundOff() { // TODO: 在此添加控件通知处理程序代码 bool bMute = theApp.m_model.getBonder().isMute(); WriteOperationDataToPLC(OperationType::MUTE, !bMute); } void CProjectPageMain::OnBnClickedButtonResetting() { // TODO: 在此添加控件通知处理程序代码 HandleOperation(OperationType::OPR); } void CProjectPageMain::OnBnClickedButtonStop() { // TODO: 在此添加控件通知处理程序代码 HandleOperation(OperationType::STOP); } LRESULT CProjectPageMain::OnUpdateDataToUI(WPARAM wParam, LPARAM lParam) { return 0; }