#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<int>(eOpType), nAddr, bPressed);
|
}
|
else {
|
TRACE("²Ù×÷ʧ°Ü£ºÀàÐÍ=%d£¬µØÖ·=%d£¬´íÎóÂë=%d\n", static_cast<int>(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);
|
}
|