| | |
| | | #include "BondEq.h" |
| | | #include "afxdialogex.h" |
| | | #include "IOMonitoringDlg.h" |
| | | #include "ToolUnits.h" |
| | | |
| | | #define TIMER_INIT 1 |
| | | #define TIMER_READ_PLC_DATA 2 |
| | |
| | | // 计算页数 |
| | | 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) |
| | |
| | | CString currentText; |
| | | pControl->GetWindowText(currentText); |
| | | |
| | | BOOL bOn = FALSE; |
| | | if (currentText == _T("OFF")) { |
| | | pControl->SetBkColor(RGB(0, 255, 0)); // 绿色背景 |
| | | pControl->SetText(_T("ON")); // 更新文本为 ON |
| | | //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 |
| | | //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("地址解析成功: %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; |
| | |
| | | m_staticControls.clear(); |
| | | } |
| | | |
| | | void CIOMonitoringDlg::UpdatePLCStates() |
| | | bool CIOMonitoringDlg::ParsePLCAddress(const CString& address, MC::SOFT_COMPONENT& component, int& addr) |
| | | { |
| | | // 随机值模拟 |
| | | 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")); |
| | | if (address.GetLength() < 2) { |
| | | return false; |
| | | } |
| | | |
| | | 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")); |
| | | // 提取组件类型(第一个字符) |
| | | 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; |
| | | |
| | | // 解析起始和结束地址 |
| | | 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; |
| | | |
| | | // 解析起始和结束地址 |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | // TODO: 在此添加消息处理程序代码和/或调用默认值 |
| | | if (TIMER_READ_PLC_DATA == nIDEvent) { |
| | | //ASSERT(m_pPLC); |
| | | ASSERT(m_pPLC); |
| | | UpdatePLCStates(); |
| | | Sleep(100); |
| | | } |