📄 optimize.lst
字号:
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 + -