// 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;
|
}
|
|
CProjectPageMain::~CProjectPageMain()
|
{
|
}
|
|
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)
|
{
|
MC::SOFT_COMPONENT enComponent = MC::ZR;
|
int nStartAddress = 10000;
|
int nEndAddress = nStartAddress + 300;
|
int nSize = (nEndAddress - nStartAddress + 1) * 2;
|
|
// 根据操作类型计算目标地址
|
int bitIndex = 0;
|
char szWrite[4] = { 0x0, 0x0, 0x0, 0x0 };
|
switch (eOpType) {
|
case OperationType::RUN:
|
nStartAddress += 0; // RUN 信号地址 0,闪动信息06.0
|
szWrite[0] = bPressed ? 0x1 : 0;
|
break;
|
case OperationType::AUTO:
|
nStartAddress += 01; // AUTO 信号地址 c
|
szWrite[1] = bPressed ? 0x10 : 0;
|
break;
|
case OperationType::PUASE:
|
nStartAddress += 01; // PUASE 信号地址 d
|
szWrite[1] = bPressed ? 0x20 : 0;
|
break;
|
case OperationType::MANUAL:
|
nStartAddress += 05; // MANUAL 信号地址 5.e
|
szWrite[1] = bPressed ? 0x40 : 0;
|
break;
|
case OperationType::MUTE:
|
nStartAddress += 01; // MUTE 信号地址 1.a
|
szWrite[1] = bPressed ? 0x04 : 0;
|
break;
|
case OperationType::OPR:
|
nStartAddress += 01; // OPR 信号地址 1.a
|
szWrite[1] = bPressed ? 0x04 : 0;
|
break;
|
case OperationType::STOP:
|
nStartAddress += 01; // STOP 信号地址 1.a
|
szWrite[1] = bPressed ? 0x04 : 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);
|
}
|
});
|
}
|
|
void CProjectPageMain::ReadPLCDataToUI()
|
{
|
MC::SOFT_COMPONENT enComponent = MC::ZR;
|
int nStartAddress = 10000;
|
int nEndAddress = nStartAddress + 300;
|
int nSize = (nEndAddress - nStartAddress + 1) * 2;
|
|
auto funOnReadData = [this, nStartAddress, nSize](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) -> void {
|
if (nDataSize == nSize && flag == 0 && ::IsWindow(m_hWnd)) {
|
dVelocityRatio = CToolUnits::toInt32(&pData[20 * 2]) * 0.001;
|
dTactTime = CToolUnits::toInt32(&pData[82 * 2]) * 0.001;
|
nDayShiftCapacity = CToolUnits::toInt16(&pData[84 * 2]) * 0.001;
|
nNightShiftCapacity = CToolUnits::toInt16(&pData[50 * 2]) * 0.1;
|
|
PostMessage(ID_MSG_UPDATA_DATA_TO_UI);
|
}
|
};
|
|
// m_pPLC->readData(enComponent, nStartAddress, nSize, funOnReadData);
|
}
|
|
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 (true) {
|
|
//}
|
pAny->release();
|
}, [&]() -> void {
|
// onComplete
|
}, [&](IThrowable* pThrowable) -> void {
|
// onErrorm
|
pThrowable->printf();
|
});
|
|
theApp.m_model.getObservable()->observeOn(pRxWindows->mainThread())
|
->subscribe(m_pObserver);
|
}
|
}
|
|
BOOL CProjectPageMain::OnInitDialog()
|
{
|
CDialogEx::OnInitDialog();
|
|
InitRxWindows();
|
SetTimer(TIMER_READ_PLC_DATA, 500, nullptr);
|
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)
|
{
|
if (TIMER_READ_PLC_DATA == nIDEvent) {
|
ASSERT(m_pPLC);
|
|
if (m_pPLC != nullptr) {
|
ReadPLCDataToUI();
|
}
|
}
|
|
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: 在此添加控件通知处理程序代码
|
HandleOperation(OperationType::MUTE);
|
}
|
|
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("%.3f %"), dVelocityRatio);
|
GetDlgItem(IDC_EDIT_VELOCITY_RATIO)->SetWindowText(strText);
|
|
strText.Format(_T("%.3f"), dTactTime);
|
GetDlgItem(IDC_EDIT_TACT_TIME)->SetWindowText(strText);
|
|
SetDlgItemInt(IDC_EDIT_DAY_SHIFT_CAPACITY, nDayShiftCapacity);
|
SetDlgItemInt(IDC_EDIT_NIGHT_SHIFT_CAPACITY, nNightShiftCapacity);
|
|
return 0;
|
}
|