From 2a803976ed12e59f3e082e7c08941ef5004e6ea1 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期二, 20 五月 2025 11:40:10 +0800
Subject: [PATCH] 1. 添加机器臂命令配置界面

---
 SourceCode/Bond/Servo/CPageGraph2.cpp           |   45 ++--
 SourceCode/Bond/Servo/Servo.vcxproj             |    4 
 SourceCode/Bond/Servo/Servo.vcxproj.filters     |    4 
 SourceCode/Bond/Servo/resource.h                |    0 
 SourceCode/Bond/Servo/CRobotCmdContainerDlg.cpp |  149 ++++++++++++++++
 SourceCode/Bond/Servo/PageRobotCmd.h            |   42 ++++
 SourceCode/Bond/Servo/Servo.rc                  |    0 
 SourceCode/Bond/Servo/CRobotCmdContainerDlg.h   |   40 ++++
 SourceCode/Bond/Servo/PageRobotCmd.cpp          |  208 +++++++++++++++++++++++
 9 files changed, 473 insertions(+), 19 deletions(-)

diff --git a/SourceCode/Bond/Servo/CPageGraph2.cpp b/SourceCode/Bond/Servo/CPageGraph2.cpp
index 83e917f..cbce17f 100644
--- a/SourceCode/Bond/Servo/CPageGraph2.cpp
+++ b/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());
+					}
+				}
 			}
 
 
diff --git a/SourceCode/Bond/Servo/CRobotCmdContainerDlg.cpp b/SourceCode/Bond/Servo/CRobotCmdContainerDlg.cpp
new file mode 100644
index 0000000..9a9601a
--- /dev/null
+++ b/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);
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/CRobotCmdContainerDlg.h b/SourceCode/Bond/Servo/CRobotCmdContainerDlg.h
new file mode 100644
index 0000000..383017e
--- /dev/null
+++ b/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;
+};
diff --git a/SourceCode/Bond/Servo/PageRobotCmd.cpp b/SourceCode/Bond/Servo/PageRobotCmd.cpp
new file mode 100644
index 0000000..bd89ce1
--- /dev/null
+++ b/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);
+
+	// 鍒濆鍖栬澶囧悕绉颁笅鎷夋锛圙et/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);
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/PageRobotCmd.h b/SourceCode/Bond/Servo/PageRobotCmd.h
new file mode 100644
index 0000000..9534384
--- /dev/null
+++ b/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;
+};
diff --git a/SourceCode/Bond/Servo/Servo.rc b/SourceCode/Bond/Servo/Servo.rc
index d8792b7..f255c93 100644
--- a/SourceCode/Bond/Servo/Servo.rc
+++ b/SourceCode/Bond/Servo/Servo.rc
Binary files differ
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj b/SourceCode/Bond/Servo/Servo.vcxproj
index 5db43c3..18abe4c 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj
+++ b/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" />
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj.filters b/SourceCode/Bond/Servo/Servo.vcxproj.filters
index d3871d4..f79e425 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj.filters
+++ b/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" />
diff --git a/SourceCode/Bond/Servo/resource.h b/SourceCode/Bond/Servo/resource.h
index 6f0240f..9b64524 100644
--- a/SourceCode/Bond/Servo/resource.h
+++ b/SourceCode/Bond/Servo/resource.h
Binary files differ

--
Gitblit v1.9.3