?? distribute.c
字號(hào):
#include "global.h"
uchar Is3FloorDistributed(uchar cLIdx, uchar updown_flg);
uchar IsLastOneDistribution(uchar cLIdx, uchar updown_flg);
uchar IsSomeoneNextStopFloor(uchar cLIdx, uchar updown_flg);
void SetNearNextStopFloorLIdx(uchar cEIdx); //LHM dyn_test temp動(dòng)態(tài)測(cè)試專用變量(移植時(shí)刪除)
void DistributeEle(void)
{
uchar m_cLNum = LNum_MAX;
uchar m_cENum = m_pL_Data->cENum;
uchar cCurFloorIdx=0;
uchar i=0,j=0;
uchar updown_flg; //1上 0下
uint out_id=0; //樓層數(shù)(其中5位有效)
uchar a=0;
uchar xdata *can_p;
uchar cSendLIdx=0;
uchar ret0=0;
uchar ret1=0;
E_WaiHu *pWaiHu = &(m_pE_InputData->mWaiHu);
//上呼分配(從下而上進(jìn)行分配)
uchar cLIdx = m_CalUpLIdx; //(取值0-55)
uchar bVal; //外呼數(shù)值
//設(shè)置中間數(shù)據(jù)"樓層可停"
SetInterVal_FloorCanStop(cLIdx, 1);
//設(shè)置中間數(shù)據(jù)"2層以內(nèi)運(yùn)動(dòng)"
SetInterVal_2FloorMove(cLIdx, 1);
//設(shè)置中間數(shù)據(jù)"順向"
SetInterVal_SameDirection(cLIdx, 1);
if(GetArrayData(pWaiHu->bShang, cLIdx) == 1){ //若該層有上呼,進(jìn)行電梯分配
updown_flg = D_Up; //設(shè)置上標(biāo)記
bVal = 1;
//若有一部電梯恰好到達(dá)外呼層,順向,零速信號(hào)為1或運(yùn)行停止信號(hào)為0,則撤銷外呼點(diǎn)燈
if(IsWithdrawOutLight(cLIdx,updown_flg)){
SetOutCallLight(cLIdx, updown_flg, 0);
//2004.11.17
//為避免撤燈時(shí),發(fā)生閃爍,取消提前撤燈(需要進(jìn)一步確認(rèn))
//為了及時(shí)外呼撤燈,提前發(fā)送撤燈數(shù)據(jù)
for(a=0; a<m_cENum; a++){
if(e_online[a]==1){
//2004.11.24 LHM
// cSendLIdx=cLIdx-LNum_MAX_UNDERGROUND+1;
cSendLIdx=cLIdx-mE_InputData.mDianTi[a].cJuDiCengShu-LNum_MAX_UNDERGROUND+1;
out_id=cSendLIdx; //計(jì)算外呼標(biāo)志符
out_id=out_id<<5;
out_id=out_id|0x4800;
can_p=canx_cs[a];
//can是否在線
if((*(can_p+2)&0x4)==0x4){ // 發(fā)送緩沖區(qū)空
*(can_p+16)=0x02;
*(can_p+17)=out_id>>8;
*(can_p+18)=out_id&0xff;
*(can_p+19)=0x5a; //命令3
*(can_p+20)=0xa0; //外呼燈
*(can_p+1)=0x1; //發(fā)送請(qǐng)求
}
}
}
}
//進(jìn)行外呼分配
// if(cLIdx==9)
// mE_InputData.mDianTi[0].TongXun.bZhiShi=IsLastOneDistribution(cLIdx, updown_flg);
ret0 = IsSomeoneNextStopFloor(cLIdx, updown_flg);
ret1 = IsLastOneDistribution(cLIdx, updown_flg);
if( /*(!Is3FloorDistributed(cLIdx, updown_flg)) && */(ret0==0) && (ret1==0) )
OptimizeArrange(cLIdx, updown_flg);
}else{
updown_flg = D_Up; //設(shè)置上標(biāo)記
bVal = 0;
//確保取消外呼點(diǎn)燈
SetOutCallLight(cLIdx, updown_flg, bVal);
//確保取消外呼分配
SetOutCallDistribution(cLIdx, updown_flg, bVal);
}
cLIdx = m_CalDownLIdx;
//設(shè)置中間數(shù)據(jù)"樓層可停"
SetInterVal_FloorCanStop(cLIdx, 0);
//設(shè)置中間數(shù)據(jù)"2層以內(nèi)運(yùn)動(dòng)"
SetInterVal_2FloorMove(cLIdx, 0);
//設(shè)置中間數(shù)據(jù)"順向"
SetInterVal_SameDirection(cLIdx, 0);
if(GetArrayData(pWaiHu->bXia, cLIdx) == 1){//若該層有下呼,進(jìn)行電梯分配
updown_flg = D_Down; //設(shè)置下標(biāo)記
bVal = 1;
if(IsWithdrawOutLight(cLIdx,updown_flg)){
SetOutCallLight(cLIdx, updown_flg, 0);
//2004.11.17
//為避免撤燈時(shí),發(fā)生閃爍,取消提前撤燈(需要進(jìn)一步確認(rèn))
//為了及時(shí)外呼撤燈,提前發(fā)送撤燈數(shù)據(jù)
for(a=0; a<8; a++){
if(e_online[a]==1){
//2004.11.24 LHM
// cSendLIdx=cLIdx-LNum_MAX_UNDERGROUND+1;
cSendLIdx=cLIdx-mE_InputData.mDianTi[a].cJuDiCengShu-LNum_MAX_UNDERGROUND+1;
out_id=cSendLIdx; //計(jì)算外呼標(biāo)志符
out_id=out_id<<5;
out_id=out_id|0x4800;
can_p=canx_cs[a];
//can是否在線
if((*(can_p+2)&0x4)==0x4){ //發(fā)送緩沖區(qū)空
*(can_p+16)=0x02;
*(can_p+17)=out_id>>8;
*(can_p+18)=out_id&0xff;
*(can_p+19)=0x5a; //命令3
*(can_p+20)=0x0a; //外呼燈
*(can_p+1)=0x1; //發(fā)送請(qǐng)求
}
}
}
}
//進(jìn)行外呼分配
// if(cLIdx==9){
// mE_InputData.mDianTi[0].TongXun.bZhiShi=IsLastOneDistribution(cLIdx, updown_flg);
// P1_7=0;
// }
ret0 = IsSomeoneNextStopFloor(cLIdx, updown_flg);
ret1 = IsLastOneDistribution(cLIdx, updown_flg);
//if( (!Is3FloorDistributed(cLIdx, updown_flg)) && (!IsSomeoneNextStopFloor(cLIdx, updown_flg))&&(!IsLastOneDistribution(cLIdx, updown_flg)) )
if( /*(!Is3FloorDistributed(cLIdx, updown_flg)) && */(ret0==0) && (ret1==0) )
OptimizeArrange(cLIdx, updown_flg);
}else{
updown_flg = D_Down; //設(shè)置下標(biāo)記
bVal = 0;
//確保取消外呼點(diǎn)燈
SetOutCallLight(cLIdx, updown_flg, bVal);
//確保取消外呼分配
SetOutCallDistribution(cLIdx, updown_flg, bVal);
}
//2004.11.25 added by LHM循環(huán)設(shè)置點(diǎn)燈數(shù)據(jù)
LoopSetCallLightData(m_CalUpLIdx, m_CalDownLIdx);
//取得各電梯下一??繉铀饕退阉鞣较? for(i=0; i<m_cENum; i++){
SetNearNextStopFloorLIdx(i);
}
//下一樓層
m_CalUpLIdx++; //上呼層索引
if(m_CalUpLIdx>=m_cLNum)
m_CalUpLIdx=0;
if(m_CalDownLIdx==0) //下呼層索引
m_CalDownLIdx=mL_Data.cLNum-1;
else
m_CalDownLIdx--;
}
//外呼是否已經(jīng)分配給"三層以內(nèi)(含三層)到達(dá)且處于運(yùn)動(dòng)中的電梯"
uchar Is3FloorDistributed(uchar cLIdx, uchar updown_flg)
{
uchar m_cLNum = LNum_MAX;
uchar m_cENum = m_pL_Data->cENum;
uchar i=0,j=0;
signed char distance=0;
E_DianTi *pEleData;
E_FangXiang *pFangXiang; //方向數(shù)據(jù)
E_XiangYing *pXiangYing; //外呼分配數(shù)據(jù)
uchar cCurFloorIdx; //當(dāng)前層
for(i=0; i<m_cENum; i++){
pEleData = &(m_pE_InputData->mDianTi[i]);
pFangXiang = &(pEleData->FangXiang); //方向數(shù)據(jù)
pXiangYing = &(m_pE_OutputData->mXiangYing[i]); //外呼分配數(shù)據(jù)
cCurFloorIdx = pEleData->cDangQianCeng-1; //當(dāng)前層
if(updown_flg == D_Up){ //上呼
//外呼層到當(dāng)前層的間隔樓層數(shù)("-1"是因?yàn)?quot;當(dāng)前層"從1開(kāi)始)
if( cLIdx >= cCurFloorIdx)
distance = cLIdx - cCurFloorIdx;
else
distance = cCurFloorIdx - cLIdx;
//三層以內(nèi),運(yùn)行方向向上,運(yùn)動(dòng)中,并且已分配
//2004.05.25 LHM 修正原因:下位機(jī)負(fù)責(zé)定向,定向用到外呼分配,而撤銷外呼用到方向,為避免三角連鎖錯(cuò)誤,故對(duì)于正常到達(dá)的電梯在開(kāi)關(guān)門(mén)狀態(tài)時(shí),不必進(jìn)行分配.
// if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (pXiangYing->bShang[cLIdx]==1)){
if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (GetArrayData(pXiangYing->bShang, cLIdx)==1)){
if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
return 1;
else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
return 1;
}
if(cCurFloorIdx==cLIdx)
if(pEleData->bDongOrJing ==0)
if(GetArrayData(pXiangYing->bShang, cLIdx)==1){
if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
return 1;
else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
return 1;
}
}else{ //下呼
//外呼層到當(dāng)前層的間隔樓層數(shù)("-1"是因?yàn)?quot;當(dāng)前層"從1開(kāi)始)
if( cLIdx >= cCurFloorIdx)
distance = cLIdx - cCurFloorIdx;
else
distance = cCurFloorIdx - cLIdx;
//三層以內(nèi),運(yùn)行方向向上,運(yùn)動(dòng)中,并且已分配
// if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (pXiangYing->bXia[cLIdx]==1)){
if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (GetArrayData(pXiangYing->bXia, cLIdx)==1)){
if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
return 1;
else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
return 1;
}
if(cCurFloorIdx==cLIdx)
if(pEleData->bDongOrJing ==0)
if(GetArrayData(pXiangYing->bXia, cLIdx)==1){
if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
return 1;
else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
return 1;
}
}
}
return 0;
}
//外呼是否是某電梯最后一個(gè)外呼分配,且當(dāng)前層與最后一個(gè)外呼之間無(wú)內(nèi)選
uchar IsLastOneDistribution(uchar cLIdx, uchar updown_flg)
{
uchar m_cLNum = LNum_MAX;
uchar m_cENum = m_pL_Data->cENum;
uchar m_cEleIdx=0xFF; //該外呼已經(jīng)分配給該部電梯
uchar i=0,j=0;
E_DianTi *pEleData;
E_FangXiang *pFangXiang; //方向數(shù)據(jù)
E_XiangYing *pXiangYing; //外呼分配數(shù)據(jù)
uchar cCurFloorIdx; //當(dāng)前層
uchar cTopFloor = pEleData->cZuiGaoCeng-1; //可到最高層(-1是因?yàn)闃菍佑?jì)數(shù)從1開(kāi)始)
uchar cBottomFloor = pEleData->cZuiDiCeng-1; //可到最底層(-1是因?yàn)闃菍佑?jì)數(shù)從1開(kāi)始)
uchar count=0;
uchar cIsExistNeiXuan=0;
for(i=0; i<m_cENum; i++){
pEleData = &(m_pE_InputData->mDianTi[i]);
pXiangYing = &(m_pE_OutputData->mXiangYing[i]); //外呼分配數(shù)據(jù)
if(updown_flg==1){ //上呼
if(GetArrayData(pXiangYing->bShang, cLIdx)==1){
m_cEleIdx=i;
}
}else if(updown_flg==0){ //下呼
if(GetArrayData(pXiangYing->bXia, cLIdx)==1){
m_cEleIdx=i;
}
}
}
if(m_cEleIdx==0xFF){ //尚未分配給任意一部電梯
return 0;
}
pEleData = &(m_pE_InputData->mDianTi[m_cEleIdx]);
pXiangYing = &(m_pE_OutputData->mXiangYing[m_cEleIdx]); //外呼分配數(shù)據(jù)
pFangXiang = &(pEleData->FangXiang); //方向數(shù)據(jù)
cCurFloorIdx = pEleData->cDangQianCeng-1; //當(dāng)前層
cTopFloor = pEleData->cZuiGaoCeng-1; //可到最高層(-1是因?yàn)闃菍佑?jì)數(shù)從1開(kāi)始)
cBottomFloor= pEleData->cZuiDiCeng-1; //可到最底層(-1是因?yàn)闃菍佑?jì)數(shù)從1開(kāi)始)
//計(jì)算該部電梯的已有外呼分配數(shù)目
count=0;
for(j=0; j<m_cLNum; j++){
if(GetArrayData(pXiangYing->bShang, j)==1)
count++;
if(GetArrayData(pXiangYing->bXia, j)==1)
count++;
}
//判斷是否是最后一個(gè)外呼分配
if(count!=1)
return 0;
/* else{
if(pEleData->bDongOrJing==1)
return 1;
else
return 0;
}
return 1;
*/
cIsExistNeiXuan=0;
//判斷是否在當(dāng)前層與外呼之間存在內(nèi)選
if(updown_flg==1){ //上呼
//當(dāng)前層沿著運(yùn)行方向是否有內(nèi)選
if((pFangXiang->bShang==1)&&(pXiangYing->bXia==0)){
if(cCurFloorIdx>cLIdx){
// if(cCurFloorIdx==cTopFloor){
// cIsExistNeiXuan=0;
// }else{
for(j=(cCurFloorIdx+1); j<=cTopFloor; j++){
if(GetArrayData(pEleData->bNeiXuan, j)==1)
cIsExistNeiXuan=1;
}
// }
}else if(cCurFloorIdx<cLIdx){
for(j=(cCurFloorIdx+1); j<=(cLIdx-1); j++){
if(GetArrayData(pEleData->bNeiXuan, j)==1)
cIsExistNeiXuan=1;
}
}else{
cIsExistNeiXuan=0;
}
}else if((pFangXiang->bShang==0)&&(pFangXiang->bXia==1)){
if(cCurFloorIdx>cLIdx){
for(j=(cLIdx+1); j<=(cCurFloorIdx-1); j++){
if(GetArrayData(pEleData->bNeiXuan, j)==1)
cIsExistNeiXuan=1;
}
}else if(cCurFloorIdx<cLIdx){
// if(cIsExistNeiXuan==cBottomFloor){
// cIsExistNeiXuan=0;
// }else{
for(j=cBottomFloor; j<=(cCurFloorIdx-1); j++){
if(GetArrayData(pEleData->bNeiXuan, j)==1)
cIsExistNeiXuan=1;
}
// }
}else{
cIsExistNeiXuan=0;
}
}else{
cIsExistNeiXuan=0;
}
}else if(updown_flg==0){
//當(dāng)前層與外呼層之間是否有內(nèi)選
if((pFangXiang->bShang==1)&&(pFangXiang->bXia==0)){
if(cCurFloorIdx>cLIdx){
// if(cCurFloorIdx==cTopFloor){
// cIsExistNeiXuan=0;
// }else{
for(j=(cCurFloorIdx+1); j<=cTopFloor; j++){
if(GetArrayData(pEleData->bNeiXuan, j)==1)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -