From d38d98d99e873d0a48e75aa9f8472cff4574c132 Mon Sep 17 00:00:00 2001
From: LAPTOP-SNT8I5JK\Boounion <Chenluhua@qq.com>
Date: 星期三, 30 四月 2025 17:46:50 +0800
Subject: [PATCH] 1.添加CEqReadStep, 以后大部分读数据可能要使用这个类,可以简单程序。 2.文档;

---
 Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5(5).xlsx |    0 
 SourceCode/Bond/Servo/Servo.vcxproj                             |    4 
 Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5(4).xlsx |    0 
 SourceCode/Bond/Servo/CLoadPort.h                               |    1 
 SourceCode/Bond/Servo/CEFEM.h                                   |    1 
 SourceCode/Bond/Servo/CLoadPort.cpp                             |  114 ++++
 SourceCode/Bond/Servo/CEqWriteStep.h                            |   32 +
 SourceCode/Bond/Servo/Servo.vcxproj.filters                     |    4 
 SourceCode/Bond/Servo/CEqWriteStep.cpp                          |   66 ++
 SourceCode/Bond/Servo/CEquipment.cpp                            |   30 +
 SourceCode/Bond/Servo/CEFEM.cpp                                 |  237 ++++++++++
 SourceCode/Bond/Servo/CMaster.cpp                               |  504 ---------------------
 SourceCode/Bond/Servo/CEqReadStep.cpp                           |   82 +++
 SourceCode/Bond/Servo/CEquipment.h                              |    8 
 SourceCode/Bond/Servo/CBonder.h                                 |    8 
 SourceCode/Bond/Servo/CBonder.cpp                               |  209 +++++++++
 SourceCode/Bond/Servo/CEqReadStep.h                             |   35 +
 SourceCode/Bond/Servo/Common.h                                  |    4 
 18 files changed, 828 insertions(+), 511 deletions(-)

diff --git "a/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0504\051.xlsx" "b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0504\051.xlsx"
new file mode 100644
index 0000000..0a62420
--- /dev/null
+++ "b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0504\051.xlsx"
Binary files differ
diff --git "a/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0505\051.xlsx" "b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0505\051.xlsx"
new file mode 100644
index 0000000..35d3f51
--- /dev/null
+++ "b/Document/ESWIN_EAS_Bonder_Inline_Mapping_Address_v1.1.5\0505\051.xlsx"
Binary files differ
diff --git a/SourceCode/Bond/Servo/CBonder.cpp b/SourceCode/Bond/Servo/CBonder.cpp
index 1bb185f..5276f30 100644
--- a/SourceCode/Bond/Servo/CBonder.cpp
+++ b/SourceCode/Bond/Servo/CBonder.cpp
@@ -5,7 +5,7 @@
 namespace SERVO {
 	CBonder::CBonder() : CEquipment()
 	{
-
+		m_nIndex = 0;
 	}
 
 	CBonder::~CBonder()
@@ -38,6 +38,203 @@
 		addPin(SERVO::PinType::OUTPUT, _T("Out"));
 	}
 
+	void CBonder::initSteps()
+	{
+		CEquipment::initSteps();
+
+
+		{
+			// eq mode
+			CEqModeStep* pStep = new CEqModeStep();
+			pStep->setName(STEP_MODE);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x350 : 0x650);
+			pStep->setModeDev(m_nIndex == 0 ? 0x9d7d : 0xdd7d);
+			if (addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq status
+			CEqStatusStep* pStep = new CEqStatusStep();
+			pStep->setName(STEP_STATUS);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x351 : 0x651);
+			pStep->setStatusDev(m_nIndex == 0 ? 0x9d59 : 0xdd59);
+			if (addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Eq Alarm
+			static char* pszName[] = { STEP_ALARM_BLOCK1, STEP_ALARM_BLOCK2, STEP_ALARM_BLOCK3, STEP_ALARM_BLOCK4, STEP_ALARM_BLOCK5 };
+			static int dev[2][5] = { { 0x9f0e , 0x9f3b, 0x9f68, 0x9f95, 0x9fc2 },
+				{ 0xdf0e , 0xdf3b, 0xdf68, 0xdf95, 0xdfc2 } };
+			static int writeSignalDev[2][5] = { { 0x352, 0x353, 0x354, 0x355, 0x356 },
+				{ 0x652, 0x653, 0x654, 0x655, 0x656 } };
+			static int addr[] = { STEP_ID_EQALARM1, STEP_ID_EQALARM2, STEP_ID_EQALARM3, STEP_ID_EQALARM4, STEP_ID_EQALARM5 };
+
+			for (int i = 0; i < 5; i++) {
+				CEqAlarmStep* pStep = new CEqAlarmStep();
+				pStep->setName(pszName[i]);
+				pStep->setWriteSignalDev(writeSignalDev[m_nIndex][i]);
+				pStep->setAlarmDev(dev[m_nIndex][i]);
+				if (addStep(addr[i], pStep) != 0) {
+					delete pStep;
+				}
+			}
+
+		}
+
+		{
+			// eq process
+			CEqProcessStep* pStep = new CEqProcessStep();
+			pStep->setName(STEP_PROCESS);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x357 : 0x657);
+			pStep->setProcessDev(m_nIndex == 0 ? 0xab55 : 0xeb55);
+			if (addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq cim mode change
+			CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
+			pStep->setName(STEP_CIM_MODE_CHANGE);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x370 : 0x670);
+			pStep->setCimModeDev(m_nIndex == 0 ? 0x965 : 0x12b5);
+			if (addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq cim message cmd
+			CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
+			pStep->setName(STEP_CIM_MESSAGE_CMD);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x371 : 0x671);
+			pStep->setCimMessageDev(m_nIndex == 0 ? 0x950 : 0x12a0);
+			if (addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq current recipe change
+			CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
+			pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x348 : 0x648);
+			pStep->setDataDev(m_nIndex == 0 ? 0xa850 : 0xe850);
+			if (addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// CIM Message Confirm
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, m_nIndex == 0 ? 0x9d80 : 0xdd80);
+			pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x359 : 0x659);
+			if (addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
+			pStep->setName(STEP_CIM_MESSAGE_CLEAR);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x372 : 0x672);
+			pStep->setClearCimMessageDev(m_nIndex == 0 ? 0x963 : 0x12b3);
+			if (addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+
+		{
+			CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
+			pStep->setName(STEP_DATETIME_SET_CMD);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x373 : 0x673);
+			pStep->setDateTimeDev(m_nIndex == 0 ? 0x966 : 0x12b6);
+			if (addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			CEqModeChangeStep* pStep = new CEqModeChangeStep();
+			pStep->setName(STEP_EQ_MODE_CHANGE);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x375 : 0x675);
+			pStep->setEqModeDev(m_nIndex == 0 ? 0x96E : 0x12be);
+			if (addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// 请求主配方列表的step
+			CEqWriteStep* pStep = new CEqWriteStep();
+			pStep->setName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x366 : 0x666);
+			pStep->setDataDev(m_nIndex == 0 ? 0x125a : 0x1baa);
+			if (addStep(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// master recipe list report
+			CEqReadStep* pStep = new CEqReadStep(m_nIndex == 0 ? 0xa955 : 0xe955, 255 * 2,
+				[&](int code, const char* pszData, size_t size) -> int {
+					if (code == ROK && pszData != nullptr && size > 0) {
+						// 此处解释配方数据
+					}
+				});
+			pStep->setName(STEP_EQ_MASTER_RECIPE_LIST);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x34b : 0x64b);
+			if (addStep(STEP_ID_MASTER_RECIPE_LIST_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			CEqJobEventStep* pStep = new CEqJobEventStep();
+			pStep->setName(STEP_EQ_RECEIVED_JOB_UPS1);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x300 : 0x600);
+			pStep->setJobDataDev(m_nIndex == 0 ? 0x8c90 : 0xcc90);
+			if (addStep(STEP_ID_RECIVE_JOB_UPS1, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqJobEventStep* pStep = new CEqJobEventStep();
+			pStep->setName(STEP_EQ_RECEIVED_JOB_UPS2);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x301 : 0x601);
+			pStep->setJobDataDev(m_nIndex == 0 ? 0x8dd0 : 0xcdd0);
+			if (addStep(STEP_ID_RECIVE_JOB_UPS2, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqJobEventStep* pStep = new CEqJobEventStep();
+			pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS1);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x310 : 0x610);
+			pStep->setJobDataDev(m_nIndex == 0 ? 0x8000 : 0xc000);
+			if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS1, pStep) != 0) {
+				delete pStep;
+			}
+		}
+		{
+			CEqJobEventStep* pStep = new CEqJobEventStep();
+			pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS2);
+			pStep->setWriteSignalDev(m_nIndex == 0 ? 0x311 : 0x611);
+			pStep->setJobDataDev(m_nIndex == 0 ? 0x8140 : 0xc140);
+			if (addStep(STEP_ID_SENT_OUT_JOB_DOWNS2, pStep) != 0) {
+				delete pStep;
+			}
+		}
+	}
+
 	void CBonder::onTimer(UINT nTimerid)
 	{
 		CEquipment::onTimer(nTimerid);
@@ -67,4 +264,14 @@
 
 		return m_glassList.empty();
 	}
+
+	void CBonder::setIndex(unsigned int index)
+	{
+		m_nIndex = index;
+	}
+
+	unsigned int CBonder::getIndex()
+	{
+		return m_nIndex;
+	}
 }
diff --git a/SourceCode/Bond/Servo/CBonder.h b/SourceCode/Bond/Servo/CBonder.h
index e6f9843..04785d3 100644
--- a/SourceCode/Bond/Servo/CBonder.h
+++ b/SourceCode/Bond/Servo/CBonder.h
@@ -15,11 +15,19 @@
         virtual void init();
         virtual void term();
         virtual void initPins();
+        virtual void initSteps();
         virtual void onTimer(UINT nTimerid);
         virtual void serialize(CArchive& ar);
         virtual void getAttributeVector(CAttributeVector& attrubutes);
         virtual int recvIntent(CPin* pPin, CIntent* pIntent);
         virtual BOOL glassWillArrive(CGlass* pGlass);
+
+    public:
+        void setIndex(unsigned int index);
+        unsigned int getIndex();
+
+    private:
+        unsigned int m_nIndex;
     };
 }
 
diff --git a/SourceCode/Bond/Servo/CEFEM.cpp b/SourceCode/Bond/Servo/CEFEM.cpp
index 635b445..4520495 100644
--- a/SourceCode/Bond/Servo/CEFEM.cpp
+++ b/SourceCode/Bond/Servo/CEFEM.cpp
@@ -2,6 +2,16 @@
 #include "CEFEM.h"
 
 
+#define ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(name,ws,index,psd) {				\
+	CEqCassetteTransferStateStep* pStep = new CEqCassetteTransferStateStep();	\
+	pStep->setName(name);														\
+	pStep->setWriteSignalDev(ws);												\
+	pStep->setPortStatusDev(psd);												\
+	if (addStep(index, pStep) != 0) {											\
+		delete pStep;															\
+	}																			\
+}
+
 namespace SERVO {
 	CEFEM::CEFEM() : CEquipment()
 	{
@@ -46,6 +56,226 @@
 		LOGI("<CEFEM>initPins");
 	}
 
+	void CEFEM::initSteps()
+	{
+		CEquipment::initSteps();
+
+
+		{
+			// Eq mode
+			CEqModeStep* pStep = new CEqModeStep();
+			pStep->setName(STEP_MODE);
+			pStep->setWriteSignalDev(0x50);
+			pStep->setModeDev(0x5d7d);
+			if (addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Eq Status
+			CEqStatusStep* pStep = new CEqStatusStep();
+			pStep->setName(STEP_STATUS);
+			pStep->setWriteSignalDev(0x51);
+			pStep->setStatusDev(0x5d59);
+			if (addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Eq Alarm
+			static char* pszName[] = { STEP_ALARM_BLOCK1, STEP_ALARM_BLOCK2, STEP_ALARM_BLOCK3, STEP_ALARM_BLOCK4, STEP_ALARM_BLOCK5 };
+			static int dev[] = { 0x5f0e , 0x5f3b, 0x5f68, 0x5f95, 0x5fc2 };
+			static int writeSignalDev[] = { 0x52, 0x53, 0x54, 0x55, 0x56 };
+			static int addr[] = { STEP_ID_EQALARM1, STEP_ID_EQALARM2, STEP_ID_EQALARM3, STEP_ID_EQALARM4, STEP_ID_EQALARM5 };
+
+			for (int i = 0; i < 5; i++) {
+				CEqAlarmStep* pStep = new CEqAlarmStep();
+				pStep->setName(pszName[i]);
+				pStep->setWriteSignalDev(writeSignalDev[i]);
+				pStep->setAlarmDev(dev[i]);
+				if (addStep(addr[i], pStep) != 0) {
+					delete pStep;
+				}
+			}
+
+		}
+
+		{
+			// eq process
+			CEqProcessStep* pStep = new CEqProcessStep();
+			pStep->setName(STEP_PROCESS);
+			pStep->setWriteSignalDev(0x57);
+			pStep->setProcessDev(0x6b55);
+			if (addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq cim mode change
+			CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
+			pStep->setName(STEP_CIM_MODE_CHANGE);
+			pStep->setWriteSignalDev(0x70);
+			pStep->setCimModeDev(0x15);
+			if (addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq cim message
+			CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
+			pStep->setName(STEP_CIM_MESSAGE_CMD);
+			pStep->setWriteSignalDev(0x71);
+			pStep->setCimMessageDev(0x0);
+			if (addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+
+		{
+			// CIM Message Confirm
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x5f80);
+			pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
+			pStep->setWriteSignalDev(0x59);
+			if (addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// VCR1 Event Report
+			CEqVcrEventStep* pStep = new CEqVcrEventStep();
+			pStep->setName(STEP_EQ_VCR1_EVENT_REPORT);
+			pStep->setWriteSignalDev(0x4a);
+			pStep->setReturnDev(0x91e);
+			pStep->setVcrEventReportDev(0x5fef);
+			if (addStep(STEP_ID_VCR1_EVENT_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq cim message clear
+			CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
+			pStep->setName(STEP_CIM_MESSAGE_CLEAR);
+			pStep->setWriteSignalDev(0x72);
+			pStep->setClearCimMessageDev(0x13);
+			if (addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// datetime set cmd
+			CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
+			pStep->setName(STEP_DATETIME_SET_CMD);
+			pStep->setWriteSignalDev(0x73);
+			pStep->setDateTimeDev(0x16);
+			if (addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// vcr enable
+			CEqVCREnableStep* pStep = new CEqVCREnableStep();
+			pStep->setName(STEP_EQ_VCR_ENABLE);
+			pStep->setWriteSignalDev(0x74);
+			pStep->setEqVCRModeDev(0x1F);
+			if (addStep(STEP_ID_VCR_ENABLE_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// eq mode change
+			CEqModeChangeStep* pStep = new CEqModeChangeStep();
+			pStep->setName(STEP_EQ_MODE_CHANGE);
+			pStep->setWriteSignalDev(0x75);
+			pStep->setEqModeDev(0x1E);
+			if (addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// current recipe change
+			CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
+			pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
+			pStep->setWriteSignalDev(0x48);
+			pStep->setDataDev(0x6850);
+			if (addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+
+		{
+			// 请求主配方列表的step
+			CEqWriteStep* pStep = new CEqWriteStep();
+			pStep->setName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
+			pStep->setWriteSignalDev(0x66);
+			pStep->setDataDev(0x90a);
+			if (addStep(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		// CEqCassetteTranserStateStep
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_EMPTY, 0xd8,
+			STEP_ID_PORT1_CASSETTIE_EMPTY, 0x6050);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOAD_EADY, 0xe0,
+			STEP_ID_PORT1_CASSETTIE_LOAD_READY, 0x6050);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOADED, 0xe8,
+			STEP_ID_PORT1_CASSETTIE_LOADED, 0x6050);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_INUSE, 0xf0,
+			STEP_ID_PORT1_CASSETTIE_INUSE, 0x6050);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_UNLOAD_EADY, 0xf8,
+			STEP_ID_PORT1_CASSETTIE_UNLOAD_READY, 0x60f50);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_BLOCKED, 0x100,
+			STEP_ID_PORT1_CASSETTIE_BLOCKED, 0x6050);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_EMPTY, 0xd9,
+			STEP_ID_PORT2_CASSETTIE_EMPTY, 0x6070);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOAD_EADY, 0xe1,
+			STEP_ID_PORT2_CASSETTIE_LOAD_READY, 0x6070);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOADED, 0xe9,
+			STEP_ID_PORT2_CASSETTIE_LOADED, 0x6070);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_INUSE, 0xf1,
+			STEP_ID_PORT2_CASSETTIE_INUSE, 0x6070);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_UNLOAD_EADY, 0xf9,
+			STEP_ID_PORT2_CASSETTIE_UNLOAD_READY, 0x6070);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_BLOCKED, 0x101,
+			STEP_ID_PORT2_CASSETTIE_BLOCKED, 0x6070);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_EMPTY, 0xda,
+			STEP_ID_PORT3_CASSETTIE_EMPTY, 0x6090);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOAD_EADY, 0xe2,
+			STEP_ID_PORT3_CASSETTIE_LOAD_READY, 0x6090);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOADED, 0xea,
+			STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_INUSE, 0xf2,
+			STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_UNLOAD_EADY, 0xfa,
+			STEP_ID_PORT3_CASSETTIE_UNLOAD_READY, 0x6090);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_BLOCKED, 0x102,
+			STEP_ID_PORT3_CASSETTIE_BLOCKED, 0x6090);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_EMPTY, 0xdb,
+			STEP_ID_PORT4_CASSETTIE_EMPTY, 0x60b0);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOAD_EADY, 0xe3,
+			STEP_ID_PORT4_CASSETTIE_LOAD_READY, 0x60b0);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOADED, 0xeb,
+			STEP_ID_PORT4_CASSETTIE_LOADED, 0x60b0);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_INUSE, 0xf3,
+			STEP_ID_PORT4_CASSETTIE_INUSE, 0x60b0);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_UNLOAD_EADY, 0xfb,
+			STEP_ID_PORT4_CASSETTIE_UNLOAD_READY, 0x60b0);
+		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_BLOCKED, 0x103,
+			STEP_ID_PORT4_CASSETTIE_BLOCKED, 0x60b0);
+	}
+
 	int CEFEM::onStepEvent(CStep* pStep, int code)
 	{
 		int nRet = CEquipment::onStepEvent(pStep, code);
@@ -58,13 +288,6 @@
 				if (id == STEP_ID_PORT1_CASSETTIE_EMPTY) {
 
 				}
-/*
-	#define STEP_ID_PORT1_CASSETTIE_LOAD_READY		0x420
-	#define STEP_ID_PORT1_CASSETTIE_LOADED			0x428
-	#define STEP_ID_PORT1_CASSETTIE_INUSE			0x430
-	#define STEP_ID_PORT1_CASSETTIE_UNLOAD_READY	0x438
-	#define STEP_ID_PORT1_CASSETTIE_BLOCKED			0x440
-*/
 			}
 		}
 
diff --git a/SourceCode/Bond/Servo/CEFEM.h b/SourceCode/Bond/Servo/CEFEM.h
index 034c571..2d7cc4b 100644
--- a/SourceCode/Bond/Servo/CEFEM.h
+++ b/SourceCode/Bond/Servo/CEFEM.h
@@ -16,6 +16,7 @@
         virtual void init();
         virtual void term();
         virtual void initPins();
+        virtual void initSteps();
         virtual int onStepEvent(CStep* pStep, int code);
         virtual void onTimer(UINT nTimerid);
         virtual void serialize(CArchive& ar);
diff --git a/SourceCode/Bond/Servo/CEqReadStep.cpp b/SourceCode/Bond/Servo/CEqReadStep.cpp
new file mode 100644
index 0000000..854338e
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqReadStep.cpp
@@ -0,0 +1,82 @@
+#include "stdafx.h"
+#include "CEqReadStep.h"
+#include "Log.h"
+
+
+namespace SERVO {
+	CEqReadStep::CEqReadStep() : CReadStep()
+	{
+		m_nDataDev = 0;
+		m_nReadSize = 0;
+		m_onReadBlock = nullptr;
+	}
+
+	CEqReadStep::CEqReadStep(int dev, size_t readSize, ONREAD onReadBlock)
+	{
+		m_nDataDev = dev;
+		m_nReadSize = readSize;
+		m_onReadBlock = onReadBlock;
+	}
+
+	CEqReadStep::~CEqReadStep()
+	{
+
+	}
+
+	void CEqReadStep::getAttributeVector(CAttributeVector& attrubutes)
+	{
+		CReadStep::getAttributeVector(attrubutes);
+
+		std::string strTemp;
+		attrubutes.addAttribute(new CAttribute("Dev",
+			("W" + CToolUnits::toHexString(m_nDataDev, strTemp)).c_str(), ""));
+	}
+
+	int CEqReadStep::onReadData()
+	{
+		CReadStep::onReadData();
+
+
+		char szBuffer[READ_BUFFER_MAX];
+		int nRet = m_pCclink->ReadData2(m_station, DeviceType::W, m_nDataDev,
+			(long)min(READ_BUFFER_MAX, m_nReadSize), szBuffer);
+		if (0 != nRet) {
+			LOGI("<CEqReadStep>Read data error.");
+			if (m_onReadBlock != nullptr) {
+				m_onReadBlock(RERROR, nullptr, 0);
+			}
+			return -1;
+		}
+
+		LOGI("<CEqReadStep>read data succeed.");
+		if (m_onReadBlock != nullptr) {
+			m_onReadBlock(ROK, szBuffer, m_nReadSize);
+		}
+
+
+		return 0;
+	}
+
+	int CEqReadStep::onComplete()
+	{
+		CReadStep::onComplete();
+		LOGI("<CEqReadStep> onComplete.");
+		if (m_onReadBlock != nullptr) {
+			m_onReadBlock(RCOMPLETE, nullptr, 0);
+		}
+
+		return 0;
+	}
+
+	int CEqReadStep::onTimeout()
+	{
+		CReadStep::onTimeout();
+		LOGI("<CEqReadStep> onTimeout.");
+		if (m_onReadBlock != nullptr) {
+			m_onReadBlock(RTIMEOUT, nullptr, 0);
+		}
+
+		return 0;
+	}
+}
+
diff --git a/SourceCode/Bond/Servo/CEqReadStep.h b/SourceCode/Bond/Servo/CEqReadStep.h
new file mode 100644
index 0000000..fa9a2b3
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqReadStep.h
@@ -0,0 +1,35 @@
+#pragma once
+#include "CReadStep.h"
+#include <functional>
+
+
+#define READ_BUFFER_MAX		1024
+
+#define ROK				0					/* 读数据OK */
+#define RTIMEOUT		-1					/* 读数据超时 */
+#define RERROR			-2					/* 读数据出错 */
+#define RCOMPLETE		1					/* 读数据流程完成 */
+
+namespace SERVO {
+	typedef std::function<int(int code, const char* pszData, size_t size)> ONREAD;
+
+	class CEqReadStep : public CReadStep
+	{
+	public:
+		CEqReadStep();
+		CEqReadStep(int dev, size_t readSize, ONREAD onReadBlock);
+		~CEqReadStep();
+
+	public:
+		virtual void getAttributeVector(CAttributeVector& attrubutes);
+		virtual int onReadData();
+		virtual int onComplete();
+		virtual int onTimeout();
+
+	private:
+		ONREAD m_onReadBlock;
+		int m_nDataDev;
+		size_t m_nReadSize;
+	};
+}
+
diff --git a/SourceCode/Bond/Servo/CEqWriteStep.cpp b/SourceCode/Bond/Servo/CEqWriteStep.cpp
new file mode 100644
index 0000000..da4a0cc
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqWriteStep.cpp
@@ -0,0 +1,66 @@
+#include "stdafx.h"
+#include "CEqWriteStep.h"
+
+
+namespace SERVO {
+	CEqWriteStep::CEqWriteStep() : CWriteStep()
+	{
+		m_nDataDev = 0;
+		m_onWritedBlock = nullptr;
+	}
+
+	CEqWriteStep::~CEqWriteStep()
+	{
+
+	}
+
+	void CEqWriteStep::setDataDev(int nDev)
+	{
+		m_nDataDev = nDev;
+	}
+
+	int CEqWriteStep::writeShort(short value, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		m_onWritedBlock = onWritedBlock;
+		return writeData(m_nDataDev, (const char*)&value, sizeof(short));
+	}
+
+	int CEqWriteStep::writeInt(int value, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		m_onWritedBlock = onWritedBlock;
+		return writeData(m_nDataDev, (const char*)&value, sizeof(int));
+	}
+
+	int CEqWriteStep::writeDataEx(const char* pszData, int size, ONWRITED onWritedBlock/* = nullptr*/)
+	{
+		m_onWritedBlock = onWritedBlock;
+		return writeData(m_nDataDev, pszData, size);
+	}
+
+	void CEqWriteStep::getAttributeVector(CAttributeVector& attrubutes)
+	{
+		CWriteStep::getAttributeVector(attrubutes);
+
+		std::string strTemp;
+		attrubutes.addAttribute(new CAttribute("Data Dev",
+			("W" + CToolUnits::toHexString(m_nDataDev, strTemp)).c_str(), ""));
+	}
+
+	int CEqWriteStep::onComplete()
+	{
+		if (m_onWritedBlock != nullptr) {
+			m_onWritedBlock(WOK);
+		}
+
+		return 0;
+	}
+
+	int CEqWriteStep::onTimeout()
+	{
+		if (m_onWritedBlock != nullptr) {
+			m_onWritedBlock(WTIMEOUT);
+		}
+
+		return 0;
+	}
+}
diff --git a/SourceCode/Bond/Servo/CEqWriteStep.h b/SourceCode/Bond/Servo/CEqWriteStep.h
new file mode 100644
index 0000000..602408b
--- /dev/null
+++ b/SourceCode/Bond/Servo/CEqWriteStep.h
@@ -0,0 +1,32 @@
+#pragma once
+#include "CWriteStep.h"
+#include <functional>
+
+
+#define WOK				0
+#define WTIMEOUT		-1
+
+namespace SERVO {
+	typedef std::function<int(int code)> ONWRITED;
+
+	class CEqWriteStep : public CWriteStep
+	{
+	public:
+		CEqWriteStep();
+		~CEqWriteStep();
+
+	public:
+		void setDataDev(int nDev);
+		virtual void getAttributeVector(CAttributeVector& attrubutes);
+		int writeShort(short value, ONWRITED onWritedBlock = nullptr);
+		int writeInt(int value, ONWRITED onWritedBlock = nullptr);
+		int writeDataEx(const char* pszData, int size, ONWRITED onWritedBlock = nullptr);
+		virtual int onComplete();
+		virtual int onTimeout();
+
+	private:
+		int m_nDataDev;
+		ONWRITED m_onWritedBlock;
+	};
+}
+
diff --git a/SourceCode/Bond/Servo/CEquipment.cpp b/SourceCode/Bond/Servo/CEquipment.cpp
index d18f1d8..aaf7662 100644
--- a/SourceCode/Bond/Servo/CEquipment.cpp
+++ b/SourceCode/Bond/Servo/CEquipment.cpp
@@ -132,6 +132,7 @@
 	void CEquipment::init()
 	{
 		initPins();
+		initSteps();
 		for (auto item : m_mapStep) {
 			item.second->init();
 		}
@@ -142,6 +143,11 @@
 		for (auto item : m_mapStep) {
 			item.second->term();
 		}
+	}
+
+	void CEquipment::initSteps()
+	{
+
 	}
 
 	void CEquipment::setID(int nID)
