From 6fe6f0ccc9a788de59a8ea2c31ce2a0a02af80fa Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期四, 09 一月 2025 14:09:48 +0800
Subject: [PATCH] Merge branch 'liuyang' into clh

---
 SourceCode/Bond/BondEq/CProjectPageMain.cpp     |    1 
 SourceCode/Bond/BoounionPLC/BoounionPLC.rc      |    0 
 SourceCode/Bond/BoounionPLC/Common.h            |   22 +++
 SourceCode/Bond/BoounionPLC/PlcView.cpp         |  257 +++++++++++++++++++++++++++++++++++++++++-
 SourceCode/Bond/BoounionPLC/PlcView.h           |   37 ++++++
 SourceCode/Bond/BoounionPLC/Resource.h          |    0 
 SourceCode/Bond/BoounionPLC/AlarmPopupDlg.cpp   |    8 
 SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj |    3 
 8 files changed, 312 insertions(+), 16 deletions(-)

diff --git a/SourceCode/Bond/BondEq/CProjectPageMain.cpp b/SourceCode/Bond/BondEq/CProjectPageMain.cpp
index f5986f8..53f1689 100644
--- a/SourceCode/Bond/BondEq/CProjectPageMain.cpp
+++ b/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()
diff --git a/SourceCode/Bond/BoounionPLC/AlarmPopupDlg.cpp b/SourceCode/Bond/BoounionPLC/AlarmPopupDlg.cpp
index c62e850..d0d5816 100644
--- a/SourceCode/Bond/BoounionPLC/AlarmPopupDlg.cpp
+++ b/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 {
diff --git a/SourceCode/Bond/BoounionPLC/BoounionPLC.rc b/SourceCode/Bond/BoounionPLC/BoounionPLC.rc
index 265c082..e996965 100644
--- a/SourceCode/Bond/BoounionPLC/BoounionPLC.rc
+++ b/SourceCode/Bond/BoounionPLC/BoounionPLC.rc
Binary files differ
diff --git a/SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj b/SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj
index 4877768..7b7068a 100644
--- a/SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj
+++ b/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>
diff --git a/SourceCode/Bond/BoounionPLC/Common.h b/SourceCode/Bond/BoounionPLC/Common.h
index deaea4c..bbd8e73 100644
--- a/SourceCode/Bond/BoounionPLC/Common.h
+++ b/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)
diff --git a/SourceCode/Bond/BoounionPLC/PlcView.cpp b/SourceCode/Bond/BoounionPLC/PlcView.cpp
index 9fac0f2..9d0926e 100644
--- a/SourceCode/Bond/BoounionPLC/PlcView.cpp
+++ b/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);
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/BoounionPLC/PlcView.h b/SourceCode/Bond/BoounionPLC/PlcView.h
index da44c6d..bcebc87 100644
--- a/SourceCode/Bond/BoounionPLC/PlcView.h
+++ b/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();
 };
 
diff --git a/SourceCode/Bond/BoounionPLC/Resource.h b/SourceCode/Bond/BoounionPLC/Resource.h
index 7f80a40..951baec 100644
--- a/SourceCode/Bond/BoounionPLC/Resource.h
+++ b/SourceCode/Bond/BoounionPLC/Resource.h
Binary files differ

--
Gitblit v1.9.3