Document/Panel Bonder°ËÁãÁªºÏ SecsTest CheckList_v3.0.xlsxBinary files differ
SourceCode/Bond/Servo/CBonder.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ #include "stdafx.h" #include "CBonder.h" namespace SERVO { CBonder::CBonder() { } CBonder::~CBonder() { } const char* CBonder::getClassName() { static char* pszName = "CBonder"; return pszName; } void CBonder::init() { CEquipment::init(); } void CBonder::term() { CEquipment::term(); } void CBonder::onTimer(UINT nTimerid) { CEquipment::onTimer(nTimerid); } void CBonder::serialize(CArchive& ar) { CEquipment::serialize(ar); } } SourceCode/Bond/Servo/CBonder.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ #pragma once #include "CEquipment.h" namespace SERVO { class CBonder : public CEquipment { public: CBonder(); ~CBonder(); public: virtual const char* getClassName(); virtual void init(); virtual void term(); virtual void onTimer(UINT nTimerid); virtual void serialize(CArchive& ar); }; } SourceCode/Bond/Servo/CCLinkPerformance/CCLinkIEControl.cpp
@@ -40,7 +40,7 @@ return ERROR_CODE_INVALID_DATA; } // è§£æåä½ç¶æ // è§£æåä½ç¶æ const short nBuffer = vecLedBuffer[0]; outLedStatus.bExtPw = (nBuffer & (1 << 15)) != 0; outLedStatus.bRd = (nBuffer & (1 << 6)) != 0; @@ -56,26 +56,48 @@ CCLinkIEControlMode CCCLinkIEControl::ConvertToCCLinkIEControlMode(const short nMode) { switch (static_cast<CCLinkIEControlMode>(nMode)) { case CCLinkIEControlMode::ONLINE: return CCLinkIEControlMode::ONLINE; // å¨çº¿ case CCLinkIEControlMode::OFFLINE: return CCLinkIEControlMode::OFFLINE; // 离线 case CCLinkIEControlMode::INTER_STATION_TEST: return CCLinkIEControlMode::INTER_STATION_TEST; // ç«é´æµè¯ case CCLinkIEControlMode::LINE_TEST: return CCLinkIEControlMode::LINE_TEST; // 线路æµè¯ case CCLinkIEControlMode::LOOPBACK_TEST: return CCLinkIEControlMode::LOOPBACK_TEST; // èªåéæµè¯ case CCLinkIEControlMode::HW_TEST: return CCLinkIEControlMode::HW_TEST; // H/Wæµè¯ case CCLinkIEControlMode::BUS_IF_TEST: return CCLinkIEControlMode::BUS_IF_TEST; // æ»çº¿I/Fæµè¯ case CCLinkIEControlMode::ONLINE: return CCLinkIEControlMode::ONLINE; // å¨çº¿ case CCLinkIEControlMode::OFFLINE: return CCLinkIEControlMode::OFFLINE; // 离线 case CCLinkIEControlMode::INTER_STATION_TEST: return CCLinkIEControlMode::INTER_STATION_TEST; // ç«é´æµè¯ case CCLinkIEControlMode::LINE_TEST: return CCLinkIEControlMode::LINE_TEST; // 线路æµè¯ case CCLinkIEControlMode::LOOPBACK_TEST: return CCLinkIEControlMode::LOOPBACK_TEST; // èªåéæµè¯ case CCLinkIEControlMode::HW_TEST: return CCLinkIEControlMode::HW_TEST; // H/Wæµè¯ case CCLinkIEControlMode::BUS_IF_TEST: return CCLinkIEControlMode::BUS_IF_TEST; // æ»çº¿I/Fæµè¯ default: return CCLinkIEControlMode::UNKNOWN; } } int CCCLinkIEControl::ValidateBoardStatus(const BoardStatus& status) { if (status.nStationValue < 1 || status.nStationValue > 120) { return ERROR_CODE_STATION_OUT_OF_RANGE; // ç«å·è¶ åºèå´ return ERROR_CODE_STATION_OUT_OF_RANGE; // ç«å·è¶ åºèå´ } if (status.nGroupValue < 0 || status.nGroupValue > 32) { return ERROR_CODE_GROUP_OUT_OF_RANGE; // ç»è¶ åºèå´ return ERROR_CODE_GROUP_OUT_OF_RANGE; // ç»è¶ åºèå´ } if (status.nNetworkValue < 1 || status.nNetworkValue > 239) { return ERROR_CODE_NETWORK_OUT_OF_RANGE; // ç½ç»å·è¶ åºèå´ return ERROR_CODE_NETWORK_OUT_OF_RANGE; // ç½ç»å·è¶ åºèå´ } return 0; // æ ¡éªéè¿ return 0; // æ ¡éªéè¿ } int CCCLinkIEControl::ReadData2(const StationIdentifier& station, short devType, short devNo, short size, void* pData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStationAndSize(station, size); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ { std::lock_guard<std::mutex> lock(m_mtx); nRet = mdReceive(m_nPath, CombineStation(station), devType, devNo, &size, pData); } if (nRet != 0) { UpdateLastError(nRet); } return nRet; } SourceCode/Bond/Servo/CCLinkPerformance/CCLinkIEControl.h
@@ -4,14 +4,14 @@ #include "PerformanceMelsec.h" enum class CCLinkIEControlMode : short { UNKNOWN = 0x0194, // æªç¥ ONLINE = 0x0000, // å¨çº¿ OFFLINE = 0x0002, // 离线 INTER_STATION_TEST = 0x0005, // ç«é´æµè¯ LINE_TEST = 0x0006, // 线路æµè¯ LOOPBACK_TEST = 0x0007, // èªåéæµè¯ HW_TEST = 0x0009, // H/Wæµè¯ BUS_IF_TEST = 0x000E // æ»çº¿I/Fæµè¯ UNKNOWN = 0x0194, // δ֪ ONLINE = 0x0000, // å¨çº¿ OFFLINE = 0x0002, // 离线 INTER_STATION_TEST = 0x0005, // ç«é´æµè¯ LINE_TEST = 0x0006, // 线路æµè¯ LOOPBACK_TEST = 0x0007, // èªåéæµè¯ HW_TEST = 0x0009, // H/Wæµè¯ BUS_IF_TEST = 0x000E // æ»çº¿I/Fæµè¯ }; class CCCLinkIEControl final : public CPerformanceMelsec { @@ -20,16 +20,16 @@ ~CCCLinkIEControl() override; struct LedStatus { bool bExtPw; // å¤é¨çµæºç¶æ (b15) bool bRd; // æ°æ®æ¥æ¶ç¶æ (b6) bool bDLnk; // æ°æ®é¾æ¥ç¶æ (b5) bool bPrm; // 管çåè½ç¶æ (b4) bool bErr; // éè¯¯ç¶æ (b3) bool bSd; // æ°æ®åéç¶æ (b2) bool bMode; // å¨ä½æ¨¡å¼ (b1) bool bRun; // è¿è¡ç¶æ (b0) bool bExtPw; // å¤é¨çµæºç¶æ (b15) bool bRd; // æ°æ®æ¥æ¶ç¶æ (b6) bool bDLnk; // æ°æ®é¾æ¥ç¶æ (b5) bool bPrm; // 管çåè½ç¶æ (b4) bool bErr; // éè¯¯ç¶æ (b3) bool bSd; // æ°æ®åéç¶æ (b2) bool bMode; // å¨ä½æ¨¡å¼ (b1) bool bRun; // è¿è¡ç¶æ (b0) // 转æ¢ä¸ºå符串ï¼ç¨äºè°è¯ // 转æ¢ä¸ºå符串ï¼ç¨äºè°è¯ std::string ToString() const { std::ostringstream oss; oss << "CC-Link IE Control Network LED Status: {" @@ -46,19 +46,21 @@ } }; // 读åç®æ ç«ç¹CPUç±»å // 读åç®æ ç«ç¹CPUç±»å // short ReadCPUCodeEx(const StationIdentifier& station, short& nCPUCode); // æ¿æ¨¡å¼è·å/设置 // æ¿æ¨¡å¼è·å/设置 int SetBoardModeEx(CCLinkIEControlMode mode); CCLinkIEControlMode GetBoardModeEx(); // è·åæ¿ç¶æ // è·åæ¿ç¶æ int GetBoardStatusEx(BoardStatus& status); // 读åLEDç¶æ // 读åLEDç¶æ int ReadLedStatus(LedStatus& outLedStatus); int ReadData2(const StationIdentifier& station, short devType, short devNo, short size, void* pData); private: static CCLinkIEControlMode ConvertToCCLinkIEControlMode(short nMode); static int ValidateBoardStatus(const BoardStatus& status); SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.cpp
@@ -23,9 +23,9 @@ #define LOG_DEBUG(msg) #endif // åå§åéææååé // åå§åéææååé std::unordered_map<int, std::string> CPerformanceMelsec::m_mapError = { // æ¿åSDKé误ç // æ¿åSDKé误ç {0, "No error, communication successful."}, {1, "Driver not started. The driver is not running."}, {2, "Timeout error (board response error). Request not completed within timeout."}, @@ -118,7 +118,7 @@ {-28634, "Hardware self-diagnosis error."}, {-28636, "Hardware self-diagnosis error."}, // èªå®ä¹é误ç // èªå®ä¹é误ç {ERROR_CODE_UNKNOWN, "Error: Unknown error code."}, {ERROR_CODE_NOT_CONNECTED, "Error: Not connected to the device."}, {ERROR_CODE_INVALID_PARAM, "Error: Invalid parameter."}, @@ -137,26 +137,26 @@ m_bConnected.store(false); } // ææå½æ° // ææå½æ° CPerformanceMelsec::~CPerformanceMelsec() { Disconnect(); } // è·åæè¿çéè¯¯ä¿¡æ¯ // è·åæè¿çéè¯¯ä¿¡æ¯ std::string CPerformanceMelsec::GetLastError() const { return m_strLastError; } // ä¿åéè¯¯ä¿¡æ¯ // ä¿åéè¯¯ä¿¡æ¯ bool CPerformanceMelsec::SaveErrorInfoToFile(const std::string& filename) { // æå¼æä»¶ // æå¼æä»¶ std::ofstream file(filename); if (!file.is_open()) { std::cerr << "Failed to open file for saving: " << filename << std::endl; return false; } // éåéææååé m_mapError å¹¶å°æ¯ä¸ªé误信æ¯åå ¥æä»¶ // éåéææååé m_mapError å¹¶å°æ¯ä¸ªé误信æ¯åå ¥æä»¶ for (const auto& entry : m_mapError) { const int nCode = entry.first; const std::string& strMessage = entry.second; @@ -167,7 +167,7 @@ return true; } // å è½½éè¯¯ä¿¡æ¯ // å è½½éè¯¯ä¿¡æ¯ bool CPerformanceMelsec::LoadErrorInfoFromFile(const std::string& filename) { std::ifstream inFile(filename); if (!inFile.is_open()) { @@ -183,7 +183,7 @@ std::string strToken; std::string strMessage; // 使ç¨åé符 "|" è§£ææ¯ä¸è¡ // 使ç¨åé符 "|" è§£ææ¯ä¸è¡ if (std::getline(iss, strToken, '|')) { nCode = std::stoi(strToken); } @@ -200,7 +200,7 @@ return true; } // è¿æ¥å°PLC // è¿æ¥å°PLC int CPerformanceMelsec::Connect(const short nChannel, const short nMode) { std::lock_guard<std::mutex> lock(m_mtx); @@ -214,7 +214,7 @@ return ERROR_CODE_INVALID_PARAM; } // è¿æ¥PLCï¼æ¾å¼ç±»å转æ¢ä»¥å¹é mdOpen çç¾å // è¿æ¥PLCï¼æ¾å¼ç±»å转æ¢ä»¥å¹é mdOpen çç¾å const short nRet = mdOpen(nChannel, nMode, &m_nPath); if (nRet == 0) { m_bConnected.store(true); @@ -227,7 +227,7 @@ return nRet; } // æå¼è¿æ¥ // æå¼è¿æ¥ int CPerformanceMelsec::Disconnect() { std::lock_guard<std::mutex> lock(m_mtx); @@ -244,7 +244,7 @@ return nRet; } // å¯ç¼ç¨æ§å¶å¨è½¯å ä»¶ä¿¡æ¯è¡¨çåå§å // å¯ç¼ç¨æ§å¶å¨è½¯å ä»¶ä¿¡æ¯è¡¨çåå§å int CPerformanceMelsec::InitializeController() { std::lock_guard<std::mutex> lock(m_mtx); @@ -262,14 +262,14 @@ return nRet; } // è·åçæ¬ä¿¡æ¯ // è·åçæ¬ä¿¡æ¯ int CPerformanceMelsec::GetBoardVersion(BoardVersion& version) { if (!m_bConnected.load()) { UpdateLastError(ERROR_CODE_NOT_CONNECTED); return ERROR_CODE_NOT_CONNECTED; } // è·åçæ¬ä¿¡æ¯ // è·åçæ¬ä¿¡æ¯ short buf[32] = {0}; const short nRet = mdBdVerRead(m_nPath, buf); if (nRet != 0) { @@ -278,7 +278,7 @@ return nRet; } // å¡«å çæ¬ä¿¡æ¯å°ç»æä½ // å¡«å çæ¬ä¿¡æ¯å°ç»æä½ version.fixedValue[0] = static_cast<char>(buf[0] & 0xFF); version.fixedValue[1] = static_cast<char>((buf[0] >> 8) & 0xFF); @@ -309,16 +309,16 @@ return nRet; } // 读åç®æ ç«ç¹CPUç±»å // 读åç®æ ç«ç¹CPUç±»å int CPerformanceMelsec::ReadCPUCode(const StationIdentifier& station, short& nCPUCode) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ { nCPUCode = 0; std::lock_guard<std::mutex> lock(m_mtx); @@ -333,15 +333,15 @@ return nRet; } // æ¿æ¨¡å¼è®¾ç½® // æ¿æ¨¡å¼è®¾ç½® int CPerformanceMelsec::SetBoardMode(const short nMode) { // æ£æ¥æ¯å¦å·²ç»è¿æ¥ // æ£æ¥æ¯å¦å·²ç»è¿æ¥ if (!m_bConnected.load()) { UpdateLastError(ERROR_CODE_NOT_CONNECTED); return ERROR_CODE_NOT_CONNECTED; } // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ short nRet = 0; { std::lock_guard<std::mutex> lock(m_mtx); @@ -356,9 +356,9 @@ return nRet; } // è·åæ¿æ¨¡å¼ // è·åæ¿æ¨¡å¼ int CPerformanceMelsec::GetBoardMode(short& nMode) { // æ£æ¥æ¯å¦å·²ç»è¿æ¥ // æ£æ¥æ¯å¦å·²ç»è¿æ¥ if (!m_bConnected.load()) { UpdateLastError(ERROR_CODE_NOT_CONNECTED); return ERROR_CODE_NOT_CONNECTED; @@ -380,7 +380,7 @@ return 0; } // æ¿å¤ä½ // æ¿å¤ä½ int CPerformanceMelsec::BoardReset() { std::lock_guard<std::mutex> lock(m_mtx); if (!m_bConnected.load()) { @@ -397,7 +397,7 @@ return nRet; } // æ¿LED读å // æ¿LED读å int CPerformanceMelsec::ReadBoardLed(std::vector<short>& vecLedBuffer) { std::lock_guard<std::mutex> lock(m_mtx); if (!m_bConnected.load()) { @@ -405,11 +405,11 @@ return ERROR_CODE_NOT_CONNECTED; } // æ¸ ç©º LED ç¼å²åº // æ¸ ç©º LED ç¼å²åº vecLedBuffer.clear(); vecLedBuffer.resize(16, 0); // è°ç¨ SDK 彿°è¯»å LED æ°æ® // è°ç¨ SDK 彿°è¯»å LED æ°æ® const short nRet = mdBdLedRead(m_nPath, vecLedBuffer.data()); if (nRet != 0) { UpdateLastError(ERROR_CODE_NOT_CONNECTED); @@ -420,7 +420,7 @@ return nRet; } // è·åæ¿ç¶æ // è·åæ¿ç¶æ int CPerformanceMelsec::GetBoardStatus(BoardStatus& status) { std::lock_guard<std::mutex> lock(m_mtx); if (!m_bConnected) { @@ -435,25 +435,25 @@ LOG_ERROR(m_strLastError); } // å° buf æ å°å°ç»æä½ // å° buf æ å°å°ç»æä½ status = BoardStatus::fromBuffer(buf); return 0; } // éç¨è¯»æ°æ® // éç¨è¯»æ°æ® int CPerformanceMelsec::ReadData(const StationIdentifier& station, const short nDevType, const short nDevNo, short nSize, std::vector<short>& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStationAndSize(station, nSize); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // åå§å读åç¼å²åº // åå§å读åç¼å²åº vecData.clear(); vecData.resize(nSize); // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ { std::lock_guard<std::mutex> lock(m_mtx); short* pData = vecData.data(); @@ -466,38 +466,38 @@ } if (nRet != 0) { vecData.clear(); // å¦æè¯»åå¤±è´¥ï¼æ¸ 空ç¼å²åº vecData.clear(); // å¦æè¯»åå¤±è´¥ï¼æ¸ 空ç¼å²åº } return nRet; } // 读å使°æ® // 读å使°æ® int CPerformanceMelsec::ReadBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nBitCount, BitContainer& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStationAndSize(station, nBitCount); if (nRet != 0) { 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>((nBitCount + 7) / 8); // åä¸åæ´ std::vector<short> vecTempBuffer((nSize + 1) / 2, 0); // 临æ¶ç¼å²åºï¼åèå¯¹é½ nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer); if (nRet == 0) { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertShortToUint8(vecTempBuffer, vecData); } return nRet; } // 读ååæ°æ® // 读ååæ°æ® int CPerformanceMelsec::ReadWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nWordCount, WordContainer& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStationAndSize(station, nWordCount); if (nRet != 0) { UpdateLastError(nRet); @@ -516,44 +516,44 @@ return nRet; } // 读åååæ°æ® // 读åååæ°æ® int CPerformanceMelsec::ReadDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const short nDWordCount, DWordContainer& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStationAndSize(station, nDWordCount); if (nRet != 0) { UpdateLastError(nRet); return nRet; } const auto nSize = static_cast<short>(nDWordCount * 2); // æ¯ä¸ªååå 两个åï¼æ¯ä¸ªååå 4 åèï¼ const auto nSize = static_cast<short>(nDWordCount * 2); // æ¯ä¸ªååå 两个åï¼æ¯ä¸ªååå 4 åèï¼ const short nDevType = CalculateDeviceType(station, enDevType); std::vector<short> vecTempBuffer(nSize, 0); nRet = ReadData(station, nDevType, nDevNo, nSize, vecTempBuffer); if (nRet == 0) { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertShortToUint32(vecTempBuffer, vecData); } return nRet; } // éç¨åæ°æ® // éç¨åæ°æ® int CPerformanceMelsec::WriteData(const StationIdentifier& station, const short nDevType, const short nDevNo, short nSize, short* pData) { // éªè¯ç«ç¹åæ° // éªè¯ç«ç¹åæ° int nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // æ°æ®æææ§ // æ°æ®æææ§ if (nSize < 0 || pData == nullptr) { UpdateLastError(ERROR_CODE_INVALID_PARAM); return ERROR_CODE_INVALID_PARAM; } // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ { std::lock_guard<std::mutex> lock(m_mtx); nRet = mdSend(m_nPath, CombineStation(station), nDevType, nDevNo, &nSize, pData); @@ -567,37 +567,37 @@ return nRet; } // å使°æ® // å使°æ® int CPerformanceMelsec::WriteBitData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const BitContainer& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ const int nRet = ValidateStationAndData(station, vecData); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // 计ç®éè¦åå ¥çåèæ°ï¼ä½æ°æ®éè¦æ 8 ä½å¯¹é½ä¸ºåèæ°ï¼ // 计ç®éè¦åå ¥çåèæ°ï¼ä½æ°æ®éè¦æ 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); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertUint8ToShort(vecData, vecBuffer); } return WriteData(station, nDevType, nDevNo, nSize, vecBuffer.data()); } // ååæ°æ® // ååæ°æ® int CPerformanceMelsec::WriteWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const WordContainer& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ const int nRet = ValidateStationAndData(station, vecData); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // 计ç®éè¦åå ¥çåèæ°ï¼æ¯ä¸ªåå 2 åèï¼ // 计ç®éè¦åå ¥çåèæ°ï¼æ¯ä¸ªåå 2 åèï¼ const short nDevType = CalculateDeviceType(station, enDevType); const auto nSize = static_cast<short>(vecData.size() * sizeof(uint16_t)); const auto pData = const_cast<short*>(reinterpret_cast<const short*>(vecData.data())); @@ -605,30 +605,30 @@ return WriteData(station, nDevType, nDevNo, nSize, pData); } // åååæ°æ® // åååæ°æ® int CPerformanceMelsec::WriteDWordData(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo, const DWordContainer& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ const int nRet = ValidateStationAndData(station, vecData); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // 计ç®éè¦åå ¥çåèæ°ï¼æ¯ä¸ªååå 4 åèï¼ // 计ç®éè¦åå ¥çåèæ°ï¼æ¯ä¸ªååå 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); { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertUint32ToShort(vecData, vecBuffer); } return WriteData(station, nDevType, nDevNo, nSize, vecBuffer.data()); } // æ©å±è¯»æ°æ® // æ©å±è¯»æ°æ® long CPerformanceMelsec::ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<char>& vecData) { // éªè¯ç«ç¹åæ°å读å大尿¯å¦ææ // éªè¯ç«ç¹åæ°å读å大尿¯å¦ææ long nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); @@ -645,7 +645,7 @@ std::vector<short> vecBuffer(nActualSize, 0); { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nActualSize, vecBuffer.data()); } @@ -653,33 +653,33 @@ UpdateLastError(nRet); LOG_ERROR(m_strLastError); } else { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertShortToChar(vecBuffer, vecData); } return 0; } // æ©å±åæ°æ® // æ©å±åæ°æ® long CPerformanceMelsec::WriteDataEx(const StationIdentifier& station, long nDevType, long nDevNo, const std::vector<char>& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ long nRet = ValidateStationAndData(station, vecData); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº long nSize = static_cast<long>(vecData.size()); std::vector<short> vecBuffer((nSize + 1) / 2, 0); { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertCharToShort(vecData, vecBuffer); nRet = mdSendEx(m_nPath, station.nNetNo, station.nStNo, nDevType, nDevNo, &nSize, vecBuffer.data()); } // é误å¤ç忥å¿è®°å½ // é误å¤ç忥å¿è®°å½ if (nRet != 0) { UpdateLastError(nRet); LOG_ERROR(m_strLastError); @@ -688,7 +688,7 @@ return nRet; } // æ©å±è½¯å ä»¶éæºè¯»å // æ©å±è½¯å ä»¶éæºè¯»å long CPerformanceMelsec::ReadRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, std::vector<char>& vecData) { if (vecSoftElements.empty()) { UpdateLastError(ERROR_INVALID_PARAMETER); @@ -696,48 +696,48 @@ return ERROR_INVALID_PARAMETER; } // åå¤ dev æ°æ® std::vector<short> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å ä»¶éè¦ 3 个 shortï¼å¤å ä¸ä¸ªè®¡æ°å¨ devBuffer[0] = static_cast<short>(vecSoftElements.size()); // 第ä¸ä¸ªå ç´ æ¯è½¯å ä»¶æ°é // åå¤ dev æ°æ® std::vector<short> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å ä»¶éè¦ 3 个 shortï¼å¤å ä¸ä¸ªè®¡æ°å¨ devBuffer[0] = static_cast<short>(vecSoftElements.size()); // 第ä¸ä¸ªå ç´ æ¯è½¯å ä»¶æ°é for (size_t i = 0; i < vecSoftElements.size(); ++i) { const SoftElement& element = vecSoftElements[i]; devBuffer[i * 3 + 1] = element.nType; // 软å ä»¶ç±»å devBuffer[i * 3 + 2] = static_cast<short>(element.nStartNo); // èµ·å§è½¯å ä»¶ç¼å· devBuffer[i * 3 + 3] = element.nElementCount; // ç¹æ° devBuffer[i * 3 + 1] = element.nType; // 软å ä»¶ç±»å devBuffer[i * 3 + 2] = static_cast<short>(element.nStartNo); // èµ·å§è½¯å ä»¶ç¼å· devBuffer[i * 3 + 3] = element.nElementCount; // ç¹æ° } // 计ç®è¯»åæ°æ®æéç¼å²åºå¤§å° // 计ç®è¯»åæ°æ®æéç¼å²åºå¤§å° long nBufferSize = 0; for (const auto& element : vecSoftElements) { nBufferSize += element.nElementCount * 2; // æ¯ä¸ªç¹å ç¨ 2 个åè nBufferSize += element.nElementCount * 2; // æ¯ä¸ªç¹å ç¨ 2 个åè } // éä¿æ¤åè°ç¨ mdRandREx // éä¿æ¤åè°ç¨ mdRandREx long nRet = 0; std::vector<short> vecBuffer(nBufferSize / 2, 0); { std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å ¨ std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å ¨ nRet = mdRandREx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), nBufferSize); } // é误å¤ç忥å¿è®°å½ // é误å¤ç忥å¿è®°å½ if (nRet != 0) { UpdateLastError(nRet); LOG_ERROR(m_strLastError); return nRet; } // å°è¯»åå°ç short æ°æ®è½¬æ¢ä¸º char æ°æ® // å°è¯»åå°ç short æ°æ®è½¬æ¢ä¸º char æ°æ® vecData.resize(nBufferSize); for (size_t i = 0; i < vecBuffer.size(); ++i) { vecData[i * 2] = static_cast<char>(vecBuffer[i] & 0xFF); // ä½åè vecData[i * 2 + 1] = static_cast<char>((vecBuffer[i] >> 8) & 0xFF); // é«åè vecData[i * 2] = static_cast<char>(vecBuffer[i] & 0xFF); // ä½åè vecData[i * 2 + 1] = static_cast<char>((vecBuffer[i] >> 8) & 0xFF); // é«åè } return nRet; } // æ©å±è½¯å ä»¶éæºåå ¥ï¼æ¯æå¤ä¸ªè½¯å ä»¶ï¼ // æ©å±è½¯å ä»¶éæºåå ¥ï¼æ¯æå¤ä¸ªè½¯å ä»¶ï¼ long CPerformanceMelsec::WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData) { if (vecSoftElements.empty() || vecData.empty()) { UpdateLastError(ERROR_INVALID_PARAMETER); @@ -745,26 +745,26 @@ return ERROR_INVALID_PARAMETER; } // åå¤ dev æ°æ® std::vector<long> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å ä»¶éè¦ 3 个 longï¼å¤å ä¸ä¸ªè®¡æ°å¨ devBuffer[0] = static_cast<long>(vecSoftElements.size()); // 第ä¸ä¸ªå ç´ æ¯è½¯å ä»¶æ°é // åå¤ dev æ°æ® std::vector<long> devBuffer(vecSoftElements.size() * 3 + 1, 0); // æ¯ä¸ªè½¯å ä»¶éè¦ 3 个 longï¼å¤å ä¸ä¸ªè®¡æ°å¨ devBuffer[0] = static_cast<long>(vecSoftElements.size()); // 第ä¸ä¸ªå ç´ æ¯è½¯å ä»¶æ°é for (size_t i = 0; i < vecSoftElements.size(); ++i) { const SoftElement& element = vecSoftElements[i]; devBuffer[i * 3 + 1] = static_cast<long>(element.nType); // 软å ä»¶ç±»å devBuffer[i * 3 + 2] = element.nStartNo; // èµ·å§è½¯å ä»¶ç¼å·ï¼å·²ç»æ¯ long ç±»åï¼æ é转æ¢ï¼ devBuffer[i * 3 + 3] = static_cast<long>(element.nElementCount); // ç¹æ° devBuffer[i * 3 + 1] = static_cast<long>(element.nType); // 软å ä»¶ç±»å devBuffer[i * 3 + 2] = element.nStartNo; // èµ·å§è½¯å ä»¶ç¼å·ï¼å·²ç»æ¯ long ç±»åï¼æ é转æ¢ï¼ devBuffer[i * 3 + 3] = static_cast<long>(element.nElementCount); // ç¹æ° } // éä¿æ¤åè°ç¨ mdRandWEx // éä¿æ¤åè°ç¨ mdRandWEx long nRet = 0; std::vector<short> vecBuffer(vecData.size() / 2, 0); { std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å ¨ std::lock_guard<std::mutex> lock(m_mtx); // ç¡®ä¿çº¿ç¨å®å ¨ ConvertCharToShort(vecData, vecBuffer); nRet = mdRandWEx(m_nPath, station.nNetNo, station.nStNo, devBuffer.data(), vecBuffer.data(), static_cast<long>(vecBuffer.size())); } // é误å¤ç忥å¿è®°å½ // é误å¤ç忥å¿è®°å½ if (nRet != 0) { UpdateLastError(nRet); LOG_ERROR(m_strLastError); @@ -773,9 +773,9 @@ return nRet; } // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å long CPerformanceMelsec::ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); @@ -790,36 +790,36 @@ long nActualSize = (nSize + 1) / 2; std::vector<short> vecBuffer(nActualSize, 0); { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ nRet = mdRemBufReadEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nActualSize, vecBuffer.data()); } if (nRet != 0) { UpdateLastError(nRet); // æ´æ°é误ç UpdateLastError(nRet); // æ´æ°é误ç LOG_ERROR(m_strLastError); } else { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertShortToChar(vecBuffer, vecData); } return nRet; } // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨åå ¥ // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨åå ¥ long CPerformanceMelsec::WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ long nRet = ValidateStationAndData(station, vecData); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº // å° vecData 转æ¢ä¸º short ç±»åçç¼å²åº long nSize = static_cast<long>(vecData.size()); std::vector<short> vecBuffer((nSize + 1) / 2, 0); { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertCharToShort(vecData, vecBuffer); nRet = mdRemBufWriteEx(m_nPath, station.nNetNo, station.nStNo, nOffset, &nSize, vecBuffer.data()); } @@ -832,7 +832,7 @@ return nRet; } // è¿ç¨ç«çç¼å²åå¨å¨è¯»å 对象ç«IPå°åæå® // è¿ç¨ç«çç¼å²åå¨å¨è¯»å 对象ç«IPå°åæå® long CPerformanceMelsec::ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData) { uint32_t nAddress = 0; if (nSize < 0 || !ConvertIpStringToUint32(strIP, nAddress)) { @@ -840,14 +840,14 @@ return ERROR_CODE_INVALID_PARAM; } // å°ç¼å²åºå¤§å°è°æ´ä¸º nSize // å°ç¼å²åºå¤§å°è°æ´ä¸º nSize vecData.resize(nSize, 0); std::vector<short> vecBuffer((nSize + 1) / 2, 0); // 转æ¢ä¸º short ç±»å std::vector<short> vecBuffer((nSize + 1) / 2, 0); // 转æ¢ä¸º short ç±»å // è°ç¨åºå± SDK // è°ç¨åºå± SDK long nRet = 0; { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ nRet = mdRemBufReadIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data()); } @@ -855,14 +855,14 @@ UpdateLastError(nRet); LOG_ERROR(m_strLastError); } else { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ä¿æ¤ ConvertShortToChar(vecBuffer, vecData); } return nRet; } // è¿ç¨ç«çç¼å²åå¨å¨åå ¥ 对象ç«IPå°åæå® // è¿ç¨ç«çç¼å²åå¨å¨åå ¥ 对象ç«IPå°åæå® long CPerformanceMelsec::WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData) { uint32_t nAddress = 0; if (vecData.empty() || !ConvertIpStringToUint32(strIP, nAddress)) { @@ -870,13 +870,13 @@ return ERROR_CODE_INVALID_PARAM; } // è½¬æ¢ vecData 为 short ç±»åçç¼å²åº // è½¬æ¢ vecData 为 short ç±»åçç¼å²åº long nSize = static_cast<long>(vecData.size()); std::vector<short> vecBuffer((nSize + 1) / 2, 0); long nRet = 0; { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ ConvertCharToShort(vecData, vecBuffer); nRet = mdRemBufWriteIPEx(m_nPath, static_cast<long>(nAddress), nOffset, &nSize, vecBuffer.data()); } @@ -889,18 +889,18 @@ return nRet; } // 设置(ON)对象ç«çæå®ä½è½¯å ä»¶ // 设置(ON)对象ç«çæå®ä½è½¯å ä»¶ int CPerformanceMelsec::SetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short nDevNo) { // éªè¯ç«ç¹åæ° // éªè¯ç«ç¹åæ° int nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ { std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ std::lock_guard<std::mutex> lock(m_mtx); // 线ç¨å®å ¨ const short nDevType = CalculateDeviceType(station, enDevType); nRet = mdDevSet(m_nPath, CombineStation(station), nDevType, nDevNo); } @@ -913,16 +913,16 @@ return nRet; } // å¤ä½(OFF)对象ç«çæå®ä½è½¯å ä»¶ // å¤ä½(OFF)对象ç«çæå®ä½è½¯å ä»¶ int CPerformanceMelsec::ResetBitDevice(const StationIdentifier& station, const DeviceType enDevType, const short enDevNo) { // éªè¯ç«ç¹åæ° // éªè¯ç«ç¹åæ° int nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ { std::lock_guard<std::mutex> lock(m_mtx); const short nDevType = CalculateDeviceType(station, enDevType); @@ -937,11 +937,11 @@ return nRet; } // æ©å±ä½è½¯å 件设置 // æ©å±ä½è½¯å 件设置 long CPerformanceMelsec::SetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo) { std::lock_guard<std::mutex> lock(m_mtx); // æ£æ¥åæ°æææ§ // æ£æ¥åæ°æææ§ long nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); @@ -957,11 +957,11 @@ return nRet; } // æ©å±ä½è½¯å ä»¶å¤ä½ // æ©å±ä½è½¯å ä»¶å¤ä½ long CPerformanceMelsec::ResetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo) { std::lock_guard<std::mutex> lock(m_mtx); // æ£æ¥åæ°æææ§ // æ£æ¥åæ°æææ§ long nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); @@ -977,23 +977,23 @@ return nRet; } // æ§è¡å¯¹è±¡ç«çCPU // æ§è¡å¯¹è±¡ç«çCPU int CPerformanceMelsec::ControlCPU(const StationIdentifier& station, ControlCode enControlCode) { // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int nRet = ValidateStation(station); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // éªè¯æ§å¶ç æ¯å¦åæ³ // éªè¯æ§å¶ç æ¯å¦åæ³ const auto nControlCode = static_cast<short>(enControlCode); if (nControlCode < 0 || nControlCode > 2) { UpdateLastError(ERROR_CODE_INVALID_PARAM); // åæ°é误 UpdateLastError(ERROR_CODE_INVALID_PARAM); // åæ°é误 return ERROR_CODE_INVALID_PARAM; } // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ // ç¡®ä¿çº¿ç¨å®å ¨çæå°éå®èå´ { std::lock_guard<std::mutex> lock(m_mtx); nRet = mdControl(m_nPath, CombineStation(station), nControlCode); @@ -1007,7 +1007,7 @@ return nRet; } // äºä»¶çå¾ // äºä»¶çå¾ int CPerformanceMelsec::WaitForBoardEvent(std::vector<short> vecEventNumbers, const int nTimeoutMs, EventDetails& details) { std::lock_guard<std::mutex> lock(m_mtx); @@ -1021,12 +1021,12 @@ return ERROR_CODE_INVALID_PARAM; } // 第 0 个å ç´ å卿°éï¼æå¤§æ¯æ 64 个äºä»¶ // 第 0 个å ç´ å卿°éï¼æå¤§æ¯æ 64 个äºä»¶ std::array<short, 65> eventno = {0}; eventno[0] = static_cast<short>(vecEventNumbers.size()); std::copy(vecEventNumbers.begin(), vecEventNumbers.end(), eventno.begin() + 1); // åå§åè¾åºåæ° // åå§åè¾åºåæ° details.nEventNo = 0; details.details.fill(0); @@ -1039,99 +1039,100 @@ return nRet; } //============================================è¾ å©å½æ°======================================================= // æ´æ°æè¿çéè¯¯ä¿¡æ¯ //============================================è¾ å©å½æ°======================================================= // æ´æ°æè¿çéè¯¯ä¿¡æ¯ void CPerformanceMelsec::UpdateLastError(const int nCode) { if (nCode == 0) { return; } // æ£æ¥éè¯¯ç æ¯å¦åå¨äºæ å°è¡¨ä¸ // æ£æ¥éè¯¯ç æ¯å¦åå¨äºæ å°è¡¨ä¸ const auto it = m_mapError.find(nCode); if (it != m_mapError.end()) { // 妿æ¾å°ï¼ç´æ¥è¿å对åºè¯è¨çéè¯¯ä¿¡æ¯ // 妿æ¾å°ï¼ç´æ¥è¿å对åºè¯è¨çéè¯¯ä¿¡æ¯ m_strLastError = it->second; } else { // å¦ææªæ¾å°ï¼å¤çç¹æ®èå´ // å¦ææªæ¾å°ï¼å¤çç¹æ®èå´ m_strLastError = "Unknown error."; if (nCode == -28611 || nCode == -28612) { // ç³»ç»åºé // ç³»ç»åºé m_strLastError = "System error."; } if (nCode >= -20480 && nCode <= -16384) { // CC-Link ç³»ç»æ£æµåºçé误 // CC-Link ç³»ç»æ£æµåºçé误 m_strLastError = "Error detected in the CC-Link system."; } if (nCode >= -12288 && nCode <= -8193) { // CC-Link IE TSN ç³»ç»æ£æµåºçé误 // CC-Link IE TSN ç³»ç»æ£æµåºçé误 m_strLastError = "Error detected in the CC-Link IE TSN system."; } if (nCode >= -8192 && nCode <= -4097) { // CC-Link IE æ§å¶ç½ç»ç³»ç»æ£æµåºçé误 // CC-Link IE æ§å¶ç½ç»ç³»ç»æ£æµåºçé误 m_strLastError = "Error detected in the CC-Link IE control network system."; } if (nCode >= -4096 && nCode <= -257) { // MELSECNET/10 æ MELSECNET/ç½ç»ç³»ç»é误èå´ // MELSECNET/10 æ MELSECNET/ç½ç»ç³»ç»é误èå´ m_strLastError = "Errors detected in MELSECNET/10 or MELSECNET/network system."; } if (nCode >= 4096 && nCode <= 16383) { // MELSEC æ°æ®é¾æ¥åºèå´ // MELSEC æ°æ®é¾æ¥åºèå´ m_strLastError = "Internal error detected by MELSEC Data Link Library."; } if (nCode == 18944 || nCode == 18945) { // 龿¥å ³èåºé // 龿¥å ³èåºé m_strLastError = "Link association error: Network does not exist, unsupported CPU, or incorrect network No./station number."; } if (nCode >= 16384 && nCode <= 20479) { // PLC CPU æ£æµèå´ // PLC CPU æ£æµèå´ m_strLastError = "Errors detected by the programmable controller CPU in the target station."; } if (nCode >= 28416 && nCode <= 28671) { // åä½åè½æ¨¡åèå´ // åä½åè½æ¨¡åèå´ m_strLastError = "Error detected in the redundancy module of the target station."; } } } // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ int CPerformanceMelsec::ValidateStation(const StationIdentifier& station) const { // æ£æ¥æ¯å¦å·²è¿æ¥ // æ£æ¥æ¯å¦å·²è¿æ¥ if (!m_bConnected.load()) { return ERROR_CODE_NOT_CONNECTED; } // æ£æ¥ç½ç»å·åç«ç¹å·èå´ // æ£æ¥ç½ç»å·åç«ç¹å·èå´ if (station.nNetNo < 0 || station.nNetNo > 239 || station.nStNo < 0 || station.nStNo > 255) { return ERROR_CODE_INVALID_PARAM; } return 0; // åæ°ææ return 0; // åæ°ææ } // éªè¯ç«ç¹åæ°åæ°æ®æææ§ // éªè¯ç«ç¹åæ°åæ°æ®æææ§ int CPerformanceMelsec::ValidateStationAndSize(const StationIdentifier& station, const short nCount) const { // éªè¯ç«ç¹åæ° // éªè¯ç«ç¹åæ° const int nRet = ValidateStation(station); if (nRet != 0) { return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç } if (nCount <= 0) { return ERROR_CODE_INVALID_PARAM; } return 0; // éªè¯éè¿ return 0; // éªè¯éè¿ } // IPå符串转uint32_t // IPå符串转uint32_t bool CPerformanceMelsec::ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP) { nIP = 0; std::stringstream ss(strIP); @@ -1150,30 +1151,30 @@ return true; } //============================================éæè¾ å©å½æ°==================================================== // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ //============================================éæè¾ å©å½æ°==================================================== // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ void CPerformanceMelsec::Delay(const unsigned int nDelayMs) { MSG message; // å¦æå»¶è¿æ¶é´ä¸º 0ï¼ä» å¤ç䏿¬¡æ¶æ¯éå // å¦æå»¶è¿æ¶é´ä¸º 0ï¼ä» å¤ç䏿¬¡æ¶æ¯éå if (nDelayMs == 0) { // éé»å¡çæ£æ¥æ¶æ¯éå // éé»å¡çæ£æ¥æ¶æ¯éå if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage(&message); // å°æ¶æ¯è½¬å为ææççªå£æ¶æ¯ DispatchMessage(&message); // æ´¾åæ¶æ¯ç»ç¸åºççªå£è¿ç¨ TranslateMessage(&message); // å°æ¶æ¯è½¬å为ææççªå£æ¶æ¯ DispatchMessage(&message); // æ´¾åæ¶æ¯ç»ç¸åºççªå£è¿ç¨ } return; } DWORD finish; const DWORD start = GetTickCount(); // è·åå½åçæ¶é´æ³ï¼ä»ç³»ç»å¯å¨ä»¥æ¥çæ¯«ç§æ°ï¼ const DWORD start = GetTickCount(); // è·åå½åçæ¶é´æ³ï¼ä»ç³»ç»å¯å¨ä»¥æ¥çæ¯«ç§æ°ï¼ do { if (PeekMessage(&message, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage(&message); // è½¬æ¢æ¶æ¯ DispatchMessage(&message); // å¤çæ¶æ¯ TranslateMessage(&message); // è½¬æ¢æ¶æ¯ DispatchMessage(&message); // å¤çæ¶æ¯ } Sleep(1); // æå 1 毫ç§ï¼é²æ¢è¿åº¦å ç¨ CPU finish = GetTickCount(); // è·åå½åçæ¶é´æ³ } while ((finish - start) < nDelayMs); // 循ç¯ç´å°ç»è¿çæ¶é´å¤§äºæå®çå»¶è¿æ¶é´ Sleep(1); // æå 1 毫ç§ï¼é²æ¢è¿åº¦å ç¨ CPU finish = GetTickCount(); // è·åå½åçæ¶é´æ³ } while ((finish - start) < nDelayMs); // 循ç¯ç´å°ç»è¿çæ¶é´å¤§äºæå®çå»¶è¿æ¶é´ } BoardType CPerformanceMelsec::FindBoardTypeByChannel(const int nChannel) { @@ -1191,132 +1192,132 @@ return BoardType::UNKNOWN; } // åå¹¶ç½ç»å·åç«ç¹å· // åå¹¶ç½ç»å·åç«ç¹å· short CPerformanceMelsec::CombineStation(const StationIdentifier& station) { return static_cast<short>(station.nStNo | ((station.nNetNo << 8) & 0xFF00)); } // 计ç®è½¯å ä»¶ç±»å // 计ç®è½¯å ä»¶ç±»å short CPerformanceMelsec::CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType) { int nDevType = static_cast<int>(enDevType); // æ ¹æ®è½¯å ä»¶ç±»åçç¹å®è§åè¿è¡è®¡ç® // æ ¹æ®è½¯å ä»¶ç±»åçç¹å®è§åè¿è¡è®¡ç® if (enDevType == DeviceType::LX || enDevType == DeviceType::LY || enDevType == DeviceType::LB || enDevType == DeviceType::LW || enDevType == DeviceType::LSB || enDevType == DeviceType::LSW) { // ç½ç»å·å åç§» // ç½ç»å·å åç§» nDevType += station.nNetNo; } else if (enDevType == DeviceType::ER) { // æä»¶å¯åå¨çåå·å åç§» // æä»¶å¯åå¨çåå·å åç§» nDevType += 0; } else if (enDevType == DeviceType::SPG) { // èµ·å§ I/O No. ÷ 16 çå¼ // èµ·å§ I/O No. ÷ 16 çå¼ nDevType += 0 / 16; } return static_cast<short>(nDevType); } // std::vector<char>转æ¢ä¸ºstd::vector<short> // std::vector<char>转æ¢ä¸ºstd::vector<short> void CPerformanceMelsec::ConvertCharToShort(const std::vector<char>& vecChar, std::vector<short>& vecShort) { vecShort.resize((vecChar.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° vecShort.resize((vecChar.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° for (size_t i = 0; i < vecChar.size(); i++) { if (i % 2 == 0) { vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]); // ä½åè vecShort[i / 2] = static_cast<unsigned char>(vecChar[i]); // ä½åè } else { vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // é«åè vecShort[i / 2] |= static_cast<unsigned char>(vecChar[i]) << 8; // é«åè } } } // std::vector<short>转æ¢ä¸ºstd::vector<char> // std::vector<short>转æ¢ä¸ºstd::vector<char> void CPerformanceMelsec::ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>& vecChar) { vecChar.resize(vecShort.size() * 2); // è°æ´ char 容å¨å¤§å° vecChar.resize(vecShort.size() * 2); // è°æ´ char 容å¨å¤§å° for (size_t i = 0; i < vecShort.size(); i++) { vecChar[i * 2] = static_cast<char>(vecShort[i] & 0xFF); // ä½åè vecChar[i * 2 + 1] = static_cast<char>((vecShort[i] >> 8) & 0xFF); // é«åè vecChar[i * 2] = static_cast<char>(vecShort[i] & 0xFF); // ä½åè vecChar[i * 2 + 1] = static_cast<char>((vecShort[i] >> 8) & 0xFF); // é«åè } } // std::vector<uint8_t>转æ¢ä¸ºstd::vector<short> // std::vector<uint8_t>转æ¢ä¸ºstd::vector<short> void CPerformanceMelsec::ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort) { vecShort.resize((vecUint8.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° vecShort.resize((vecUint8.size() + 1) / 2, 0); // è°æ´ short 容å¨å¤§å° for (size_t i = 0; i < vecUint8.size(); i++) { if (i % 2 == 0) { vecShort[i / 2] = static_cast<short>(vecUint8[i]); // ä½åè vecShort[i / 2] = static_cast<short>(vecUint8[i]); // ä½åè } else { vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8); // é«åè vecShort[i / 2] |= static_cast<short>(vecUint8[i] << 8); // é«åè } } } // std::vector<short>转æ¢ä¸ºstd::vector<uint8_t> // std::vector<short>转æ¢ä¸ºstd::vector<uint8_t> void CPerformanceMelsec::ConvertShortToUint8(const std::vector<short>& vecShort, std::vector<uint8_t>& vecUint8) { vecUint8.resize(vecShort.size() * 2); // è°æ´ uint8_t 容å¨å¤§å° vecUint8.resize(vecShort.size() * 2); // è°æ´ uint8_t 容å¨å¤§å° for (size_t i = 0; i < vecShort.size(); i++) { vecUint8[i * 2] = static_cast<uint8_t>(vecShort[i] & 0xFF); // ä½åè vecUint8[i * 2 + 1] = static_cast<uint8_t>((vecShort[i] >> 8) & 0xFF); // é«åè vecUint8[i * 2] = static_cast<uint8_t>(vecShort[i] & 0xFF); // ä½åè vecUint8[i * 2 + 1] = static_cast<uint8_t>((vecShort[i] >> 8) & 0xFF); // é«åè } } // std::vector<uint32_t>转æ¢ä¸ºstd::vector<short> // std::vector<uint32_t>转æ¢ä¸ºstd::vector<short> void CPerformanceMelsec::ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort) { vecShort.resize(vecUint32.size() * 2); // æ¯ä¸ª uint32_t 转æ¢ä¸ºä¸¤ä¸ª short vecShort.resize(vecUint32.size() * 2); // æ¯ä¸ª uint32_t 转æ¢ä¸ºä¸¤ä¸ª short for (size_t i = 0; i < vecUint32.size(); i++) { vecShort[i * 2] = static_cast<short>(vecUint32[i] & 0xFFFF); // ä½16ä½ vecShort[i * 2 + 1] = static_cast<short>((vecUint32[i] >> 16) & 0xFFFF); // é«16ä½ vecShort[i * 2] = static_cast<short>(vecUint32[i] & 0xFFFF); // ä½16ä½ vecShort[i * 2 + 1] = static_cast<short>((vecUint32[i] >> 16) & 0xFFFF); // é«16ä½ } } // std::vector<short>转æ¢ä¸ºstd::vector<uint32_t> // std::vector<short>转æ¢ä¸ºstd::vector<uint32_t> void CPerformanceMelsec::ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32) { vecUint32.resize((vecShort.size() + 1) / 2, 0); // æ¯ä¸¤ä¸ª short å并为ä¸ä¸ª uint32_t 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ä½ 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ä½ } } //============================================模æ¿è¾ å©å½æ°==================================================== // éªè¯ç«ç¹åæ°åæ°æ®æææ§ //============================================模æ¿è¾ å©å½æ°==================================================== // éªè¯ç«ç¹åæ°åæ°æ®æææ§ template <typename T> int CPerformanceMelsec::ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData) { // éªè¯ç«ç¹åæ° // éªè¯ç«ç¹åæ° const int nRet = ValidateStation(station); if (nRet != 0) { return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç return nRet; // 妿ç«ç¹éªè¯å¤±è´¥ï¼è¿å对åºé误ç } // éªè¯æ°æ®æ¯å¦ä¸ºç©º // éªè¯æ°æ®æ¯å¦ä¸ºç©º if (vecData.empty()) { return ERROR_CODE_INVALID_PARAM; } return 0; // éªè¯éè¿ return 0; // éªè¯éè¿ } // ç±ä½è½¬é«å®¹å¨ç模æ¿ï¼æ´åï¼ // ç±ä½è½¬é«å®¹å¨ç模æ¿ï¼æ´åï¼ template <typename T, typename U> void CPerformanceMelsec::ConvertLowToHigh(const std::vector<T>& vecLow, std::vector<U>& vecHigh) { static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types"); // èªå¨è®¡ç® nGroupSize // èªå¨è®¡ç® nGroupSize constexpr size_t nGroupSize = sizeof(U) / sizeof(T); // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ if (sizeof(T) == sizeof(U)) { vecHigh.assign(vecLow.begin(), vecLow.end()); return; } // 妿 U ç大尿¯ T çåæ°ï¼æ£å¸¸ç»å // 妿 U ç大尿¯ T çåæ°ï¼æ£å¸¸ç»å static_assert(sizeof(U) > sizeof(T), "Size of U must be greater than or equal to size of T"); // 计ç®å®æ´ç»çæ°é size_t nHighSize = (vecLow.size() + nGroupSize - 1) / nGroupSize; // åä¸åæ´ // 计ç®å®æ´ç»çæ°é size_t nHighSize = (vecLow.size() + nGroupSize - 1) / nGroupSize; // åä¸åæ´ vecHigh.resize(nHighSize, 0); // åå¹¶ä½ä½æ°æ®å°é«ä½æ°æ® // åå¹¶ä½ä½æ°æ®å°é«ä½æ°æ® for (size_t i = 0; i < vecLow.size(); i++) { vecHigh[i / nGroupSize] |= (static_cast<U>(vecLow[i]) << ((i % nGroupSize) * CHAR_BIT * sizeof(T))); } @@ -1324,27 +1325,27 @@ return vecHigh; } // ç±é«è½¬ä½å®¹å¨ç模æ¿ï¼æ´åï¼ // ç±é«è½¬ä½å®¹å¨ç模æ¿ï¼æ´åï¼ template <typename T, typename U> void CPerformanceMelsec::ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow) { static_assert(std::is_integral<T>::value && std::is_integral<U>::value, "T and U must be integral types"); // èªå¨è®¡ç® nGroupSize // èªå¨è®¡ç® nGroupSize constexpr size_t nGroupSize = sizeof(T) / sizeof(U); // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ // 妿 T å U ç大å°ç¸çï¼ç´æ¥è½¬æ¢ if (sizeof(T) == sizeof(U)) { vecLow.assign(vecHigh.begin(), vecHigh.end()); return; } // 妿 T ç大尿¯ U çåæ°ï¼æ£å¸¸åè§£ // 妿 T ç大尿¯ U çåæ°ï¼æ£å¸¸åè§£ static_assert(sizeof(T) > sizeof(U), "Size of T must be greater than or equal to size of U"); size_t nLowSize = vecHigh.size() * nGroupSize; // ä½å®¹å¨çå¤§å° size_t nLowSize = vecHigh.size() * nGroupSize; // ä½å®¹å¨çå¤§å° vecLow.resize(nLowSize, 0); // åè§£é«ä½æ°æ®å°ä½ä½æ°æ® // åè§£é«ä½æ°æ®å°ä½ä½æ°æ® for (size_t i = 0; i < vecHigh.size(); i++) { for (size_t j = 0; j < nGroupSize; j++) { vecLow[i * nGroupSize + j] = static_cast<U>((vecHigh[i] >> (j * CHAR_BIT * sizeof(U))) & ((1ULL << (CHAR_BIT * sizeof(U))) - 1)); SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.h
@@ -10,151 +10,151 @@ #include <sstream> #include <unordered_map> // è¿æ¥åæ° #define PLC_MAX_RETRY 3 // æå¤§éè¯æ¬¡æ°ï¼å¨ä¸PLCéä¿¡æ¶ï¼å¦æåçéä¿¡é误ï¼å°æå¤éè¯3次 #define PLC_TIMEOUT 500 // è¶ æ¶æ¶é´ï¼æ¯«ç§ï¼ï¼æ¯æ¬¡éä¿¡æä½çè¶ æ¶çå¾ æ¶é´ä¸º500æ¯«ç§ // è¿æ¥åæ° #define PLC_MAX_RETRY 3 // æå¤§éè¯æ¬¡æ°ï¼å¨ä¸PLCéä¿¡æ¶ï¼å¦æåçéä¿¡é误ï¼å°æå¤éè¯3次 #define PLC_TIMEOUT 500 // è¶ æ¶æ¶é´ï¼æ¯«ç§ï¼ï¼æ¯æ¬¡éä¿¡æä½çè¶ æ¶çå¾ æ¶é´ä¸º500æ¯«ç§ /* * ç½ç»ééï¼æå®éä¿¡æä½¿ç¨çç½ç»ééå·ï¼é常å¨å¤éééä¿¡ä¸è®¾ç½® * 51 å° 54 æ¯ MELSECNET/H ç 1-4 éé * 81 å° 84 æ¯ CC-Link ç 1-4 éé * 151 å° 154 æ¯ CC-Link IE æ§å¶å¨ç½ç»ç 1-4 éé * 181 å° 184 æ¯ CC-Link IE ç°åºç½ç»ç 1-4 éé * 281 å° 284 æ¯ CC-Link IE TSN ç½ç»ç 1-4 éé * ç½ç»ééï¼æå®éä¿¡æä½¿ç¨çç½ç»ééå·ï¼é常å¨å¤éééä¿¡ä¸è®¾ç½® * 51 å° 54 æ¯ MELSECNET/H ç 1-4 éé * 81 å° 84 æ¯ CC-Link ç 1-4 éé * 151 å° 154 æ¯ CC-Link IE æ§å¶å¨ç½ç»ç 1-4 éé * 181 å° 184 æ¯ CC-Link IE ç°åºç½ç»ç 1-4 éé * 281 å° 284 æ¯ CC-Link IE TSN ç½ç»ç 1-4 éé **/ #define MELSECNET_CHANNEL(x) (50 + (x)) // x èå´ï¼1~4 #define CC_LINK_CHANNEL(x) (80 + (x)) // x èå´ï¼1~4 #define CC_LINK_IE_CONTROL_CHANNEL(x) (150 + (x)) // x èå´ï¼1~4 #define CC_LINK_IE_FIELD_CHANNEL(x) (180 + (x)) // x èå´ï¼1~4 #define CC_LINK_IE_TSN_CHANNEL(x) (280 + (x)) // x èå´ï¼1~4 #define MELSECNET_CHANNEL(x) (50 + (x)) // x èå´ï¼1~4 #define CC_LINK_CHANNEL(x) (80 + (x)) // x èå´ï¼1~4 #define CC_LINK_IE_CONTROL_CHANNEL(x) (150 + (x)) // x èå´ï¼1~4 #define CC_LINK_IE_FIELD_CHANNEL(x) (180 + (x)) // x èå´ï¼1~4 #define CC_LINK_IE_TSN_CHANNEL(x) (280 + (x)) // x èå´ï¼1~4 // èªå®ä¹é误ç #define ERROR_CODE_UNKNOWN 0x00010000 // æªç¥ #define ERROR_CODE_NOT_CONNECTED 0x00020000 // æªè¿æ¥ #define ERROR_CODE_INVALID_PARAM 0x00030000 // åæ°æ æ #define ERROR_CODE_INVALID_DATA 0x00040000 // æ°æ®æ æ #define ERROR_CODE_STATION_OUT_OF_RANGE 0x00050000 // ç«å·è¶ åºèå´ #define ERROR_CODE_GROUP_OUT_OF_RANGE 0x00060000 // ç»å·è¶ åºèå´ #define ERROR_CODE_NETWORK_OUT_OF_RANGE 0x00070000 // ç½ç»å·è¶ åºèå´ // èªå®ä¹é误ç #define ERROR_CODE_UNKNOWN 0x00010000 // δ֪ #define ERROR_CODE_NOT_CONNECTED 0x00020000 // æªè¿æ¥ #define ERROR_CODE_INVALID_PARAM 0x00030000 // åæ°æ æ #define ERROR_CODE_INVALID_DATA 0x00040000 // æ°æ®æ æ #define ERROR_CODE_STATION_OUT_OF_RANGE 0x00050000 // ç«å·è¶ åºèå´ #define ERROR_CODE_GROUP_OUT_OF_RANGE 0x00060000 // ç»å·è¶ åºèå´ #define ERROR_CODE_NETWORK_OUT_OF_RANGE 0x00070000 // ç½ç»å·è¶ åºèå´ // æ¿åç±»å // æ¿åç±»å enum class BoardType { UNKNOWN = -1, // æªç¥ç±»å UNKNOWN = -1, // æªç¥ç±»å MELSECNET_H = MELSECNET_CHANNEL(1), // MELSECNET/H CC_LINK_VER_2 = CC_LINK_CHANNEL(1), // CC-Link Ver. 2 CC_LINK_IE_CONTROL = CC_LINK_IE_CONTROL_CHANNEL(1), // CC-Link IE æ§å¶ç½ç» CC_LINK_IE_FIELD = CC_LINK_IE_FIELD_CHANNEL(1), // CC-Link IE ç°åºç½ç» CC_LINK_IE_CONTROL = CC_LINK_IE_CONTROL_CHANNEL(1), // CC-Link IE æ§å¶ç½ç» CC_LINK_IE_FIELD = CC_LINK_IE_FIELD_CHANNEL(1), // CC-Link IE ç°åºç½ç» CC_LINK_IE_TSN = CC_LINK_IE_TSN_CHANNEL(1) // CC-Link IE TSN }; // 软å ä»¶ç±»åæä¸¾ // 软å ä»¶ç±»åæä¸¾ enum class DeviceType { /* * ERãLXãLYãLBãLWãLSBãLSWåSPG软å 件齿¯èå´å * ERï¼DevER0ï½256 * LXï¼DevLX1ï½255ï¼DevLX(x) (DevX*1000+(x)) * LYï¼DevLY1ï½255ï¼DevLY(x) (DevY*1000+(x)) * LBï¼DevLB1ï½255ï¼DevLB(x) (DevB*1000+(x)) * LWï¼DevLW1ï½255ï¼DevLW(x) (DevW*1000+(x)) * LSBï¼DevLSB1ï½255ï¼DevLSB(x) (DevQSB*1000+(x)) * LSWï¼DevLSW1ï½255ï¼DevLSW(x) (DevQSW*1000+(x)) * SPGï¼DevSPG0ï½255ï¼DevSPG(x) (29*1000+(x)) * æ©å±æä»¶å¯åå¨ä»£ç æå®(10è¿å¶æ°)çå3使°å软å ä»¶åæå®çæ°å¼ä¸ï¼åºæå®åNo.(0ï½256) * 龿¥ç´æ¥è½¯å ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å ä»¶åæå®çæ°å¼ä¸ï¼åºæå®ç½ç»No.(1ï½255) * æºè½åè½æ¨¡å软å ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å ä»¶åæå®çæ°å¼ä¸ï¼åºæå®(èµ·å§I/ONo.÷16)çå¼ * æ©å±æä»¶å¯åå¨å龿¥ç´æ¥è½¯å ä»¶å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é ä¸åå¨ç软å 件乿å¯è½æ£å¸¸ç»æ * MAILåMAILMCå¨SENDåè½åRECVåè½ä¸ï¼ä¸è½¯å 件访é®ä¸æ ·ï¼æå®ååè½å¯¹åºç软å ä»¶ç±»åï¼è¿è¡æ°æ®çåé(mdSendãmdSendEx)ææ°æ®ç读å(mdReceiveãmdReceiveEx) * ERãLXãLYãLBãLWãLSBãLSWåSPG软å 件齿¯èå´å * ERï¼DevER0ï½256 * LXï¼DevLX1ï½255ï¼DevLX(x) (DevX*1000+(x)) * LYï¼DevLY1ï½255ï¼DevLY(x) (DevY*1000+(x)) * LBï¼DevLB1ï½255ï¼DevLB(x) (DevB*1000+(x)) * LWï¼DevLW1ï½255ï¼DevLW(x) (DevW*1000+(x)) * LSBï¼DevLSB1ï½255ï¼DevLSB(x) (DevQSB*1000+(x)) * LSWï¼DevLSW1ï½255ï¼DevLSW(x) (DevQSW*1000+(x)) * SPGï¼DevSPG0ï½255ï¼DevSPG(x) (29*1000+(x)) * æ©å±æä»¶å¯åå¨ä»£ç æå®(10è¿å¶æ°)çå3使°å软å ä»¶åæå®çæ°å¼ä¸ï¼åºæå®åNo.(0ï½256) * 龿¥ç´æ¥è½¯å ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å ä»¶åæå®çæ°å¼ä¸ï¼åºæå®ç½ç»No.(1ï½255) * æºè½åè½æ¨¡å软å ä»¶ä»£ç æå®(10è¿å¶æ°)çå3使°å软å ä»¶åæå®çæ°å¼ä¸ï¼åºæå®(èµ·å§I/ONo.÷16)çå¼ * æ©å±æä»¶å¯åå¨å龿¥ç´æ¥è½¯å ä»¶å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é ä¸åå¨ç软å 件乿å¯è½æ£å¸¸ç»æ * MAILåMAILMCå¨SENDåè½åRECVåè½ä¸ï¼ä¸è½¯å 件访é®ä¸æ ·ï¼æå®ååè½å¯¹åºç软å ä»¶ç±»åï¼è¿è¡æ°æ®çåé(mdSendãmdSendEx)ææ°æ®ç读å(mdReceiveãmdReceiveEx) **/ X = 0x0001, // è¾å ¥ (ä½) Y = 0x0002, // è¾åº (ä½) L = 0x0003, // éåç»§çµå¨ (ä½) M = 0x0004, // å é¨ç»§çµå¨ (ä½) SM = 0x0005, // ç¹æ®ç»§çµå¨ (ä½) F = 0x0006, // æ¥è¦å¨ (ä½) TT = 0x0007, // 宿¶å¨ (触ç¹) (ä½) TC = 0x0008, // 计æ°å¨ (线å) (ä½) CT = 0x0009, // 计æ°å¨ (触ç¹) (ä½) CC = 0x000A, // 计æ°å¨ (线å) (å) TN = 0x000B, // 宿¶å¨ (å½åå¼) (å) CN = 0x000C, // 计æ°å¨ (å½åå¼) (å) D = 0x000D, // æ°æ®å¯åå¨ (å) SD = 0x000E, // ç¹æ®å¯åå¨ (å) TM = 0x000F, // 宿¶å¨ (设置å¼ä¸») (å) TS = 0x0010, // 宿¶å¨ (设置å¼ä¸»1) (å) TS2 = 0x3E82, // 宿¶å¨ (设置å¼ä¸»2) (å) TS3 = 0x3E83, // 宿¶å¨ (设置å¼ä¸»3) (å) CM = 0x0011, // 计æ°å¨ (设置å¼ä¸») (å) CS = 0x0012, // 计æ°å¨ (设置å¼ä¸»1) (å) CS2 = 0x4652, // 计æ°å¨ (设置å¼ä¸»2) (å) CS3 = 0x4653, // 计æ°å¨ (设置å¼ä¸»3) (å) A = 0x0013, // ç´¯å å¨ (å) Z = 0x0014, // ååå¯åå¨ (å) V = 0x0015, // ååå¯åå¨ (å) R = 0x0016, // æä»¶å¯åå¨ (å忢æ¹å¼) (å) ER = 0x55F0, // æ©å±æä»¶å¯åå¨ (å忢æ¹å¼) (0x55F0ï½0x56F0) (å) (å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é ä¸åå¨ç软å 件乿å¯è½æ£å¸¸ç»æã(è¯»åæ°æ®ä¸æ£ç¡®ã)) ZR = 0x00DC, // æä»¶å¯åå¨ (è¿å·è®¿é®æ¹å¼) (å) B = 0x0017, // 龿¥ç»§çµå¨ (ä½) W = 0x0018, // 龿¥å¯åå¨ (å) QSB = 0x0019, // 龿¥ç¹æ®ç»§çµå¨ (ä½) STT = 0x001A, // ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) STC = 0x001B, // ç´¯è®¡å®æ¶å¨ (线å) (ä½) QSW = 0x001C, // 龿¥ç¹æ®å¯åå¨ (å) QV = 0x001E, // ååç»§çµå¨ (ä½) MRB = 0x0021, // éæºè®¿é®ç¼å² (å) STN = 0x0023, // ç´¯è®¡å®æ¶å¨ (å½åå¼) (å) LZ = 0x0026, // è¶ é¿ååå¯åå¨ (åå) RD = 0x0027, // å·æ°æ°æ®å¯åå¨ (å) LTT = 0x0029, // è¶ é¿å®æ¶å¨ (触ç¹) (ä½) LTC = 0x002A, // è¶ é¿å®æ¶å¨ (线å) (ä½) LTN = 0x002B, // è¶ é¿å®æ¶å¨ (å½åå¼) (åå) LCT = 0x002C, // è¶ é¿è®¡æ°å¨ (触ç¹) (ä½) LCC = 0x002D, // è¶ é¿è®¡æ°å¨ (线å) (ä½) LCN = 0x002E, // è¶ é¿è®¡æ°å¨ (å½åå¼) (åå) LSTT = 0x002F, // è¶ é¿ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) LSTC = 0x0030, // è¶ é¿ç´¯è®¡å®æ¶å¨ (线å) (ä½) LSTN = 0x0031, // è¶ é¿ç´¯è®¡å®æ¶å¨ (å½åå¼) (åå) SPB = 0x0032, // ç¼å²åå¨å¨ (å) MAIL = 0x0065, // ç¹æ®è½¯å ä»¶ç±»åï¼é®ä»¶ç±»å (10è¿å¶ 101) MAILMC = 0x0066, // ç¹æ®è½¯å ä»¶ç±»åï¼æ 确认é®ä»¶ (10è¿å¶ 102) LX = 0x03E9, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥è¾å ¥) (0x03E9ï½0x04E7) (ä½) LY = 0x07D1, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥è¾åº) (0x07D1ï½0x08CF) (ä½) LB = 0x59D9, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥ç»§çµå¨) (0x59D9ï½0x5AD7) (ä½) LW = 0x5DC1, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥å¯åå¨) (0x5DC1ï½0x5EBF) (å) LSB = 0x61A9, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥ç¹æ®ç»§çµå¨) (0x61A9ï½0x62A7) (ä½) LSW = 0x6D61, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥ç¹æ®å¯åå¨) (0x6D61ï½0x6E5F) (å) SPG = 0x7148, // æºè½åè½æ¨¡å软å ä»¶ (0x7148ï½0x7247) (å) X = 0x0001, // è¾å ¥ (ä½) Y = 0x0002, // è¾åº (ä½) L = 0x0003, // éåç»§çµå¨ (ä½) M = 0x0004, // å é¨ç»§çµå¨ (ä½) SM = 0x0005, // ç¹æ®ç»§çµå¨ (ä½) F = 0x0006, // æ¥è¦å¨ (ä½) TT = 0x0007, // 宿¶å¨ (触ç¹) (ä½) TC = 0x0008, // 计æ°å¨ (线å) (ä½) CT = 0x0009, // 计æ°å¨ (触ç¹) (ä½) CC = 0x000A, // 计æ°å¨ (线å) (å) TN = 0x000B, // 宿¶å¨ (å½åå¼) (å) CN = 0x000C, // 计æ°å¨ (å½åå¼) (å) D = 0x000D, // æ°æ®å¯åå¨ (å) SD = 0x000E, // ç¹æ®å¯åå¨ (å) TM = 0x000F, // 宿¶å¨ (设置å¼ä¸») (å) TS = 0x0010, // 宿¶å¨ (设置å¼ä¸»1) (å) TS2 = 0x3E82, // 宿¶å¨ (设置å¼ä¸»2) (å) TS3 = 0x3E83, // 宿¶å¨ (设置å¼ä¸»3) (å) CM = 0x0011, // 计æ°å¨ (设置å¼ä¸») (å) CS = 0x0012, // 计æ°å¨ (设置å¼ä¸»1) (å) CS2 = 0x4652, // 计æ°å¨ (设置å¼ä¸»2) (å) CS3 = 0x4653, // 计æ°å¨ (设置å¼ä¸»3) (å) A = 0x0013, // ç´¯å å¨ (å) Z = 0x0014, // ååå¯åå¨ (å) V = 0x0015, // ååå¯åå¨ (å) R = 0x0016, // æä»¶å¯åå¨ (å忢æ¹å¼) (å) ER = 0x55F0, // æ©å±æä»¶å¯åå¨ (å忢æ¹å¼) (0x55F0ï½0x56F0) (å) (å¨éæºè¯»å(mdRandRãmdRandREx)彿°ä¸ï¼å³ä½¿æå®å®é ä¸åå¨ç软å 件乿å¯è½æ£å¸¸ç»æã(è¯»åæ°æ®ä¸æ£ç¡®ã)) ZR = 0x00DC, // æä»¶å¯åå¨ (è¿å·è®¿é®æ¹å¼) (å) B = 0x0017, // 龿¥ç»§çµå¨ (ä½) W = 0x0018, // 龿¥å¯åå¨ (å) QSB = 0x0019, // 龿¥ç¹æ®ç»§çµå¨ (ä½) STT = 0x001A, // ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) STC = 0x001B, // ç´¯è®¡å®æ¶å¨ (线å) (ä½) QSW = 0x001C, // 龿¥ç¹æ®å¯åå¨ (å) QV = 0x001E, // ååç»§çµå¨ (ä½) MRB = 0x0021, // éæºè®¿é®ç¼å² (å) STN = 0x0023, // ç´¯è®¡å®æ¶å¨ (å½åå¼) (å) LZ = 0x0026, // è¶ é¿ååå¯åå¨ (åå) RD = 0x0027, // å·æ°æ°æ®å¯åå¨ (å) LTT = 0x0029, // è¶ é¿å®æ¶å¨ (触ç¹) (ä½) LTC = 0x002A, // è¶ é¿å®æ¶å¨ (线å) (ä½) LTN = 0x002B, // è¶ é¿å®æ¶å¨ (å½åå¼) (åå) LCT = 0x002C, // è¶ é¿è®¡æ°å¨ (触ç¹) (ä½) LCC = 0x002D, // è¶ é¿è®¡æ°å¨ (线å) (ä½) LCN = 0x002E, // è¶ é¿è®¡æ°å¨ (å½åå¼) (åå) LSTT = 0x002F, // è¶ é¿ç´¯è®¡å®æ¶å¨ (触ç¹) (ä½) LSTC = 0x0030, // è¶ é¿ç´¯è®¡å®æ¶å¨ (线å) (ä½) LSTN = 0x0031, // è¶ é¿ç´¯è®¡å®æ¶å¨ (å½åå¼) (åå) SPB = 0x0032, // ç¼å²åå¨å¨ (å) MAIL = 0x0065, // ç¹æ®è½¯å ä»¶ç±»åï¼é®ä»¶ç±»å (10è¿å¶ 101) MAILMC = 0x0066, // ç¹æ®è½¯å ä»¶ç±»åï¼æ 确认é®ä»¶ (10è¿å¶ 102) LX = 0x03E9, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥è¾å ¥) (0x03E9ï½0x04E7) (ä½) LY = 0x07D1, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥è¾åº) (0x07D1ï½0x08CF) (ä½) LB = 0x59D9, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥ç»§çµå¨) (0x59D9ï½0x5AD7) (ä½) LW = 0x5DC1, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥å¯åå¨) (0x5DC1ï½0x5EBF) (å) LSB = 0x61A9, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥ç¹æ®ç»§çµå¨) (0x61A9ï½0x62A7) (ä½) LSW = 0x6D61, // 龿¥ç´æ¥è½¯å ä»¶ (龿¥ç¹æ®å¯åå¨) (0x6D61ï½0x6E5F) (å) SPG = 0x7148, // æºè½åè½æ¨¡å软å ä»¶ (0x7148ï½0x7247) (å) }; // æ°æ®ç±»å // æ°æ®ç±»å enum class DataType { BIT = 1, // ä½ (1ä½) WORD = 2, // å (16ä½) DWORD =4 // åå (32ä½) BIT = 1, // λ (1λ) WORD = 2, // å (16ä½) DWORD =4 // åå (32ä½) }; // æ§å¶ä»£ç // æ§å¶ä»£ç enum class ControlCode { RUN = 0, // è¿ç¨ RUN STOP = 1, // è¿ç¨ STOP PAUSE = 2 // è¿ç¨ PAUSE RUN = 0, // è¿ç¨ RUN STOP = 1, // è¿ç¨ STOP PAUSE = 2 // è¿ç¨ PAUSE }; // çæ¬ä¿¡æ¯ // çæ¬ä¿¡æ¯ struct BoardVersion { char fixedValue[2]; // åºå®å¼ char checksum[2]; // æ ¡éªå char swVersion[2]; // è½¯ä»¶çæ¬ char date[6]; // æ¥æ (æ ¼å¼ YYMMDD) uint32_t reserved; // ä¿çåºå (4 åè) char swModel[16]; // 软件åå· char hwModel[16]; // 硬件åå· char twoPortMemory[2]; // 两端å£åå¨å¨å ç¨å®¹é char twoPortAttribute[2]; // 两端å£å±æ§ char availableBias[2]; // å¯ä½¿ç¨åç½® char moduleType[10]; // æºåç±»å char fixedValue[2]; // åºå®å¼ char checksum[2]; // æ ¡éªå char swVersion[2]; // è½¯ä»¶çæ¬ char date[6]; // æ¥æ (æ ¼å¼ YYMMDD) uint32_t reserved; // ä¿çåºå (4 åè) char swModel[16]; // 软件åå· char hwModel[16]; // 硬件åå· char twoPortMemory[2]; // 两端å£åå¨å¨å ç¨å®¹é char twoPortAttribute[2]; // 两端å£å±æ§ char availableBias[2]; // å¯ä½¿ç¨åç½® char moduleType[10]; // æºåç±»å // è¾åºç»æä½å 容为å符串 (便äºè°è¯) // è¾åºç»æä½å 容为å符串 (便äºè°è¯) std::string toString() const { std::ostringstream oss; oss << "Fixed Value: " << fixedValue[0] << fixedValue[1] << "\n" @@ -172,18 +172,18 @@ } }; // ç«ç¹æ è¯ç¬¦ï¼é»è®¤ä½¿ç¨æ¬ç« // ç«ç¹æ è¯ç¬¦ï¼é»è®¤ä½¿ç¨æ¬ç« struct StationIdentifier { /* * [Network No.] * 0 表示æ¬ç« * 1~239 表示æ®éç½ç»å· * 0 表示æ¬ç« * 1~239 表示æ®éç½ç»å· **/ /* * [Station No.] * MELSECNET/Hï¼1~64 è¡¨ç¤ºå ¶ä»ç«ç¹ï¼255 表示æ¬ç« * CC-Link ç³»åç½ç»çèå´ç±»ä¼¼ï¼åºå«å¨äºç«å·çåå¼èå´ * MELSECNET/Hï¼1~64 è¡¨ç¤ºå ¶ä»ç«ç¹ï¼255 表示æ¬ç« * CC-Link ç³»åç½ç»çèå´ç±»ä¼¼ï¼åºå«å¨äºç«å·çåå¼èå´ * MELSECNET/H : 1~64(Other stations),255(Own station) * CC-Link : 0~63(Other stations),255(Own station) * CC-Link IE Controller : 1~120(Other stations),255(Own station) @@ -192,35 +192,41 @@ **/ /* * é« 8 ä½ï¼ç½ç»å·ï¼ï¼ æå®è®¾å¤æå±çç½ç» * ä½ 8 ä½ï¼ç«ç¹å·ï¼ï¼ æå®è®¾å¤å¨ç½ç»ä¸çç¼å· * ç¨ä¸ä¸ªåæ°ä¼ é设å¤çç½ç»å·åç«ç¹å·æ¶: nSt = station.nStNo | ((station.nNetNo << 8) & 0xFF00); * é« 8 ä½ï¼ç½ç»å·ï¼ï¼ æå®è®¾å¤æå±çç½ç» * ä½ 8 ä½ï¼ç«ç¹å·ï¼ï¼ æå®è®¾å¤å¨ç½ç»ä¸çç¼å· * ç¨ä¸ä¸ªåæ°ä¼ é设å¤çç½ç»å·åç«ç¹å·æ¶: nSt = station.nStNo | ((station.nNetNo << 8) & 0xFF00); **/ short nNetNo = 0; // ç½ç»ç¼å·ï¼PLCæè¿æ¥çç½ç»ç¼å·ï¼0表示é»è®¤ç½ç» short nStNo = 255; // ç«ç¹ç¼å·ï¼æå®ä¸PLCè¿æ¥çç«ç¹ç¼å·ï¼255éå¸¸è¡¨ç¤ºå¹¿ææææç«ç¹ short nNetNo = 0; // ç½ç»ç¼å·ï¼PLCæè¿æ¥çç½ç»ç¼å·ï¼0表示é»è®¤ç½ç» short nStNo = 255; // ç«ç¹ç¼å·ï¼æå®ä¸PLCè¿æ¥çç«ç¹ç¼å·ï¼255éå¸¸è¡¨ç¤ºå¹¿ææææç«ç¹ // èªå®ä¹æé 彿°ï¼è¦çé»è®¤å¼ StationIdentifier() { nNetNo = 0; nStNo = 255; } // èªå®ä¹æé 彿°ï¼è¦çé»è®¤å¼ explicit StationIdentifier(const short net, const short st) : nNetNo(net), nStNo(st) {} // å°âç½ç»å·âåâç«ç¹å·âç»åæä¸ä¸ªæç»ç¼ç // å°âç½ç»å·âåâç«ç¹å·âç»åæä¸ä¸ªæç»ç¼ç short StationIdentifier::toNetworkStationCode() const { return static_cast<short>(nStNo | ((nNetNo << 8) & 0xFF00)); } // éè½½ < è¿ç®ç¬¦ï¼ç¨äºæåºææ¯è¾ï¼é常ç¨äº map æ set ä¸ä½ä¸º keyï¼ // éè½½ < è¿ç®ç¬¦ï¼ç¨äºæåºææ¯è¾ï¼é常ç¨äº map æ set ä¸ä½ä¸º keyï¼ bool operator<(const StationIdentifier& other) const { return std::tie(nNetNo, nStNo) < std::tie(other.nNetNo, other.nStNo); } // éè½½ == è¿ç®ç¬¦ï¼ç¨äºç¸çæ¯è¾ï¼ // éè½½ == è¿ç®ç¬¦ï¼ç¨äºç¸çæ¯è¾ï¼ bool operator==(const StationIdentifier& other) const { return std::tie(nNetNo, nStNo) == std::tie(other.nNetNo, other.nStNo); } // éè½½ = è¿ç®ç¬¦ï¼ç¨äºèµå¼ï¼ // éè½½ = è¿ç®ç¬¦ï¼ç¨äºèµå¼ï¼ StationIdentifier& operator=(const StationIdentifier& other) { if (this != &other) { nNetNo = other.nNetNo; @@ -230,16 +236,16 @@ } }; // æ¿ç¶æ // æ¿ç¶æ struct BoardStatus { short nStationValue = 0; // ç«å·ç设å¤å¼ (buf[0]) short nGroupValue = 0; // ç» No. ç设å¤å¼ (buf[1]) short nNetworkValue = 0; // ç½ç» No. ç设å¤å¼ (buf[2]) short nReserved1 = 0; // ä¿çåæ®µ (buf[3]) short nReserved2 = 0; // ä¿çåæ®µ (buf[4]) short nReserved3 = 0; // ä¿çåæ®µ (buf[5]) short nStationValue = 0; // ç«å·ç设å¤å¼ (buf[0]) short nGroupValue = 0; // ç» No. ç设å¤å¼ (buf[1]) short nNetworkValue = 0; // ç½ç» No. ç设å¤å¼ (buf[2]) short nReserved1 = 0; // ä¿çåæ®µ (buf[3]) short nReserved2 = 0; // ä¿çåæ®µ (buf[4]) short nReserved3 = 0; // ä¿çåæ®µ (buf[5]) // å°æ°ç»æ å°å°ç»æä½ // å°æ°ç»æ å°å°ç»æä½ static BoardStatus fromBuffer(const short buf[6]) { return { buf[0], @@ -251,7 +257,7 @@ }; } // å°ç»æä½å 容æ å°å°æ°ç» // å°ç»æä½å 容æ å°å°æ°ç» void toBuffer(short buf[6]) const { buf[0] = nStationValue; buf[1] = nGroupValue; @@ -261,7 +267,7 @@ buf[5] = nReserved3; } // è°è¯è¾åº // è°è¯è¾åº std::string toString() const { std::ostringstream oss; oss << "Station Value: " << nStationValue << "\n" @@ -274,12 +280,12 @@ } }; // äºä»¶è¯¦æ // äºä»¶è¯¦æ struct EventDetails { short nEventNo; // åççäºä»¶å· std::array<short, 4> details; // åå¨äºä»¶è¯¦æ ä¿¡æ¯ short nEventNo; // åççäºä»¶å· std::array<short, 4> details; // åå¨äºä»¶è¯¦æ ä¿¡æ¯ // è§£æäºä»¶è¯¦æ ï¼è¿åæ ¼å¼åå符串 // è§£æäºä»¶è¯¦æ ï¼è¿åæ ¼å¼åå符串 std::string toString() const { std::ostringstream oss; oss << "Details[0]: " << details[0] << ", " @@ -290,33 +296,33 @@ } }; // SoftElement ç»æä½å®ä¹ // SoftElement ç»æä½å®ä¹ struct SoftElement { short nType; // 软å ä»¶ç±»å short nElementCount; // ç¹æ° long nStartNo; // èµ·å§è½¯å ä»¶ç¼å· short nType; // 软å ä»¶ç±»å short nElementCount; // ç¹æ° long nStartNo; // èµ·å§è½¯å ä»¶ç¼å· }; // éè¯¯ä¿¡æ¯ // éè¯¯ä¿¡æ¯ struct ErrorInfo { int nErrorCode = 0; // é误ç std::string strErrorMessageCn; // 䏿æè¿° std::string strErrorMessageEn; // è±ææè¿° int nErrorCode = 0; // é误ç std::string strErrorMessageCn; // 䏿æè¿° std::string strErrorMessageEn; // è±ææè¿° // å°ç»æä½åºåå为å符串 // å°ç»æä½åºåå为å符串 std::string toString() const { std::ostringstream oss; oss << nErrorCode << "|" << strErrorMessageCn << "|" << strErrorMessageEn; return oss.str(); } // ä»å符串ååºååä¸ºç»æä½ // ä»å符串ååºååä¸ºç»æä½ static ErrorInfo fromString(const std::string& line) { ErrorInfo info; std::istringstream iss(line); std::string token; // 使ç¨åé符 "|" è§£æå符串 // 使ç¨åé符 "|" è§£æå符串 std::getline(iss, token, '|'); info.nErrorCode = std::stoi(token); @@ -330,47 +336,47 @@ } }; using BitContainer = std::vector<uint8_t>; // æ¯ä¸ªå ç´ åå¨ 8 ä¸ªä½ using WordContainer = std::vector<uint16_t>; // æ¯ä¸ªå ç´ åå¨ 16 ä½ using DWordContainer = std::vector<uint32_t>; // æ¯ä¸ªå ç´ åå¨ 32 ä½ using BitContainer = std::vector<uint8_t>; // æ¯ä¸ªå ç´ åå¨ 8 ä¸ªä½ using WordContainer = std::vector<uint16_t>; // æ¯ä¸ªå ç´ åå¨ 16 ä½ using DWordContainer = std::vector<uint32_t>; // æ¯ä¸ªå ç´ åå¨ 32 ä½ // CPerformanceMelsec 类声æ // CPerformanceMelsec 类声æ class CPerformanceMelsec { public: // è·åæè¿çéè¯¯ä¿¡æ¯ // è·åæè¿çéè¯¯ä¿¡æ¯ std::string GetLastError() const; // é误信æ¯å è½½ä¸ä¿åæ¥å£ static bool LoadErrorInfoFromFile(const std::string& filename); // 仿件å è½½éè¯¯ä¿¡æ¯ static bool SaveErrorInfoToFile(const std::string& filename); // ä¿åé误信æ¯å°æä»¶ // é误信æ¯å è½½ä¸ä¿åæ¥å£ static bool LoadErrorInfoFromFile(const std::string& filename); // 仿件å è½½éè¯¯ä¿¡æ¯ static bool SaveErrorInfoToFile(const std::string& filename); // ä¿åé误信æ¯å°æä»¶ // è¿æ¥/æå¼ // è¿æ¥/æå¼ int Connect(short nChannel, short nMode = -1); int Disconnect(); // åå§åå¯ç¼ç¨æ§å¶å¨è½¯å ä»¶ä¿¡æ¯è¡¨ // åå§åå¯ç¼ç¨æ§å¶å¨è½¯å ä»¶ä¿¡æ¯è¡¨ int InitializeController(); // è·åçæ¬ä¿¡æ¯ // è·åçæ¬ä¿¡æ¯ int GetBoardVersion(BoardVersion& version); // æ¿å¤ä½ // æ¿å¤ä½ int BoardReset(); // æ¿LED读å // æ¿LED读å int ReadBoardLed(std::vector<short>& vecLedBuffer); // 读åç®æ ç«ç¹CPUç±»å // 读åç®æ ç«ç¹CPUç±»å int ReadCPUCode(const StationIdentifier& station, short& nCPUCode); // æ¿æ¨¡å¼è·å/设置 // æ¿æ¨¡å¼è·å/设置 int SetBoardMode(short nMode); int GetBoardMode(short& nMode); // è·åæ¿ç¶æ // è·åæ¿ç¶æ int GetBoardStatus(BoardStatus& status); // è¯»åæ°æ® // è¯»åæ°æ® int ReadData(const StationIdentifier& station, short nDevType, short nDevNo, short nSize, std::vector<short>& vecData); int ReadBitData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nBitCount, BitContainer& vecData); int ReadWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, short nWordCount, WordContainer& vecData); @@ -380,60 +386,60 @@ int WriteWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const WordContainer& vecData); int WriteDWordData(const StationIdentifier& station, DeviceType enDevType, short nDevNo, const DWordContainer& vecData); // æ©å±è¯»åæ°æ® // æ©å±è¯»åæ°æ® long ReadDataEx(const StationIdentifier& station, long nDevType, long nDevNo, long nSize, std::vector<char>& vecData); long WriteDataEx(const StationIdentifier& station, long nDevType, long nDevNo, const std::vector<char>& vecData); // æ©å±è½¯å ä»¶éæºè¯»åï¼æ¯æå¤ä¸ªè½¯å ä»¶ï¼ // æ©å±è½¯å ä»¶éæºè¯»åï¼æ¯æå¤ä¸ªè½¯å ä»¶ï¼ long ReadRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, std::vector<char>& vecData); long WriteRandomDataEx(const StationIdentifier& station, const std::vector<SoftElement>& vecSoftElements, const std::vector<char>& vecData); // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å // è¿ç¨è®¾å¤ç«/è¿ç¨ç«çç¼å²åå¨å¨è¯»å long ReadRemoteBuffer(const StationIdentifier& station, long nOffset, long nSize, std::vector<char>& vecData); long WriteRemoteBuffer(const StationIdentifier& station, long nOffset, const std::vector<char>& vecData); long ReadRemoteBufferByIp(const std::string& strIP, long nOffset, long nSize, std::vector<char>& vecData); long WriteRemoteBufferByIp(const std::string& strIP, long nOffset, const std::vector<char>& vecData); // 设置/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å ä»¶ // 设置/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å ä»¶ int SetBitDevice(const StationIdentifier& station, DeviceType enDevType, short nDevNo); int ResetBitDevice(const StationIdentifier& station, DeviceType enDevType, short enDevNo); // æ©å±è®¾ç½®/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å ä»¶ // æ©å±è®¾ç½®/å¤ä½å¯¹è±¡ç«çæå®ä½è½¯å ä»¶ long SetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo); long ResetBitDeviceEx(const StationIdentifier& station, long nDevType, long nDevNo); // æ§è¡å¯¹è±¡ç«çCPU // æ§è¡å¯¹è±¡ç«çCPU int ControlCPU(const StationIdentifier& station, ControlCode enControlCode); // äºä»¶çå¾ ï¼vecEventNumbers[0, 64]ï¼nTimeoutMs[-1, 2147483647] // åæ¶åçäºå¤ä¸ªäºä»¶çæ åµä¸ï¼é¦å æ£æµåºå ¶ä¸ä¸ä¸ªäºä»¶ã 忬¡æ§è¡äºæ¬å½æ°çæ åµä¸æ£æµåºå ¶å®äºä»¶ã // äºä»¶çå¾ ï¼vecEventNumbers[0, 64]ï¼nTimeoutMs[-1, 2147483647] // åæ¶åçäºå¤ä¸ªäºä»¶çæ åµä¸ï¼é¦å æ£æµåºå ¶ä¸ä¸ä¸ªäºä»¶ã 忬¡æ§è¡äºæ¬å½æ°çæ åµä¸æ£æµåºå ¶å®äºä»¶ã int WaitForBoardEvent(std::vector<short> vecEventNumbers, int nTimeoutMs, EventDetails& details); private: // éå®ä¸è§£éï¼å¤çº¿ç¨åæ¥ä¿æ¤ï¼ // éå®ä¸è§£éï¼å¤çº¿ç¨åæ¥ä¿æ¤ï¼ void Lock() { m_mtx.lock(); } void Unlock() { m_mtx.unlock(); } protected: // æé 彿°/ææå½æ° // æé 彿°/ææå½æ° explicit CPerformanceMelsec(BoardType enBoardType); virtual ~CPerformanceMelsec(); // è¾ å©å½æ° void UpdateLastError(int nCode); // æ´æ°æè¿çéè¯¯ä¿¡æ¯ int ValidateStation(const StationIdentifier& station) const; // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ // è¾ å©å½æ° void UpdateLastError(int nCode); // æ´æ°æè¿çéè¯¯ä¿¡æ¯ int ValidateStation(const StationIdentifier& station) const; // æ£æ¥è¿æ¥ç¶æåç«ç¹åæ°æææ§ int ValidateStationAndSize(const StationIdentifier& station, short nCount) const; // éæè¾ å©å½æ° static void Delay(unsigned int nDelayMs); // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ static BoardType FindBoardTypeByChannel(int nChannel); // æ¥æ¾æ¿åç±»å static short CombineStation(const StationIdentifier& station); // åå¹¶ç½ç»å·åç«ç¹å· static short CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType); // 计ç®è½¯å ä»¶ç±»å // éæè¾ å©å½æ° static void Delay(unsigned int nDelayMs); // å»¶æ¶ï¼å¹¶ä¸è½¬åçªå£æ¶æ¯ static BoardType FindBoardTypeByChannel(int nChannel); // æ¥æ¾æ¿åç±»å static short CombineStation(const StationIdentifier& station); // åå¹¶ç½ç»å·åç«ç¹å· static short CalculateDeviceType(const StationIdentifier& station, DeviceType enDevType); // 计ç®è½¯å ä»¶ç±»å // IPè½¬æ¢ // IPè½¬æ¢ static bool ConvertIpStringToUint32(const std::string& strIP, uint32_t& nIP); // 容å¨è½¬æ¢ // 容å¨è½¬æ¢ static void ConvertCharToShort(const std::vector<char>& vecChar, std::vector<short>& vecShort); static void ConvertShortToChar(const std::vector<short>& vecShort, std::vector<char>&vecChar); static void ConvertUint8ToShort(const std::vector<uint8_t>& vecUint8, std::vector<short>& vecShort); @@ -441,7 +447,7 @@ static void ConvertUint32ToShort(const std::vector<uint32_t>& vecUint32, std::vector<short>& vecShort); static void ConvertShortToUint32(const std::vector<short>& vecShort, std::vector<uint32_t>& vecUint32); // 模æ¿è¾ å©å½æ° // 模æ¿è¾ å©å½æ° template <typename T> int ValidateStationAndData(const StationIdentifier& station, const std::vector<T>& vecData); @@ -451,15 +457,15 @@ template <typename T, typename U> void ConvertHighToLow(const std::vector<T>& vecHigh, std::vector<U>& vecLow); // æååé std::mutex m_mtx; // äºæ¥éä¿æ¤ BoardType m_enBoardType; // æ¿åç±»å long m_nPath; // éä¿¡è·¯å¾ std::atomic<bool> m_bConnected; // æ¯å¦å·²è¿æ¥ std::string m_strLastError; // æè¿ä¸æ¬¡éè¯¯ä¿¡æ¯ // æååé std::mutex m_mtx; // äºæ¥éä¿æ¤ BoardType m_enBoardType; // æ¿åç±»å long m_nPath; // éä¿¡è·¯å¾ std::atomic<bool> m_bConnected; // æ¯å¦å·²è¿æ¥ std::string m_strLastError; // æè¿ä¸æ¬¡éè¯¯ä¿¡æ¯ // éææååé static std::unordered_map<int, std::string> m_mapError; // éè¯¯ç æ å°è¡¨ // éææååé static std::unordered_map<int, std::string> m_mapError; // éè¯¯ç æ å°è¡¨ }; #endif // PERFORMANCE_MELSEC_H SourceCode/Bond/Servo/CEFEM.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ #include "stdafx.h" #include "CEFEM.h" namespace SERVO { CEFEM::CEFEM() { } CEFEM::~CEFEM() { } const char* CEFEM::getClassName() { static char* pszName = "CEFEM"; return pszName; } void CEFEM::init() { CEquipment::init(); } void CEFEM::term() { CEquipment::term(); } void CEFEM::onTimer(UINT nTimerid) { CEquipment::onTimer(nTimerid); } void CEFEM::serialize(CArchive& ar) { CEquipment::serialize(ar); } } SourceCode/Bond/Servo/CEFEM.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ #pragma once #include "CEquipment.h" namespace SERVO { class CEFEM : public CEquipment { public: CEFEM(); ~CEFEM(); public: virtual const char* getClassName(); virtual void init(); virtual void term(); virtual void onTimer(UINT nTimerid); virtual void serialize(CArchive& ar); }; } SourceCode/Bond/Servo/CEquipment.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,93 @@ #include "stdafx.h" #include "CEquipment.h" namespace SERVO { CEquipment::CEquipment() { InitializeCriticalSection(&m_criticalSection); } CEquipment::~CEquipment() { DeleteCriticalSection(&m_criticalSection); } void CEquipment::init() { } void CEquipment::term() { } void CEquipment::setName(const char* pszName) { m_strName = pszName; } std::string& CEquipment::getName() { return m_strName; } void CEquipment::setDescription(const char* pszDescription) { m_strDescription = pszDescription; } std::string& CEquipment::getDescription() { return m_strDescription; } void CEquipment::setStation(int network, int station) { m_station.nNetNo = network; m_station.nStNo = station; } const StationIdentifier& CEquipment::getStation() { return m_station; } void CEquipment::setReadBitBlock(unsigned int start, unsigned int end) { m_blockReadBit.type = (unsigned int)DeviceType::LB;; m_blockReadBit.start = start; m_blockReadBit.end = end; m_blockReadBit.size = (m_blockReadBit.end - m_blockReadBit.start + 1) / 8; } MemoryBlock& CEquipment::getReadBitBlock() { return m_blockReadBit; } void CEquipment::setWriteBitBlock(unsigned int start, unsigned int end) { m_blockWriteBit.type = (unsigned int)DeviceType::LB; m_blockWriteBit.start = start; m_blockWriteBit.end = end; m_blockWriteBit.size = (m_blockWriteBit.end - m_blockWriteBit.start + 1) / 8; } MemoryBlock& CEquipment::getWriteBitBlock() { return m_blockWriteBit; } void CEquipment::onTimer(UINT nTimerid) { } void CEquipment::serialize(CArchive& ar) { } } SourceCode/Bond/Servo/CEquipment.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,51 @@ #pragma once #include "Log.h" #include "CCLinkIEControl.h" namespace SERVO { // Memory Block ç»æä½å®ä¹ typedef struct _MemoryBlock { unsigned int type; unsigned int start; unsigned int end; unsigned int size; } MemoryBlock; class CEquipment { public: CEquipment(); virtual ~CEquipment(); public: virtual const char* getClassName() = 0; void setName(const char* pszName); std::string& getName(); void setDescription(const char* pszDescription); std::string& getDescription(); void setStation(int network, int station); const StationIdentifier& getStation(); void setReadBitBlock(unsigned int start, unsigned int end); MemoryBlock& getReadBitBlock(); void setWriteBitBlock(unsigned int start, unsigned int end); MemoryBlock& getWriteBitBlock(); virtual void init(); virtual void term(); virtual void onTimer(UINT nTimerid); virtual void serialize(CArchive& ar); protected: inline void Lock() { EnterCriticalSection(&m_criticalSection); } inline void Unlock() { LeaveCriticalSection(&m_criticalSection); } protected: std::string m_strName; std::string m_strDescription; CRITICAL_SECTION m_criticalSection; StationIdentifier m_station; MemoryBlock m_blockReadBit; MemoryBlock m_blockWriteBit; }; } SourceCode/Bond/Servo/CMaster.cpp
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,127 @@ #include "stdafx.h" #include "CMaster.h" namespace SERVO { CMaster* g_pMaster = NULL; void CALLBACK MasterTimerProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime) { if (g_pMaster != NULL) { g_pMaster->onTimer(nTimerid); } } CMaster::CMaster() { } CMaster::~CMaster() { for (auto item : m_listEquipment) { delete item; } m_listEquipment.clear(); } int CMaster::init() { LOGI("<Master>æ£å¨åå§å..."); // cclink if (m_cclink.Connect(CC_LINK_IE_CONTROL_CHANNEL(1)) != 0) { LOGE("è¿æ¥CC-Link失败."); return -1; } else { LOGI("è¿æ¥CC-Linkæå."); BoardVersion version{}; int nRet = m_cclink.GetBoardVersion(version); if (nRet == 0) { LOGI("çæ¬ä¿¡æ¯ï¼%s.", version.toString().c_str()); } else { LOGE("è·åCC-Linkçæ¬ä¿¡æ¯å¤±è´¥."); } BoardStatus status; nRet = m_cclink.GetBoardStatus(status); if (nRet == 0) { LOGI("ç¶æï¼%s.", status.toString().c_str()); } else { LOGE("è·åCC-Linkç¶æå¤±è´¥."); } } // åå§åæ·»å ååè®¾å¤ { CEFEM* pEquipment = new CEFEM(); pEquipment->setName("EFEM(ROBOT)"); pEquipment->setDescription("EFEM(ROBOT)."); pEquipment->setReadBitBlock(0x4000, 0x45ff); pEquipment->setStation(1, 2); addEquipment(pEquipment); LOGE("已添å âEFEM(ROBOT)â."); } /* { CBonder* pBonder = new CBonder(); pBonder->setName("Bonder 1"); pBonder->setDescription("Bonder 1."); pBonder->setReadBitBlock(0x4600, 0x4bff); pBonder->setStation(1, 3); addEquipment(pBonder); LOGE("已添å âBonder 1â."); } */ // 宿¶å¨ g_pMaster = this; SetTimer(NULL, 1, 250, (TIMERPROC)MasterTimerProc); LOGI("<Master>åå§å宿."); return 0; } int CMaster::term() { return 0; } int CMaster::addEquipment(CEquipment* pEquipment) { m_listEquipment.push_back(pEquipment); return 0; } void CMaster::onTimer(UINT nTimerid) { for (auto item : m_listEquipment) { item->onTimer(nTimerid); } // 以ä¸ä¸ºæµè¯ä»£ç static int i = 0; i++; if (i % (4 * 1) == 0) { for (auto item : m_listEquipment) { const StationIdentifier& station = item->getStation(); MemoryBlock& block = item->getReadBitBlock(); char szBuffer[1024]; int nRet = m_cclink.ReadData2(station, (short)block.type, block.start, block.size, szBuffer); for (unsigned int i = 0; i < block.size; i++) { if(szBuffer[i] != 0) TRACE("%d[%x]\n", i, szBuffer[i]); } TRACE("nRet=%d\n", nRet); } } } } SourceCode/Bond/Servo/CMaster.h
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ #pragma once #include <list> #include "CEquipment.h" #include "CEFEM.h" #include "CBonder.h" #include "CCLinkIEControl.h" namespace SERVO { class CMaster { public: CMaster(); ~CMaster(); public: int init(); int term(); void onTimer(UINT nTimerid); private: int addEquipment(CEquipment* pEquipment); private: CCCLinkIEControl m_cclink; std::list<CEquipment*> m_listEquipment; }; } SourceCode/Bond/Servo/Model.cpp
@@ -96,6 +96,8 @@ { m_hsmsPassive.term(); CLog::GetLog()->SetOnLogCallback(nullptr); m_master.term(); return 0; } SourceCode/Bond/Servo/Model.h
@@ -1,6 +1,7 @@ #pragma once #include "Configuration.h" #include "HsmsPassive.h" #include "CMaster.h" class CModel { @@ -31,6 +32,7 @@ public: CConfiguration m_configuration; CHsmsPassive m_hsmsPassive; SERVO::CMaster m_master; private: IObservable* m_pObservable; SourceCode/Bond/Servo/Servo.vcxproj
@@ -132,6 +132,9 @@ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ResourceCompile> <PostBuildEvent> <Command>copy "$(TargetDir)$(ProjectName).exe" "\\Boounion-0106\Servo\\$(ProjectName).exe"</Command> </PostBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> @@ -194,8 +197,12 @@ <ItemGroup> <ClInclude Include="AlarmManager.h" /> <ClInclude Include="BlButton.h" /> <ClInclude Include="CBonder.h" /> <ClInclude Include="CCLinkPerformance\CCLinkIEControl.h" /> <ClInclude Include="CCLinkPerformance\PerformanceMelsec.h" /> <ClInclude Include="CEFEM.h" /> <ClInclude Include="CEquipment.h" /> <ClInclude Include="CMaster.h" /> <ClInclude Include="Common.h" /> <ClInclude Include="Configuration.h" /> <ClInclude Include="Context.h" /> @@ -218,8 +225,12 @@ <ItemGroup> <ClCompile Include="AlarmManager.cpp" /> <ClCompile Include="BlButton.cpp" /> <ClCompile Include="CBonder.cpp" /> <ClCompile Include="CCLinkPerformance\CCLinkIEControl.cpp" /> <ClCompile Include="CCLinkPerformance\PerformanceMelsec.cpp" /> <ClCompile Include="CEFEM.cpp" /> <ClCompile Include="CEquipment.cpp" /> <ClCompile Include="CMaster.cpp" /> <ClCompile Include="Configuration.cpp" /> <ClCompile Include="Context.cpp" /> <ClCompile Include="HsmsAction.cpp" /> SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -30,6 +30,10 @@ <ClCompile Include="CCLinkPerformance\PerformanceMelsec.cpp"> <Filter>CCLinkPerformance</Filter> </ClCompile> <ClCompile Include="CEquipment.cpp" /> <ClCompile Include="CBonder.cpp" /> <ClCompile Include="CMaster.cpp" /> <ClCompile Include="CEFEM.cpp" /> </ItemGroup> <ItemGroup> <ClInclude Include="AlarmManager.h" /> @@ -58,6 +62,10 @@ <ClInclude Include="CCLinkPerformance\PerformanceMelsec.h"> <Filter>CCLinkPerformance</Filter> </ClInclude> <ClInclude Include="CEquipment.h" /> <ClInclude Include="CBonder.h" /> <ClInclude Include="CMaster.h" /> <ClInclude Include="CEFEM.h" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="Servo.rc" /> SourceCode/Bond/Servo/Servo.vcxproj.user
@@ -3,4 +3,10 @@ <PropertyGroup> <RESOURCE_FILE>Servo.rc</RESOURCE_FILE> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <RemoteDebuggerCommand>D:\CLH\Servo\Servo.exe</RemoteDebuggerCommand> <RemoteDebuggerWorkingDirectory>D:\CLH\Servo\</RemoteDebuggerWorkingDirectory> <RemoteDebuggerServerName>Boounion-0106</RemoteDebuggerServerName> <DebuggerFlavor>WindowsRemoteDebugger</DebuggerFlavor> </PropertyGroup> </Project> SourceCode/Bond/Servo/ServoDlg.cpp
@@ -290,8 +290,15 @@ SetTimer(TIMER_ID_CREATE_TERMINAL, 3000, nullptr); InitRxWindows(); OnBnClickedButtonLog(); UpdateLogBtn(); Resize(); // ç¸å½äºå»¶æ¶è°ç¨masterçåå§å theApp.m_model.m_master.init(); return TRUE; // é¤éå°ç¦ç¹è®¾ç½®å°æ§ä»¶ï¼å¦åè¿å TRUE } SourceCode/Bond/Servo/packages.config
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <packages> <package id="Microsoft.Web.WebView2" version="1.0.2903.40" targetFramework="native" /> <package id="Microsoft.Windows.ImplementationLibrary" version="1.0.240803.1" targetFramework="native" /> </packages>