// 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<int>(eOpType), nAddr, bPressed);
|
}
|
else {
|
TRACE("操作失败:类型=%d,地址=%d,错误码=%d\n", static_cast<int>(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)
|
{
|
/*
|
CString strText;
|
strText.Format(_T("%d %s"), nVelocityRatio, _T("%"));
|
GetDlgItem(IDC_EDIT_VELOCITY_RATIO)->SetWindowText(strText);
|
|
strText.Format(_T("%.2f"), dTactTime);
|
GetDlgItem(IDC_EDIT_TACT_TIME)->SetWindowText(strText);
|
|
SetDlgItemInt(IDC_EDIT_DAY_SHIFT_CAPACITY, nDayShiftCapacity);
|
SetDlgItemInt(IDC_EDIT_NIGHT_SHIFT_CAPACITY, nNightShiftCapacity);
|
*/
|
return 0;
|
}
|