optimize.c

来自「一整套电梯控制器源程序」· C语言 代码 · 共 971 行 · 第 1/3 页

C
971
字号
	E_DianTi    *pEleData   = &(m_pE_InputData->mDianTi[cEIdx]);
	E_FangXiang	*pFangXiang = &(pEleData->FangXiang);
	E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);
	schar i=0;
	uchar cTopFloor		= pEleData->cZuiGaoCeng-1;	//最高层(-1是因为楼层计数从1开始)
	uchar cBottomFloor	= pEleData->cZuiDiCeng-1;	//最底层(-1是因为楼层计数从1开始)
	uchar cCurFloor		= pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)
	

	if(bStartDirect==1){		//初始搜索方向向上
		
		//首先,检查"电梯向上运行阶段,是否有停靠层"
		if((*bDirect==D_Up) && (cStartFloorIdx>=cCurFloor)){
//2004.02.12 Modified by LHM
//			for(i=(cStartFloorIdx+1); i<=cTopFloor; i++){
			for(i=(cStartFloorIdx); i<=cTopFloor; i++){
				//可到最高层处,切换搜索方向
				if(i==cTopFloor)	
					*bDirect = D_Down;	
				//如果有停靠层,返回该值
//				if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bShang[i]==1) )
				if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bShang, i)==1) )
						return i;
			}
			//若直至"可到最高层"都未发现停靠层,改变运动趋势
			cStartFloorIdx = cTopFloor;
		}
		//然后,检查"向下运行阶段,是否有停靠层"
		if(*bDirect == D_Down){
			*cStartSearchEnd=1;
			for(i=cStartFloorIdx; i>=cBottomFloor; i--){
				//可到最底层处,切换搜索方向
				if(i==cBottomFloor)
					*bDirect = D_Up;
				//如果有停靠层,返回该值
//				if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bXia[i]==1) )
				if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bXia, i)==1) )
					return i;
			}
			//若直至"可到最底层"都未发现停靠层,改变运动趋势
			cStartFloorIdx = cBottomFloor;
		}
		//最后,检查"电梯再次向上运行阶段,是否有停靠层"
		if(*bDirect == D_Up){
			for(i=cStartFloorIdx; i<=cCurFloor; i++){
				//搜索完毕
				if(i==cCurFloor)
					return 0xFF;
				//如果有停靠层,返回该值
//				if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bShang[i]==1) )
				if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bShang, i)==1) )
					return i;
			}
		}
	}else/*if(bStartDirect==0)*/{	//初始搜索方向向下
		//首先,检查"电梯向下运行阶段,是否有停靠层"
		if(*bDirect == D_Down){
//			for(i=(cStartFloorIdx-1); i>=cBottomFloor; i--){	//2003.02.12 Modified by LHM  
			for(i=(cStartFloorIdx); i>=cBottomFloor; i--){
				//可到最底层处,切换搜索方向
				if(i==cBottomFloor)
					*bDirect = D_Up;
				//如果有停靠层,返回该值
//				if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bXia[i]==1) )
				if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bXia, i)==1) )
					return i;
			}
			//若直至"可到最底层"都未发现停靠层,改变运动趋势
			cStartFloorIdx = cBottomFloor;
		}
		//然后,检查"向上运行阶段,是否有停靠层"
		if(*bDirect == D_Up){
			*cStartSearchEnd=1;
			for(i=cStartFloorIdx; i<=cTopFloor; i++){
				//可到最高层处,切换搜索方向
				if(i==cTopFloor)	
					*bDirect = D_Down;	
				//如果有停靠层,返回该值
//				if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bShang[i]==1) )
				if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bShang, i)==1) )
					return i;
			}
			//若直至"可到最高层"都未发现停靠层,改变运动趋势
			cStartFloorIdx = cTopFloor;
		}
		//最后,检查"电梯再次向下运行阶段,是否有停靠层"
		if(*bDirect == D_Down){
			for(i=cStartFloorIdx; i>=cCurFloor; i--){
				//搜索完毕
				if(i==cCurFloor)
					return 0xFF;
				//如果有停靠层,返回该值
//				if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bXia[i]==1) )
				if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bXia, i)==1) )
					return i;
			}
		}

	}/*else if((pFangXiang->bShang==0) && (pFangXiang->bXia==0)){	//无方向

	}else if((pFangXiang->bShang==1) && (pFangXiang->bXia==1)){
		//do nothing
	}*/

	return 0xFF;	//其后暂无任务(既无内选又无外呼分配)
}

