mrDarker
2025-05-20 2a803976ed12e59f3e082e7c08941ef5004e6ea1
1. 添加机器臂命令配置界面
已添加4个文件
已修改5个文件
492 ■■■■■ 文件已修改
SourceCode/Bond/Servo/CPageGraph2.cpp 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotCmdContainerDlg.cpp 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CRobotCmdContainerDlg.h 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageRobotCmd.cpp 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/PageRobotCmd.h 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -12,6 +12,7 @@
#include "CPagePortProperty.h"
#include "CPageCassetteCtrlCmd.h"
#include "CJobDataB.h"
#include "CRobotCmdContainerDlg.h"
// CPageGraph2 å¯¹è¯æ¡†
@@ -251,26 +252,32 @@
            if (pEquipment->getID() == EQ_ID_EFEM) {
                SERVO::CEFEM* pEFEM = (SERVO::CEFEM*)pEquipment;
                //SERVO::ROBOT_CMD_PARAM cmds[4];
                //cmds[0].sequenceNo = 1;
                //cmds[0].rcmd = (short)SERVO::RCMD::Move;
                //cmds[0].armNo = 1;
                //cmds[0].getPosition = 1;
                //cmds[0].putPosition = 2;
                //cmds[0].getSlotNo = 3;
                //cmds[0].putSlotNo = 4;
                //cmds[0].subCmd = 5;
                //cmds[1].sequenceNo = 2;
                //cmds[1].rcmd = (short)SERVO::RCMD::Transfer;
                //cmds[1].armNo = 2;
                //cmds[1].getPosition = 6;
                //cmds[1].putPosition = 7;
                //cmds[1].getSlotNo = 8;
                //cmds[1].putSlotNo = 9;
                //cmds[1].subCmd = 10;
                //pEFEM->robotCmds(cmds, 2);
                SERVO::ROBOT_CMD_PARAM cmds[4];
                cmds[0].sequenceNo = 1;
                cmds[0].rcmd = (short)SERVO::RCMD::Move;
                cmds[0].armNo = 1;
                cmds[0].getPosition = 1;
                cmds[0].putPosition = 2;
                cmds[0].getSlotNo = 3;
                cmds[0].putSlotNo = 4;
                cmds[0].subCmd = 5;
                cmds[1].sequenceNo = 2;
                cmds[1].rcmd = (short)SERVO::RCMD::Transfer;
                cmds[1].armNo = 2;
                cmds[1].getPosition = 6;
                cmds[1].putPosition = 7;
                cmds[1].getSlotNo = 8;
                cmds[1].putSlotNo = 9;
                cmds[1].subCmd = 10;
                pEFEM->robotCmds(cmds, 2);
                CRobotCmdContainerDlg dlg;
                if (dlg.DoModal() == IDOK) {
                    std::vector<SERVO::ROBOT_CMD_PARAM>& cmds = dlg.GetResultCmds();
                    if (!cmds.empty()) {
                        pEFEM->robotCmds(cmds.data(), (int)cmds.size());
                    }
                }
            }
SourceCode/Bond/Servo/CRobotCmdContainerDlg.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,149 @@
// CRobotCmdContainerDlg.cpp: å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
#include "Servo.h"
#include "afxdialogex.h"
#include "CRobotCmdContainerDlg.h"
// CRobotCmdContainerDlg å¯¹è¯æ¡†
IMPLEMENT_DYNAMIC(CRobotCmdContainerDlg, CDialogEx)
CRobotCmdContainerDlg::CRobotCmdContainerDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_DIALOG_ROBOT_CMD_CONTAINER, pParent)
{
}
CRobotCmdContainerDlg::~CRobotCmdContainerDlg()
{
}
std::vector<SERVO::ROBOT_CMD_PARAM>& CRobotCmdContainerDlg::GetResultCmds()
{
    return m_cmdResult;
}
void CRobotCmdContainerDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_CHECK_ENABLE1, m_chkEnable[0]);
    DDX_Control(pDX, IDC_CHECK_ENABLE2, m_chkEnable[1]);
    DDX_Control(pDX, IDC_CHECK_ENABLE3, m_chkEnable[2]);
    DDX_Control(pDX, IDC_CHECK_ENABLE4, m_chkEnable[3]);
    DDX_Control(pDX, IDC_STATIC_PLACE1, m_placeHolder[0]);
    DDX_Control(pDX, IDC_STATIC_PLACE2, m_placeHolder[1]);
    DDX_Control(pDX, IDC_STATIC_PLACE3, m_placeHolder[2]);
    DDX_Control(pDX, IDC_STATIC_PLACE4, m_placeHolder[3]);
}
BEGIN_MESSAGE_MAP(CRobotCmdContainerDlg, CDialogEx)
    ON_BN_CLICKED(IDC_CHECK_ENABLE1, &CRobotCmdContainerDlg::OnCheckEnable1)
    ON_BN_CLICKED(IDC_CHECK_ENABLE2, &CRobotCmdContainerDlg::OnCheckEnable2)
    ON_BN_CLICKED(IDC_CHECK_ENABLE3, &CRobotCmdContainerDlg::OnCheckEnable3)
    ON_BN_CLICKED(IDC_CHECK_ENABLE4, &CRobotCmdContainerDlg::OnCheckEnable4)
