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

📄 distribute.c

📁 一整套电梯控制器源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
							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)){
//					for(j=cBottomFloor; j<=(cLIdx-1); j++){
			if(cCurFloorIdx>cLIdx){
				for(j=(cLIdx+1); j<=(cCurFloorIdx-1); j++){
					if(GetArrayData(pEleData->bNeiXuan, j)==1){
						cIsExistNeiXuan=1;
					}
				}
			}else if(cCurFloorIdx<cLIdx){
//				if(cCurFloorIdx==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;
		}
    }

    if(cIsExistNeiXuan==1)
        return 0;   //不是"最后一个外呼分配且"中间"无内选"
    else
        return 1;   //最后一个外呼分配且"中间"无内选

    return 1;   //仅为语法检查

}

/*
//外呼是否是某电梯最后一个外呼分配(当前层与最后一个外呼之间无内选)
uchar IsLastOneDistribution(uchar cLIdx, uchar updown_flg)
{
	uchar m_cLNum = LNum_MAX;
	uchar m_cENum = m_pL_Data->cENum;
	uchar i=0,j=0;
	uchar count=0;

	E_DianTi	*pEleData; 
	E_FangXiang	*pFangXiang;				//方向数据
	E_XiangYing *pXiangYing;	//外呼分配数据
	uchar       cCurFloorIdx;			//当前层
	uchar cTopFloor		= pEleData->cZuiGaoCeng-1;	//可到最高层(-1是因为楼层计数从1开始)
	uchar cBottomFloor	= pEleData->cZuiDiCeng-1;	//可到最底层(-1是因为楼层计数从1开始)

	uchar cJudgeStart=0;
	uchar cJudgeEnd=0;
	uchar cIsExistNeiXuan=0;

	for(i=0; i<m_cENum; i++){
		pEleData    = &(m_pE_InputData->mDianTi[i]); 
		pFangXiang  = &(pEleData->FangXiang);				//方向数据
		pXiangYing  = &(m_pE_OutputData->mXiangYing[i]);	//外呼分配数据
		cCurFloorIdx = pEleData->cDangQianCeng-1;			//当前层
		cTopFloor	= pEleData->cZuiGaoCeng-1;	//可到最高层(-1是因为楼层计数从1开始)
		cBottomFloor= pEleData->cZuiDiCeng-1;	//可到最底层(-1是因为楼层计数从1开始)

		cIsExistNeiXuan=0;
		if(updown_flg ==D_Up){						//上呼
//			if(pXiangYing->bShang[cLIdx]==1){
			if(GetArrayData(pXiangYing->bShang, cLIdx)==1){
				count=0;
				//第i部电梯的外呼分配数
				for(j=0; j<m_cLNum; j++){
//					if(pXiangYing->bShang[j]==1)
					if(GetArrayData(pXiangYing->bShang, j)==1)
						count++;
//					if(pXiangYing->bXia[j]==1)
					if(GetArrayData(pXiangYing->bXia, j)==1)
						count++;
				}

				//当前层沿着运行方向是否有内选
				if((pFangXiang->bShang==1)&&(pXiangYing->bXia==0)){
					if(cCurFloorIdx>cLIdx){
						if(cCurFloorIdx==cTopFloor){
							cIsExistNeiXuan=0;
						}else{
							for(j=cCurFloorIdx; j<=cTopFloor; j++){
								if(GetArrayData(pEleData->bNeiXuan, j)==1)
									cIsExistNeiXuan=1;
							}
						}
					}else if(cCurFloorIdx<cLIdx){
						for(j=cCurFloorIdx; 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; j++){
							if(GetArrayData(pEleData->bNeiXuan, j)==1)
								cIsExistNeiXuan=1;
						}
					}else if(cCurFloorIdx<cLIdx){
						if(cIsExistNeiXuan==cBottomFloor){
							cIsExistNeiXuan=0;
						}else{
							for(j=cBottomFloor; j<=cCurFloorIdx; j++){
								if(GetArrayData(pEleData->bNeiXuan, j)==1)
									cIsExistNeiXuan=1;
							}
						}
					}else{
						cIsExistNeiXuan=0;
					}
				}

				if((count==1) && (cIsExistNeiXuan==0))	//最后一个外呼分配(当前层与最后一个外呼之间无内选)
					return 1;
//				else
//					return 0;
			}
		}else{									//下呼
//			if(pXiangYing->bXia[cLIdx]==1){
			if(GetArrayData(pXiangYing->bXia, cLIdx)==1){
				count=0;
				//第i部电梯的外呼分配数
				for(j=0; j<m_cLNum; j++){
//					if(pXiangYing->bShang[j]==1)
					if(GetArrayData(pXiangYing->bShang, j)==1)
						count++;
//					if(pXiangYing->bXia[j]==1)
					if(GetArrayData(pXiangYing->bXia, j)==1)
						count++;
				}

				//当前层与外呼层之间是否有内选
				if((pFangXiang->bShang==1)&&(pFangXiang->bXia==0)){
					if(cCurFloorIdx>cLIdx){
						if(cCurFloorIdx==cTopFloor){
							cIsExistNeiXuan=0;
						}else{
							for(j=cCurFloorIdx; j<=cTopFloor; j++){
								if(GetArrayData(pEleData->bNeiXuan, j)==1)
									cIsExistNeiXuan=1;
							}
						}
					}else if(cCurFloorIdx<cLIdx){
						for(j=cCurFloorIdx; j<=(cLIdx-1); j++){
							if(GetArrayData(pEleData->bNeiXuan, j)==1)
								cIsExistNeiXuan=1;
						}
					}else{
						cIsExistNeiXuan=0;
					}

				}else if((pFangXiang->bShang==0)&&(pFangXiang->bXia==1)){
//					for(j=cBottomFloor; j<=(cLIdx-1); j++){
					if(cCurFloorIdx>cLIdx){
						for(j=(cLIdx+1); j<=cCurFloorIdx; j++){
							if(GetArrayData(pEleData->bNeiXuan, j)==1){
								cIsExistNeiXuan=1;
							}
						}
					}else if(cCurFloorIdx<cLIdx){
						if(cCurFloorIdx==cBottomFloor){
							cIsExistNeiXuan=0;
						}else{
							for(j=cBottomFloor; j<=cCurFloorIdx; j++){
								if(GetArrayData(pEleData->bNeiXuan, j)==1)
									cIsExistNeiXuan=1;
							}
						}
					}else{
						cIsExistNeiXuan=0;
					}
				}

//				if(i==2){
//					mE_InputData.mDianTi[0].TongXun.bZhiShi=count;
//					mE_InputData.mDianTi[3].TongXun.bZhiShi=cIsExistNeiXuan;
//					P1_7=0;					
//				}
				if((count==1) && (cIsExistNeiXuan==0))	//最后一个外呼分配
					return 1;
//				else
//					return 0;
			}
		}
	}

	return 0;
}
*/
//外呼层是否是某运行中的电梯"当前指向的"目标层
uchar IsSomeoneNextStopFloor(uchar cLIdx, uchar updown_flg)
{
	uchar m_cLNum = LNum_MAX;
	uchar m_cENum = m_pL_Data->cENum;
	uchar i=0;
	E_DianTi *pEleData;
	E_XiangYing *pXiangYing;

	for(i=0; i<m_cENum; i++){
		pEleData	= &(m_pE_InputData->mDianTi[i]);
		pXiangYing = &(m_pE_OutputData->mXiangYing[i]);
		if(pEleData->bDongOrJing == 1){	//运动中
			if((m_nNextStopLIdx[i]==cLIdx) && (m_bDirect[i]==updown_flg) && (m_InterData[i].bVeto==0)){
				if((updown_flg==1)&&(GetArrayData(pXiangYing->bShang, cLIdx)==1))
					return 1;
				if((updown_flg==0)&&(GetArrayData(pXiangYing->bXia, cLIdx)==1))
					return 1;
			}
		}
	}

	return 0;
}

