LAPTOP-SNT8I5JK\Boounion
2025-02-19 ab612c6fa43c9ae172572d187bf40da0386434d2
1.增加CStep类,用于处理相似的CC-Link读取数据,回复等逻辑;
已添加4个文件
已修改5个文件
374 ■■■■■ 文件已修改
SourceCode/Bond/Servo/CEquipment.cpp 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CMaster.cpp 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CStep.cpp 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CStep.h 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/DevicePropertyDlg.cpp 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/DevicePropertyDlg.h 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CEquipment.cpp
@@ -20,6 +20,11 @@
    CEquipment::~CEquipment()
    {
        for (auto item : m_mapStep) {
            delete item.second;
        }
        m_mapStep.clear();
        DeleteCriticalSection(&m_criticalSection);
    }
@@ -29,14 +34,37 @@
        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)
@@ -196,6 +224,27 @@
        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)
SourceCode/Bond/Servo/CEquipment.h
@@ -1,6 +1,9 @@
#pragma once
#include "Log.h"
#include "CCLinkIEControl.h"
#include "CStep.h"
#include <map>
namespace SERVO {
#define BLOCK_BUFFER_MAX            1024
@@ -52,6 +55,8 @@
        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);
@@ -97,6 +102,9 @@
        BOOL m_bLocalAlarm;
        BOOL m_bAutoRecipeChange;
        BOOL m_bVCREnable[VCR_MAX];
    private:
        std::map<unsigned int, CStep*> m_mapStep;
    };
}
SourceCode/Bond/Servo/CMaster.cpp
@@ -38,7 +38,6 @@
        //     cclink
        if (m_cclink.Connect(CC_LINK_IE_CONTROL_CHANNEL(1)) != 0) {
            LOGE("连接CC-Link失败.");
            return -1;
        }
        else {
            LOGI("连接CC-Link成功.");
@@ -71,6 +70,8 @@
            pEquipment->setReadBitBlock(0x4000, 0x45ff);
            pEquipment->setStation(1, 2);
            addEquipment(pEquipment);
            pEquipment->init();
            LOGE("已添加“EFEM(ROBOT)”.");
        }
        /*
@@ -96,6 +97,11 @@
    int CMaster::term()
    {
        LOGI("<Master>正在结束程序.");
        for (auto item : m_listEquipment) {
            item->term();
        }
        return 0;
    }
SourceCode/Bond/Servo/CStep.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,159 @@
#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);
    }
}
SourceCode/Bond/Servo/CStep.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
#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;
    };
}
SourceCode/Bond/Servo/DevicePropertyDlg.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,79 @@
// 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
}
SourceCode/Bond/Servo/DevicePropertyDlg.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
#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;
};
SourceCode/Bond/Servo/Servo.vcxproj
@@ -200,6 +200,7 @@
    <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" />
@@ -230,6 +231,7 @@
    <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" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -36,6 +36,7 @@
    <ClCompile Include="CEFEM.cpp" />
    <ClCompile Include="ToolUnits.cpp" />
    <ClCompile Include="DevicePropertyDlg.cpp" />
    <ClCompile Include="CStep.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -70,6 +71,7 @@
    <ClInclude Include="CEFEM.h" />
    <ClInclude Include="ToolUnits.h" />
    <ClInclude Include="DevicePropertyDlg.h" />
    <ClInclude Include="CStep.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />