Преглед на файлове

响应LEO的需求,当heater和MFC连续两个step的设置值和alarm condtion配置都相同的话,alarm condtion要连续检查,不能在第二个step重新开始,在op中增加了elapsedTime的备份和恢复函数,具体OP中根据情况调用即可

shishenghui преди 4 дни
родител
ревизия
4a3717c852

+ 2 - 2
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/BaseDevice.cpp

@@ -131,7 +131,7 @@ OperatorStatusEnum BaseDevice::doAlarmConditionAlarm(AlarmCondition *ac)
 		//Jump
 		//TODO;这里是有错误的,alarmJumpStepName现在是个int型,需要和上位机对一下。
 		if (isAlarmCommandHigher("Jump", scValue)) {
-			sprintf(scValue, "Jump:%s", ac->alarmJumpStepName);
+			sprintf(scValue, "Jump:%d", ac->alarmJumpStepNo);
 		}
 		return OperatorStatusEnum::SUCCESS;
 	case 90:
@@ -201,7 +201,7 @@ OperatorStatusEnum BaseDevice::doAlarmConditionWarning(AlarmCondition *ac)
 		//Jump
 		//TODO;这里是有错误的,alarmJumpStepName现在是个int型,需要和上位机对一下。
 		if (isAlarmCommandHigher("Jump", scValue)) {
-			sprintf(scValue, "Jump:%s", ac->warningJumpStepName);
+			sprintf(scValue, "Jump:%d", ac->warningJumpStepNo);
 		}
 		return OperatorStatusEnum::SUCCESS;
 	case 90:

+ 15 - 0
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/IoHeater.cpp

@@ -140,6 +140,20 @@ void IoHeater::initialize()
 		else {
 			op->setTimes(device->getAlarmCondition()->alarmDelayDetectTimeS * 1000, TIME_STABLE_DEFAULT, device->getAlarmCondition()->alarmCheckTime, TIME_USE_LAST);
 		}
+		RecipeContext* context = RecipeContext::GetInstance();
+		if (context != NULL) {
+			if (context->currentStepNo > 0) {
+				double space = device->getWaferTemperatureSetPoint() - device->backupSetPoint;
+				if ((AlarmCondition*)device->backupAlarmCondtion == device->getAlarmCondition() &&
+					IS_ZERO(space)) {
+					//继续上一个alarm condition的计时
+					op->loadElapsedTime();
+				}
+			}
+			device->backupSetPoint = device->getWaferTemperatureSetPoint();
+			device->backupAlarmCondtion = device->getAlarmCondition();
+
+		}
 		return OperatorStatusEnum::RUNNING;
 
 		});
@@ -191,6 +205,7 @@ void IoHeater::initialize()
 		if (device->getAlarmCondition() == NULL) {
 			return OperatorStatusEnum::SUCCESS;
 		}
+		op->saveElapsedTime();//保存alarm condition的时间消耗,以便下一个step继续使用
 		if (IS_ZERO(device->getAlarmCondition()->alarmHigh) || IS_ZERO(device->getAlarmCondition()->alarmLow)) {
 			return OperatorStatusEnum::SUCCESS;
 		}

+ 2 - 1
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/IoHeater.h

@@ -15,7 +15,8 @@ class IoHeater: BaseDevice {
 		PMCBOOL BWR = FALSE;
 		double waitLow = 0;
 		double waitHigh = 0;
-		
+		double backupSetPoint = 0;
+		void* backupAlarmCondtion = NULL;
 
 		double getWaferTemperature();
 		void setWaferTemperature(double temperature);

+ 15 - 0
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/IoMFC.cpp

@@ -104,6 +104,20 @@ void IoMFC::initialize()
 		else {
 			op->setTimes(device->getAlarmCondition()->alarmDelayDetectTimeS*1000 , TIME_STABLE_DEFAULT, device->getAlarmCondition()->alarmCheckTime, TIME_USE_LAST);
 		}
+		RecipeContext* context = RecipeContext::GetInstance();
+		if (context != NULL) {
+			if (context->currentStepNo > 0) {
+				double space = device->aoFlow.getDoubleValue() - device->backupSetPoint;
+				if ((AlarmCondition*)device->backupAlarmCondtion == device->getAlarmCondition() &&
+					IS_ZERO(space)) {
+					//继续上一个alarm condition的计时
+					op->loadElapsedTime();
+				}
+			}
+			device->backupSetPoint = device->aoFlow.getDoubleValue();
+			device->backupAlarmCondtion = device->getAlarmCondition();
+		}
+		
 		return OperatorStatusEnum::RUNNING;
 		
 	});
@@ -154,6 +168,7 @@ void IoMFC::initialize()
 		if (device->getAlarmCondition() == NULL) {
 			return OperatorStatusEnum::SUCCESS;
 		}
