LAPTOP-T815PCOQ\25526
2025-01-09 009eda749899fc85d3a75ad2016371f27436bf36
Merge branch 'liuyang' into chenluhua
已修改8个文件
328 ■■■■■ 文件已修改
SourceCode/Bond/BondEq/CProjectPageMain.cpp 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BoounionPLC/AlarmPopupDlg.cpp 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BoounionPLC/BoounionPLC.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BoounionPLC/Common.h 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BoounionPLC/PlcView.cpp 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BoounionPLC/PlcView.h 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BoounionPLC/Resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/BondEq/CProjectPageMain.cpp
@@ -124,7 +124,6 @@
    ON_MESSAGE(ID_MSG_UPDATA_DATA_TO_UI, &CProjectPageMain::OnUpdateDataToUI)
END_MESSAGE_MAP()
// CProjectPageMain 消息处理程序
void CProjectPageMain::InitRxWindows()
SourceCode/Bond/BoounionPLC/AlarmPopupDlg.cpp
@@ -65,9 +65,11 @@
            // onNext
            pAny->addRef();
            int code = pAny->getCode();
            if (RX_CODE_BONDER_BEEP == code) {
                bool bMute = FALSE;// theApp.m_model.getBonder().isMute();
                SetButtonBackgroundColors(bMute);
            if (RX_CODE_BEEP == code) {
                int nValue = 0;
                if (pAny->getIntValue("exCode", nValue)) {
                    SetButtonBackgroundColors(nValue == 0);
                }
            }
            pAny->release();
        }, [&]() -> void {
SourceCode/Bond/BoounionPLC/BoounionPLC.rc
Binary files differ
SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj
@@ -52,7 +52,7 @@
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v140</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
    <CharacterSet>MultiByte</CharacterSet>
    <UseOfMfc>Dynamic</UseOfMfc>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
@@ -169,6 +169,7 @@
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <SDLCheck>true</SDLCheck>
      <AdditionalIncludeDirectories>.;.\DBManager;..\DatabaseSDK\include</AdditionalIncludeDirectories>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
SourceCode/Bond/BoounionPLC/Common.h
@@ -9,7 +9,17 @@
#define RX_CODE_SELECT_PLC                1003
#define RX_CODE_ALARM_ON                1004
#define RX_CODE_ALARM_OFF                1005
#define RX_CODE_BONDER_BEEP                1006
#define RX_CODE_ACTIVATE                1006 // 启动
#define RX_CODE_AUTO                    1007 // 自动
#define RX_CODE_PUASE                    1008 // 暂停
#define RX_CODE_MANUAL                    1009 // 手动
#define RX_CODE_BEEP                    1010 // 静音
#define RX_CODE_RESETTING                1011 // 复位
#define RX_CODE_STOP                    1012 // ֹͣ
#define RX_CODE_VELOCITY_RATIO            1013 // 速度比例
#define RX_CODE_TACT_TIME                1014 // 节拍时间
#define RX_CODE_DAY_SHIFT_CAPACTITY        1015 // 白班产量
#define RX_CODE_NIGHT_SHIFT_CAPACTITY    1016 // 夜班产量
/* 定制颜色 */
@@ -21,6 +31,16 @@
#define PLC_VIEW_BACKGROUND                RGB(252, 252, 255)
#define LOGCAT_BACKGROUND_COLOR            RGB(252, 252, 255)
/* PLCVIEW按钮 */
#define BTN_PLCVIEW_FRAME_NORMAL    RGB(88, 88, 88)
#define BTN_PLCVIEW_FRAME_HOVER        RGB(88, 88, 88)
#define BTN_PLCVIEW_FRAME_PRESS        RGB(88, 88, 88)
#define BTN_PLCVIEW_OFF_BKGND_NORMAL    RGB(255, 127, 39)
#define BTN_PLCVIEW_OFF_BKGND_HOVER        RGB(255, 157, 59)
#define BTN_PLCVIEW_OFF_BKGND_PRESS        RGB(255, 100, 29)
#define BTN_PLCVIEW_ON_BKGND_NORMAL        RGB(100, 200, 100)
#define BTN_PLCVIEW_ON_BKGND_HOVER        RGB(150, 250, 150)
#define BTN_PLCVIEW_ON_BKGND_PRESS        RGB(50, 150, 50)
/* 解除警告 按钮 */
#define BTN_ALARM_OFF_FRAME_NORMAL        RGB(88, 88, 88)
SourceCode/Bond/BoounionPLC/PlcView.cpp
@@ -15,11 +15,17 @@
    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)
@@ -27,11 +33,18 @@
    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)
END_MESSAGE_MAP()
// CComponentData1Dlg 消息处理程序
@@ -55,7 +68,77 @@
            // 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
@@ -69,6 +152,99 @@
    }
}
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();
@@ -77,10 +253,31 @@
        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"));
    return TRUE;  // return TRUE unless you set the focus to a control
                  // 异常: OCX 属性页应返回 FALSE
}
HBRUSH CPlcView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
@@ -116,11 +313,51 @@
    CBaseView::OnSize(nType, cx, cy);
}
void CPlcView::Resize()
void CPlcView::OnClose()
{
    int y = 12;
    int x = 0;
    CRect rcClient, rcItem;
    CWnd* pItem;
    GetClientRect(&rcClient);
    // 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);
}
SourceCode/Bond/BoounionPLC/PlcView.h
@@ -1,7 +1,28 @@
#pragma once
#include "CBaseView.h"
#include "BlButton.h"
#include "PLC.h"
// BUTTON控件
#define BTN_MAX            7
#define BTN_RUN            0 // 启动
#define BTN_AUTO        1 // 自动
#define BTN_PUASE        2 // 暂停
#define BTN_MANUAL        3 // 手动
#define BTN_MUTE        4 // 静音
#define BTN_OPR            5 // 复位
#define BTN_STOP        6 // ֹͣ
// 操作类型
enum class OperationType {
    RUN = 0,            // 启动
    AUTO,                // 自动
    PUASE,                // 暂停
    MANUAL,                // 手动
    MUTE,                // 静音
    OPR,                // 复位
    STOP                // ֹͣ
};
class CPlcView :public CBaseView
{
@@ -19,11 +40,19 @@
    void Resize();
private:
    void SetButtonBackgroundColors(CBlButton* btn, bool bOff);
    void HandleOperation(OperationType eOpType);
    void WriteOperationDataToPLC(OperationType eOpType, bool bPressed);
private:
    COLORREF m_crBkgnd;
    HBRUSH m_hbrBkgnd;
    IObserver* m_pObserver;
    CPLC* m_pPlc;
private:
    // 控件
    CBlButton* m_pBlBtns[BTN_MAX];
    // 对话框数据
#ifdef AFX_DESIGN_TIME
@@ -39,5 +68,13 @@
    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 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();
};
SourceCode/Bond/BoounionPLC/Resource.h
Binary files differ