//LHM dyn_test temp 动态测试专用(移植时不删除)
void SetNearNextStopFloorLIdx(uchar cEIdx)
{
	E_DianTi	*pEleData	= &(m_pE_InputData->mDianTi[cEIdx]);
	E_FangXiang	*pFangXiang = &(pEleData->FangXiang);
	E_Men		*pMen		= &(pEleData->Men);
	E_MenTime	*pMenTime	= &(pEleData->MenTime);
	E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);
	uchar cTopFloor		= pEleData->cZuiGaoCeng-1;	//最高层(-1是因为楼层计数从1开始)
	uchar cBottomFloor	= pEleData->cZuiDiCeng-1;	//最底层(-1是因为楼层计数从1开始)

	uchar cNextStopLIdx=0xFE;	//下一停靠层索引(0xFF代表搜索完毕)
	uchar cCurFloorIdx  = pEleData->cDangQianCeng-1;
	uchar cStartFloorIdx= pEleData->cDangQianCeng-1;
	uint  time=0;				//时间
	uchar  bStartDirect=0;		//初始搜索方向
	uchar  bDirect=0;			//搜索方向(1:上   0:下)
	uchar  bEnd=0;				//搜索结束标记(1:结束 0:未结束)
	uchar  cStartSearchEnd=0;

	//设定初始搜索方向(搜索方向应该与电梯运动方向一致)
	if(pFangXiang->bShang==1 && pFangXiang->bXia==0){	  //方向向上,搜索方向按"上->下->上"
		bStartDirect = D_Up;
		bDirect = D_Up;
	}
	else if(pFangXiang->bShang==0 && pFangXiang->bXia==1){//方向向下,搜索方向按"下->上->下"
		bStartDirect = D_Down;
		bDirect = D_Down;
	}else{												  //无方向,确定运动趋势方向
		bStartDirect = GetNoDirectEleTrend(cEIdx);
//		bDirect = GetNoDirectEleTrend(cEIdx);
		bDirect = bStartDirect;
	}


	if(cStartFloorIdx == cTopFloor){					  //当前层为最高层,搜索方向向下
		bStartDirect = D_Down;
		bDirect = D_Down;
	}
	else if(cStartFloorIdx == cBottomFloor){			  //当前层为最底层,搜索方向向下
		bStartDirect = D_Up;
		bDirect = D_Up;
	}

	//若当前层正好有外呼,判断该电梯是否可以立即响应该外呼,以下情况视为可以立即响应:
	//1)外呼层=电梯当前层,无方向
	//2)外呼层=电梯当前层,运行方向与外呼方向一致,关门未到位
	if(((pFangXiang->bShang==1)&&(pFangXiang->bXia==0)) &&(pEleData->Men.bGuanMenDaoWei==0) &&
		((GetArrayData(pXiangYing->bShang, cCurFloorIdx)==1)||(GetArrayData(pEleData->bNeiXuan, cCurFloorIdx)==1)) ){	//都为上向,关门未到位
		m_nNextStopLIdx[cEIdx] = cCurFloorIdx;
		bDirect = 1;	//需确认
		m_bDirect[cEIdx] = bDirect;
		return;
	}else if(((pFangXiang->bShang==0)&&(pFangXiang->bXia==1))  &&(pEleData->Men.bGuanMenDaoWei==0) &&
		((GetArrayData(pXiangYing->bXia, cCurFloorIdx)==1)||(GetArrayData(pEleData->bNeiXuan, cCurFloorIdx)==1)) ){		//都为下向,关门未到位
		m_nNextStopLIdx[cEIdx] = cCurFloorIdx;
		bDirect = 0;	//需确认
		m_bDirect[cEIdx] = bDirect;
		return;
	}else if((pFangXiang->bShang==0)&&(pFangXiang->bXia==0)&&((GetArrayData(pXiangYing->bShang,cCurFloorIdx)==1)||(GetArrayData(pXiangYing->bXia,cCurFloorIdx)==1)||(GetArrayData(pEleData->bNeiXuan, cCurFloorIdx)==1))){	//无方向时
		m_nNextStopLIdx[cEIdx] = cCurFloorIdx;
		if(GetArrayData(pXiangYing->bShang, cCurFloorIdx)==1)
			bDirect = 1;
		else if(GetArrayData(pXiangYing->bXia, cCurFloorIdx)==1)
			bDirect = 0;
		m_bDirect[cEIdx] = bDirect;
		return;
	}

	cNextStopLIdx = GetNextStopLIdx(cEIdx, cStartFloorIdx, bStartDirect, &bDirect, &cStartSearchEnd);

	m_nNextStopLIdx[cEIdx] = cNextStopLIdx;	//最近的下一停靠层
	m_bDirect[cEIdx] = bDirect;				//方向
}

