From df0863b2c29fa227d186e6b8aeb4a856dcae12f3 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 02 十二月 2024 13:57:42 +0800
Subject: [PATCH] 1.增加PLC组件页

---
 SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp |  196 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 194 insertions(+), 2 deletions(-)

diff --git a/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp b/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
index 2897dfb..f707501 100644
--- a/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
+++ b/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
@@ -5,7 +5,10 @@
 #include "BondEq.h"
 #include "afxdialogex.h"
 #include "IOMonitoringDlg.h"
+#include "ToolUnits.h"
 
+#define TIMER_INIT				1
+#define TIMER_READ_PLC_DATA		2
 
 // CIOMonitoringDlg 瀵硅瘽妗�
 
@@ -51,6 +54,12 @@
 	// 璁$畻椤垫暟
 	m_nCurrentPage = 1;
 	m_nTotalPages = (m_displayData.size() + m_nRowsPerPage - 1) / m_nRowsPerPage;
+}
+
+void CIOMonitoringDlg::SetPLC(CPLC* pPLC)
+{
+	ASSERT(pPLC);
+	m_pPLC = pPLC;
 }
 
 CFont* CIOMonitoringDlg::GetOrCreateFont(int nFontSize)
@@ -177,7 +186,41 @@
 		x += colWidthLarge + groupSpacing;
 
 		// 鍒涘缓绗� 2 缁� (3, 4, 5)
-		CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("OFF"), true, AlignCenter);
+		CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("OFF"), true, AlignCenter, [this, i]() {
+			// 鑷畾涔夌偣鍑讳簨浠剁殑閫昏緫
+			auto* pControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]);
+			CString currentText;
+			pControl->GetWindowText(currentText);
+
+			BOOL bOn = FALSE;
+			if (currentText == _T("OFF")) {
+				//pControl->SetBkColor(RGB(0, 255, 0)); // 缁胯壊鑳屾櫙
+				//pControl->SetText(_T("ON"));          // 鏇存柊鏂囨湰涓� ON
+				bOn = TRUE;
+			}
+			else {
+				//pControl->SetBkColor(RGB(255, 0, 0)); // 绾㈣壊鑳屾櫙
+				//pControl->SetText(_T("OFF"));         // 鏇存柊鏂囨湰涓� OFF
+				bOn = FALSE;
+			}
+
+			pControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 4]);
+			pControl->GetWindowText(currentText);
+
+			int nAddress;
+			MC::SOFT_COMPONENT component;
+			if (ParsePLCAddress(currentText, component, nAddress) && m_pPLC) {
+				TRACE("鍦板潃瑙f瀽鎴愬姛: %s\n", currentText);
+				m_pPLC->writeBit(component, nAddress, bOn, [](IMcChannel* pChannel, int addr, DWORD value, int flag) {
+					if (flag == 0) {
+						TRACE("鍐欏叆鎴愬姛: 鍦板潃: %d, 鍊�: %lu\n", addr, value);
+					}
+					else {
+						TRACE("鍐欏叆澶辫触: 鍦板潃: %d, 閿欒鐮�: %d\n", addr, flag);
+					}
+				});
+			}
+		});
 		x += colWidthSmall;
 		CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("Y1010"), false, AlignCenter);
 		x += colWidthSmall;
@@ -185,7 +228,7 @@
 	}
 }
 
-void CIOMonitoringDlg::CreateStaticControl(int x, int y, int width, int height, const CString& text, bool hasBorder, TextAlign alignment)
+void CIOMonitoringDlg::CreateStaticControl(int x, int y, int width, int height, const CString& text, bool hasBorder, TextAlign alignment, std::function<void()> clickCallback)
 {
 	// 鍒涘缓鍔ㄦ�佹帶浠�
 	CBLLabel* pStatic = new CBLLabel();
@@ -205,6 +248,11 @@
 	pStatic->SetFontSize(nSize);
 	pStatic->SetDynamicFont(TRUE);
 
+	// 璁剧疆鍥炶皟
+	if (clickCallback) {
+		pStatic->SetClickCallback(clickCallback);
+	}
+
 	// 瀛樺偍鎺т欢鎸囬拡
 	m_staticControls.push_back(pStatic);
 }
@@ -214,11 +262,18 @@
 	int startIndex = (m_nCurrentPage - 1) * m_nRowsPerPage;
 	int endIndex = min(startIndex + m_nRowsPerPage, static_cast<int>(m_displayData.size()));
 
+	m_inputPLCAddresses.clear();
+	m_outputPLCAddresses.clear();
+
 	for (int i = 0; i < m_nRowsPerPage; ++i) {
 		int row = i;
 
 		if (startIndex + i < endIndex) {
 			const auto& data = m_displayData[startIndex + i];
+
+			// 娣诲姞 PLC 鍦板潃鍒板鍣ㄤ腑
+			m_inputPLCAddresses.push_back(CString(data.inputAddress.c_str()));		// 1 鍒�
+			m_outputPLCAddresses.push_back(CString(data.outputAddress.c_str()));	// 4 鍒�
 
 			// 鏄剧ず鎺т欢骞惰缃唴瀹�
 			m_staticControls[row * m_nCols + 0]->SetWindowText(_T("OFF"));
@@ -263,10 +318,127 @@
 	m_staticControls.clear();
 }
 
+bool CIOMonitoringDlg::ParsePLCAddress(const CString& address, MC::SOFT_COMPONENT& component, int& addr)
+{
+	if (address.GetLength() < 2) {
+		return false;
+	}
+
+	// 鎻愬彇缁勪欢绫诲瀷锛堢涓�涓瓧绗︼級
+	TCHAR componentChar = address[0];
+	switch (componentChar) {
+	case 'D':
+		component = MC::SOFT_COMPONENT::D;
+		break;
+	case 'M':
+		component = MC::SOFT_COMPONENT::M;
+		break;
+	case 'X':
+		component = MC::SOFT_COMPONENT::X;
+		break;
+	case 'Y':
+		component = MC::SOFT_COMPONENT::Y;
+		break;
+	default:
+		return false;
+	}
+
+	CString hexAddress = address.Mid(1);
+	addr = _tcstoul(hexAddress, nullptr, 16);
+
+	return true;
+}
+
+void CIOMonitoringDlg::UpdatePLCStates()
+{
+	// 绀轰緥锛氫粠 PLC 鑾峰彇鍊硷紝杩欓噷鐢ㄩ殢鏈哄�兼ā鎷�
+	//for (size_t i = 0; i < m_inputPLCAddresses.size(); ++i) {
+	//	// 妯℃嫙鑾峰彇杈撳叆鐘舵��
+	//	bool inputState = (rand() % 2 == 0); // 鍋跺皵涓� true/false
+	//	auto* inputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 0]);
+	//	inputControl->SetBkColor(inputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
+	//	inputControl->SetText(inputState ? _T("ON") : _T("OFF"));
+	//}
+
+	//for (size_t i = 0; i < m_outputPLCAddresses.size(); ++i) {
+	//	// 妯℃嫙鑾峰彇杈撳嚭鐘舵��
+	//	bool outputState = (rand() % 2 == 0); // 鍋跺皵涓� true/false
+	//	auto* outputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]);
+	//	outputControl->SetBkColor(outputState ? RGB(0, 255, 0) : RGB(255, 0, 0));
+	//	outputControl->SetText(outputState ? _T("ON") : _T("OFF"));
+	//}
+
+	// 杈撳叆鍦板潃鐨勮鍙�
+	if (!m_inputPLCAddresses.empty()) {
+		// 鑾峰彇璧峰鍦板潃鍜岄暱搴�
+		CString startAddressStr = m_inputPLCAddresses.front();
+		CString endAddressStr = m_inputPLCAddresses.back();
+		MC::SOFT_COMPONENT component;
+		int startAddress, endAddress;
+
+		// 瑙f瀽璧峰鍜岀粨鏉熷湴鍧�
+		if (ParsePLCAddress(startAddressStr, component, startAddress) &&
+			ParsePLCAddress(endAddressStr, component, endAddress)) {
+			int inputSize = endAddress - startAddress + 1;
+
+			// 鍥炶皟澶勭悊杈撳叆鏁版嵁
+			auto funOnReadInput = [this, startAddress](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
+				if (nDataSize == (unsigned int)(m_inputPLCAddresses.size()) && flag == 0) {
+					for (size_t i = 0; i < m_inputPLCAddresses.size(); ++i) {
+						int offset = i;
+						int value = CToolUnits::toInt16(&pData[offset]);
+
+						auto* inputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 0]); // 绗� 0 鍒�
+						inputControl->SetBkColor(value ? RGB(0, 255, 0) : RGB(255, 0, 0)); // 鏇存柊鑳屾櫙棰滆壊
+						inputControl->SetText(value ? _T("ON") : _T("OFF"));               // 鏇存柊鏂囨湰
+					}
+				}
+			};
+
+			// 璇诲彇杈撳叆鏁版嵁
+			m_pPLC->readData(component, startAddress, inputSize, funOnReadInput);
+		}
+	}
+
+	// 杈撳嚭鍦板潃鐨勮鍙�
+	if (!m_outputPLCAddresses.empty()) {
+		// 鑾峰彇璧峰鍦板潃鍜岄暱搴�
+		CString startAddressStr = m_outputPLCAddresses.front();
+		CString endAddressStr = m_outputPLCAddresses.back();
+		MC::SOFT_COMPONENT component;
+		int startAddress, endAddress;
+
+		// 瑙f瀽璧峰鍜岀粨鏉熷湴鍧�
+		if (ParsePLCAddress(startAddressStr, component, startAddress) &&
+			ParsePLCAddress(endAddressStr, component, endAddress)) {
+			int outputSize = endAddress - startAddress + 1;
+
+			// 鍥炶皟澶勭悊杈撳嚭鏁版嵁
+			auto funOnReadOutput = [this, startAddress](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) {
+				if (nDataSize == (unsigned int)(m_outputPLCAddresses.size()) && flag == 0) {
+					for (size_t i = 0; i < m_outputPLCAddresses.size(); ++i) {
+						int offset = i;
+						int value = CToolUnits::toInt16(&pData[offset]);
+
+						auto* outputControl = static_cast<CBLLabel*>(m_staticControls[i * m_nCols + 3]); // 绗� 3 鍒�
+						outputControl->SetBkColor(value ? RGB(0, 255, 0) : RGB(255, 0, 0)); // 鏇存柊鑳屾櫙棰滆壊
+						outputControl->SetText(value ? _T("ON") : _T("OFF"));               // 鏇存柊鏂囨湰
+					}
+				}
+			};
+
+			// 璇诲彇杈撳嚭鏁版嵁
+			m_pPLC->readData(component, startAddress, outputSize, funOnReadOutput);
+		}
+	}
+}
+
 BEGIN_MESSAGE_MAP(CIOMonitoringDlg, CDialogEx)
 	ON_BN_CLICKED(IDC_BUTTON_PREV_PAGE, &CIOMonitoringDlg::OnBnClickedButtonPrevPage)
 	ON_BN_CLICKED(IDC_BUTTON_NEXT_PAGE, &CIOMonitoringDlg::OnBnClickedButtonNextPage)
 	ON_WM_SIZE()
+	ON_WM_TIMER()
+	ON_WM_CLOSE()
 END_MESSAGE_MAP()
 
 
@@ -331,6 +503,8 @@
 	CreateDynamicControls();
 	DisplayCurrentPage();
 
+	SetTimer(TIMER_READ_PLC_DATA, 500, nullptr);
+
 	return TRUE;  // return TRUE unless you set the focus to a control
 	// 寮傚父: OCX 灞炴�ч〉搴旇繑鍥� FALSE
 }
@@ -374,3 +548,21 @@
 		AfxMessageBox(_T("宸茬粡鏄渶鍚庝竴椤碉紒"));
 	}
 }
+
+void CIOMonitoringDlg::OnTimer(UINT_PTR nIDEvent)
+{
+	// TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜�/鎴栬皟鐢ㄩ粯璁ゅ��
+	if (TIMER_READ_PLC_DATA == nIDEvent) {
+		ASSERT(m_pPLC);
+		UpdatePLCStates();
+		Sleep(100);
+	}
+	CDialogEx::OnTimer(nIDEvent);
+}
+
+void CIOMonitoringDlg::OnClose()
+{
+	// TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜�/鎴栬皟鐢ㄩ粯璁ゅ��
+	KillTimer(TIMER_READ_PLC_DATA);
+	CDialogEx::OnClose();
+}

--
Gitblit v1.9.3