#include "stdafx.h" #include "CCLinkIEControl.h" CCCLinkIEControl::CCCLinkIEControl() : CPerformanceMelsec(BoardType::CC_LINK_IE_CONTROL) {} CCCLinkIEControl::~CCCLinkIEControl() = default; int CCCLinkIEControl::SetBoardModeEx(CCLinkIEControlMode mode) { return SetBoardMode(static_cast(mode)); } CCLinkIEControlMode CCCLinkIEControl::GetBoardModeEx() { short nMode = 0; const int nResult = GetBoardMode(nMode); if (nResult != 0) { return CCLinkIEControlMode::UNKNOWN; } return ConvertToCCLinkIEControlMode(nMode); } int CCCLinkIEControl::GetBoardStatusEx(BoardStatus& status) { const int nResult = GetBoardStatus(status); if (nResult != 0) { return nResult; } return ValidateBoardStatus(status); } int CCCLinkIEControl::ReadLedStatus(LedStatus& outLedStatus) { std::vector vecLedBuffer; const int nRet = ReadBoardLed(vecLedBuffer); if (nRet != 0) { return nRet; } if (vecLedBuffer.empty()) { UpdateLastError(ERROR_CODE_INVALID_DATA); return ERROR_CODE_INVALID_DATA; } // ½âÎö¸÷λ״̬ const short nBuffer = vecLedBuffer[0]; outLedStatus.bExtPw = (nBuffer & (1 << 15)) != 0; outLedStatus.bRd = (nBuffer & (1 << 6)) != 0; outLedStatus.bDLnk = (nBuffer & (1 << 5)) != 0; outLedStatus.bPrm = (nBuffer & (1 << 4)) != 0; outLedStatus.bErr = (nBuffer & (1 << 3)) != 0; outLedStatus.bSd = (nBuffer & (1 << 2)) != 0; outLedStatus.bMode = (nBuffer & (1 << 1)) != 0; outLedStatus.bRun = (nBuffer & (1 << 0)) != 0; return 0; } CCLinkIEControlMode CCCLinkIEControl::ConvertToCCLinkIEControlMode(const short nMode) { switch (static_cast(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²âÊÔ default: return CCLinkIEControlMode::UNKNOWN; } } int CCCLinkIEControl::ValidateBoardStatus(const BoardStatus& status) { if (status.nStationValue < 1 || status.nStationValue > 120) { return ERROR_CODE_STATION_OUT_OF_RANGE; // Õ¾ºÅ³¬³ö·¶Î§ } if (status.nGroupValue < 0 || status.nGroupValue > 32) { return ERROR_CODE_GROUP_OUT_OF_RANGE; // ×鳬³ö·¶Î§ } if (status.nNetworkValue < 1 || status.nNetworkValue > 239) { return ERROR_CODE_NETWORK_OUT_OF_RANGE; // ÍøÂçºÅ³¬³ö·¶Î§ } 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 lock(m_mtx); nRet = mdReceive(m_nPath, CombineStation(station), devType, devNo, &size, pData); } if (nRet != 0) { UpdateLastError(nRet); } return nRet; }