From aedb3b85fed48cb2cf0abb5fafa8e7591644c9f4 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期一, 02 十二月 2024 08:53:06 +0800
Subject: [PATCH] Merge branch 'liuyang' into clh
---
SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp | 284 +++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 248 insertions(+), 36 deletions(-)
diff --git a/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp b/SourceCode/Bond/BondEq/View/IOMonitoringDlg.cpp
index 1185f82..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 瀵硅瘽妗�
@@ -53,6 +56,12 @@
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)
{
auto it = m_mapFonts.find(nFontSize);
@@ -88,8 +97,7 @@
CWnd* pWnd = GetWindow(GW_CHILD);
while (pWnd) {
int nCtrlID = pWnd->GetDlgCtrlID();
- if (nCtrlID != -1 && m_mapCtrlLayouts.find(nCtrlID) != m_mapCtrlLayouts.end())
- {
+ if (nCtrlID != -1 && m_mapCtrlLayouts.find(nCtrlID) != m_mapCtrlLayouts.end()) {
CRect originalRect = m_mapCtrlLayouts[nCtrlID];
CRect newRect(
static_cast<int>(originalRect.left * dScaleX),
@@ -112,6 +120,7 @@
// 鏍规嵁鎺т欢楂樺害鍔ㄦ�佽皟鏁村瓧浣撳ぇ灏�
int fontSize = nHeight / 2;
if (fontSize < 8) fontSize = 8;
+ if (fontSize < 24) fontSize = 24;
// 鑾峰彇鎴栧垱寤哄瓧浣�
CFont* pFont = GetOrCreateFont(fontSize);
@@ -161,50 +170,88 @@
int colWidthLarge = availableWidth * 4 / 14; // 澶у搴﹀垪姣斾緥
int groupWidth = colWidthSmall * 2 + colWidthLarge; // 姣忕粍鎬诲搴�
- for (int i = 0; i < m_nRowsPerPage; ++i)
- {
+ for (int i = 0; i < m_nRowsPerPage; ++i) {
// 姣忎竴琛岀殑璧峰 Y 鍧愭爣
int y = topMargin + i * (rowHeight + verticalSpacing);
// 鍒涘缓绗� 1 缁� (0, 1, 2)
int x = sideMargin; // 浠庡乏杈硅窛寮�濮�
- CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("OFF"), true);
+ CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("OFF"), true, AlignCenter);
x += colWidthSmall;
- CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("X1000"));
+ CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("X1000"), false, AlignCenter);
x += colWidthSmall;
- CreateStaticControl(x, y, colWidthLarge, rowHeight, _T("鎻忚堪鏂囨湰"), false, true);
+ CreateStaticControl(x, y, colWidthLarge, rowHeight, _T("鎻忚堪鏂囨湰"), false);
// 绗� 2 缁勮捣濮嬩綅缃紝鍔犱笂缁勯棿璺�
x += colWidthLarge + groupSpacing;
// 鍒涘缓绗� 2 缁� (3, 4, 5)
- CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("OFF"), true);
+ 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"));
+ CreateStaticControl(x, y, colWidthSmall, rowHeight, _T("Y1010"), false, AlignCenter);
x += colWidthSmall;
- CreateStaticControl(x, y, colWidthLarge, rowHeight, _T("鎻忚堪鏂囨湰"), false, true);
+ CreateStaticControl(x, y, colWidthLarge, rowHeight, _T("鎻忚堪鏂囨湰"), false);
}
}
-void CIOMonitoringDlg::CreateStaticControl(int x, int y, int width, int height, const CString& text, bool hasBorder, bool alignLeft)
+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();
DWORD style = WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE; // 纭繚鍨傜洿灞呬腑
if (hasBorder) {
- style |= WS_BORDER; // 娣诲姞杈规
+ style |= WS_BORDER; // 娣诲姞杈规
}
- if (alignLeft) {
- style |= SS_LEFT; // 宸﹀榻愭枃鏈�
- }
- else {
- style |= SS_CENTER; // 灞呬腑鏂囨湰
- }
-
- CStatic* pStatic = new CStatic();
pStatic->Create(text, style, CRect(x, y, x + width, y + height), this);
- // 鍔ㄦ�佽缃瓧浣撳ぇ灏�
- CFont* pFont = GetOrCreateFont(height / 3);
+ // 璁剧疆鏂囨湰瀵归綈鏂瑰紡
+ pStatic->SetAlignment(alignment);
+
+ // 璁剧疆鍔ㄦ�佸瓧浣撹皟鏁达紝骞惰缃瓧浣撳ぇ灏忥紙鍔ㄦ�佸瓧浣撲細鏍规嵁鎺т欢澶у皬璋冩暣锛�
+ int nSize = height / 3;
+ CFont* pFont = GetOrCreateFont(nSize);
pStatic->SetFont(pFont);
+ pStatic->SetFontSize(nSize);
+ pStatic->SetDynamicFont(TRUE);
+
+ // 璁剧疆鍥炶皟
+ if (clickCallback) {
+ pStatic->SetClickCallback(clickCallback);
+ }
// 瀛樺偍鎺т欢鎸囬拡
m_staticControls.push_back(pStatic);
@@ -215,27 +262,55 @@
int startIndex = (m_nCurrentPage - 1) * m_nRowsPerPage;
int endIndex = min(startIndex + m_nRowsPerPage, static_cast<int>(m_displayData.size()));
- for (int i = startIndex; i < endIndex; ++i)
- {
- const auto& data = m_displayData[i];
- int row = i - startIndex;
+ m_inputPLCAddresses.clear();
+ m_outputPLCAddresses.clear();
- m_staticControls[row * m_nCols + 0]->SetWindowText(_T("OFF"));
- m_staticControls[row * m_nCols + 1]->SetWindowText(CString(data.inputAddress.c_str()));
- m_staticControls[row * m_nCols + 2]->SetWindowText(CString(data.inputDescription.c_str()));
- m_staticControls[row * m_nCols + 3]->SetWindowText(_T("OFF"));
- m_staticControls[row * m_nCols + 4]->SetWindowText(CString(data.outputAddress.c_str()));
- m_staticControls[row * m_nCols + 5]->SetWindowText(CString(data.outputDescription.c_str()));
+ 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"));
+ m_staticControls[row * m_nCols + 0]->ShowWindow(SW_SHOW);
+ m_staticControls[row * m_nCols + 0]->SetBkColor(RGB(255, 0, 0));
+
+ m_staticControls[row * m_nCols + 1]->SetWindowText(CString(data.inputAddress.c_str()));
+ m_staticControls[row * m_nCols + 1]->ShowWindow(SW_SHOW);
+
+ m_staticControls[row * m_nCols + 2]->SetWindowText(CString(data.inputDescription.c_str()));
+ m_staticControls[row * m_nCols + 2]->ShowWindow(SW_SHOW);
+
+ m_staticControls[row * m_nCols + 3]->SetWindowText(_T("OFF"));
+ m_staticControls[row * m_nCols + 3]->ShowWindow(SW_SHOW);
+ m_staticControls[row * m_nCols + 3]->SetBkColor(RGB(255, 0, 0));
+
+ m_staticControls[row * m_nCols + 4]->SetWindowText(CString(data.outputAddress.c_str()));
+ m_staticControls[row * m_nCols + 4]->ShowWindow(SW_SHOW);
+
+ m_staticControls[row * m_nCols + 5]->SetWindowText(CString(data.outputDescription.c_str()));
+ m_staticControls[row * m_nCols + 5]->ShowWindow(SW_SHOW);
+ }
+ else {
+ // 闅愯棌杩欎竴琛岀殑鎵�鏈夋帶浠�
+ for (int col = 0; col < m_nCols; ++col) {
+ m_staticControls[row * m_nCols + col]->ShowWindow(SW_HIDE);
+ }
+ }
}
+
UpdatePageInfo();
}
void CIOMonitoringDlg::ClearDynamicControls()
{
- for (auto* pStatic : m_staticControls)
- {
- if (pStatic)
- {
+ for (auto* pStatic : m_staticControls) {
+ if (pStatic) {
pStatic->DestroyWindow();
delete pStatic;
}
@@ -243,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()
@@ -311,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
}
@@ -354,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