| | |
| | | return nRet; |
| | | } |
| | | |
| | | // 计算需要读取的字节大小(按位对齐为字节数) |
| | | if (nDevNo % 8 != 0) { |
| | | nRet = -2; |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>((nBitCount + 7) / 8); // 向上取整 |
| | | std::vector<short> vecTempBuffer((nSize + 1) / 2, 0); // 临时缓冲区,字节对齐 |
| | | const auto nSize = static_cast<short>((static_cast<int>(nBitCount) + 15) / 16); // 计算需要读取的字数量(向上取整) |
| | | |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer); |
| | | |
| | | if (nRet == 0) { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护 |
| | | ConvertShortToUint8(vecTempBuffer, vecData); |
| | | vecData.clear(); |
| | | |
| | | // 将字数据解析为位数据 |
| | | for (short nIdx = 0; nIdx < nSize; ++nIdx) { |
| | | const short nCurrentValue = vecTempBuffer[nIdx]; |
| | | // 遍历当前 short 中的每一位 |
| | | for (int bitIdx = 0; bitIdx < 16; ++bitIdx) { |
| | | bool bBit = (nCurrentValue & (1 << bitIdx)) != 0; |
| | | vecData.push_back(bBit); |
| | | if (vecData.size() >= nBitCount) { |
| | | return nRet; // 如果已经读取完所需的位数,提前退出 |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | return nRet; |
| | |
| | | // 写位数据 |
| | | int CPerformanceMelsec::WriteBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const BitContainer& vecData) { |
| | | // 验证站点参数和数据有效性 |
| | | const int nRet = ValidateStationAndData(station, vecData); |
| | | int nRet = ValidateStationAndData(station, vecData); |
| | | if (nRet != 0) { |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | // 计算需要写入的字节数(位数据需要按 8 位对齐为字节数) |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>((vecData.size() + 7) / 8); |
| | | std::vector<short> vecBuffer(vecData.size() / 2 + vecData.size() % 2, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护 |
| | | ConvertUint8ToShort(vecData, vecBuffer); |
| | | if (nDevNo % 8 != 0) { |
| | | nRet = -2; |
| | | UpdateLastError(nRet); |
| | | return nRet; |
| | | } |
| | | |
| | | return WriteData(station, nDevType, nDevNo, nSize, vecBuffer.data()); |
| | | const short nDevType = CalculateDeviceType(station, enDevType); |
| | | const auto nSize = static_cast<short>((static_cast<int>(vecData.size()) + 15) / 16); // 计算需要写入的字数量(向上取整) |
| | | |
| | | // 准备临时缓冲区来存储转换后的 16 位数据 |
| | | std::vector<short> vecTempBuffer(nSize, 0); |
| | | { |
| | | std::lock_guard<std::mutex> lock(m_mtx); // 线程安全保护 |
| | | // 将位数据按字打包到临时缓冲区 |
| | | for (int i = 0; i < vecData.size(); ++i) { |
| | | if (vecData[i]) { |
| | | // 使用 & 0xFFFF 保证不会超过 16 位,防止溢出 |
| | | vecTempBuffer[i / 16] |= static_cast<short>((1 << (i % 16)) & 0xFFFF); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return WriteData(station, nDevType, nDevNo, nSize, vecTempBuffer.data()); |
| | | } |
| | | |
| | | // 写字数据 |