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

📄 optimize.lst

📁 一整套电梯控制器源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 368      =1  void can_call_in(uchar a);           //外呼
 369      =1  can_receive_more(uchar a);      //控制器
 370      =1  can_receive_only(uchar a);      //控制器
 371      =1  clear_unknow_code(uchar a);     //清乱码
 372      =1  void can_call_assign();              //外呼分派
 373      =1  can_call_lamp();                //暂定50ms循环点灯,灭灯
 374      =1  
 375      =1  
   2          
   3          /*uchar GetNextStopLIdx(uchar cEIdx, uchar cStartFloorIdx, uchar bStartDirect, uchar *bDirect);*/
   4          uint CalTimeToDest(uchar cEIdx, uchar cStartFloor, uchar cEndFloor);
   5          uint GetEleToFloorTime(uchar cEIdx, uchar cLIdx, uchar updown_flg);
   6          uchar IsExistInsel(uchar cEIdx);
   7          
   8          void WashOut_DistributeInSel(uchar *pWashOutFlg);
   9          void WashOut_2FloorMoveEle(uchar *pWashOutFlg);
  10          void WashOut_NotStopEle(uchar *pWashOutFlg);
  11          void WashOut_VetoEle(uchar *pWashOutFlg);
  12          uchar WashOut_LongTimeEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg);
  13          void WashOut_HeavyBearEle(uchar *pWashOutFlg);
  14          void WashOut_NoSameDirectionEle(uchar *pWashOutFlg);
  15          void WashOut_NoInSelStopEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg);
  16          void WashOut_MoreStopCntEle(uchar *pWashOutFlg);
  17          uchar WashOut_LargerIndexEle(uchar *pWashOutFlg);
  18          void UpdateDistribution(uchar cLIdx, uchar updown_flg, uchar cBestEleNo);
  19          void UpdateStaticStopDistribution(uchar cLIdx, uchar cBestEleNo);
  20          
  21          
  22          //对所有群控电梯进行选优处理
  23          //说明:只要不是所有电梯都被"一票否决",经过选优处理后,一定会选出一个最佳方案
  24          void OptimizeArrange(uchar cLIdx, uchar updown_flg)
  25          {
  26   1      	uchar m_cENum = m_pL_Data->cENum;
  27   1      	uchar cBestEIdx = INVALID_ELEINDEX;	//最优的电梯索引(注:INVALID_ELEINDEX代表无效索引)
  28   1      	uchar  bWashOutFlg[ENum_MAX];			//淘汰标记
  29   1      	uchar i=0;
  30   1      	uchar ret=0;								//时间计算正确与否
  31   1      
  32   1      	//淘汰标记清零
  33   1      	for(i=0; i<ENum_MAX; i++){
  34   2      		bWashOutFlg[i]	= 0;
  35   2      	}
  36   1      
  37   1      	//淘汰"2层以内运动中的电梯"
  38   1      	WashOut_2FloorMoveEle(bWashOutFlg);
  39   1      
  40   1      // if(cLIdx==8){
  41   1      //		mE_InputData.mDianTi[0].TongXun.bZhiShi=m_InterData[0].b2FloorMove;
  42   1      // }
  43   1      	//淘汰"该层不可停的电梯"
  44   1      	WashOut_NotStopEle(bWashOutFlg);
  45   1      
  46   1      	//淘汰"已被一票否决的电梯"
  47   1      	WashOut_VetoEle(bWashOutFlg);
  48   1      
  49   1      	//淘汰"到达该层所需时间较长的电梯"
  50   1      	ret = WashOut_LongTimeEle(cLIdx, updown_flg, bWashOutFlg);
  51   1      
  52   1      	//淘汰"承载较重的电梯"
  53   1      	WashOut_HeavyBearEle(bWashOutFlg);
  54   1      
  55   1      	//淘汰"非顺向的电梯"
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 15  

  56   1      	WashOut_NoSameDirectionEle(bWashOutFlg);
  57   1      
  58   1      	//若合格的电梯中有一部内选恰好为外呼,且方向一致,淘汰其余电梯
  59   1      	WashOut_NoInSelStopEle(cLIdx, updown_flg, bWashOutFlg);
  60   1      
  61   1      	//淘汰"停靠层站数较多的电梯"
  62   1      	WashOut_MoreStopCntEle(bWashOutFlg);
  63   1      
  64   1      	//淘汰"电梯优先级号较大的电梯",得到最优电梯序号
  65   1      	cBestEIdx = WashOut_LargerIndexEle(bWashOutFlg);
  66   1      
  67   1      //2004.07.21 LHM staticstop
  68   1      	if((cBestEIdx!=0xFF) && (ret==1)){	//最优电梯索引有效,时间计算有效
  69   2      			UpdateDistribution(cLIdx, updown_flg, cBestEIdx);
  70   2      	}else{
  71   2      //		P1_4=0;
  72   2      	}
  73   1      
  74   1      }
  75          
  76          void WashOut_DistributeInSel(uchar *pWashOutFlg)
  77          {
  78   1      	uchar m_cENum = m_pL_Data->cENum;
  79   1      	uchar i=0;
  80   1      
  81   1      	for(i=0; i<m_cENum; i++){
  82   2      		//对于当前所讨论的外呼,该电梯是否已被分配了内选
  83   2      		if(pWashOutFlg[i]==0)
  84   2      			if(IsExistInsel(i)==1) 
  85   2      				pWashOutFlg[i] = 1;
  86   2      	}
  87   1      }
  88          
  89          void WashOut_2FloorMoveEle(uchar *pWashOutFlg)
  90          {
  91   1      	uchar m_cENum = m_pL_Data->cENum;
  92   1      	uchar i=0;
  93   1      
  94   1      	for(i=0; i<m_cENum; i++){
  95   2      		//对于当前所讨论的外呼,该电梯是否"处于两层以内,并且处于运动中"
  96   2      		if(pWashOutFlg[i]==0)
  97   2      			if(m_InterData[i].b2FloorMove==1) 
  98   2      				pWashOutFlg[i] = 1;
  99   2      	}
 100   1      
 101   1      }
 102          
 103          void WashOut_NotStopEle(uchar *pWashOutFlg)
 104          {
 105   1      	uchar m_cENum = m_pL_Data->cENum;
 106   1      	uchar i=0;
 107   1      
 108   1      	for(i=0; i<m_cENum; i++){
 109   2      		//对于当前所讨论的外呼,该电梯是否"在外呼层可停"
 110   2      		if(pWashOutFlg[i]==0)
 111   2      			if(m_InterData[i].bFloorCanStop==0) 
 112   2      				pWashOutFlg[i] = 1;
 113   2      	}
 114   1      }
 115          
 116          void WashOut_VetoEle(uchar *pWashOutFlg)
 117          {
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 16  

 118   1      	uchar m_cENum = m_pL_Data->cENum;
 119   1      	uchar i=0;
 120   1      
 121   1      	for(i=0; i<m_cENum; i++){
 122   2      		//电梯是否"一票否决"
 123   2      		if(pWashOutFlg[i]==0)
 124   2      			if(m_InterData[i].bVeto==1)
 125   2      				pWashOutFlg[i] = 1;
 126   2      	}
 127   1      }
 128          
 129          // 返回0异常,返回1正常
 130          uchar WashOut_LongTimeEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg)
 131          {
 132   1      	uchar m_cENum = m_pL_Data->cENum;
 133   1      	uint  time_min = 0xFFFF;	//初始时,设置最短时间足够大
 134   1      	uchar i=0;
 135   1      	uchar j=0;
 136   1      	uint  time=0;
 137   1      
 138   1      	for(i=0; i<m_cENum; i++){
 139   2      		if(pWashOutFlg[i] == 0){
 140   3      
 141   3      			//电梯到第cLIdx所用时间(若超时,追加超时时间)
 142   3      //			uint time = 0;
 143   3      			time = GetEleToFloorTime(i, cLIdx, updown_flg)/* + m_cOvertime[i]*/;
 144   3      			//Added by LHM 2004.07.19 计算异常时,不取本次的计算结果
 145   3      			if(time==0xFFFF){
 146   4      				return 0;
 147   4      			}
 148   3      			if(time<time_min){	//新短时间									
 149   4      				if(((time_min-time)>TIMEINTERVAL_MIN)){//若比最短时间"短很多",更新最短时间,且确保淘汰前面的电梯;
 150   5      					time_min = time;
 151   5      					//确保淘汰前面的电梯
 152   5      					for(j=0; j<i; j++){
 153   6      						if(pWashOutFlg[j] == 0)
 154   6      							pWashOutFlg[j] = 1;
 155   6      					}
 156   5      				}
 157   4      				else{								  //若比最短时间"短不太多",仅更新最短时间;
 158   5      					time_min = time;
 159   5      				}
 160   4      			}
 161   3      		    else{				//较长时间
 162   4      				//若比最短时间"长太多",则淘汰;
 163   4      				if(( (time-time_min)> TIMEINTERVAL_MIN))
 164   4      					pWashOutFlg[i] = 1;
 165   4      			}
 166   3      		}
 167   2      	}
 168   1      
 169   1      	return 1;
 170   1      }
 171          
 172          void WashOut_HeavyBearEle(uchar *pWashOutFlg)
 173          {
 174   1      	uchar m_cENum = m_pL_Data->cENum;
 175   1      	uchar bear_min = Weight_Heavy;	//初始时,设置负载足够大
 176   1      	uchar i=0;
 177   1      	uchar j=0;
 178   1      
 179   1      	for(i=0; i<m_cENum; i++){
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 17  

 180   2      		if(pWashOutFlg[i] == 0){
 181   3      			//取得电梯承载状态
 182   3      			uchar cBear = m_InterData[i].cWeight;
 183   3      			if(cBear<bear_min){				//出现新最小负载
 184   4      				//更新最小负载
 185   4      				bear_min = cBear;
 186   4      				//确保淘汰前面的电梯
 187   4      				for(j=0; j<i; j++){
 188   5      					if(pWashOutFlg[j] == 0)
 189   5      						pWashOutFlg[j] = 1;
 190   5      				}
 191   4      			}else if(cBear == bear_min){	//负载与前次相同
 192   4      				//do nothing 
 193   4      			}else{							//出现更大负载或错误信号
 194   4      				//设置淘汰标记
 195   4      				pWashOutFlg[i] = 1;
 196   4      			}
 197   3      		}
 198   2      	}
 199   1      
 200   1      }
 201          
 202          void WashOut_NoSameDirectionEle(uchar *pWashOutFlg)
 203          {
 204   1      	uchar m_cENum = m_pL_Data->cENum;
 205   1      	uchar i=0;
 206   1      	
 207   1      	uchar cExistSameFlg = 0;	//"尚未淘汰的电梯中,存在顺向电梯"的标记
 208   1      	for(i=0; i<m_cENum; i++){
 209   2      		if(pWashOutFlg[i]==0)
 210   2      			if(m_InterData[i].bSameDirection==1){ 
 211   3      				cExistSameFlg = 1;
 212   3      				break;
 213   3      			}
 214   2      	}
 215   1      
 216   1      	if(cExistSameFlg == 1){	//存在
 217   2      		for(i=0; i<m_cENum; i++){
 218   3      			if(pWashOutFlg[i]==0)
 219   3      				if(m_InterData[i].bSameDirection==0){ //淘汰非顺向的电梯
 220   4      					//设置淘汰标记
 221   4      					pWashOutFlg[i] = 1;
 222   4      				}
 223   3      		}
 224   2      	}else{					//不存在
 225   2      		//do nothing 
 226   2      	}
 227   1      }
 228          
 229          //若尚未淘汰的电梯中有一部内选恰好为外呼,且方向一致,淘汰其余电梯
 230          void WashOut_NoInSelStopEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg)
 231          {
 232   1      	uchar m_cENum = m_pL_Data->cENum;
 233   1      	uchar i=0;
 234   1      	uchar  bExist = 0;	//"某梯在cLIdx层存在内选,尚未淘汰"标记
 235   1      	E_DianTi *pEleData = 0;
 236   1      	E_FangXiang *pFangXiang = 0;
 237   1      	
 238   1      	for(i=0; i<m_cENum; i++){
 239   2      		pEleData = &(m_pE_InputData->mDianTi[i]);
 240   2      		pFangXiang = &(pEleData->FangXiang);
 241   2      		if(pWashOutFlg[i] == 0){	//尚未淘汰
C51 COMPILER V6.12  OPTIMIZE                                                               06/05/2005 15:44:44 PAGE 18  

 242   3      //			if((pEleData->bNeiXuan[cLIdx]==1)){	//存在内选
 243   3      			if((GetArrayData(pEleData->bNeiXuan, cLIdx)==1)){	//存在内选
 244   4      				if((updown_flg==1)&&(pFangXiang->bShang==1)&&(pFangXiang->bXia==0))		//方向一致(上)
 245   4      					bExist = 1;
 246   4      				else if((updown_flg==0)&&(pFangXiang->bShang==0)&&(pFangXiang->bXia==1))//方向一致(下)
 247   4      					bExist = 1;
 248   4      			}
 249   3      		}
 250   2      	}
 251   1      	
 252   1      	if( bExist == 1){	//存在
 253   2      		for(i=0; i<m_cENum; i++){
 254   3      			pEleData = &(m_pE_InputData->mDianTi[i]);
 255   3      			pFangXiang = &(pEleData->FangXiang);
 256   3      			if(pWashOutFlg[i] == 0){
 257   4      //				if(pEleData->bNeiXuan[cLIdx] != 1){
 258   4      				if(GetArrayData(pEleData->bNeiXuan, cLIdx) != 1){
 259   5      					pWashOutFlg[i] = 1;
 260   5      				}else{
 261   5      					if((updown_flg==1)&&(pFangXiang->bShang==1)&&(pFangXiang->bXia==0)){	//方向一致(上)
 262   6      						pWashOutFlg[i] = 0;//do nothing
 263   6      					}

⌨️ 快捷键说明

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