LAPTOP-SNT8I5JK\Boounion
2025-09-12 c62dbec7328a8b44e6ec61758e7b8463f2e502dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#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<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::ReadDataEx(const StationIdentifier& station, DeviceType enDevType, long devNo, long size, void* pData)
{
    // 验证站点参数和数据有效性
    int nRet = ValidateStationAndSize(station, static_cast<short>(size));
    if (nRet != 0) {
        UpdateLastError(nRet);
        return nRet;
    }
 
    // 确保线程安全的最小锁定范围
    {
        std::lock_guard<std::mutex> 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;
}