END_MESSAGE_MAP()
// CRobotCmdContainerDlg æ¶ˆæ¯å¤„理程序
BOOL CRobotCmdContainerDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    // TODO:  åœ¨æ­¤æ·»åŠ é¢å¤–çš„åˆå§‹åŒ–
    constexpr int kPageCount = 4;
    constexpr int kColumns = 2;
    constexpr int kRows = 2;
    constexpr int kMargin = 10;
    constexpr int kCheckboxHeight = 20;
    constexpr int kBorderPadding = 2;
    constexpr int kButtonHeight = 40;
    // å­é¡µé¢å°ºå¯¸ï¼ˆä»Žå ä½é™æ€æ¡†å–)
    CSize pageSize;
    CRect rcFrame[kPageCount];
    for (int i = 0; i < kPageCount; ++i)
    {
        m_placeHolder[i].GetWindowRect(&rcFrame[i]);
        ScreenToClient(&rcFrame[i]);
        // è®°å½•页面尺寸(假设全部一样)
        if (i == 0) {
            pageSize = rcFrame[i].Size();
        }
        // æ”¾ç½®å‹¾é€‰æ¡†åœ¨é™æ€æ¡†ä¸Šæ–¹
        CRect rcCheck = rcFrame[i];
        rcCheck.bottom = rcCheck.top;
        rcCheck.top -= kCheckboxHeight;
        rcCheck.bottom += 2;
        rcCheck.left += 2;
        rcCheck.right = rcCheck.left + 60;
        m_chkEnable[i].MoveWindow(rcCheck);
        m_chkEnable[i].ShowWindow(SW_SHOW);
        // åˆ›å»ºå­é¡µé¢ï¼Œç¼©è¿›åŽ»ä¸€ç‚¹é¿å…é®è¾¹æ¡†
        CRect rcShrinked = rcFrame[i];
        rcShrinked.DeflateRect(kBorderPadding, kBorderPadding);
        m_pageRobotCmd[i].Create(IDD_PAGE_ROBOT_CMD, this);
        m_pageRobotCmd[i].MoveWindow(rcShrinked);
        m_pageRobotCmd[i].ShowWindow(SW_SHOW);
        m_pageRobotCmd[i].EnableWindow(FALSE);
        m_pageRobotCmd[i].SetSequenceNo(i + 1);
    }
    // è®¡ç®—整体宽高
    int totalWidth = kMargin + kColumns * (pageSize.cx + kMargin);
    int totalHeight = kMargin + kRows * (pageSize.cy + kCheckboxHeight + kMargin) + kButtonHeight;
    // æ”¾ç½®æŒ‰é’®
    CSize btnSize(80, 28);
    int btnSpacing = 10;
    int groupWidth = btnSize.cx * 2 + btnSpacing;
    int btnStartX = (totalWidth - groupWidth) / 2;
    int btnY = totalHeight - kButtonHeight + (kButtonHeight - btnSize.cy) / 2;
    if (CWnd* pOK = GetDlgItem(IDOK))
        pOK->MoveWindow(btnStartX - btnSpacing, btnY + btnSpacing, btnSize.cx, btnSize.cy);
    if (CWnd* pCancel = GetDlgItem(IDCANCEL))
        pCancel->MoveWindow(btnStartX + btnSize.cx + btnSpacing, btnY + btnSpacing, btnSize.cx, btnSize.cy);
    // é‡æ–°è®¾ç½®çª—口尺寸(客户区 -> å«è¾¹æ¡†ï¼‰
    CRect rcClient(0, 0, totalWidth, totalHeight);
    DWORD dwStyle = GetStyle();
    DWORD dwExStyle = GetExStyle();
    ::AdjustWindowRectEx(&rcClient, dwStyle, TRUE, dwExStyle);
    SetWindowPos(nullptr, 0, 0, rcClient.Width(), rcClient.Height(), SWP_NOMOVE | SWP_NOZORDER);
    return TRUE;  // return TRUE unless you set the focus to a control
    // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
