1.增加CStep类,用于处理相似的CC-Link读取数据,回复等逻辑;
| | |
| | | |
| | | CEquipment::~CEquipment() |
| | | { |
| | | for (auto item : m_mapStep) { |
| | | delete item.second; |
| | | } |
| | | m_mapStep.clear(); |
| | | |
| | | DeleteCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | |
| | | m_listener.onCimStateChanged = listener.onCimStateChanged; |
| | | } |
| | | |
| | | CStep* CEquipment::getStep(unsigned int addr) |
| | | { |
| | | auto iter = m_mapStep.find(addr); |
| | | if (iter == m_mapStep.end()) return nullptr; |
| | | return iter->second; |
| | | } |
| | | |
| | | int CEquipment::addStep(unsigned int addr, CStep* pStep) |
| | | { |
| | | auto iter = m_mapStep.find(addr); |
| | | if (iter != m_mapStep.end()) return -1; |
| | | m_mapStep[addr] = pStep; |
| | | return 0; |
| | | } |
| | | |
| | | void CEquipment::init() |
| | | { |
| | | |
| | | CStep* pStep = new CStep(); |
| | | if (addStep(0x360, pStep) == 0) { |
| | | pStep->init(); |
| | | } |
| | | else { |
| | | delete pStep; |
| | | } |
| | | } |
| | | |
| | | void CEquipment::term() |
| | | { |
| | | |
| | | for (auto item : m_mapStep) { |
| | | item.second->term(); |
| | | } |
| | | } |
| | | |
| | | void CEquipment::setID(int nID) |
| | |
| | | if (!equalBool(m_bVCREnable[0], bFlag)) { |
| | | m_bVCREnable[0] = bFlag; |
| | | } |
| | | |
| | | |
| | | // 以䏿 ¹æ®ä¿¡å·åæµç¨å¤ç |
| | | |
| | | // Equipment Mode Change Report |
| | | index = 0x360; |
| | | bFlag = isBitOn(pszData, size, ++index); |
| | | static int i; |
| | | i++; |
| | | if (i > 10) bFlag = TRUE; |
| | | if (i > 15) bFlag = FALSE; |
| | | if (i > 110) bFlag = TRUE; |
| | | if (i > 115) bFlag = FALSE; |
| | | //if (i == 12) bFlag = FALSE; |
| | | CStep* pStep = getStep(0x360); |
| | | if (pStep != nullptr) { |
| | | pStep->onSignal(bFlag); |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index) |
| | |
| | | #pragma once |
| | | #include "Log.h" |
| | | #include "CCLinkIEControl.h" |
| | | #include "CStep.h" |
| | | #include <map> |
| | | |
| | | |
| | | namespace SERVO { |
| | | #define BLOCK_BUFFER_MAX 1024 |
| | |
| | | MemoryBlock& getReadBitBlock(); |
| | | void setWriteBitBlock(unsigned int start, unsigned int end); |
| | | MemoryBlock& getWriteBitBlock(); |
| | | int addStep(unsigned int addr, CStep* pStep); |
| | | CStep* getStep(unsigned int addr); |
| | | virtual void init(); |
| | | virtual void term(); |
| | | virtual void onTimer(UINT nTimerid); |
| | |
| | | BOOL m_bLocalAlarm; |
| | | BOOL m_bAutoRecipeChange; |
| | | BOOL m_bVCREnable[VCR_MAX]; |
| | | |
| | | private: |
| | | std::map<unsigned int, CStep*> m_mapStep; |
| | | }; |
| | | } |
| | | |
| | |
| | | // cclink |
| | | if (m_cclink.Connect(CC_LINK_IE_CONTROL_CHANNEL(1)) != 0) { |
| | | LOGE("è¿æ¥CC-Link失败."); |
| | | return -1; |
| | | } |
| | | else { |
| | | LOGI("è¿æ¥CC-Linkæå."); |
| | |
| | | pEquipment->setReadBitBlock(0x4000, 0x45ff); |
| | | pEquipment->setStation(1, 2); |
| | | addEquipment(pEquipment); |
| | | |
| | | pEquipment->init(); |
| | | LOGE("已添å âEFEM(ROBOT)â."); |
| | | } |
| | | /* |
| | |
| | | |
| | | int CMaster::term() |
| | | { |
| | | LOGI("<Master>æ£å¨ç»æç¨åº."); |
| | | for (auto item : m_listEquipment) { |
| | | item->term(); |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #include "stdafx.h" |
| | | #include "CStep.h" |
| | | |
| | | |
| | | namespace SERVO { |
| | | #define TIMEOUT 15 |
| | | |
| | | unsigned __stdcall StepWorkThreadFunction(LPVOID lpParam) |
| | | { |
| | | CStep* pScale = (CStep*)lpParam; |
| | | return pScale->WorkingProc(); |
| | | } |
| | | |
| | | CStep::CStep() |
| | | { |
| | | m_nWordThreadAddr = 0; |
| | | m_hWorkStop = nullptr; |
| | | m_hWorkThreadHandle = nullptr; |
| | | m_hSignalOn = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hSignalOff = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_nCurStep = 0; |
| | | InitializeCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | | CStep::~CStep() |
| | | { |
| | | ASSERT(m_hSignalOn); |
| | | CloseHandle(m_hSignalOn); |
| | | m_hSignalOn = nullptr; |
| | | |
| | | ASSERT(m_hSignalOff); |
| | | CloseHandle(m_hSignalOff); |
| | | m_hSignalOff = nullptr; |
| | | |
| | | DeleteCriticalSection(&m_criticalSection); |
| | | } |
| | | |
| | | void CStep::init() |
| | | { |
| | | if (m_hWorkStop != nullptr) return; |
| | | m_hWorkStop = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | m_hWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, SERVO::StepWorkThreadFunction, this, |
| | | 0, &m_nWordThreadAddr); |
| | | } |
| | | |
| | | void CStep::term() |
| | | { |
| | | ASSERT(m_hWorkStop); |
| | | SetEvent(m_hWorkStop); |
| | | if (m_hWorkThreadHandle != NULL) { |
| | | WaitForSingleObject(m_hWorkThreadHandle, INFINITE); |
| | | CloseHandle(m_hWorkThreadHandle); |
| | | m_hWorkThreadHandle = NULL; |
| | | } |
| | | CloseHandle(m_hWorkStop); |
| | | m_hWorkStop = NULL; |
| | | } |
| | | |
| | | unsigned CStep::WorkingProc() |
| | | { |
| | | HANDLE hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL); |
| | | BOOL bReadOk = FALSE; |
| | | |
| | | int nBeginAddr = 0x0; |
| | | while (1) { |
| | | RESET: |
| | | resetStep(); |
| | | |
| | | // å¾
éåºä¿¡å·ææ¶é´å° |
| | | HANDLE hEvents[] = { m_hWorkStop, m_hSignalOn }; |
| | | int nRet = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); |
| | | if (nRet == WAIT_OBJECT_0) { |
| | | ResetEvent(m_hWorkStop); |
| | | break; |
| | | } |
| | | |
| | | else if (nRet == WAIT_OBJECT_0 + 1) { |
| | | ResetEvent(m_hSignalOn); |
| | | |
| | | // 1.è¯»åæ°æ® |
| | | nextStep(); |
| | | TRACE("m_nCurStep:%d\n", m_nCurStep); |
| | | |
| | | |
| | | // 2.ç»å¯¹æ¹åON |
| | | nextStep(); |
| | | TRACE("m_nCurStep:%d\n", m_nCurStep); |
| | | |
| | | |
| | | // 3.çå¾
对æ¹OFF |
| | | nextStep(); |
| | | TRACE("m_nCurStep:%d\n", m_nCurStep); |
| | | int nStep3Ret = ::WaitForSingleObject(m_hSignalOff, TIMEOUT * 1000); |
| | | if (nStep3Ret == WAIT_TIMEOUT) { |
| | | timeout(); |
| | | goto RESET; |
| | | } |
| | | ResetEvent(m_hSignalOff); |
| | | |
| | | |
| | | // 4.ç»å¯¹æ¹åOFF |
| | | nextStep(); |
| | | TRACE("m_nCurStep:%d\n", m_nCurStep); |
| | | |
| | | |
| | | // 5.对æ¥CIMç |
| | | nextStep(); |
| | | TRACE("m_nCurStep:%d\n", m_nCurStep); |
| | | |
| | | |
| | | // 6.宿 |
| | | nextStep(); |
| | | TRACE("m_nCurStep:%d\n", m_nCurStep); |
| | | } |
| | | } |
| | | |
| | | if (hEvent != nullptr) { |
| | | CloseHandle(hEvent); |
| | | } |
| | | |
| | | // _endthreadex(0); |
| | | TRACE("CStep::WorkingProc 线ç¨éåº\n"); |
| | | return 0; |
| | | } |
| | | |
| | | void CStep::onSignal(BOOL bSignal) |
| | | { |
| | | TRACE(">>>>>>>>>>>>>>>>>>>> setSignal:%s\n", bSignal ? "ON" : "OFF"); |
| | | Lock(); |
| | | if (m_nCurStep == 0 && bSignal) { |
| | | SetEvent(m_hSignalOn); |
| | | } |
| | | else if (m_nCurStep == 3 && !bSignal) { |
| | | SetEvent(m_hSignalOff); |
| | | } |
| | | |
| | | Unlock(); |
| | | } |
| | | |
| | | void CStep::resetStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep = 0; |
| | | Unlock(); |
| | | } |
| | | |
| | | void CStep::nextStep() |
| | | { |
| | | Lock(); |
| | | m_nCurStep++; |
| | | Unlock(); |
| | | } |
| | | |
| | | void CStep::timeout() |
| | | { |
| | | TRACE(">>>>>>>>>>>>>>>> timeout:%d\n", m_nCurStep); |
| | | } |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | |
| | | |
| | | namespace SERVO { |
| | | class CStep |
| | | { |
| | | public: |
| | | CStep(); |
| | | virtual ~CStep(); |
| | | |
| | | public: |
| | | unsigned WorkingProc(); |
| | | virtual void init(); |
| | | virtual void CStep::term(); |
| | | virtual void onSignal(BOOL bSignal); |
| | | |
| | | protected: |
| | | inline void Lock() { EnterCriticalSection(&m_criticalSection); } |
| | | inline void Unlock() { LeaveCriticalSection(&m_criticalSection); } |
| | | inline void nextStep(); |
| | | inline void resetStep(); |
| | | void timeout(); |
| | | |
| | | private: |
| | | CRITICAL_SECTION m_criticalSection; |
| | | std::string strName; |
| | | HANDLE m_hWorkThreadHandle; |
| | | unsigned m_nWordThreadAddr; |
| | | HANDLE m_hWorkStop; |
| | | HANDLE m_hSignalOn; |
| | | HANDLE m_hSignalOff; |
| | | int m_nCurStep; |
| | | }; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // CDevicePropertyDlg.cpp: å®ç°æä»¶ |
| | | // |
| | | |
| | | #include "stdafx.h" |
| | | #include "Servo.h" |
| | | #include "afxdialogex.h" |
| | | #include "DevicePropertyDlg.h" |
| | | |
| | | // CDevicePropertyDlg å¯¹è¯æ¡ |
| | | |
| | | IMPLEMENT_DYNAMIC(CDevicePropertyDlg, CDialogEx) |
| | | |
| | | CDevicePropertyDlg::CDevicePropertyDlg(CWnd* pParent /*=nullptr*/, int nDeviceID /*=0*/) |
| | | : CDialogEx(IDD_DIALOG_DEVICE_PROPERTY, pParent), m_nDeviceID(nDeviceID) |
| | | { |
| | | |
| | | } |
| | | |
| | | CDevicePropertyDlg::~CDevicePropertyDlg() |
| | | { |
| | | } |
| | | |
| | | void CDevicePropertyDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialogEx::DoDataExchange(pDX); |
| | | DDX_Control(pDX, IDC_LIST_DEVICE_PROPERTY, m_listDeviceProperties); |
| | | } |
| | | |
| | | |
| | | BEGIN_MESSAGE_MAP(CDevicePropertyDlg, CDialogEx) |
| | | END_MESSAGE_MAP() |
| | | |
| | | |
| | | // CDevicePropertyDlg æ¶æ¯å¤çç¨åº |
| | | |
| | | |
| | | BOOL CDevicePropertyDlg::OnInitDialog() |
| | | { |
| | | CDialogEx::OnInitDialog(); |
| | | |
| | | // TODO: 卿¤æ·»å é¢å¤çåå§å |
| | | SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(m_nDeviceID); |
| | | if (nullptr == pEquipment) { |
| | | LOGI("<设å¤IDï¼%d>è·å设å¤å±æ§å¤±è´¥ã", m_nDeviceID); |
| | | return FALSE; |
| | | } |
| | | |
| | | // ä¿®æ¹å¯¹è¯æ¡æ é¢ |
| | | std::string strDeviceName = pEquipment->getName(); |
| | | SetWindowText(CString(strDeviceName.c_str())); |
| | | |
| | | // è·åææè®¾å¤å±æ§ |
| | | std::vector<std::pair<std::string, std::string>> properties; |
| | | //pEquipment->getProperties(properties); |
| | | |
| | | // è·åListCtrlç客æ·åºå |
| | | CRect rect; |
| | | m_listDeviceProperties.GetClientRect(&rect); |
| | | int nTotalWidth = rect.Width(); |
| | | |
| | | int nColumnWidth = 150; |
| | | m_listDeviceProperties.InsertColumn(0, _T("åç§°"), LVCFMT_LEFT, nColumnWidth); |
| | | m_listDeviceProperties.InsertColumn(1, _T("å¼"), LVCFMT_LEFT, nColumnWidth); |
| | | |
| | | // éå容å¨ä¸çææå±æ§å¹¶è¾åº |
| | | int nItem = 0; |
| | | for (const auto& property : properties) { |
| | | // æå
¥è®¾å¤å±æ§ |
| | | m_listDeviceProperties.InsertItem(nItem, property.first.c_str()); |
| | | m_listDeviceProperties.SetItemText(nItem, 1, property.second.c_str()); |
| | | ++nItem; |
| | | } |
| | | |
| | | // 设置第äºå宽度 |
| | | m_listDeviceProperties.SetColumnWidth(1, nTotalWidth - nColumnWidth); |
| | | |
| | | return TRUE; // return TRUE unless you set the focus to a control |
| | | // å¼å¸¸: OCX 屿§é¡µåºè¿å FALSE |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #pragma once |
| | | #include "afxdialogex.h" |
| | | |
| | | |
| | | // CDevicePropertyDlg å¯¹è¯æ¡ |
| | | |
| | | class CDevicePropertyDlg : public CDialogEx |
| | | { |
| | | DECLARE_DYNAMIC(CDevicePropertyDlg) |
| | | |
| | | public: |
| | | CDevicePropertyDlg(CWnd* pParent = nullptr, int nDeviceID = 0); // æ åæé 彿° |
| | | virtual ~CDevicePropertyDlg(); |
| | | |
| | | // å¯¹è¯æ¡æ°æ® |
| | | #ifdef AFX_DESIGN_TIME |
| | | enum { IDD = IDD_DIALOG_DEVICE_PROPERTY }; |
| | | #endif |
| | | |
| | | protected: |
| | | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV æ¯æ |
| | | virtual BOOL OnInitDialog(); |
| | | DECLARE_MESSAGE_MAP() |
| | | |
| | | private: |
| | | int m_nDeviceID; |
| | | CListCtrl m_listDeviceProperties; |
| | | }; |
| | |
| | | <ClInclude Include="CBonder.h" /> |
| | | <ClInclude Include="CCLinkPerformance\CCLinkIEControl.h" /> |
| | | <ClInclude Include="CCLinkPerformance\PerformanceMelsec.h" /> |
| | | <ClInclude Include="CStep.h" /> |
| | | <ClInclude Include="DevicePropertyDlg.h" /> |
| | | <ClInclude Include="CEFEM.h" /> |
| | | <ClInclude Include="CEquipment.h" /> |
| | |
| | | <ClCompile Include="CBonder.cpp" /> |
| | | <ClCompile Include="CCLinkPerformance\CCLinkIEControl.cpp" /> |
| | | <ClCompile Include="CCLinkPerformance\PerformanceMelsec.cpp" /> |
| | | <ClCompile Include="CStep.cpp" /> |
| | | <ClCompile Include="DevicePropertyDlg.cpp" /> |
| | | <ClCompile Include="CEFEM.cpp" /> |
| | | <ClCompile Include="CEquipment.cpp" /> |
| | |
| | | <ClCompile Include="CEFEM.cpp" /> |
| | | <ClCompile Include="ToolUnits.cpp" /> |
| | | <ClCompile Include="DevicePropertyDlg.cpp" /> |
| | | <ClCompile Include="CStep.cpp" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="AlarmManager.h" /> |
| | |
| | | <ClInclude Include="CEFEM.h" /> |
| | | <ClInclude Include="ToolUnits.h" /> |
| | | <ClInclude Include="DevicePropertyDlg.h" /> |
| | | <ClInclude Include="CStep.h" /> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ResourceCompile Include="Servo.rc" /> |