.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.xlsxBinary 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>