@@ -394,6 +400,9 @@
 
 		// EQ mode change cmd reply
 		CHECK_WRITE_STEP_SIGNAL(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pszData, size);
+
+		// EQ Master recipe request cmd reply
+		CHECK_WRITE_STEP_SIGNAL(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pszData, size);
 
 		// CIM Message Confirm
 		CHECK_READ_STEP_SIGNAL(STEP_ID_CIM_MSG_CONFIRM_REPORT, pszData, size);
@@ -869,4 +878,25 @@
 
 		return pStep->setDateTime(year, month, day, hour, minute, second);
 	}
+
+	int CEquipment::masterRecipeListRequest(short unitNo)
+	{
+		SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
+		if (pStep == nullptr) {
+			return -1;
+		}
+
+		LOGI("<CEquipment-%s>正在请求单元<%d>主配方列表", m_strName.c_str(), unitNo);
+		pStep->writeShort(unitNo, [&](int code) -> int {
+			if (code == WOK) {
+				LOGI("<CEquipment-%s>请求单元<%d>主配方列表成功,正在等待数据.", m_strName.c_str(), unitNo);
+			}
+			else {
+				LOGI("<CEquipment-%s>请求单元<%d>主配方列表失败,code:%d", m_strName.c_str(), unitNo, code);
+			}
+
+			return 0;
+		});
+		return 0;
+	}
 }
\ No newline at end of file
diff --git a/SourceCode/Bond/Servo/CEquipment.h b/SourceCode/Bond/Servo/CEquipment.h
index ba1416f..e16140a 100644
--- a/SourceCode/Bond/Servo/CEquipment.h
+++ b/SourceCode/Bond/Servo/CEquipment.h
@@ -20,6 +20,8 @@
 #include "CEqJobEventStep.h"
 #include "CEqVcrEventStep.h"
 #include "CEqCurrentRecipeChangeStep.h"
+#include "CEqWriteStep.h"
+#include "CEqReadStep.h"
 #include <vector>
 #include <map>
 #include <list>
@@ -94,6 +96,7 @@
 		virtual void init();
 		virtual void term();
 		virtual void initPins() = 0;
+		virtual void initSteps();
 		virtual void onTimer(UINT nTimerid);
 		virtual void serialize(CArchive& ar);
 		virtual void onReceiveLBData(const char* pszData, size_t size);
@@ -124,6 +127,11 @@
 		int setCimMessage(const char* pszMessage, short id, short nTouchPanelNo);
 		int clearCimMessage(short id, short nTouchPanelNo);
 		int setDateTime(short year, short month, short day, short hour, short minute, short second);
+		
+		// 请求主配方列表
+		// unitNo: 0:local; Others:unit No
+		int masterRecipeListRequest(short unitNo);
+
 
 	// 以下为从CC-Link读取到的Bit标志位检测函数
 	public:
diff --git a/SourceCode/Bond/Servo/CLoadPort.cpp b/SourceCode/Bond/Servo/CLoadPort.cpp
index a51e99c..32ee535 100644
--- a/SourceCode/Bond/Servo/CLoadPort.cpp
+++ b/SourceCode/Bond/Servo/CLoadPort.cpp
@@ -53,6 +53,120 @@
 		addPin(SERVO::PinType::OUTPUT, _T("Out2"));
 	}
 
