⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 optimize.lst

📁 一整套电梯控制器源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 264   5      					else if((updown_flg==0)&&(pFangXiang->bShang==0)&&(pFangXiang->bXia==1)){//方向一致(下)
 265   6      						pWashOutFlg[i] = 0;//do nothing
 266   6      					}
 267   5      					else{
 268   6      						pWashOutFlg[i] = 1;
 269   6      					}
 270   5      
 271   5      				}
 272   4      			}
 273   3      		}
 274   2      	}
 275   1      /*	uchar m_cENum = m_pL_Data->cENum;
 276   1      	uchar i=0;
 277   1      	uchar  bExist = 0;
 278   1      
 279   1      	for(i=0; i<m_cENum; i++){
 280   1      		E_DianTi *pEleData = &(m_pE_InputData->mDianTi[i]);
 281   1      		if(pWashOutFlg[i] == 0){
 282   1      			if(pEleData->bNeiXuanKeTing[cLIdx] == 1)
 283   1      				bExist = 1;
 284   1      		}
 285   1      	}
 286   1      	
 287   1      	if( bExist == 1){
 288   1      		for(i=0; i<m_cENum; i++){
 289   1      			E_DianTi *pEleData = &(m_pE_InputData->mDianTi[i]);
 290   1      			if(pWashOutFlg[i] == 0){
 291   1      				if(pEleData->bNeiXuanKeTing[cLIdx] != 1)
 292   1      					pWashOutFlg[i] = 1;
 293   1      			}
 294   1      		}
 295   1      	}*/
 296   1      }
 297          
 298          void WashOut_MoreStopCntEle(uchar *pWashOutFlg)
 299          {
 300   1      	uchar m_cENum = m_pL_Data->cENum;
 301   1      	uchar cStopCnt_min = 0xFF;	//初始时,设置可停站数足够大
 302   1      	uchar cStopCnt=0;			//电梯可停站数
 303   1      	uchar i=0;
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 19  

 304   1      	uchar j=0;
 305   1      
 306   1      	for(i=0; i<m_cENum; i++){
 307   2      		if(pWashOutFlg[i] == 0){
 308   3      			//取得电梯可停站数
 309   3      			cStopCnt = m_InterData[i].cStopCount;
 310   3      			if(cStopCnt<cStopCnt_min){			//出现新最小
 311   4      				//更新最小
 312   4      				cStopCnt_min = cStopCnt;
 313   4      				//确保淘汰前面的电梯
 314   4      				for(j=0; j<i; j++){
 315   5      					if(pWashOutFlg[j] == 0)
 316   5      						pWashOutFlg[j] = 1;
 317   5      				}
 318   4      			}else if(cStopCnt == cStopCnt_min){	//与前次相同
 319   4      				//do nothing 
 320   4      			}else{								//出现更大
 321   4      				//设置淘汰标记
 322   4      				pWashOutFlg[i] = 1;
 323   4      			}
 324   3      		}
 325   2      	}
 326   1      }
 327          
 328          //返回:0xFF--无电梯可以分配
 329          //		0x00至0x07--正确的返回值
 330          uchar WashOut_LargerIndexEle(uchar *pWashOutFlg)
 331          {
 332   1      	uchar m_cENum = m_pL_Data->cENum;
 333   1      	uchar cPRINo_min = 0xFF;	//初始时,设置电梯优先级号足够大
 334   1      	uchar cPRINo = 0;
 335   1      	uchar i=0;
 336   1      	uchar j=0;
 337   1      	uchar cBestIdx=0xFF;
 338   1      
 339   1      	for(i=0; i<m_cENum; i++){
 340   2      		if(pWashOutFlg[i] == 0){
 341   3      			//取得电梯优先级号
 342   3      			cPRINo = m_InterData[i].cPRINo;
 343   3      			if(cPRINo<cPRINo_min){			//出现新最小
 344   4      				//更新最小
 345   4      				cPRINo_min = cPRINo;
 346   4      				//!!!最优电梯诞生
 347   4      				cBestIdx = i;
 348   4      				//确保淘汰前面的电梯
 349   4      				for(j=0; j<i; j++){
 350   5      					if(pWashOutFlg[j] == 0)
 351   5      						pWashOutFlg[j] = 1;
 352   5      				}
 353   4      			}else if(cPRINo == cPRINo_min){	//与前次相同
 354   4      				//do nothing 
 355   4      			}else{							//出现更大
 356   4      				//设置淘汰标记
 357   4      				pWashOutFlg[i] = 1;
 358   4      			}
 359   3      		}
 360   2      	}
 361   1      
 362   1      	return cBestIdx;
 363   1      }
 364          
 365          //更新外呼分配数据
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 20  

 366          void UpdateDistribution(uchar cLIdx, uchar updown_flg, uchar cBestEleNo)
 367          {
 368   1      	E_XiangYing *pXiangYing = 0;
 369   1      	uchar m_cENum = m_pL_Data->cENum;
 370   1      	uchar i=0;
 371   1      
 372   1      	for(i=0; i<m_cENum; i++){
 373   2      		pXiangYing = &(m_pE_OutputData->mXiangYing[i]);
 374   2      		if(updown_flg == D_Up){
 375   3      			if(i != cBestEleNo)
 376   3      //				pXiangYing->bShang[cLIdx] = 0;	//确保撤销原有分配
 377   3      				SetArrayData(pXiangYing->bShang, cLIdx, 0);
 378   3      			else
 379   3      //				pXiangYing->bShang[cLIdx] = 1;	//将该外呼分配给最优电梯
 380   3      				SetArrayData(pXiangYing->bShang, cLIdx, 1);
 381   3      		}else{
 382   3      			if(i != cBestEleNo)
 383   3      //				pXiangYing->bXia[cLIdx] = 0;	//确保撤销原有分配
 384   3      				SetArrayData(pXiangYing->bXia, cLIdx, 0);
 385   3      			else
 386   3      //				pXiangYing->bXia[cLIdx] = 1;	//将该外呼分配给最优电梯
 387   3      				SetArrayData(pXiangYing->bXia, cLIdx, 1);
 388   3      		}
 389   2      	}	
 390   1      }
 391          
 392          //静态停靠时,更新内选数据
 393          void UpdateStaticStopDistribution(uchar cLIdx, uchar cBestEleNo)
 394          {
 395   1      	E_DianTi    *pEleData = 0;
 396   1      	E_WaiHu		*pWaiHu = &(m_pE_InputData->mWaiHu);
 397   1      	uchar m_cENum = m_pL_Data->cENum;
 398   1      	uchar i=0;
 399   1      
 400   1      //	for(i=0; i<m_cENum; i++){
 401   1      		pEleData   = &(m_pE_InputData->mDianTi[cBestEleNo]);
 402   1      		//设置内选数据
 403   1      		SetArrayData(pEleData->bNeiXuan, cLIdx, 1);
 404   1      		//确保撤销"人为设定外呼"
 405   1      		SetArrayData(pWaiHu->bShang, cLIdx, 0);
 406   1      		SetArrayData(pWaiHu->bXia, cLIdx, 0);
 407   1      //	}	
 408   1      }
 409          
 410          //第cEIdx部电梯响应第cLIdx层外呼所需要的时间(单位:十分之一秒)
 411          //参数:cEIdx--电梯索引
 412          //		cLIdx--外呼楼层数
 413          //		updown_flg--外呼的方向(1:上 0:下)
 414          uint GetEleToFloorTime(uchar cEIdx, uchar cLIdx, uchar updown_flg)
 415          {
 416   1      	E_DianTi	*pEleData	= &(m_pE_InputData->mDianTi[cEIdx]);
 417   1      	E_FangXiang	*pFangXiang = &(pEleData->FangXiang);
 418   1      	E_Men		*pMen		= &(pEleData->Men);
 419   1      	E_MenTime	*pMenTime	= &(pEleData->MenTime);
 420   1      	uchar cTopFloor		= pEleData->cZuiGaoCeng-1;	//可到最高层(-1是因为楼层计数从1开始)
 421   1      	uchar cBottomFloor	= pEleData->cZuiDiCeng-1;	//可到最底层(-1是因为楼层计数从1开始)
 422   1      
 423   1      	uchar cNextStopLIdx=0xFE;	//下一停靠层索引(0xFF代表搜索完毕)
 424   1      	uchar cCurFloorIdx  = pEleData->cDangQianCeng-1;
 425   1      	uchar cStartFloorIdx= pEleData->cDangQianCeng-1;
 426   1      	uchar cCanStopFloorCnt= pEleData->cZuiGaoCeng - pEleData->cZuiDiCeng;
 427   1      	uint  time=0;				//时间
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 21  

 428   1      	uchar  bStartDirect=0;		//初始搜索方向
 429   1      	uchar  bDirect=0;			//搜索方向(1:上   0:下)
 430   1      	uchar  bEnd=0;				//搜索结束标记(1:结束 0:未结束)
 431   1      
 432   1      	uchar SearchCount=0;	//搜索计数(防止死循环,不能正常返回)
 433   1      	uchar cLastStopLIdx = cStartFloorIdx;
 434   1      	uint nYinZi = 10;		//2004.06.23 added by LHM(为解决计算为0的问题)
 435   1      	uchar cStartSearchEnd=0;	//起始搜索阶段(分三个阶段:1,起始搜索阶段;2,第一次折返搜索阶段;3,第二次折返搜索阶
             -段)
 436   1      
 437   1      	//若外呼层正好有电梯,判断该电梯是否可以立即响应该外呼,以下情况视为可以立即响应:
 438   1      	//1)外呼层=电梯当前层,无方向
 439   1      	//2)外呼层=电梯当前层,运行方向与外呼方向一致,关门未到位
 440   1      	if( cLIdx==cCurFloorIdx ){					//无方向时
 441   2      		if((pFangXiang->bShang==0)&&(pFangXiang->bXia==0)){
 442   3      			return time;
 443   3      		}else if(((pFangXiang->bShang==1)&&(pFangXiang->bXia==0)) && (updown_flg==D_Up) && 
 444   2      			(pEleData->Men.bGuanMenDaoWei==0)){ //都为上向,关门未到位
 445   3      			return time;
 446   3      		}else if(((pFangXiang->bShang==0)&&(pFangXiang->bXia==1)) && (updown_flg==D_Down) && 
 447   2      			(pEleData->Men.bGuanMenDaoWei==0)){	//都为下向,关门未到位
 448   3      			return time;
 449   3      		}
 450   2      	}
 451   1      
 452   1      	//设定初始搜索方向(搜索方向应该与电梯运动方向一致)
 453   1      	if(pFangXiang->bShang==1 && pFangXiang->bXia==0){	  //方向向上,搜索方向按"上->下->上"
 454   2      		bStartDirect = D_Up;
 455   2      		bDirect = D_Up;
 456   2      	}
 457   1      	else if(pFangXiang->bShang==0 && pFangXiang->bXia==1){//方向向下,搜索方向按"下->上->下"
 458   2      		bStartDirect = D_Down;
 459   2      		bDirect = D_Down;
 460   2      	}else{												  //无方向,确定运动趋势方向
 461   2      		bStartDirect = GetNoDirectEleTrend(cEIdx);
 462   2      //		bDirect = GetNoDirectEleTrend(cEIdx);
 463   2      		bDirect = bStartDirect;
 464   2      	}
 465   1      
 466   1      	if(cStartFloorIdx == cTopFloor){				  //当前层为最高层,搜索方向向下
 467   2      		bStartDirect = D_Down;
 468   2      		bDirect = D_Down;
 469   2      	}else if(cStartFloorIdx == cBottomFloor){			  //当前层为最底层,搜索方向向下
 470   2      		bStartDirect = D_Up;
 471   2      		bDirect = D_Up;
 472   2      	}
 473   1      
 474   1      	//若电梯处于静止,检查门的状态,如需要累加开关门时间()
 475   1      	//2004.07.16 LHM
 476   1      	if(pEleData->bDongOrJing == 0){	//处于静止
 477   2      		if(GetDoorActionState(cEIdx)==2/*Door_Opening*/){		//开门中
 478   3      			time += pMenTime->cKaiMenTime*nYinZi;						//累加自动关门延迟时间	//2004.06.16 LHM debug
 479   3      			time += pMenTime->cGMYanChiTime*nYinZi;						//累加自动关门延迟时间
 480   3      			time += pMenTime->cGuanMenTime*nYinZi;						//累加关门时间
 481   3      		}else if(GetDoorActionState(cEIdx) == 0/*Door_OpenOK*/){	//开门到位
 482   3      			time += pMenTime->cGMYanChiTime*nYinZi;						//累加自动关门延迟时间	//2004.06.16 LHM debug
 483   3      			time += pMenTime->cGuanMenTime*nYinZi;						//累加关门时间
 484   3      		}else if(GetDoorActionState(cEIdx) == 3/*Door_Closing*/){//关门中
 485   3      			time += pMenTime->cGuanMenTime*nYinZi;						//累加关门时间(不能确认关门到何位置,做保守处理)
 486   3      		}else if(GetDoorActionState(cEIdx) == 1/*Door_CloseOK*/){//关门到位+电梯停止时序(不是当前层)
 487   3      				//2004.07.14 Modified by LHM(因为前面已考虑过当前层响应问题,这里的累加时间仅适应于非当前层外呼)
 488   3      				if(pEleData->bLingSuXinHao==1){
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 22  

 489   4      					time += pMenTime->cKaiMenTime*nYinZi;						//累加自动关门延迟时间	
 490   4      					time += pMenTime->cGMYanChiTime*nYinZi;						//累加自动关门延迟时间
 491   4      					time += pMenTime->cGuanMenTime*nYinZi;						//累加关门时间
 492   4      				}
 493   3      		}
 494   2      	}
 495   1      
 496   1      	while(1){
 497   2      
 498   2      		SearchCount++;
 499   2      		if(SearchCount>(cCanStopFloorCnt*2)){	// Error Logic. Dead loop.
 500   3      //				TRACE("No.%d elevator cCurFloorIdx=%d cStartFloorIdx=%d cNextStopLIdx=%d bStartDirect=%d bDirect=%d\
             -n",cEIdx,cCurFloorIdx,cStartFloorIdx,cNextStopLIdx,bStartDirect,bDirect);
 501   3      //				AfxMessageBox("Dead loop.");
 502   3      			SearchCount = 0;
 503   3      			time=0xFFFF;
 504   3      			return time;
 505   3      		}
 506   2      
 507   2      		//取得下一停靠层的楼层数,以及停靠之后的搜索方向
 508   2      		cNextStopLIdx = GetNextStopLIdx(cEIdx, cStartFloorIdx, bStartDirect, &bDirect, &cStartSearchEnd);
 509   2      
 510   2      
 511   2      		if( cNextStopLIdx == 0xFF){			//搜索结束,未发现到达或超越该外呼层的停靠
 512   3      			cNextStopLIdx = cLIdx;				//设定下一停靠层为外呼层
 513   3      			bEnd = 1;							//设置搜索结束标记
 514   3      		}else{								//检查是否到达或"超过"外呼层,若超过,结束搜索
 515   3      /*1)*/		if(updown_flg == D_Up){			//上呼
 516   4      				if(bStartDirect == D_Down){		//初始搜索方向向下
 517   5      					if(cLIdx<=cCurFloorIdx){		//外呼层小于等于当前层
 518   6      						if((bDirect==D_Down) && (cNextStopLIdx<cCurFloorIdx)){
 519   7      							//do nothing
 520   7      						}else if((bDirect==D_Up) && (cNextStopLIdx>=cLIdx)){
 521   7      							cNextStopLIdx = cLIdx;
 522   7      							bEnd = 1;
 523   7      						}else if((bDirect==D_Down) && (cNextStopLIdx>=cCurFloorIdx) &&(cStartSearchEnd==1)){
 524   7      							
 525   7      							cNextStopLIdx = cLIdx;
 526   7      							bEnd = 1;
 527   7      						}
 528   6      					}else/*if(cLIdx>cCurFl

⌨️ 快捷键说明

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