void CRobotCmdContainerDlg::OnOK()
{
    m_cmdResult.clear();
    for (int i = 0; i < 4; ++i) {
        if (m_chkEnable[i].GetCheck()) {
            m_cmdResult.push_back(m_pageRobotCmd[i].GetRobotCmdParam());
        }
    }
    CDialogEx::OnOK();
}
void CRobotCmdContainerDlg::OnCheckEnable1() { ToggleEnable(0); }
void CRobotCmdContainerDlg::OnCheckEnable2() { ToggleEnable(1); }
void CRobotCmdContainerDlg::OnCheckEnable3() { ToggleEnable(2); }
void CRobotCmdContainerDlg::OnCheckEnable4() { ToggleEnable(3); }
void CRobotCmdContainerDlg::ToggleEnable(int index)
{
    BOOL bChecked = m_chkEnable[index].GetCheck();
    m_pageRobotCmd[index].EnableWindow(bChecked);
}
SourceCode/Bond/Servo/CRobotCmdContainerDlg.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
#pragma once
#include "afxdialogex.h"
#include "PageRobotCmd.h"
// CRobotCmdContainerDlg å¯¹è¯æ¡†
class CRobotCmdContainerDlg : public CDialogEx
{
    DECLARE_DYNAMIC(CRobotCmdContainerDlg)
public:
    CRobotCmdContainerDlg(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CRobotCmdContainerDlg();
    std::vector<SERVO::ROBOT_CMD_PARAM>& GetResultCmds();
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_DIALOG_ROBOT_CMD_CONTAINER };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    virtual BOOL OnInitDialog();
    virtual void OnOK() override;
    afx_msg void OnCheckEnable1();
    afx_msg void OnCheckEnable2();
    afx_msg void OnCheckEnable3();
    afx_msg void OnCheckEnable4();
    DECLARE_MESSAGE_MAP()
private:
    void ToggleEnable(int index);
    CButton m_chkEnable[4];
    CStatic m_placeHolder[4];
    CPageRobotCmd m_pageRobotCmd[4];
    std::vector<SERVO::ROBOT_CMD_PARAM> m_cmdResult;
};
SourceCode/Bond/Servo/PageRobotCmd.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,208 @@
// PageRobotCmd.cpp: å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
#include "Servo.h"
#include "afxdialogex.h"
#include "PageRobotCmd.h"
// CPageRobotCmd å¯¹è¯æ¡†
std::map<CString, int> g_deviceSlotCount = {
    {_T("PORT 1"), 1},
    {_T("PORT 2"), 1},
    {_T("PORT 3"), 1},
    {_T("PORT 4"), 1},
    {_T("RB1"), 1},
    {_T("RB2"), 1},
    {_T("ALIGN"), 1},
    {_T("FLIP"), 1},
    {_T("VAC BAKE"), 2},
    {_T("BONDER1"), 2},
    {_T("BONDER2"), 2},
    {_T("POST BAKE(COOLING)"), 4},
    {_T("MEASUREMENT"), 1}
};
IMPLEMENT_DYNAMIC(CPageRobotCmd, CDialogEx)
CPageRobotCmd::CPageRobotCmd(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_PAGE_ROBOT_CMD, pParent)
{
    m_nSequenceNo = -1;
    m_nRcmd = -1;
    m_nArmNo = -1;
    m_nGetPosition = -1;
    m_nPutPosition = -1;
    m_nGetSlotNo = -1;
    m_nPutSlotNo = -1;
    m_nSubCmd = -1;
}
CPageRobotCmd::~CPageRobotCmd()
{
}
void CPageRobotCmd::SetSequenceNo(int nSeq)
{
    m_nSequenceNo = nSeq;
    if (CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_SEQ_NO)) {
        CString str;
        str.Format(_T("%d"), m_nSequenceNo);
        pEdit->SetWindowText(str);
    }
}
SERVO::ROBOT_CMD_PARAM CPageRobotCmd::GetRobotCmdParam()
{
    // çª—口销毁时不可用
    if (IsWindow(m_hWnd)) {
        UpdateData(TRUE); // åŒæ­¥æˆå‘˜å˜é‡åˆ°ç•Œé¢
    }
    SERVO::ROBOT_CMD_PARAM param;
    param.sequenceNo = static_cast<short>(m_nSequenceNo);
    param.rcmd = static_cast<short>(m_nRcmd + 1);
    param.armNo = static_cast<short>(m_nArmNo);
    param.getPosition = static_cast<short>(m_nGetPosition + 1);
    param.putPosition = static_cast<short>(m_nPutPosition + 1);
    param.getSlotNo = static_cast<short>(m_nGetSlotNo + 1);
    param.putSlotNo = static_cast<short>(m_nPutSlotNo + 1);
    param.subCmd = static_cast<short>(m_nSubCmd + 1);
    return param;
}
void CPageRobotCmd::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT_SEQ_NO, m_nSequenceNo);
    DDX_CBIndex(pDX, IDC_COMBO_RCMD, m_nRcmd);
    DDX_Radio(pDX, IDC_RADIO_ARM_A, m_nArmNo);
    DDX_CBIndex(pDX, IDC_COMBO_GET_POS, m_nGetPosition);
    DDX_CBIndex(pDX, IDC_COMBO_PUT_POS, m_nPutPosition);
    DDX_CBIndex(pDX, IDC_COMBO_GET_SLOT, m_nGetSlotNo);
    DDX_CBIndex(pDX, IDC_COMBO_PUT_SLOT, m_nPutSlotNo);
    DDX_CBIndex(pDX, IDC_COMBO_SUB_CMD, m_nSubCmd);
}
BEGIN_MESSAGE_MAP(CPageRobotCmd, CDialogEx)
    ON_CBN_SELCHANGE(IDC_COMBO_GET_POS, &CPageRobotCmd::OnCbnSelchangeComboGetPos)
    ON_CBN_SELCHANGE(IDC_COMBO_PUT_POS, &CPageRobotCmd::OnCbnSelchangeComboPutPos)
END_MESSAGE_MAP()
// CPageRobotCmd æ¶ˆæ¯å¤„理程序
BOOL CPageRobotCmd::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    // TODO:  åœ¨æ­¤æ·»åŠ é¢å¤–çš„åˆå§‹åŒ–
    // åˆå§‹åŒ– RCMD ä¸‹æ‹‰æ¡†
    CComboBox* pComboRcmd = (CComboBox*)GetDlgItem(IDC_COMBO_RCMD);
    pComboRcmd->AddString(_T("Robot_home"));           // 1
    pComboRcmd->AddString(_T("Transfer"));             // 2
    pComboRcmd->AddString(_T("Move"));                 // 3
    pComboRcmd->AddString(_T("Get"));                  // 4
    pComboRcmd->AddString(_T("Put"));                  // 5
    pComboRcmd->AddString(_T("One_Action_Exchange"));  // 6
    pComboRcmd->AddString(_T("Two_Action_Exchange"));  // 7
    pComboRcmd->AddString(_T("Command_Clear"));        // 8
    pComboRcmd->AddString(_T("Batch_get"));            // 9
    pComboRcmd->AddString(_T("Batch_put"));            // 10
    pComboRcmd->SetCurSel(0);
    // åˆå§‹åŒ–设备名称下拉框(Get/Put Position)
    CStringList eqNameList;
    eqNameList.AddTail(_T("PORT 1"));                // 1 1 UNIT
    eqNameList.AddTail(_T("PORT 2"));                // 2 1 UNIT
    eqNameList.AddTail(_T("PORT 3"));                // 3 1 UNIT
    eqNameList.AddTail(_T("PORT 4"));                // 4 1 UNIT
    eqNameList.AddTail(_T("RB1"));                    // 5 1 UNIT
    eqNameList.AddTail(_T("RB2"));                    // 6 1 UNIT
    eqNameList.AddTail(_T("ALIGN"));                // 7 1 UNIT
    eqNameList.AddTail(_T("FLIP"));                    // 8 1 UNIT
    eqNameList.AddTail(_T("VAC BAKE"));                // 9 2 UNIT
    eqNameList.AddTail(_T("BONDER1"));                // 10 2 UNIT
    eqNameList.AddTail(_T("BONDER2"));                // 11 2 UNIT
    eqNameList.AddTail(_T("POST BAKE(COOLING)"));    // 12 4 UNIT
    eqNameList.AddTail(_T("MEASUREMENT"));            // 13 1 UNIT
    CComboBox* pComboGetPos = (CComboBox*)GetDlgItem(IDC_COMBO_GET_POS);
    CComboBox* pComboPutPos = (CComboBox*)GetDlgItem(IDC_COMBO_PUT_POS);
    CComboBox* pComboGetSlot = (CComboBox*)GetDlgItem(IDC_COMBO_GET_SLOT);
    CComboBox* pComboPutSlot = (CComboBox*)GetDlgItem(IDC_COMBO_PUT_SLOT);
    for (POSITION pos = eqNameList.GetHeadPosition(); pos != NULL;) {
        CString item = eqNameList.GetNext(pos);
        pComboGetPos->AddString(item);
        pComboPutPos->AddString(item);
    }
    pComboGetPos->SetCurSel(0);
    pComboPutPos->SetCurSel(0);
    UpdateSlotList(pComboGetPos, pComboGetSlot);
    UpdateSlotList(pComboPutPos, pComboPutSlot);
    // åˆå§‹åŒ– Sub CMD ä¸‹æ‹‰æ¡†
    CComboBox* pComboSubCmd = (CComboBox*)GetDlgItem(IDC_COMBO_SUB_CMD);
    pComboSubCmd->AddString(_T("1: Get Ready"));
    pComboSubCmd->AddString(_T("2: Put Ready"));
    pComboSubCmd->SetCurSel(0);
    // åˆå§‹åŒ–单选框
    CButton* pRadioArmA = (CButton*)GetDlgItem(IDC_RADIO_ARM_A);
    CButton* pRadioArmB = (CButton*)GetDlgItem(IDC_RADIO_ARM_B);
    pRadioArmA->SetCheck(BST_CHECKED);
    pRadioArmB->SetCheck(BST_UNCHECKED);
    return TRUE;  // return TRUE unless you set the focus to a control
    // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
