LAPTOP-T815PCOQ\25526
2024-12-26 32f4e5154a4bcc3228b9e422e96b7009d55f50ad
1. 添加主界面,并且读写PLC
已添加2个文件
已修改2个文件
369 ■■■■■ 文件已修改
SourceCode/Bond/BondEq/CPanelProject.cpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CProjectPageMain.cpp 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CProjectPageMain.h 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/View/AxisDetailSettingsDlg.cpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CPanelProject.cpp
@@ -78,6 +78,7 @@
    //m_pAccordionWnd->AddItem("远程设备", m_pPageRemoteEqs, 0, TRUE, TRUE);
    m_pPageMain = new CProjectPageMain();
    m_pPageMain->SetPLC(theApp.m_model.getBonder().getPLC("PLC(1)"));
    m_pPageMain->Create(IDD_PROJECT_PAGE_MAIN, GetDlgItem(IDC_ACCORDION_WND1));
    m_pPageMain->ShowWindow(SW_SHOW);
    m_pAccordionWnd->AddItem("主页面", m_pPageMain, 0, TRUE, TRUE);
SourceCode/Bond/BondEq/CProjectPageMain.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,293 @@
// 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;
}
SourceCode/Bond/BondEq/CProjectPageMain.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
#pragma once
#include "afxdialogex.h"
// CProjectPageMain å¯¹è¯æ¡†
enum class OperationType {
    RUN = 0,            // å¯åЍ
    AUTO,                // è‡ªåЍ
    PUASE,                // æš‚停
    MANUAL,                // æ‰‹åЍ
    MUTE,                // é™éŸ³
    OPR,                // å¤ä½
    STOP                // åœæ­¢
};
class CProjectPageMain : public CDialogEx
{
    DECLARE_DYNAMIC(CProjectPageMain)
public:
    CProjectPageMain(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CProjectPageMain();
public:
    void SetPLC(CPLC* pPLC);
private:
    void InitRxWindows();
    void HandleOperation(OperationType eOpType);
    void WriteOperationDataToPLC(OperationType eOpType, bool bPressed);
    void ReadPLCDataToUI();
private:
    COLORREF m_crBkgnd;
    HBRUSH m_hbrBkgnd;
    IObserver* m_pObserver;
    CPLC* m_pPLC;
    double dVelocityRatio;        // é€Ÿåº¦æ¯”
    double dTactTime;            // å‘¨æœŸæ—¶é—´
    int nDayShiftCapacity;
    int nNightShiftCapacity;
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_PROJECT_PAGE_MAIN };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg void OnDestroy();
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnTimer(UINT_PTR nIDEvent);
    afx_msg void OnClose();
    afx_msg void OnBnClickedButtonActivate();
    afx_msg void OnBnClickedButtonAuto();
    afx_msg void OnBnClickedButtonPuase();
    afx_msg void OnBnClickedButtonManualOperation();
    afx_msg void OnBnClickedButtonSoundOff();
    afx_msg void OnBnClickedButtonResetting();
    afx_msg void OnBnClickedButtonStop();
    afx_msg LRESULT OnUpdateDataToUI(WPARAM wParam, LPARAM lParam);
};
SourceCode/Bond/BondEq/View/AxisDetailSettingsDlg.cpp
@@ -289,10 +289,17 @@
    auto writeIntToBuffer = [&](int value, int nWriteIndex) {
        if (nWriteIndex + 4 <= sizeof(szWrite)) {
            // å°ç«¯
            szWrite[nWriteIndex] = static_cast<char>(value & 0xFF);             // ä½Žå­—节
            szWrite[nWriteIndex + 1] = static_cast<char>((value >> 8) & 0xFF);  // æ¬¡ä½Žå­—节
            szWrite[nWriteIndex + 2] = static_cast<char>((value >> 16) & 0xFF); // æ¬¡é«˜å­—节
            szWrite[nWriteIndex + 3] = static_cast<char>((value >> 24) & 0xFF); // é«˜å­—节
            // å¤§ç«¯
            //szWrite[nWriteIndex + 3] = static_cast<char>(value & 0xFF);         // é«˜å­—节
            //szWrite[nWriteIndex + 2] = static_cast<char>((value >> 8) & 0xFF);  // æ¬¡é«˜å­—节
            //szWrite[nWriteIndex + 1] = static_cast<char>((value >> 16) & 0xFF); // æ¬¡ä½Žå­—节
            //szWrite[nWriteIndex] = static_cast<char>((value >> 24) & 0xFF);     // ä½Žå­—节
        }
    };