From 4acd7cfd96f2099772497713e17ca8bfaf5cf4ec Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期二, 25 二月 2025 14:35:17 +0800
Subject: [PATCH] 1.CStep完善;
---
SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 45 insertions(+), 14 deletions(-)
diff --git a/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp b/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp
index 23c31e8..61f9245 100644
--- a/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp
+++ b/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp
@@ -483,15 +483,33 @@
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();
+
+ // 灏嗗瓧鏁版嵁瑙f瀽涓轰綅鏁版嵁
+ 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;
@@ -573,22 +591,35 @@
// 鍐欎綅鏁版嵁
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());
}
// 鍐欏瓧鏁版嵁
--
Gitblit v1.9.3