void CPageRobotCmd::UpdateSlotList(CComboBox* pComboDevice, CComboBox* pComboSlot)
{
    if (pComboDevice == nullptr || pComboSlot == nullptr) return;
    int nSelIndex = pComboDevice->GetCurSel();
    if (nSelIndex < 0) return;
    CString strDeviceName;
    pComboDevice->GetLBText(nSelIndex, strDeviceName);
    int nMaxSlot = 1; // é»˜è®¤æ§½ä½æ•°
    auto it = g_deviceSlotCount.find(strDeviceName);
    if (it != g_deviceSlotCount.end()) {
        nMaxSlot = it->second;
    }
    // æ¸…空并添加槽号
    pComboSlot->ResetContent();
    for (int i = 1; i <= nMaxSlot; ++i) {
        CString str;
        str.Format(_T("%d"), i);
        pComboSlot->AddString(str);
    }
    pComboSlot->SetCurSel(0);
}
void CPageRobotCmd::OnCbnSelchangeComboGetPos()
{
    CComboBox* pDevice = (CComboBox*)GetDlgItem(IDC_COMBO_GET_POS);
    CComboBox* pSlot = (CComboBox*)GetDlgItem(IDC_COMBO_GET_SLOT);
    UpdateSlotList(pDevice, pSlot);
    GetRobotCmdParam();
}
void CPageRobotCmd::OnCbnSelchangeComboPutPos()
{
    CComboBox* pDevice = (CComboBox*)GetDlgItem(IDC_COMBO_PUT_POS);
    CComboBox* pSlot = (CComboBox*)GetDlgItem(IDC_COMBO_PUT_SLOT);
    UpdateSlotList(pDevice, pSlot);
}
SourceCode/Bond/Servo/PageRobotCmd.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
#pragma once
#include "afxdialogex.h"
#include "CEquipment.h"
// CPageRobotCmd å¯¹è¯æ¡†
class CPageRobotCmd : public CDialogEx
{
    DECLARE_DYNAMIC(CPageRobotCmd)
public:
    CPageRobotCmd(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CPageRobotCmd();
    void SetSequenceNo(int nSeq);
    SERVO::ROBOT_CMD_PARAM CPageRobotCmd::GetRobotCmdParam();
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_PAGE_ROBOT_CMD };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    virtual BOOL OnInitDialog();
    afx_msg void OnCbnSelchangeComboGetPos();
    afx_msg void OnCbnSelchangeComboPutPos();
    DECLARE_MESSAGE_MAP()
private:
    void UpdateSlotList(CComboBox* pComboDevice, CComboBox* pComboSlot);
    int m_nSequenceNo;
    int m_nRcmd;
    int m_nArmNo;
    int m_nGetPosition;
    int m_nPutPosition;
    int m_nGetSlotNo;
    int m_nPutSlotNo;
    int m_nSubCmd;
};
SourceCode/Bond/Servo/Servo.rc
Binary files differ
SourceCode/Bond/Servo/Servo.vcxproj
@@ -200,6 +200,7 @@
  <ItemGroup>
    <ClInclude Include="CEquipmentPage3.h" />
    <ClInclude Include="CGlassPool.h" />
    <ClInclude Include="CRobotCmdContainerDlg.h" />
    <ClInclude Include="PageRecipe.h" />
    <ClInclude Include="CDoubleGlass.h" />
    <ClInclude Include="CProcessData.h" />
@@ -283,6 +284,7 @@
    <ClInclude Include="LogEdit.h" />
    <ClInclude Include="MapPosWnd.h" />
    <ClInclude Include="Model.h" />
    <ClInclude Include="PageRobotCmd.h" />
    <ClInclude Include="ProductionLogManager.h" />
    <ClInclude Include="Resource.h" />
    <ClInclude Include="SECSRuntimeManager.h" />
@@ -299,6 +301,7 @@
  <ItemGroup>
    <ClCompile Include="CEquipmentPage3.cpp" />
    <ClCompile Include="CGlassPool.cpp" />
    <ClCompile Include="CRobotCmdContainerDlg.cpp" />
    <ClCompile Include="PageRecipe.cpp" />
    <ClCompile Include="CDoubleGlass.cpp" />
    <ClCompile Include="CProcessData.cpp" />
@@ -381,6 +384,7 @@
    <ClCompile Include="LogEdit.cpp" />
    <ClCompile Include="MapPosWnd.cpp" />
    <ClCompile Include="Model.cpp" />
    <ClCompile Include="PageRobotCmd.cpp" />
    <ClCompile Include="ProductionLogManager.cpp" />
    <ClCompile Include="SECSRuntimeManager.cpp" />
    <ClCompile Include="SecsTestDlg.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -105,6 +105,8 @@
    <ClCompile Include="CProcessData.cpp" />
    <ClCompile Include="CGlassPool.cpp" />
    <ClCompile Include="CEquipmentPage3.cpp" />
    <ClCompile Include="PageRobotCmd.cpp" />
    <ClCompile Include="CRobotCmdContainerDlg.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -208,6 +210,8 @@
    <ClInclude Include="CProcessData.h" />
    <ClInclude Include="CGlassPool.h" />
    <ClInclude Include="CEquipmentPage3.h" />
    <ClInclude Include="PageRobotCmd.h" />
    <ClInclude Include="CRobotCmdContainerDlg.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />
SourceCode/Bond/Servo/resource.h
Binary files differ