From a886343fc6eaecb4eccd35dc2a5b95fc84212dd5 Mon Sep 17 00:00:00 2001
From: darker <mr.darker@163.com>
Date: 星期二, 18 二月 2025 16:21:36 +0800
Subject: [PATCH] 1. 添加ReportVIDs表的相关操作
---
SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp | 127 +++++++++++++++++++++++++++++-------------
1 files changed, 87 insertions(+), 40 deletions(-)
diff --git a/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp b/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp
index 1f6deab..61f9245 100644
--- a/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp
+++ b/SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp
@@ -219,7 +219,8 @@
if (nRet == 0) {
m_bConnected.store(true);
m_enBoardType = enBoardType;
- } else {
+ }
+ else {
UpdateLastError(nRet);
LOG_ERROR(m_strLastError);
}
@@ -270,7 +271,7 @@
}
// 鑾峰彇鐗堟湰淇℃伅
- short buf[32] = {0};
+ short buf[32] = { 0 };
const short nRet = mdBdVerRead(m_nPath, buf);
if (nRet != 0) {
UpdateLastError(nRet);
@@ -428,7 +429,7 @@
return ERROR_CODE_NOT_CONNECTED;
}
- short buf[6] = {0};
+ short buf[6] = { 0 };
const short nRet = mdBdSwRead(m_nPath, buf);
if (nRet != 0) {
UpdateLastError(nRet);
@@ -451,12 +452,13 @@
// 鍒濆鍖栬鍙栫紦鍐插尯
vecData.clear();
- vecData.resize(nSize);
+ vecData.resize(nSize, 0);
// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
{
std::lock_guard<std::mutex> lock(m_mtx);
short* pData = vecData.data();
+ nSize *= sizeof(short);
nRet = mdReceive(m_nPath, CombineStation(station), nDevType, nDevNo, &nSize, pData);
}
@@ -481,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;
@@ -556,6 +576,7 @@
// 纭繚绾跨▼瀹夊叏鐨勬渶灏忛攣瀹氳寖鍥�
{
std::lock_guard<std::mutex> lock(m_mtx);
+ nSize *= sizeof(short);
nRet = mdSend(m_nPath, CombineStation(station), nDevType, nDevNo, &nSize, pData);
}
@@ -570,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());
}
// 鍐欏瓧鏁版嵁
@@ -599,7 +633,7 @@
// 璁$畻闇�瑕佸啓鍏ョ殑瀛楄妭鏁帮紙姣忎釜瀛楀崰 2 瀛楄妭锛�
const short nDevType = CalculateDeviceType(station, enDevType);
- const auto nSize = static_cast<short>(vecData.size() * sizeof(uint16_t));
+ const auto nSize = static_cast<short>(vecData.size());
const auto pData = const_cast<short*>(reinterpret_cast<const short*>(vecData.data()));
return WriteData(station, nDevType, nDevNo, nSize, pData);
@@ -616,8 +650,8 @@
// 璁$畻闇�瑕佸啓鍏ョ殑瀛楄妭鏁帮紙姣忎釜鍙屽瓧鍗� 4 瀛楄妭锛�
const short nDevType = CalculateDeviceType(station, enDevType);
- const auto nSize = static_cast<short>(vecData.size() * sizeof(uint32_t));
- std::vector<short> vecBuffer(vecData.size() * 2, 0);
+ const auto nSize = static_cast<short>(vecData.size() * sizeof(short));
+ std::vector<short> vecBuffer(nSize, 0);
{
std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
ConvertUint32ToShort(vecData, vecBuffer);
@@ -640,20 +674,21 @@
return ERROR_CODE_INVALID_PARAM;
}
- vecData.resize(nSize);
- long nActualSize = (nSize + 1) / 2;
- std::vector<short> vecBuffer(nActualSize, 0);
+ nSize = nSize % 2 != 0 ? nSize + 1 : nSize;
+ std::vector<short> vecBuffer(nSize / 2, 0);
{
std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
- nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nActualSize, vecBuffer.data());
+ nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data());
}
if (nRet != 0) {
UpdateLastError(nRet);
LOG_ERROR(m_strLastError);
- } else {
+ }
+ else {
std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
+ vecData.resize(nSize);
ConvertShortToChar(vecBuffer, vecData);
}
@@ -671,7 +706,8 @@
// 灏� vecData 杞崲涓� short 绫诲瀷鐨勭紦鍐插尯
long nSize = static_cast<long>(vecData.size());
- std::vector<short> vecBuffer((nSize + 1) / 2, 0);
+ nSize = nSize % 2 != 0 ? nSize + 1 : nSize;
+ std::vector<short> vecBuffer(nSize / 2, 0);
{
std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
@@ -797,7 +833,8 @@
if (nRet != 0) {
UpdateLastError(nRet); // 鏇存柊閿欒鐮�
LOG_ERROR(m_strLastError);
- } else {
+ }
+ else {
std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
ConvertShortToChar(vecBuffer, vecData);
}
@@ -854,7 +891,8 @@
if (nRet != 0) {
UpdateLastError(nRet);
LOG_ERROR(m_strLastError);
- } else {
+ }
+ else {
std::lock_guard<std::mutex> lock(m_mtx); // 绾跨▼瀹夊叏淇濇姢
ConvertShortToChar(vecBuffer, vecData);
}
@@ -1022,7 +1060,7 @@
}
// 绗� 0 涓厓绱犲瓨鍌ㄦ暟閲忥紝鏈�澶ф敮鎸� 64 涓簨浠�
- std::array<short, 65> eventno = {0};
+ std::array<short, 65> eventno = { 0 };
eventno[0] = static_cast<short>(vecEventNumbers.size());
std::copy(vecEventNumbers.begin(), vecEventNumbers.end(), eventno.begin() + 1);
@@ -1051,7 +1089,8 @@
if (it != m_mapError.end()) {
// 濡傛灉鎵惧埌锛岀洿鎺ヨ繑鍥炲搴旇瑷�鐨勯敊璇俊鎭�
m_strLastError = it->second;
- } else {
+ }
+ else {
// 濡傛灉鏈壘鍒帮紝澶勭悊鐗规畩鑼冨洿
m_strLastError = "Unknown error.";
if (nCode == -28611 || nCode == -28612) {
@@ -1179,13 +1218,17 @@
BoardType CPerformanceMelsec::FindBoardTypeByChannel(const int nChannel) {
if (nChannel >= MELSECNET_CHANNEL(1) && nChannel <= MELSECNET_CHANNEL(4)) {
return BoardType::MELSECNET_H;
- } else if (nChannel >= CC_LINK_CHANNEL(1) && nChannel <= CC_LINK_CHANNEL(4)) {
+ }
+ else if (nChannel >= CC_LINK_CHANNEL(1) && nChannel <= CC_LINK_CHANNEL(4)) {
return BoardType::CC_LINK_VER_2;
- } else if (nChannel >= CC_LINK_IE_CONTROL_CHANNEL(1) && nChannel <= CC_LINK_IE_CONTROL_CHANNEL(4)) {
+ }
+ else if (nChannel >= CC_LINK_IE_CONTROL_CHANNEL(1) && nChannel <= CC_LINK_IE_CONTROL_CHANNEL(4)) {
return BoardType::CC_LINK_IE_CONTROL;
- } else if (nChannel >= CC_LINK_IE_FIELD_CHANNEL(1) && nChannel <= CC_LINK_IE_FIELD_CHANNEL(4)) {
+ }
+ else if (nChannel >= CC_LINK_IE_FIELD_CHANNEL(1) && nChannel <= CC_LINK_IE_FIELD_CHANNEL(4)) {
return BoardType::CC_LINK_IE_FIELD;
- } else if (nChannel >= CC_LINK_IE_TSN_CHANNEL(1) && nChannel <= CC_LINK_IE_TSN_CHANNEL(4)) {
+ }
+ else if (nChannel >= CC_LINK_IE_TSN_CHANNEL(1) && nChannel <= CC_LINK_IE_TSN_CHANNEL(4)) {
return BoardType::CC_LINK_IE_TSN;
}
return BoardType::UNKNOWN;
@@ -1206,10 +1249,12 @@
enDevType == DeviceType::LSB || enDevType == DeviceType::LSW) {
// 缃戠粶鍙峰姞鍋忕Щ
nDevType += station.nNetNo;
- } else if (enDevType == DeviceType::ER) {
+ }
+ else if (enDevType == DeviceType::ER) {
// 鏂囦欢瀵勫瓨鍣ㄧ殑鍧楀彿鍔犲亸绉�
nDevType += 0;
- } else if (enDevType == DeviceType::SPG) {
+ }
+ else if (enDevType == DeviceType::SPG) {
// 璧峰 I/O No. 梅 16 鐨勫��
nDevType += 0 / 16;
}
@@ -1223,7 +1268,8 @@
for (size_t i = 0; i < vecChar.size(); i++) {
if (i % 2 == 0) {
vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]); // 浣庡瓧鑺�
- } else {
+ }
+ else {
vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // 楂樺瓧鑺�
}
}
@@ -1244,7 +1290,8 @@
for (size_t i = 0; i < vecUint8.size(); i++) {
if (i % 2 == 0) {
vecShort[i / 2] = static_cast<short>(vecUint8[i]); // 浣庡瓧鑺�
- } else {
+ }
+ else {
vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8); // 楂樺瓧鑺�
}
}
@@ -1273,7 +1320,7 @@
vecUint32.resize((vecShort.size() + 1) / 2, 0); // 姣忎袱涓� short 鍚堝苟涓轰竴涓� uint32_t
for (size_t i = 0; i < vecUint32.size(); i++) {
vecUint32[i] = (static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2 + 1])) << 16) | // 楂�16浣�
- static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2])); // 浣�16浣�
+ static_cast<uint32_t>(static_cast<uint16_t>(vecShort[i * 2])); // 浣�16浣�
}
}
--
Gitblit v1.9.3