#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<short>(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<short> 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<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²âÊÔ
|
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<std::mutex> lock(m_mtx);
|
nRet = mdReceive(m_nPath, CombineStation(station), devType, devNo, &size, pData);
|
}
|
|
if (nRet != 0) {
|
UpdateLastError(nRet);
|
}
|
|
return nRet;
|
}
|