//2004.11.25 added by LHM 检查3状态(全部在线电梯发生后应消外呼,部分在线电梯消外呼点灯消外呼分配)
void Check3states(void)
{
	uchar 	m_cENum	= m_pL_Data->cENum;
    uchar   i=0;
    uchar   j=0;
    uchar   online_count=0;
    uchar   online_occur_count=0;
    for(i=0; i<m_cENum; i++){
        if(e_online[i]==1){
            online_count++;
            if( (mE_InputData.mDianTi[i].TeBie.bJianXiu==0)&&
                (mE_InputData.mDianTi[i].TeBie.bSuoTi==0)&&
                (mE_InputData.mDianTi[i].TeBie.bXiaoFang==0)){
            }else{
                //确保取消所有外呼点灯外呼分配
                for(j=0; j<ARRAY_BYTENUM; j++){
                    mE_OutputData.mDeng[i].bShang[j]=0;
                    mE_OutputData.mDeng[i].bXia[j]=0;
                    mE_OutputData.mXiangYing[i].bShang[j]=0;
                    mE_OutputData.mXiangYing[i].bXia[j]=0;
                }
                online_occur_count++;
            }
        }
    }
    
    //3状态全部发生时的处理
    if(online_count<=online_occur_count){
        for(i=0; i<ARRAY_BYTENUM; i++){
            mE_InputData.mWaiHu.bShang[i]=0;
            mE_InputData.mWaiHu.bXia[i]=0;
        }
    }

}

⌨️ 快捷键说明

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