//估算中间无停靠的电梯运行,所要花费的时间
//单位:十分之一秒
//
//公式:1)平均楼层高度 = 平均楼层脉冲数/编码器脉冲数*所选曲线匀速段速度*60/转速
//单位:      (mm)		                              (分米/秒)                (转/分)
//
//公式:2)所选曲线匀速段速度 = 运行速度*100*所选曲线速度/额定频率
//单位:      (毫米/秒)        (分米/秒)    (Hz)       (Hz)
uint CalTimeToDest(uchar cEIdx, uchar cStartFloor, uchar cEndFloor)
{
/*	E_DianTi *pEleData	  = &(m_pE_InputData->mDianTi[cEIdx]);
	uchar cCurFloor		  = pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)
	uchar cQuXianShu	  = pEleData->cQuXianShu;
	ulong lHeightPerFloor = 0;
	uchar cQuXianFloorNum = 0;
	uchar cFloorNum		  = 0;
	uchar cSpeedHz		  = 0;
	uint  nSpeed		  = 0;
	uint  nTime		      = 0;
	uint  nYinZi		  = 100;		//2004.06.23 added by LHM(为解决nSpeed计算为0的问题)

	//两次停靠之间的楼层数
	if(cStartFloor>cEndFloor)
		cFloorNum = cStartFloor - cEndFloor;
	else
		cFloorNum = cEndFloor - cStartFloor;

	if(cStartFloor == cCurFloor)	//第一阶段的曲线数选择,要使用起始层
		cStartFloor = m_cCurStageStartFloor[cEIdx];
	if(cStartFloor>cEndFloor)
		cQuXianFloorNum = cStartFloor - cEndFloor;
	else
		cQuXianFloorNum = cEndFloor - cStartFloor;

	//零楼层间距
//	if(cQuXianFloorNum==0)
	if(cFloorNum==0)
		return 0;

	//所选曲线的匀速段速度(单位:Hz)
	//(选曲线的原则:间隔1层选曲线1,间隔2层选曲线2...,超过最大间隔层选择最高曲线)
	if(cQuXianFloorNum <= pEleData->cQuXianShu)
		cSpeedHz = pEleData->nTiSu[cQuXianFloorNum-1];
	else
		cSpeedHz = pEleData->nTiSu[pEleData->cQuXianShu-1];

	//速度值转换为"毫米/秒"
	nSpeed = (pEleData->cYunXingTiSu*nYinZi*cSpeedHz)/pEleData->cPinLv;

	//平均每层的高度(单位:毫米)
//2004.04.22 Modified by LHM
	lHeightPerFloor = pEleData->lDGCMaiChongShu/pEleData->lBMQMaiChongShu*nSpeed*60/pEleData->nZhuanSu;
//end

	//中间无停靠运行,所要花费的时间
	nTime = (uint)(lHeightPerFloor*cFloorNum*10/nSpeed);
	
	return nTime;
*/
	E_DianTi *pEleData	  = &(m_pE_InputData->mDianTi[cEIdx]);
	uchar cCurFloor		  = pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)
	uchar cQuXianShu	  = pEleData->cQuXianShu;
	ulong lHeightPerFloor = 0;
	uchar cFloorNum		  = 0;
	uchar cSpeedHz		  = 0;
	uint  nSpeed		  = 0;
	uint  nTime		      = 0;
	uint  nYinZi		  = 100;		//2004.06.23 added by LHM(为解决nSpeed计算为0的问题)

	//两次停靠之间的楼层数
	if(cStartFloor>cEndFloor)
		cFloorNum = cStartFloor - cEndFloor;
	else
		cFloorNum = cEndFloor - cStartFloor;

	if(cStartFloor == cCurFloor)	//第一阶段的曲线数选择,要使用起始层
		cStartFloor = m_cCurStageStartFloor[cEIdx];

	//零楼层间距
	if(cFloorNum==0)
		return 0;

	//所选曲线的匀速段速度(单位:Hz)
	//(选曲线的原则:间隔1层选曲线1,间隔2层选曲线2...,超过最大间隔层选择最高曲线)
	if(cFloorNum <= pEleData->cQuXianShu)
		cSpeedHz = pEleData->nTiSu[cFloorNum-1];
	else
		cSpeedHz = pEleData->nTiSu[pEleData->cQuXianShu-1];

	//速度值转换为"毫米/秒"
	nSpeed = (pEleData->cYunXingTiSu*nYinZi*cSpeedHz)/pEleData->cPinLv;

	//平均每层的高度(单位:毫米)
	lHeightPerFloor = pEleData->lDGCMaiChongShu/pEleData->lBMQMaiChongShu*nSpeed*60/pEleData->nZhuanSu;

	//中间无停靠运行,所要花费的时间
	nTime = (uint)(lHeightPerFloor*cFloorNum*10/nSpeed);
	
	return nTime;

}

//确定当前无方向电梯的运行趋势方向
//说明:1)与单梯定方向方法相同;
//      2)若无运动趋势则优先假定运动趋势向上;
//返回值:1-上   0-下
uchar GetNoDirectEleTrend(uchar cEIdx)
{
	E_DianTi    *pEleData   = &(m_pE_InputData->mDianTi[cEIdx]);
	E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);
	uchar i=0;
	uchar cTopFloor		= pEleData->cZuiGaoCeng-1;	//可到最高层(-1是因为楼层计数从1开始)
	uchar cBottomFloor	= pEleData->cZuiDiCeng-1;	//可到最底层(-1是因为楼层计数从1开始)
	uchar cCurFloor		= pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)

