#include "pch.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::ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData) { // 验证站点参数和数据有效性 int nRet = ValidateStationAndSize(station, static_cast(size)); if (nRet != 0) { UpdateLastError(nRet); return nRet; } // 确保线程安全的最小锁定范围 { std::lock_guard lock(m_mtx); const short nDevType = CalculateDeviceType(station, enDevType); nRet = mdReceiveEx(m_nPath, station.nNetNo, station.nStNo, nDevType, devNo, &size, pData); } if (nRet != 0) { UpdateLastError(nRet); } return nRet; }