| | |
| | | pStatic->SetDynamicFont(TRUE); |
| | | |
| | | // 设置回调 |
| | | if (clickCallback) { |
| | | UserManager& userManager = UserManager::getInstance(); |
| | | UserRole enRole = userManager.getCurrentUserRole(); |
| | | if (clickCallback && (enRole == UserRole::SuperAdmin || enRole == UserRole::Operator)) { |
| | | pStatic->SetClickCallback(clickCallback); |
| | | } |
| | | |
| | |
| | | int startIndex = (m_nCurrentPage - 1) * m_nRowsPerPage; |
| | | int endIndex = min(startIndex + m_nRowsPerPage, static_cast<int>(m_displayData.size())); |
| | | |
| | | m_inputStates.clear(); |
| | | m_outputStates.clear(); |
| | | m_inputPLCAddresses.clear(); |
| | | m_outputPLCAddresses.clear(); |
| | | |
| | |
| | | |
| | | if (startIndex + i < endIndex) { |
| | | const auto& data = m_displayData[startIndex + i]; |
| | | |
| | | // 添加状态到容器中 |
| | | m_inputStates.push_back(FALSE); // 0 列 |
| | | m_outputStates.push_back(FALSE); // 3 列 |
| | | |
| | | // 添加 PLC 地址到容器中 |
| | | m_inputPLCAddresses.push_back(CString(data.inputAddress.c_str())); // 1 列 |
| | |
| | | auto startData = m_displayData.front(); |
| | | auto endData = m_displayData.back(); |
| | | MC::SOFT_COMPONENT startSoftComponent, endSoftComponent; |
| | | int startAddr, endAddr; |
| | | ParsePLCAddress(CString(startData.inputAddress.c_str()), startSoftComponent, startAddr); |
| | | ParsePLCAddress(CString(endData.inputAddress.c_str()), endSoftComponent, endAddr); |
| | | int inputStartAddr, inputEndAddr; |
| | | ParsePLCAddress(CString(startData.inputAddress.c_str()), startSoftComponent, inputStartAddr); |
| | | ParsePLCAddress(CString(endData.inputAddress.c_str()), endSoftComponent, inputEndAddr); |
| | | ASSERT(startSoftComponent == endSoftComponent); |
| | | |
| | | // 读取输入数据 |
| | | ReadPLCData(startSoftComponent, startAddr, endAddr, [this, startAddr](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) { |
| | | ReadPLCData(startSoftComponent, inputStartAddr, inputEndAddr, [this, inputStartAddr](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) { |
| | | if (!::IsWindow(m_hWnd)) return; |
| | | for (auto& data : m_displayData) { |
| | | int nAddress; |
| | | MC::SOFT_COMPONENT enComponent; |
| | | if (ParsePLCAddress(CString(data.inputAddress.c_str()), enComponent, nAddress)) { |
| | | int nOffset = nAddress - startAddr; |
| | | int nOffset = nAddress - inputStartAddr; |
| | | if (nOffset >= 0 && nOffset < nDataSize) { |
| | | int byteIndex = nOffset / 8; |
| | | int bitIndex = nOffset % 8; |
| | |
| | | }); |
| | | |
| | | // 读取输出数据 |
| | | int startAddr2, endAddr2; |
| | | ParsePLCAddress(CString(startData.outputAddress.c_str()), startSoftComponent, startAddr2); |
| | | ParsePLCAddress(CString(endData.outputAddress.c_str()), endSoftComponent, endAddr2); |
| | | int outputStartAddr, outputEndAddr; |
| | | ParsePLCAddress(CString(startData.outputAddress.c_str()), startSoftComponent, outputStartAddr); |
| | | ParsePLCAddress(CString(endData.outputAddress.c_str()), endSoftComponent, outputEndAddr); |
| | | ASSERT(startSoftComponent == endSoftComponent); |
| | | ReadPLCData(startSoftComponent, startAddr2, endAddr2, [this, startAddr2](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) { |
| | | ReadPLCData(startSoftComponent, outputStartAddr, outputEndAddr, [this, outputStartAddr](IMcChannel* pChannel, int addr, char* pData, unsigned int nDataSize, int flag) { |
| | | if (!::IsWindow(m_hWnd)) return; |
| | | for (auto& data : m_displayData) { |
| | | int nAddress; |
| | | MC::SOFT_COMPONENT enComponent; |
| | | if (ParsePLCAddress(CString(data.outputAddress.c_str()), enComponent, nAddress)) { |
| | | int nOffset = nAddress - startAddr2; |
| | | int nOffset = nAddress - outputStartAddr; |
| | | if (nOffset >= 0 && nOffset < nDataSize) { |
| | | int byteIndex = nOffset / 8; |
| | | int bitIndex = nOffset % 8; |
| | |
| | | if (startIndex + i < endIndex) { |
| | | const auto& data = m_displayData[startIndex + i]; |
| | | // 设置内容和背景颜色 |
| | | m_staticControls[row * m_nCols + 0]->SetText(data.bInputStates ? _T("ON") : _T("OFF")); |
| | | m_staticControls[row * m_nCols + 0]->SetBkColor(data.bInputStates ? RGB(0, 255, 0) : RGB(255, 0, 0)); |
| | | if (m_inputStates[i] != data.bInputStates) |
| | | { |
| | | m_staticControls[row * m_nCols + 0]->SetText(data.bInputStates ? _T("ON") : _T("OFF")); |
| | | m_staticControls[row * m_nCols + 0]->SetBkColor(data.bInputStates ? RGB(0, 255, 0) : RGB(255, 0, 0)); |
| | | m_inputStates[i] = data.bInputStates; |
| | | } |
| | | |
| | | m_staticControls[row * m_nCols + 3]->SetText(data.bOutputStates ? _T("ON") : _T("OFF")); |
| | | m_staticControls[row * m_nCols + 3]->SetBkColor(data.bOutputStates ? RGB(0, 255, 0) : RGB(255, 0, 0)); |
| | | if (m_outputStates[i] != data.bOutputStates) |
| | | { |
| | | m_staticControls[row * m_nCols + 3]->SetText(data.bOutputStates ? _T("ON") : _T("OFF")); |
| | | m_staticControls[row * m_nCols + 3]->SetBkColor(data.bOutputStates ? RGB(0, 255, 0) : RGB(255, 0, 0)); |
| | | m_outputStates[i] = data.bOutputStates; |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | CreateDynamicControls(); |
| | | DisplayCurrentPage(); |
| | | |
| | | GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurrentPage > 1); |
| | | GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurrentPage < m_nTotalPages); |
| | | |
| | | SetTimer(TIMER_READ_PLC_DATA, 500, nullptr); |
| | | SetTimer(TIMER_READ_UPDATE, 200, nullptr); |
| | | |
| | |
| | | else { |
| | | AfxMessageBox(_T("已经是第一页!")); |
| | | } |
| | | |
| | | GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurrentPage > 1); |
| | | GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurrentPage < m_nTotalPages); |
| | | } |
| | | |
| | | void CIOMonitoringDlg::OnBnClickedButtonNextPage() |
| | |
| | | else { |
| | | AfxMessageBox(_T("已经是最后一页!")); |
| | | } |
| | | |
| | | GetDlgItem(IDC_BUTTON_PREV_PAGE)->EnableWindow(m_nCurrentPage > 1); |
| | | GetDlgItem(IDC_BUTTON_NEXT_PAGE)->EnableWindow(m_nCurrentPage < m_nTotalPages); |
| | | } |
| | | |
| | | LRESULT CIOMonitoringDlg::OnIoClicked(WPARAM wParam, LPARAM lParam) |