/*	//若当前层以上有内选,运动趋势向上
	for(i=(cCurFloor+1); i<=cTopFloor; i++){
//		if(pEleData->bNeiXuan[i]==1)
		if(GetArrayData(pEleData->bNeiXuan, i)==1)
			return 1;
	}

	//若当前层以下有内选,运动趋势向下
	for(i=cBottomFloor; i<=cCurFloor; i++){
//		if(pEleData->bNeiXuan[i]==1)
		if(GetArrayData(pEleData->bNeiXuan, i)==1)
			return 0;
	}

	//若当前层以上有上呼分配,运动趋势向上
	for(i=(cCurFloor+1); i<=cTopFloor; i++){
//		if(pXiangYing->bShang[i]==1)
		if(GetArrayData(pXiangYing->bShang, i)==1)
			return 1;
	}
	//若当前层以下有上呼分配,运动趋势向下
	for(i=cBottomFloor; i<=cCurFloor; i++){
//		if(pXiangYing->bShang[i]==1)
		if(GetArrayData(pXiangYing->bShang, i)==1)
			return 0;
	}
	//若当前层以上有下呼分配,运动趋势向上
	for(i=(cCurFloor+1); i<=cTopFloor; i++){
//		if(pXiangYing->bXia[i]==1)
		if(GetArrayData(pXiangYing->bXia, i)==1)
			return 1;
	}
	//若当前层以下有下呼分配,运动趋势向下
	for(i=cBottomFloor; i<=cCurFloor; i++){
//		if(pXiangYing->bXia[i]==1)
		if(GetArrayData(pXiangYing->bXia, i)==1)
			return 0;
	}
*/
	//若当前层以上有内选,运动趋势向上
	if((pEleData->bNeiXuan[0]!=0)||(pEleData->bNeiXuan[1]!=0)||(pEleData->bNeiXuan[2]!=0)||(pEleData->bNeiXuan[3]!=0)
		||(pEleData->bNeiXuan[4]!=0)||(pEleData->bNeiXuan[5]!=0)||(pEleData->bNeiXuan[6]!=0)){
		for(i=(cCurFloor+1); i<=cTopFloor; i++){
			if(GetArrayData(pEleData->bNeiXuan, i)==1)
				return 1;
		}
		//若当前层以下有内选,运动趋势向下
		for(i=cBottomFloor; i<=cCurFloor; i++){
			if(GetArrayData(pEleData->bNeiXuan, i)==1)
				return 0;
		}
	}

	if((pXiangYing->bShang[0]!=0)||(pXiangYing->bShang[1]!=0)||(pXiangYing->bShang[2]!=0)||(pXiangYing->bShang[3]!=0)
		||(pXiangYing->bShang[4]!=0)||(pXiangYing->bShang[5]!=0)||(pXiangYing->bShang[6]!=0)){
		//若当前层以上有上呼分配,运动趋势向上
		for(i=(cCurFloor+1); i<=cTopFloor; i++){
			if(GetArrayData(pXiangYing->bShang, i)==1)
				return 1;
		}
		//若当前层以下有上呼分配,运动趋势向下
		for(i=cBottomFloor; i<=cCurFloor; i++){
			if(GetArrayData(pXiangYing->bShang, i)==1)
				return 0;
		}
	}

	if((pXiangYing->bXia[0]!=0)||(pXiangYing->bXia[1]!=0)||(pXiangYing->bXia[2]!=0)||(pXiangYing->bXia[3]!=0)
		||(pXiangYing->bXia[4]!=0)||(pXiangYing->bXia[5]!=0)||(pXiangYing->bXia[6]!=0)){
		//若当前层以上有下呼分配,运动趋势向上
		for(i=(cCurFloor+1); i<=cTopFloor; i++){
			if(GetArrayData(pXiangYing->bXia, i)==1)
				return 1;
		}

		//若当前层以下有下呼分配,运动趋势向下
		for(i=cBottomFloor; i<=cCurFloor; i++){
			if(GetArrayData(pXiangYing->bXia, i)==1)
				return 0;
		}
	}	
	//若内选和外呼分配都没有,假定运动趋势向上
	return 1;
}

//第cEIdx电梯是否有内选
uchar IsExistInsel(uchar cEIdx)
{
	E_DianTi	*pEleData   = &(m_pE_InputData->mDianTi[cEIdx]); 
	E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);//外呼分配数据
	uchar cTopFloor    = pEleData->cZuiGaoCeng-1;
	uchar cBottomFloor = pEleData->cZuiDiCeng-1;
	uchar i=0;

	for(i=cBottomFloor; i<=cTopFloor; i++){
		if(GetArrayData(pEleData->bNeiXuan, i)==1)
			return 1;
	}

	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?