+		op->saveElapsedTime();//保存alarm condition的时间消耗,以便下一个step继续使用
 		if (IS_ZERO(device->getAlarmCondition()->alarmHigh) || IS_ZERO(device->getAlarmCondition()->alarmLow)) {
 			return OperatorStatusEnum::SUCCESS;
 		}

+ 2 - 1
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/IoMFC.h

@@ -41,7 +41,8 @@ class IoMFC: BaseDevice {
 		PMCBOOL isWait = FALSE;
 		double waitHigh = 0;
 		double waitLow = 0;
-		
+		double backupSetPoint = 0;
+		void* backupAlarmCondtion = NULL;
 
 };
 #endif

+ 14 - 0
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/OP.cpp

@@ -665,7 +665,19 @@ void OperatorNode::ignoreAlarm(PMCBOOL *first)
 	}
 }
 
+void OperatorNode::saveElapsedTime()
+{
+	backupElapsedDelayTime = elapsedDelayTime;
+	backupElapsedTriggerAlarmTime = elapsedTriggerAlarmTime;
+	backupElapsedTriggerWarningTime = elapsedTriggerWarningTime;
+}
 
+void OperatorNode::loadElapsedTime()
+{
+	elapsedDelayTime = backupElapsedDelayTime;
+	elapsedTriggerAlarmTime = backupElapsedTriggerAlarmTime;
+	elapsedTriggerWarningTime = backupElapsedTriggerWarningTime;
+}
 
 
 OperatorNode* COP::subscribe(const char* name)
@@ -898,3 +910,5 @@ void COP::reset()
 	
 }
 
+
+

+ 6 - 1
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/OP.h

@@ -35,7 +35,9 @@ private:
     long elapsedTriggerAlarmTime=0;
     long elapsedTriggerWarningTime = 0;
     long elapsedTimeout = 0;
-    
+    long backupElapsedDelayTime = 0;
+    long backupElapsedTriggerAlarmTime = 0;
+    long backupElapsedTriggerWarningTime = 0;
     PMCBOOL isInDelay = FALSE;
     OperatorNode* subOpList[MAX_SUB_OP_COUNT] = { 0 };
     short subOpCount=0;
@@ -84,6 +86,8 @@ public:
     void retryAlarm();
     void resetAlarm();
     void ignoreAlarm(PMCBOOL *first);
+    void saveElapsedTime();
+    void loadElapsedTime();
 };
 
 class COP{
@@ -128,6 +132,7 @@ class COP{
         //不要在OP结点的委托函数中调用reset        
         void reset();
         
+       
         
 };
 extern COP* OP;

+ 6 - 1
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/RecipeContext.cpp

@@ -1724,7 +1724,12 @@ bool RecipeContext::checkRecipeCommand() {
 			//子recipe跳转顺序:先找子recipe,再找主recipe
 			//没有成功跳转的,相当于一个skip
 			jumpTo(command + 5);//按绝对位置取,杜绝stepname中包含冒号带来的潜在问题
-			previous();
+			//不用step name,改用stepno,由上位机转换
+			currentRecipeType = RecipeTypeEnum::NormalRecipe;
+			currentStepNo = atoi(command) - 1;
+			if (currentStepNo < 0) {
+				currentStepNo = mainStepList.length - 2;
+			}
 			recipeExecuteStatus = RecipeExecuteStatusEnum::StepCompleted;
 			return true;
 		}

+ 6 - 6
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/pmc_types.h

@@ -76,12 +76,12 @@ extern M_SDO* SDO;
 	logger=&m_logger;		\
 	socketModule=this;	\
 }
-#define IS_ZERO(v) (v>=-0.00001 && v<=0.00001)
-#define GT_ZERO(v) (v>0.00001)
-#define GE_ZERO(v) (v>=-0.00001)
-#define LT_ZERO(v) (v<-0.00001)
-#define LE_ZERO(v) (v<=0.00001)
-#define FABS(x) (x>=0?x:-x)
+#define IS_ZERO(v) ((v)>=-0.00001 && (v)<=0.00001)
+#define GT_ZERO(v) ((v)>0.00001)
+#define GE_ZERO(v) ((v)>=-0.00001)
+#define LT_ZERO(v) ((v)<-0.00001)
+#define LE_ZERO(v) ((v)<=0.00001)
+#define FABS(x) ((x)>=0?(x):-(x))
 typedef enum class _switch_status { Open, Close } SwitchStatusEnum;
 typedef enum class _OperatorStatusEnum { UNDEFINED, INIT, RUNNING, WARNING, SUCCESS, ALARM, ABORT } OperatorStatusEnum;
 #endif