darker
2025-02-17 dd25d842b508e836e73b38c5970dbd276bac6fa5
Merge branch 'clh' into liuyang

# Conflicts:
# SourceCode/Bond/Servo/CCLinkPerformance/PerformanceMelsec.h
已添加9个文件
已修改10个文件
558 ■■■■■ 文件已修改
.gitignore 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Document/Panel Bonder八零联合 SecsTest CheckList_v3.0.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.cpp 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CBonder.h 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CCLinkPerformance/CCLinkIEControl.cpp 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CCLinkPerformance/CCLinkIEControl.h 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.cpp 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEFEM.h 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.h 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.user 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/packages.config 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -44,3 +44,7 @@
SourceCode/Bond/.vs/
SourceCode/Bond/packages/
SourceCode/Bond/x64/Debug/Servo.exe.WebView2/
SourceCode/Bond/x64/BoounionPLC/Debug/
*.iom
SourceCode/Bond/BoounionPLC/BoounionPLC.vcxproj.user
SourceCode/Bond/x64/Debug/ServoConfiguration.ini
Document/Panel Bonder°ËÁãÁªºÏ SecsTest CheckList_v3.0.xlsx
Binary 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/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>