+	void CLoadPort::initSteps()
+	{
+		CEquipment::initSteps();
+
+
+		ASSERT(m_nIndex == 0 || m_nIndex == 1 || m_nIndex == 2 || m_nIndex == 3);
+
+		{
+			// Cassette Ctrl Cmd
+			static char* pszName[] = { STEP_EQ_P1_CASSETTE_CTRL_CMD,	STEP_EQ_P2_CASSETTE_CTRL_CMD, STEP_EQ_P3_CASSETTE_CTRL_CMD,	STEP_EQ_P4_CASSETTE_CTRL_CMD };
+			static int writeSignalDev[] = { 0x120, 0x121, 0x122, 0x123 };
+			static int dev[] = { 0x45, 0x1a5, 0x305, 0x465 };
+			static int addr[] = { 0x480, 0x481, 0x482, 0x483 };
+
+			CEqCassetteCtrlCmdStep* pStep = new CEqCassetteCtrlCmdStep();
+			pStep->setName(pszName[m_nIndex]);
+			pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
+			pStep->setCtrlCmdDev(dev[m_nIndex]);
+			if (addStep(addr[m_nIndex], pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Type
+			static char* pszName[] = { STEP_EQ_PORT1_TYPE, STEP_EQ_PORT2_TYPE, STEP_EQ_PORT3_TYPE, STEP_EQ_PORT4_TYPE };
+			static int dev[] = { 0x6010 , 0x6020, 0x6030, 0x6040 };
+			static int writeSignalDev[] = { 0xa0, 0xa1, 0xa2, 0xa3 };
+			static int addr[] = { STEP_ID_PORT1_TYPE_CHANGE, STEP_ID_PORT2_TYPE_CHANGE, STEP_ID_PORT3_TYPE_CHANGE, STEP_ID_PORT4_TYPE_CHANGE };
+
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
+			pStep->setName(pszName[m_nIndex]);
+			pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
+			if (addStep(addr[m_nIndex], pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Mode
+			static char* pszName[] = { STEP_EQ_PORT1_MODE, STEP_EQ_PORT2_MODE, STEP_EQ_PORT3_MODE, STEP_EQ_PORT4_MODE };
+			static int dev[] = { 0x6011, 0x6021, 0x6031, 0x6041 };
+			static int writeSignalDev[] = { 0xa8, 0xa9, 0xaa, 0xab };
+			static int addr[] = { STEP_ID_PORT1_MODE_CHANGE, STEP_ID_PORT2_MODE_CHANGE, STEP_ID_PORT3_MODE_CHANGE, STEP_ID_PORT4_MODE_CHANGE };
+
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
+			pStep->setName(pszName[m_nIndex]);
+			pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
+			if (addStep(addr[m_nIndex], pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Cassette type
+			static char* pszName[] = { STEP_EQ_PORT1_CASSETTE_TYPE, STEP_EQ_PORT2_CASSETTE_TYPE, STEP_EQ_PORT3_CASSETTE_TYPE, STEP_EQ_PORT4_CASSETTE_TYPE };
+			static int dev[] = { 0x6012, 0x6022, 0x6032, 0x6042 };
+			static int writeSignalDev[] = { 0xb0, 0xb1, 0xb2, 0xb3 };
+			static int addr[] = { STEP_ID_PORT1_CASSETTE_TYPE_CHANGE, STEP_ID_PORT2_CASSETTE_TYPE_CHANGE, STEP_ID_PORT3_CASSETTE_TYPE_CHANGE, STEP_ID_PORT4_CASSETTE_TYPE_CHANGE };
+
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
+			pStep->setName(pszName[m_nIndex]);
+			pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
+			if (addStep(addr[m_nIndex], pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Transfer type
+			static char* pszName[] = { STEP_EQ_PORT1_TRANSFER_MODE, STEP_EQ_PORT2_TRANSFER_MODE, STEP_EQ_PORT3_TRANSFER_MODE, STEP_EQ_PORT4_TRANSFER_MODE };
+			static int dev[] = { 0x6014, 0x6024, 0x6034, 0x6044 };
+			static int writeSignalDev[] = { 0xb8, 0xb9, 0xba, 0xbb };
+			static int addr[] = { STEP_ID_PORT1_TRANSFER_MODE_CHANGE, STEP_ID_PORT2_TRANSFER_MODE_CHANGE, STEP_ID_PORT3_TRANSFER_MODE_CHANGE, STEP_ID_PORT4_TRANSFER_MODE_CHANGE };
+
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
+			pStep->setName(pszName[m_nIndex]);
+			pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
+			if (addStep(addr[m_nIndex], pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Port enable
+			static char* pszName[] = { STEP_EQ_PORT1_ENABLE, STEP_EQ_PORT2_ENABLE, STEP_EQ_PORT3_ENABLE, STEP_EQ_PORT4_ENABLE };
+			static int dev[] = { 0x6015, 0x6025, 0x6035, 0x6045 };
+			static int writeSignalDev[] = { 0xc0, 0xc1, 0xc2, 0xc3 };
+			static int addr[] = { STEP_ID_PORT1_ENABLE_MODE_CHANGE, STEP_ID_PORT2_ENABLE_MODE_CHANGE, STEP_ID_PORT3_ENABLE_MODE_CHANGE, STEP_ID_PORT4_ENABLE_MODE_CHANGE };
+
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
+			pStep->setName(pszName[m_nIndex]);
+			pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
+			if (addStep(addr[m_nIndex], pStep) != 0) {
+				delete pStep;
+			}
+		}
+
+		{
+			// Type auto change
+			char* pszName[] = { STEP_EQ_PORT1_TYPE_ATUO, STEP_EQ_PORT2_TYPE_ATUO, STEP_EQ_PORT3_TYPE_ATUO, STEP_EQ_PORT4_TYPE_ATUO };
+			static int dev[] = { 0x6016, 0x6026, 0x6036, 0x6046 };
+			static int writeSignalDev[] = { 0xc8, 0xc9, 0xca, 0xcb };
+			static int addr[] = { STEP_ID_PORT1_TYPE_AUTO_CHANGE, STEP_ID_PORT2_TYPE_AUTO_CHANGE, STEP_ID_PORT3_TYPE_AUTO_CHANGE, STEP_ID_PORT4_TYPE_AUTO_CHANGE };
+
+			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[m_nIndex]);
+			pStep->setName(pszName[m_nIndex]);
+			pStep->setWriteSignalDev(writeSignalDev[m_nIndex]);
+			if (addStep(addr[m_nIndex], pStep) != 0) {
+				delete pStep;
+			}
+		}
+	}
+
 	void CLoadPort::onTimer(UINT nTimerid)
 	{
 		CEquipment::onTimer(nTimerid);
diff --git a/SourceCode/Bond/Servo/CLoadPort.h b/SourceCode/Bond/Servo/CLoadPort.h
index 6e0e288..ae63fe7 100644
--- a/SourceCode/Bond/Servo/CLoadPort.h
+++ b/SourceCode/Bond/Servo/CLoadPort.h
@@ -15,6 +15,7 @@
 		virtual void init();
 		virtual void term();
 		virtual void initPins();
+		virtual void initSteps();
 		virtual void onTimer(UINT nTimerid);
 		virtual void serialize(CArchive& ar);
 		virtual void getAttributeVector(CAttributeVector& attrubutes);
diff --git a/SourceCode/Bond/Servo/CMaster.cpp b/SourceCode/Bond/Servo/CMaster.cpp
index d663e6f..40f4705 100644
--- a/SourceCode/Bond/Servo/CMaster.cpp
+++ b/SourceCode/Bond/Servo/CMaster.cpp
@@ -3,16 +3,6 @@
 #include "CMaster.h"
 
 
-#define ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(name,ws,index,psd) {				\
-	CEqCassetteTransferStateStep* pStep = new CEqCassetteTransferStateStep();	\
-	pStep->setName(name);														\
-	pStep->setWriteSignalDev(ws);												\
-	pStep->setPortStatusDev(psd);												\
-	if (pEquipment->addStep(index, pStep) != 0) {								\
-		delete pStep;															\
-	}																			\
-}
-
 namespace SERVO {
 	CMaster* g_pMaster = NULL;
 
@@ -246,15 +236,6 @@
 	CLoadPort* CMaster::addLoadPort(int index)
 	{
 		ASSERT(index == 0 || index == 1 || index == 2 || index == 3);
-		static char* pszCassetteCtrlCmd[] = { 
-			STEP_EQ_P1_CASSETTE_CTRL_CMD,
-			STEP_EQ_P2_CASSETTE_CTRL_CMD,
-			STEP_EQ_P3_CASSETTE_CTRL_CMD,
-			STEP_EQ_P4_CASSETTE_CTRL_CMD
-		};
-		int nWriteSignalDev[] = {0x120, 0x121, 0x122, 0x123};
-		int nCtrlCmdDev[] = {0x45, 0x1a5, 0x305, 0x465};
-		int nStepDev[] = { 0x480, 0x481, 0x482, 0x483 };
 
 
 		char szName[64];
@@ -265,109 +246,6 @@
 		pEquipment->setName(szName);
 		pEquipment->setDescription(szName);
 		addToEquipmentList(pEquipment);
-
-
-		// step
-		{
-			CEqCassetteCtrlCmdStep* pStep = new CEqCassetteCtrlCmdStep();
-			pStep->setName(pszCassetteCtrlCmd[index]);
-			pStep->setWriteSignalDev(nWriteSignalDev[index]);
-			pStep->setCtrlCmdDev(nCtrlCmdDev[index]);
-			if (pEquipment->addStep(nStepDev[index], pStep) != 0) {
-				delete pStep;
-			}
-		}
-
-
-		{
-			// Type
-			char* pszName[] = { STEP_EQ_PORT1_TYPE, STEP_EQ_PORT2_TYPE, STEP_EQ_PORT3_TYPE, STEP_EQ_PORT4_TYPE };
-			int dev[] = { 0x6010 , 0x6020, 0x6030, 0x6040 };
-			int writeSignalDev[] = { 0xa0, 0xa1, 0xa2, 0xa3 };
-			int addr[] = { STEP_ID_PORT1_TYPE_CHANGE, STEP_ID_PORT2_TYPE_CHANGE, STEP_ID_PORT3_TYPE_CHANGE, STEP_ID_PORT4_TYPE_CHANGE };
-
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
-			pStep->setName(pszName[index]);
-			pStep->setWriteSignalDev(writeSignalDev[index]);
-			if (pEquipment->addStep(addr[index], pStep) != 0) {
-				delete pStep;
-			}
-		}
-		
-		{
-			// Mode
-			char* pszName[] = { STEP_EQ_PORT1_MODE, STEP_EQ_PORT2_MODE, STEP_EQ_PORT3_MODE, STEP_EQ_PORT4_MODE };
-			int dev[] = { 0x6011, 0x6021, 0x6031, 0x6041};
-			int writeSignalDev[] = { 0xa8, 0xa9, 0xaa, 0xab };
-			int addr[] = { STEP_ID_PORT1_MODE_CHANGE, STEP_ID_PORT2_MODE_CHANGE, STEP_ID_PORT3_MODE_CHANGE, STEP_ID_PORT4_MODE_CHANGE };
-
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
-			pStep->setName(pszName[index]);
-			pStep->setWriteSignalDev(writeSignalDev[index]);
-			if (pEquipment->addStep(addr[index], pStep) != 0) {
-				delete pStep;
-			}
-		}
-
-		{
-			// Cassette type
-			char* pszName[] = { STEP_EQ_PORT1_CASSETTE_TYPE, STEP_EQ_PORT2_CASSETTE_TYPE, STEP_EQ_PORT3_CASSETTE_TYPE, STEP_EQ_PORT4_CASSETTE_TYPE };
-			int dev[] = { 0x6012, 0x6022, 0x6032, 0x6042 };
-			int writeSignalDev[] = { 0xb0, 0xb1, 0xb2, 0xb3 };
-			int addr[] = { STEP_ID_PORT1_CASSETTE_TYPE_CHANGE, STEP_ID_PORT2_CASSETTE_TYPE_CHANGE, STEP_ID_PORT3_CASSETTE_TYPE_CHANGE, STEP_ID_PORT4_CASSETTE_TYPE_CHANGE };
-
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
-			pStep->setName(pszName[index]);
-			pStep->setWriteSignalDev(writeSignalDev[index]);
-			if (pEquipment->addStep(addr[index], pStep) != 0) {
-				delete pStep;
-			}
-		}
-
-		{
-			// Transfer type
-			char* pszName[] = { STEP_EQ_PORT1_TRANSFER_MODE, STEP_EQ_PORT2_TRANSFER_MODE, STEP_EQ_PORT3_TRANSFER_MODE, STEP_EQ_PORT4_TRANSFER_MODE };
-			int dev[] = { 0x6014, 0x6024, 0x6034, 0x6044 };
-			int writeSignalDev[] = { 0xb8, 0xb9, 0xba, 0xbb };
-			int addr[] = { STEP_ID_PORT1_TRANSFER_MODE_CHANGE, STEP_ID_PORT2_TRANSFER_MODE_CHANGE, STEP_ID_PORT3_TRANSFER_MODE_CHANGE, STEP_ID_PORT4_TRANSFER_MODE_CHANGE };
-
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
-			pStep->setName(pszName[index]);
-			pStep->setWriteSignalDev(writeSignalDev[index]);
-			if (pEquipment->addStep(addr[index], pStep) != 0) {
-				delete pStep;
-			}
-		}
-
-		{
-			// Port enable
-			char* pszName[] = { STEP_EQ_PORT1_ENABLE, STEP_EQ_PORT2_ENABLE, STEP_EQ_PORT3_ENABLE, STEP_EQ_PORT4_ENABLE };
-			int dev[] = { 0x6015, 0x6025, 0x6035, 0x6045 };
-			int writeSignalDev[] = { 0xc0, 0xc1, 0xc2, 0xc3 };
-			int addr[] = { STEP_ID_PORT1_ENABLE_MODE_CHANGE, STEP_ID_PORT2_ENABLE_MODE_CHANGE, STEP_ID_PORT3_ENABLE_MODE_CHANGE, STEP_ID_PORT4_ENABLE_MODE_CHANGE };
-
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
-			pStep->setName(pszName[index]);
-			pStep->setWriteSignalDev(writeSignalDev[index]);
-			if (pEquipment->addStep(addr[index], pStep) != 0) {
-				delete pStep;
-			}
-		}
-
-		{
-			// Type auto change
-			char* pszName[] = { STEP_EQ_PORT1_TYPE_ATUO, STEP_EQ_PORT2_TYPE_ATUO, STEP_EQ_PORT3_TYPE_ATUO, STEP_EQ_PORT4_TYPE_ATUO };
-			int dev[] = { 0x6016, 0x6026, 0x6036, 0x6046 };
-			int writeSignalDev[] = { 0xc8, 0xc9, 0xca, 0xcb };
-			int addr[] = { STEP_ID_PORT1_TYPE_AUTO_CHANGE, STEP_ID_PORT2_TYPE_AUTO_CHANGE, STEP_ID_PORT3_TYPE_AUTO_CHANGE, STEP_ID_PORT4_TYPE_AUTO_CHANGE };
-
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, dev[index]);
-			pStep->setName(pszName[index]);
-			pStep->setWriteSignalDev(writeSignalDev[index]);
-			if (pEquipment->addStep(addr[index], pStep) != 0) {
-				delete pStep;
-			}
-		}
 
 
 		pEquipment->init();
@@ -440,213 +318,6 @@
 		addToEquipmentList(pEquipment);
 
 
-		// 添加 step
-		{
-			CEqModeStep* pStep = new CEqModeStep();
-			pStep->setName(STEP_MODE);
-			pStep->setWriteSignalDev(0x50);
-			pStep->setModeDev(0x5d7d);
-			if (pEquipment->addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqStatusStep* pStep = new CEqStatusStep();
-			pStep->setName(STEP_STATUS);
-			pStep->setWriteSignalDev(0x51);
-			pStep->setStatusDev(0x5d59);
-			if (pEquipment->addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK1);
-			pStep->setWriteSignalDev(0x52);
-			pStep->setAlarmDev(0x5f0e);
-			if (pEquipment->addStep(STEP_ID_EQALARM1, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK2);
-			pStep->setWriteSignalDev(0x53);
-			pStep->setAlarmDev(0x5f3b);
-			if (pEquipment->addStep(STEP_ID_EQALARM2, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK3);
-			pStep->setWriteSignalDev(0x54);
-			pStep->setAlarmDev(0x5f68);
-			if (pEquipment->addStep(STEP_ID_EQALARM3, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK4);
-			pStep->setWriteSignalDev(0x55);
-			pStep->setAlarmDev(0x5f95);
-			if (pEquipment->addStep(STEP_ID_EQALARM4, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK5);
-			pStep->setWriteSignalDev(0x56);
-			pStep->setAlarmDev(0x5fc2);
-			if (pEquipment->addStep(STEP_ID_EQALARM5, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqProcessStep* pStep = new CEqProcessStep();
-			pStep->setName(STEP_PROCESS);
-			pStep->setWriteSignalDev(0x57);
-			pStep->setProcessDev(0x6b55);
-			if (pEquipment->addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
-			pStep->setName(STEP_CIM_MODE_CHANGE);
-			pStep->setWriteSignalDev(0x70);
-			pStep->setCimModeDev(0x15);
-			if (pEquipment->addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
-			pStep->setName(STEP_CIM_MESSAGE_CMD);
-			pStep->setWriteSignalDev(0x71);
-			pStep->setCimMessageDev(0x0);
-			if (pEquipment->addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			// CIM Message Confirm
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x5f80);
-			pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
-			pStep->setWriteSignalDev(0x59);
-			if (pEquipment->addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			// VCR1 Event Report
-			CEqVcrEventStep* pStep = new CEqVcrEventStep();
-			pStep->setName(STEP_EQ_VCR1_EVENT_REPORT);
-			pStep->setWriteSignalDev(0x4a);
-			pStep->setReturnDev(0x91e);
-			pStep->setVcrEventReportDev(0x5fef);
-			if (pEquipment->addStep(STEP_ID_VCR1_EVENT_REPORT, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
-			pStep->setName(STEP_CIM_MESSAGE_CLEAR);
-			pStep->setWriteSignalDev(0x72);
-			pStep->setClearCimMessageDev(0x13);
-			if (pEquipment->addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
-			pStep->setName(STEP_DATETIME_SET_CMD);
-			pStep->setWriteSignalDev(0x73);
-			pStep->setDateTimeDev(0x16);
-			if (pEquipment->addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqVCREnableStep* pStep = new CEqVCREnableStep();
-			pStep->setName(STEP_EQ_VCR_ENABLE);
-			pStep->setWriteSignalDev(0x74);
-			pStep->setEqVCRModeDev(0x1F);
-			if (pEquipment->addStep(STEP_ID_VCR_ENABLE_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqModeChangeStep* pStep = new CEqModeChangeStep();
-			pStep->setName(STEP_EQ_MODE_CHANGE);
-			pStep->setWriteSignalDev(0x75);
-			pStep->setEqModeDev(0x1E);
-			if (pEquipment->addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
-			pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
-			pStep->setWriteSignalDev(0x48);
-			pStep->setDataDev(0x6850);
-			if (pEquipment->addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
-				delete pStep;
-			}
-		}
-
-		// CEqCassetteTranserStateStep
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_EMPTY, 0xd8, 
-			STEP_ID_PORT1_CASSETTIE_EMPTY, 0x6050);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOAD_EADY, 0xe0,
-			STEP_ID_PORT1_CASSETTIE_LOAD_READY, 0x6050);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_LOADED, 0xe8, 
-			STEP_ID_PORT1_CASSETTIE_LOADED, 0x6050);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_INUSE, 0xf0,
-			STEP_ID_PORT1_CASSETTIE_INUSE, 0x6050);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_UNLOAD_EADY, 0xf8,
-			STEP_ID_PORT1_CASSETTIE_UNLOAD_READY, 0x60f50);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P1_CASSETTE_BLOCKED, 0x100,
-			STEP_ID_PORT1_CASSETTIE_BLOCKED, 0x6050);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_EMPTY, 0xd9,
-			STEP_ID_PORT2_CASSETTIE_EMPTY, 0x6070);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOAD_EADY, 0xe1,
-			STEP_ID_PORT2_CASSETTIE_LOAD_READY, 0x6070);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_LOADED, 0xe9, 
-			STEP_ID_PORT2_CASSETTIE_LOADED, 0x6070);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_INUSE, 0xf1, 
-			STEP_ID_PORT2_CASSETTIE_INUSE, 0x6070);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_UNLOAD_EADY, 0xf9, 
-			STEP_ID_PORT2_CASSETTIE_UNLOAD_READY, 0x6070);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P2_CASSETTE_BLOCKED, 0x101, 
-			STEP_ID_PORT2_CASSETTIE_BLOCKED, 0x6070);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_EMPTY, 0xda,
-			STEP_ID_PORT3_CASSETTIE_EMPTY, 0x6090);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOAD_EADY, 0xe2, 
-			STEP_ID_PORT3_CASSETTIE_LOAD_READY, 0x6090);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_LOADED, 0xea, 
-			STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_INUSE, 0xf2, 
-			STEP_ID_PORT3_CASSETTIE_INUSE, 0x6090);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_UNLOAD_EADY, 0xfa, 
-			STEP_ID_PORT3_CASSETTIE_UNLOAD_READY, 0x6090);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P3_CASSETTE_BLOCKED, 0x102, 
-			STEP_ID_PORT3_CASSETTIE_BLOCKED, 0x6090);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_EMPTY, 0xdb,
-			STEP_ID_PORT4_CASSETTIE_EMPTY, 0x60b0);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOAD_EADY, 0xe3, 
-			STEP_ID_PORT4_CASSETTIE_LOAD_READY, 0x60b0);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_LOADED, 0xeb, 
-			STEP_ID_PORT4_CASSETTIE_LOADED, 0x60b0);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_INUSE, 0xf3, 
-			STEP_ID_PORT4_CASSETTIE_INUSE, 0x60b0);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_UNLOAD_EADY, 0xfb, 
-			STEP_ID_PORT4_CASSETTIE_UNLOAD_READY, 0x60b0);
-		ADD_EQ_CASSETTE_TRANSFER_STATE_STEP(STEP_EQ_P4_CASSETTE_BLOCKED, 0x103, 
-			STEP_ID_PORT4_CASSETTIE_BLOCKED, 0x60b0);
-
 		pEquipment->init();
 		LOGE("已添加“EFEM(ROBOT)”.");
 
@@ -667,181 +338,8 @@
 		pEquipment->setStation(0, 255);
 		pEquipment->setReadBitBlock(index == 0 ? 0x3b00 : 0x4600,
 			index == 0 ? 0x5600 : 0x6100);
+		pEquipment->setIndex(index);
 		addToEquipmentList(pEquipment);
-
-
-		// 添加 step
-		{
-			CEqModeStep* pStep = new CEqModeStep();
-			pStep->setName(STEP_MODE);
-			pStep->setWriteSignalDev(index == 0 ? 0x350 : 0x650);
-			pStep->setModeDev(index == 0 ? 0x9d7d : 0xdd7d);
-			if (pEquipment->addStep(STEP_ID_EQMODE_CHANGED, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqStatusStep* pStep = new CEqStatusStep();
-			pStep->setName(STEP_STATUS);
-			pStep->setWriteSignalDev(index == 0 ? 0x351 : 0x651);
-			pStep->setStatusDev(index == 0 ? 0x9d59 : 0xdd59);
-			if (pEquipment->addStep(STEP_ID_EQSTATUS_CHANGED, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK1);
-			pStep->setWriteSignalDev(index == 0 ? 0x352 : 0x652);
-			pStep->setAlarmDev(index == 0 ? 0x9f0e : 0xdf0e);
-			if (pEquipment->addStep(STEP_ID_EQALARM1, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK2);
-			pStep->setWriteSignalDev(index == 0 ? 0x353 : 0x653);
-			pStep->setAlarmDev(index == 0 ? 0x9f3b : 0xdf3b);
-			if (pEquipment->addStep(STEP_ID_EQALARM2, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK3);
-			pStep->setWriteSignalDev(index == 0 ? 0x354 : 0x654);
-			pStep->setAlarmDev(index == 0 ? 0x9f68 : 0xdf68);
-			if (pEquipment->addStep(STEP_ID_EQALARM3, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK4);
-			pStep->setWriteSignalDev(index == 0 ? 0x355 : 0x655);
-			pStep->setAlarmDev(index == 0 ? 0x9f95 : 0xdf95);
-			if (pEquipment->addStep(STEP_ID_EQALARM4, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqAlarmStep* pStep = new CEqAlarmStep();
-			pStep->setName(STEP_ALARM_BLOCK5);
-			pStep->setWriteSignalDev(index == 0 ? 0x356 : 0x656);
-			pStep->setAlarmDev(index == 0 ? 0x9fc2 : 0xdfc2);
-			if (pEquipment->addStep(STEP_ID_EQALARM5, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqProcessStep* pStep = new CEqProcessStep();
-			pStep->setName(STEP_PROCESS);
-			pStep->setWriteSignalDev(index == 0 ? 0x357 : 0x657);
-			pStep->setProcessDev(index == 0 ? 0xab55 : 0xeb55);
-			if (pEquipment->addStep(STEP_ID_PROCESS_DATA_REPORT, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCimModeChangeStep* pStep = new CEqCimModeChangeStep();
-			pStep->setName(STEP_CIM_MODE_CHANGE);
-			pStep->setWriteSignalDev(index == 0 ? 0x370 : 0x670);
-			pStep->setCimModeDev(index == 0 ? 0x965 : 0x12b5);
-			if (pEquipment->addStep(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCimMessageCmdStep* pStep = new CEqCimMessageCmdStep();
-			pStep->setName(STEP_CIM_MESSAGE_CMD);
-			pStep->setWriteSignalDev(index == 0 ? 0x371 : 0x671);
-			pStep->setCimMessageDev(index == 0 ? 0x950 : 0x12a0);
-			if (pEquipment->addStep(STEP_ID_CIM_MSG_SET_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCurrentRecipeChangeStep* pStep = new CEqCurrentRecipeChangeStep();
-			pStep->setName(STEP_EQ_RURRENT_RECIPE_CHANGE);
-			pStep->setWriteSignalDev(index == 0 ? 0x348 : 0x648);
-			pStep->setDataDev(index == 0 ? 0xa850 : 0xe850);
-			if (pEquipment->addStep(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			// CIM Message Confirm
-			CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, index == 0 ? 0x9d80 : 0xdd80);
-			pStep->setName(STEP_EQ_CIM_MESSAGE_CONFIRM);
-			pStep->setWriteSignalDev(index == 0 ? 0x359 : 0x659);
-			if (pEquipment->addStep(STEP_ID_CIM_MSG_CONFIRM_REPORT, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqCimMessageClearStep* pStep = new CEqCimMessageClearStep();
-			pStep->setName(STEP_CIM_MESSAGE_CLEAR);
-			pStep->setWriteSignalDev(index == 0 ? 0x372 : 0x672);
-			pStep->setClearCimMessageDev(index == 0 ? 0x963 : 0x12b3);
-			if (pEquipment->addStep(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqDateTimeSetCmdStep* pStep = new CEqDateTimeSetCmdStep();
-			pStep->setName(STEP_DATETIME_SET_CMD);
-			pStep->setWriteSignalDev(index == 0 ? 0x373 : 0x673);
-			pStep->setDateTimeDev(index == 0 ? 0x966 : 0x12b6);
-			if (pEquipment->addStep(STEP_ID_DATETIME_SET_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqModeChangeStep* pStep = new CEqModeChangeStep();
-			pStep->setName(STEP_EQ_MODE_CHANGE);
-			pStep->setWriteSignalDev(index == 0 ? 0x375 : 0x675);
-			pStep->setEqModeDev(index == 0 ? 0x96E : 0x12be);
-			if (pEquipment->addStep(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqJobEventStep* pStep = new CEqJobEventStep();
-			pStep->setName(STEP_EQ_RECEIVED_JOB_UPS1);
-			pStep->setWriteSignalDev(index == 0 ? 0x300 : 0x600);
-			pStep->setJobDataDev(index == 0 ? 0x8c90 : 0xcc90);
-			if (pEquipment->addStep(STEP_ID_RECIVE_JOB_UPS1, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqJobEventStep* pStep = new CEqJobEventStep();
-			pStep->setName(STEP_EQ_RECEIVED_JOB_UPS2);
-			pStep->setWriteSignalDev(index == 0 ? 0x301 : 0x601);
-			pStep->setJobDataDev(index == 0 ? 0x8dd0 : 0xcdd0);
-			if (pEquipment->addStep(STEP_ID_RECIVE_JOB_UPS2, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqJobEventStep* pStep = new CEqJobEventStep();
-			pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS1);
-			pStep->setWriteSignalDev(index == 0 ? 0x310 : 0x610);
-			pStep->setJobDataDev(index == 0 ? 0x8000 : 0xc000);
-			if (pEquipment->addStep(STEP_ID_SENT_OUT_JOB_DOWNS1, pStep) != 0) {
-				delete pStep;
-			}
-		}
-		{
-			CEqJobEventStep* pStep = new CEqJobEventStep();
-			pStep->setName(STEP_EQ_SENT_OUT_JOB_DOWNS2);
-			pStep->setWriteSignalDev(index == 0 ? 0x311 : 0x611);
-			pStep->setJobDataDev(index == 0 ? 0x8140 : 0xc140);
-			if (pEquipment->addStep(STEP_ID_SENT_OUT_JOB_DOWNS2, pStep) != 0) {
-				delete pStep;
-			}
-		}
 
 
 		pEquipment->init();
diff --git a/SourceCode/Bond/Servo/Common.h b/SourceCode/Bond/Servo/Common.h
index 78351fa..c8ae7ab 100644
--- a/SourceCode/Bond/Servo/Common.h
+++ b/SourceCode/Bond/Servo/Common.h
@@ -139,6 +139,8 @@
 #define STEP_EQ_SENT_OUT_JOB_DOWNS2		_T("EQJESentOutJobDowns2")
 #define STEP_EQ_VCR1_EVENT_REPORT		_T("EQVcr1EventReport")
 #define STEP_EQ_RURRENT_RECIPE_CHANGE	_T("EQCurrentRecipeChange")
+#define STEP_EQ_MASTER_RECIPE_LIST_REQ	_T("EQMasterRecipeListReq")
+#define STEP_EQ_MASTER_RECIPE_LIST		_T("EQMasterRecipeListReport")
 
 
 /* Step ID */
@@ -148,6 +150,7 @@
 #define STEP_ID_DATETIME_SET_CMD_REPLY			0x553
 #define STEP_ID_VCR_ENABLE_CMD_REPLY			0x554
 #define STEP_ID_EQMODE_CHANGE_CMD_REPLY			0x555
+#define STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY	0x556
 #define STEP_ID_EQMODE_CHANGED					0x560
 #define STEP_ID_EQSTATUS_CHANGED				0x561
 #define STEP_ID_EQALARM1						0x562
@@ -159,6 +162,7 @@
 #define STEP_ID_CURRENT_RECIPE_CHANGE_REPORT	0x568
 #define STEP_ID_CIM_MSG_CONFIRM_REPORT			0x569
 #define STEP_ID_VCR1_EVENT_REPORT				0x56A
+#define STEP_ID_MASTER_RECIPE_LIST_REPORT		0x56B
 #define STEP_ID_RECIVE_JOB_UPS1					0x580
 #define STEP_ID_RECIVE_JOB_UPS2					0x581
 #define STEP_ID_SENT_OUT_JOB_DOWNS1				0x590
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj b/SourceCode/Bond/Servo/Servo.vcxproj
index cddacfd..bd2f2f6 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj
+++ b/SourceCode/Bond/Servo/Servo.vcxproj
@@ -219,11 +219,13 @@
     <ClInclude Include="CEqPortChangeStep.h" />
     <ClInclude Include="CEqProcessStep.h" />
     <ClInclude Include="CEqReadIntStep.h" />
+    <ClInclude Include="CEqReadStep.h" />
     <ClInclude Include="CEqStatusStep.h" />
     <ClInclude Include="CEquipmentPage1.h" />
     <ClInclude Include="CEquipmentPage2.h" />
     <ClInclude Include="CEqVCREnableStep.h" />
     <ClInclude Include="CEqVcrEventStep.h" />
+    <ClInclude Include="CEqWriteStep.h" />
     <ClInclude Include="CFliper.h" />
     <ClInclude Include="CGlass.h" />
     <ClInclude Include="CHMPropertyDlg.h" />
@@ -306,11 +308,13 @@
     <ClCompile Include="CEqPortChangeStep.cpp" />
     <ClCompile Include="CEqProcessStep.cpp" />
     <ClCompile Include="CEqReadIntStep.cpp" />
+    <ClCompile Include="CEqReadStep.cpp" />
     <ClCompile Include="CEqStatusStep.cpp" />
     <ClCompile Include="CEquipmentPage1.cpp" />
     <ClCompile Include="CEquipmentPage2.cpp" />
     <ClCompile Include="CEqVCREnableStep.cpp" />
     <ClCompile Include="CEqVcrEventStep.cpp" />
+    <ClCompile Include="CEqWriteStep.cpp" />
     <ClCompile Include="CFliper.cpp" />
     <ClCompile Include="CGlass.cpp" />
     <ClCompile Include="CHMPropertyDlg.cpp" />
diff --git a/SourceCode/Bond/Servo/Servo.vcxproj.filters b/SourceCode/Bond/Servo/Servo.vcxproj.filters
index f6f2606..339a1a7 100644
--- a/SourceCode/Bond/Servo/Servo.vcxproj.filters
+++ b/SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -93,6 +93,8 @@
     <ClCompile Include="CEqVcrEventStep.cpp" />
     <ClCompile Include="CPagePortProperty.cpp" />
     <ClCompile Include="CEqCurrentRecipeChangeStep.cpp" />
+    <ClCompile Include="CEqWriteStep.cpp" />
+    <ClCompile Include="CEqReadStep.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="AlarmManager.h" />
@@ -184,6 +186,8 @@
     <ClInclude Include="CEqVcrEventStep.h" />
     <ClInclude Include="CPagePortProperty.h" />
     <ClInclude Include="CEqCurrentRecipeChangeStep.h" />
+    <ClInclude Include="CEqWriteStep.h" />
+    <ClInclude Include="CEqReadStep.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="Servo.rc" />

--
Gitblit v1.9.3