Browse Source

修改Fields类的实现,采用共享全局内存空间的方式,防止内存占用过大

shishenghui 1 month ago
parent
commit
4ce12282b9

+ 52 - 4
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/BoatModule.cpp

@@ -69,6 +69,11 @@ void BoatModule::subscribe()
 	char cmd[MAX_NAME_LEN];
 	sprintf(cmd, "%s.SetBoatMotion.boatload",MODULE_NAME);
 	auto opNode=OP->subscribe(cmd);
+	opNode->addReset([]()->OperatorStatusEnum {
+		//异常之后boat由上位机手工操作进行复位,这里直接设置成IDLE保证recipe能够继续执行
+		boatModule->status = BoatStatusEnum::Idle;
+		return OperatorStatusEnum::SUCCESS;
+		});
 	//第一个CheckPrepareMove
 	auto subOp=opNode->addChild("CheckPrepareMove");
 	
@@ -142,7 +147,18 @@ void BoatModule::subscribe()
 	subOp = opNode->addChild("SetBoatZAxisMove");
 	subOp->addExec([]()->OperatorStatusEnum {
 		OP->current->setTimes( 0, 0, 0, boatModule->boatElevator->scMotionTimeout);
-		boatModule->setBoatZAxisMove(SERVO_MOVE_POSITION(1));//CAP2
+		double defaultSpeed = boatModule->boatElevator->scMoveSpeed;
+		double speed = 0;
+		if (OP->currentRoot->params.length > 1) {
+			//TODO:根据参数直接解析出速度
+			speed = atof(OP->currentRoot->params.get(1));
+
+		}
+		if (speed<0.001) {
+			speed = defaultSpeed;
+		}
+		
+		boatModule->setBoatZAxisMove(SERVO_MOVE_POSITION(1),speed);//CAP2
 		return OperatorStatusEnum::RUNNING;
 		});
 	subOp->addCheck([]()->OperatorStatusEnum {
@@ -180,6 +196,11 @@ void BoatModule::subscribe()
 #pragma region boatunload
 	sprintf(cmd, "%s.SetBoatMotion.boatunload", MODULE_NAME);
 	opNode = OP->subscribe(cmd);
+	opNode->addReset([]()->OperatorStatusEnum {
+		//异常之后boat由上位机手工操作进行复位,这里直接设置成IDLE保证recipe能够继续执行
+		boatModule->status = BoatStatusEnum::Idle;
+		return OperatorStatusEnum::SUCCESS;
+		});
 	//第一个CheckPrepareMove
 	subOp = opNode->addChild("CheckPrepareMove");
 	
@@ -254,7 +275,19 @@ void BoatModule::subscribe()
 	subOp = opNode->addChild("SetBoatZAxisMove");
 	subOp->addExec([]()->OperatorStatusEnum {
 		OP->current->setTimes( 0, 0, 0, boatModule->boatElevator->scMotionTimeout);
-		boatModule->setBoatZAxisMove(SERVO_MOVE_POSITION(3));//HOME
+		double defaultSpeed = boatModule->boatElevator->scMoveSpeed;
+		double speed = 0;
+		if (OP->currentRoot->params.length > 1) {
+			//TODO:根据参数直接解析出速度
+			speed = atof(OP->currentRoot->params.get(1));
+
+		}
+		if (speed < 0.001) {
+			speed = defaultSpeed;
+		}
+
+		
+		boatModule->setBoatZAxisMove(SERVO_MOVE_POSITION(3),speed);//HOME
 		return OperatorStatusEnum::RUNNING;
 		});
 	subOp->addCheck([]()->OperatorStatusEnum {
@@ -318,6 +351,11 @@ void BoatModule::subscribe()
 #pragma region boatrotate
 	sprintf(cmd, "%s.SetBoatMotion.boatrotate", MODULE_NAME);
 	opNode = OP->subscribe(cmd);
+	opNode->addReset([]()->OperatorStatusEnum {
+		//异常之后boat由上位机手工操作进行复位,这里直接设置成IDLE保证recipe能够继续执行
+		boatModule->status = BoatStatusEnum::Idle;
+		return OperatorStatusEnum::SUCCESS;
+		});
 	//SetBoatRAxisMove
 	subOp = opNode->addChild("SetBoatRAxisMove");
 	subOp->addExec([]()->OperatorStatusEnum {
@@ -357,6 +395,11 @@ void BoatModule::subscribe()
 #pragma region boatstoprotate
 	sprintf(cmd, "%s.SetBoatMotion.boatstoprotate", MODULE_NAME);
 	opNode = OP->subscribe(cmd);
+	opNode->addReset([]()->OperatorStatusEnum {
+		//异常之后boat由上位机手工操作进行复位,这里直接设置成IDLE保证recipe能够继续执行
+		boatModule->status = BoatStatusEnum::Idle;
+		return OperatorStatusEnum::SUCCESS;
+		});
 	//SetBoatRAxisMove
 	subOp = opNode->addChild("SetBoatRAxisMoveStop");
 	subOp->addExec([]()->OperatorStatusEnum {
@@ -388,6 +431,11 @@ void BoatModule::subscribe()
 #pragma region stop(include-axis)
 	sprintf(cmd, "%s.SetBoatMotion.stop(include-axis)", MODULE_NAME);
 	opNode = OP->subscribe(cmd);
+	opNode->addReset([]()->OperatorStatusEnum {
+		//异常之后boat由上位机手工操作进行复位,这里直接设置成IDLE保证recipe能够继续执行
+		boatModule->status = BoatStatusEnum::Idle;
+		return OperatorStatusEnum::SUCCESS;
+		});
 	//SetBoatRAxisMoveStop
 	subOp = opNode->addChild("SetBoatRAxisMoveStop");
 	subOp->addExec([]()->OperatorStatusEnum {
@@ -490,10 +538,10 @@ PMCBOOL BoatModule::autoShutterOpen(PMCBOOL shutterOpen)
 	return PMCBOOL();
 }
 
-PMCBOOL BoatModule::setBoatZAxisMove(int position)
+PMCBOOL BoatModule::setBoatZAxisMove(int position,double speed)
 {
 	boatModule->boatElevator->aoTargetPosition.setFloatValue(position);
-	boatModule->boatElevator->aoTargetSpeed.setDoubleValue(boatModule->boatElevator->scMoveSpeed);
+	boatModule->boatElevator->aoTargetSpeed.setDoubleValue(speed);
 	boatModule->boatElevator->doHome.setBoolValue(FALSE);
 	boatModule->boatElevator->doInit.setBoolValue(FALSE);
 	boatModule->boatElevator->doMove.setBoolValue(FALSE);

+ 1 - 1
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/BoatModule.h

@@ -37,7 +37,7 @@ public:
 	PMCBOOL checkPrepareMove();
 	PMCBOOL autoShutterOpen(PMCBOOL shutterOpen);
 	PMCBOOL checkAutoShutterOpen(PMCBOOL shutterOpen);
-	PMCBOOL setBoatZAxisMove(int position);
+	PMCBOOL setBoatZAxisMove(int position,double speed);
 	PMCBOOL setBoatRAxisMove(BoatRotateDirection direction);
 	OperatorStatusEnum checkBoatZAxisMove(int position);
 	OperatorStatusEnum checkBoatRAxisMove(BoatRotateDirection direction);

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

@@ -35,8 +35,8 @@ char* CEV::parseErrCodeV(const char* errCode, const char * envString) {
         size_t findCommIndex = 0;
         size_t lastCommIndexPlus1 = 0;
         size_t envLen = strlen(envString);
-        static Fields<MAX_PARAM_COUNT> envFields;
-        envFields.clear();
+        static Fields  envFields;
+        
         envFields.parse(envString, ';');
 
         size_t findLeft = 0;

+ 173 - 0
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/Fields.cpp

@@ -0,0 +1,173 @@
+#include"TcPch.h"
+#pragma hdrstop
+#include"Fields.h"
+#include"debug.h"
+#define MAX_STATIC_FIELDS_SIZE 1024*200
+static char fieldsMemory[MAX_STATIC_FIELDS_SIZE * 6];
+/*
+* 存储结构
+*     [32字节块][32字节块].........共MAX_STATIC_FIELDS_SIZE字节长,6400条
+* *   [64字节块][64字节块].........共MAX_STATIC_FIELDS_SIZE字节长,3200条
+* *   [128字节块][128字节块].......共MAX_STATIC_FIELDS_SIZE字节长,1600条
+* *   [256字节块][256字节块].......共MAX_STATIC_FIELDS_SIZE字节长,800条
+* *   [512字节块][512字节块].......共MAX_STATIC_FIELDS_SIZE字节长,400条
+* *   [1024字节块][1024字节块].....共MAX_STATIC_FIELDS_SIZE字节长,200条
+* 每块结构:
+*     [1个字节占用标志][块长度-2个字节数据][1个字节0]
+*     占用标志:0-空闲 1-占用
+* 请注意Fields经过优化之后,只能用于静态使用场景,即不会自动释放空间,除非调用clear或者parse
+*/
+void initAllFields() {
+	memset(fieldsMemory, '\0', sizeof(fieldsMemory));
+
+}
+
+//得到一个空闲块地址
+static char* allockOneField(int size) {
+	int index = 0;
+	int offset = 0;
+	int blockSize = 0;
+	if (size + 2 > 1024) {
+		return NULL;
+	}else if (size + 2 > 512) {
+		index = 5;
+		blockSize = 1024;
+	}
+	else if (size + 2 > 256) {
+		index = 4;
+		blockSize = 512;
+	}
+	else if (size + 2 > 128) {
+		index = 3;
+		blockSize = 256;
+	}
+	else if (size + 2 > 64) {
+		index = 2;
+		blockSize = 128;
+	}
+	else if (size + 2 > 32) {
+		index = 1;
+		blockSize = 64;
+	}
+	else {
+		index = 0;
+		blockSize = 32;
+	}
+	int blockCount = MAX_STATIC_FIELDS_SIZE / blockSize;
+	for (offset = 0; offset < blockCount; offset++) {
+		if (!fieldsMemory[index * MAX_STATIC_FIELDS_SIZE + offset * blockSize]) {
+			break;
+		}
+	}
+	if (offset < blockCount) {
+		fieldsMemory[index * MAX_STATIC_FIELDS_SIZE + offset * blockSize] = 1;
+		return fieldsMemory + index * MAX_STATIC_FIELDS_SIZE + offset * blockSize+1;
+	}
+	return NULL;
+}
+void freeOneField(char* ptr) {
+	if (ptr == NULL) {
+		return;
+	}
+	*(ptr - 1) = 0;
+}
+short Fields::size() {
+	return length;
+}
+Fields::Fields() {
+	memset(&fields, '\0', sizeof(fields));
+	length = 0;
+}
+void Fields::clear() {
+	for (int i = 0; i < MAX_PARAM_COUNT; i++) {
+		if (fields[i] != NULL) {
+			freeOneField(fields[i]);
+			fields[i] = NULL;
+		}
+		else {
+			break;
+		}
+
+	}
+	length = 0;
+}
+void Fields::parse(const char* src, char split) {
+	int pos1 = 0;
+	int pos2 = 0;
+	length = 0;
+	clear();
+	if (src == NULL) {
+		return;
+	}
+	PMCBOOL breakFlag = FALSE;
+	while (!breakFlag) {
+		if (src[pos2] == 0) {
+			breakFlag = TRUE;
+		}
+		if (src[pos2] == split || src[pos2] == '\0') {
+			if (pos2 - pos1 >= MAX_NAME_LEN) {
+				logger->error("String fields too long:[%.20s]", src);
+				return;
+			}
+			if (length >= MAX_PARAM_COUNT) {
+				logger->error("String fields too more:[%.20s]", src);
+				return;
+			}
+			fields[length] = allockOneField(pos2 - pos1);
+			if (fields[length] != NULL) {
+				memcpy(fields[length], src + pos1, pos2 - pos1);
+				fields[length][pos2 - pos1] = '\0';
+			}
+			else {
+				logger->error("Too more fields,please reset the MAX_STATIC_FIELDS_SIZE");
+				return;
+			}
+
+			pos1 = pos2 + 1;
+
+			//zipSpace(fields[length]);
+			length++;
+
+		}
+		pos2++;
+	}
+}
+char* Fields::get(short index) {
+	if (index < 0 || index >= length) {
+		return NULL;
+	}
+	return fields[index];
+}
+#ifdef _DEBUG
+char* Fields::getValue(const char* key, const char* file , int line) {
+	size_t keyLen = strlen(key);
+	if (keyLen >= MAX_NAME_LEN - 1) {
+		return NULL;
+	}
+	static char keyEqual[MAX_NAME_LEN];
+	strcpy_debug(keyEqual, key, sizeof(keyEqual), file, line);
+	strcat(keyEqual, "=");
+	for (int i = 0; i < length; i++) {
+		if (strncmp(keyEqual, fields[i], keyLen + 1) == 0) {
+			return fields[i] + keyLen + 1;
+		}
+	}
+	return NULL;
+}
+#else
+char* Fields::getValue(const char* key) {
+	size_t keyLen = strlen(key);
+	if (keyLen >= MAX_NAME_LEN - 1) {
+		return NULL;
+	}
+	static char keyEqual[MAX_NAME_LEN];
+	strcpy(keyEqual, key);
+	strcat(keyEqual, "=");
+	for (int i = 0; i < length; i++) {
+		if (strncmp(keyEqual, fields[i], keyLen + 1) == 0) {
+			return fields[i] + keyLen + 1;
+		}
+	}
+	return NULL;
+}
+#endif

+ 12 - 98
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/Fields.h

@@ -2,110 +2,24 @@
 #define __Fields_H__
 #include"pmc_types.h"
 #include"CRemoteLog.h"
-template <short MAX_SIZE>
+#include"string.h"
+
+
+
 class Fields {
 private:
-	char fields[MAX_SIZE][MAX_NAME_LEN];
-	void zipSpace(char* str) {
-		int i = 0;
-		int j = 0;
-		while (str[i] != '\0') {
-			if (str[i] != ' ' && str[i] != '\t') {
-				if (i != j) {
-					str[j] = str[i];
-				}
-				j++;
-			}
-			
-			i++;
-		}
-		str[j] = '\0';
-	}
+	char* fields[MAX_PARAM_COUNT];
 public:
 	short length;
-	short size() {
-		return length;
-	}
-	Fields() {
-		memset(&fields, '\0', sizeof(fields));
-		length = 0;
-	}
-	void clear() {
-		memset(&fields, '\0', sizeof(fields));
-		length = 0;
-	}
-	void parse(const char* src, char split) {
-		int pos1 = 0;
-		int pos2 = 0;
-		length = 0;
-		clear();
-		if (src == NULL) {
-			return;
-		}
-		PMCBOOL breakFlag = FALSE;
-		while (!breakFlag) {
-			if (src[pos2] == 0) {
-				breakFlag = TRUE;
-			}
-			if (src[pos2] == split || src[pos2] == '\0') {
-				if (pos2 - pos1 >= MAX_NAME_LEN) {
-					logger->info("String fields too long:[%s]", src);
-					return;
-				}
-				if (length >= MAX_SIZE) {
-					logger->info("String fields too more:[%s]", src);
-					return;
-				}
-				memcpy(fields[length], src + pos1, pos2 - pos1);
-				fields[length][pos2 - pos1] = '\0';
-				
-				pos1 = pos2+1;
-				
-				//zipSpace(fields[length]);
-				length++;
-				
-			}
-			pos2++;
-		}
-	}
-	char* get(short index) {
-		if (index < 0 || index >= length) {
-			return NULL;
-		}
-		return fields[index];
-	}
+	short size();
+	Fields();
+	void clear();
+	void parse(const char* src, char split);
+	char* get(short index);
 #ifdef _DEBUG
-	char* getValue(const char* key,const char* file=__FILE__,int line=__LINE__) {
-		size_t keyLen = strlen(key);
-		if (keyLen >= MAX_NAME_LEN - 1) {
-			return NULL;
-		}
-		static char keyEqual[MAX_NAME_LEN];
-		strcpy_debug(keyEqual, key,sizeof(keyEqual),file,line);
-		strcat(keyEqual, "=");
-		for (int i = 0; i < length; i++) {
-			if (strncmp(keyEqual, fields[i], keyLen + 1) == 0) {
-				return fields[i] + keyLen + 1;
-			}
-		}
-		return NULL;
-	}
+	char* getValue(const char* key, const char* file = __FILE__, int line = __LINE__);
 #else
-	char* getValue(const char* key) {
-		size_t keyLen = strlen(key);
-		if (keyLen >= MAX_NAME_LEN - 1) {
-			return NULL;
-		}
-		static char keyEqual[MAX_NAME_LEN];
-		strcpy(keyEqual, key);
-		strcat(keyEqual, "=");
-		for (int i = 0; i < length; i++) {
-			if (strncmp(keyEqual, fields[i], keyLen + 1) == 0) {
-				return fields[i] + keyLen + 1;
-			}
-		}
-		return NULL;
-	}
+	char* getValue(const char* key);
 #endif
 };
 #endif

+ 3 - 3
TIN001-PLC/Jet_Furance_PMC/Jet_Furance_PMC/Jet_Furance_PMC/FurancePMC/OP.cpp

@@ -48,7 +48,7 @@ OperatorNode::OperatorNode()
 
 void OperatorNode::reset()
 {
-	
+	OP->current = this;
 	elapsedDelayTime = elapsedStableTime = elapsedTriggerAlarmTime =elapsedTriggerWarningTime= elapsedTimeout=0;
 	isInDelay = FALSE;
 	isTimeout = FALSE;
@@ -56,7 +56,6 @@ void OperatorNode::reset()
 	subOpIndex = 0;
 	confirm = 0;
 	method = 0;
-	paramsCount = 0;
 	if (resetFunction != NULL) {
 		resetFunction();
 	}
@@ -866,7 +865,8 @@ void COP::reset()
 {
 	
 	for (int index = 0; index < opTree.length;index++) {
-		opTree.getByIndex(index)->reset();
+		currentRoot = opTree.getByIndex(index);
+		currentRoot->reset();
 	}
 	current = currentRoot = NULL;
 	isAborted = FALSE;

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

@@ -45,8 +45,7 @@ private:
     
 public:
     char name[MAX_NAME_LEN] = { 0 };
-    Fields<MAX_PARAM_COUNT> params;
-    short paramsCount=0;
+    Fields  params;
     OperatorStatusEnum status=OperatorStatusEnum::INIT;
     
     //char  alarmText[MAX_CONTEXT_LEN]; 错误信息放到OP中,省点空间