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

📄 staticstop.c

📁 一整套电梯控制器源程序
💻 C
字号:
#include "global.h"


uchar IsExistEleOnLine();
uchar IsLouExistDistOrInsel();
uchar IsExistDistOrInsel(uchar cEIdx);
uchar IsStaticStopPos();

void SetStaticStopFloor()
{
	L_GaoFeng *pZaoGF = &(m_pL_Data->ZaoGF);
	L_GaoFeng *pWanGF   = &(m_pL_Data->WanGF);
	L_SysTime *pSysTime = &(m_pL_Data->mSysTime);

	E_DianTi  *pEleData;
//	E_WaiHu   *pWaiHu = &(m_pE_InputData->mWaiHu);
	uchar m_cENum	= m_pL_Data->cENum;
	uchar i=0;
	uchar cHour   = 0;
	uchar cMinute = 0;
	uchar cSecond = 0;
	uchar cMinBottomLIdx = 0;		//最小的可到最低层
	uchar cMaxTopLIdx = 0;			//最大的可到最高层
	uchar m_cLNum = 0;
	uchar m_cCanDistEleCount = 0;
	uchar interval = 0;		//静态停靠的间隔楼层
	uchar cEleIdx=0;
	schar cInSelIdx=0;
	//静态超时时间
	uint  overtime = 0; 

	if(IsLouExistDistOrInsel()){	//有外呼分配或内选
		m_IsExistWaiInFlg=1;
//		mE_InputData.mDianTi[0].TongXun.bZhiShi=1;
	}else{							//无外呼分配或内选
		//是否一次性数据传输完毕(为静态分配争取时间;注意一定要正确设定最高层最底层)
		if(m_once_param_over_flg==1)
			return;
		m_IsExistWaiInFlg=0;
		//静态超时时间
		overtime = m_pTimer->lJingTaiTimer/1000; 
		if((overtime>=m_pL_Data->nTKYanChiTime)){	//"静态超时时间"超过"静态停靠延迟时间"
			//若已经在静态停靠层就位,返回
			if(IsStaticStopPos())
				return;

			//取得系统时间(已取得)
//			CTime time	  = CTime::GetCurrentTime();
//			pSysTime->mHourMinSec.cHour = m_time;
//			pSysTime->mHourMinSec.cMinute = m_minute;
			//取得能分配的电梯数(一票否决的电梯不记)
			cMinBottomLIdx = GetMinBottomFloor() - 1;		//最小的可到最低层
			cMaxTopLIdx = GetMaxTopFloor() - 1;				//最大的可到最高层
			m_cLNum = cMaxTopLIdx - cMinBottomLIdx + 1;
			m_cCanDistEleCount = GetCanDistEleCount();
			interval = m_cLNum/(m_cCanDistEleCount);		//静态停靠的间隔楼层
			
			//设置内选数据(三时段处理方式暂时相同)
			if(IsPeekTime(pSysTime,pZaoGF)){
				cEleIdx=0;
				for(i=0; i<m_cENum; i++){
					if(m_InterData[i].bVeto==0){
						pEleData = &(m_pE_InputData->mDianTi[i]);
						cInSelIdx = LNum_MAX_UNDERGROUND+cEleIdx*interval-pEleData->cJuDiCengShu-LNum_MAX_UNDERGROUND+1;
                        if((cInSelIdx>0)&&(cInSelIdx<=mE_InputData.mDianTi[i].cXueXiCengShu)){   //所发内选必须限定在1-最大楼层范围之内
    						m_SendStaticInSelDataFlg[i]=1;
    						choose_out[i]=cInSelIdx;
    						yes_no[i]=1;
                        }
						cEleIdx++;
					}else{

					}
				}	
			}else if(IsPeekTime(pSysTime,pWanGF)){	//晚高峰
				cEleIdx=0;
				for(i=0; i<m_cENum; i++){
					if(m_InterData[i].bVeto==0){
						pEleData = &(m_pE_InputData->mDianTi[i]);
						cInSelIdx = LNum_MAX_UNDERGROUND+cEleIdx*interval-pEleData->cJuDiCengShu-LNum_MAX_UNDERGROUND+1;
                        if((cInSelIdx>0)&&(cInSelIdx<=mE_InputData.mDianTi[i].cXueXiCengShu)){   //所发内选必须限定在1-最大楼层范围之内
    						m_SendStaticInSelDataFlg[i]=1;
    						choose_out[i]=cInSelIdx;
    						yes_no[i]=1;
                        }
						cEleIdx++;
					}else{

					}
				}	
			}else{																		//其他时段
				cEleIdx=0;
				for(i=0; i<m_cENum; i++){
					if(m_InterData[i].bVeto==0){
						pEleData = &(m_pE_InputData->mDianTi[i]);
						cInSelIdx = LNum_MAX_UNDERGROUND+cEleIdx*interval-pEleData->cJuDiCengShu-LNum_MAX_UNDERGROUND+1;
                        if((cInSelIdx>0)&&(cInSelIdx<=mE_InputData.mDianTi[i].cXueXiCengShu)){   //所发内选必须限定在1-最大楼层范围之内
    						m_SendStaticInSelDataFlg[i]=1;
    						choose_out[i]=cInSelIdx;
    						yes_no[i]=1;
                        }
						cEleIdx++;
					}else{

					}
				}	
			}
		}else{			//静态时间未到
			//do nothing
		}
	}

}

//所有群控电梯是否有外呼分配或内选
uchar IsLouExistDistOrInsel()
{
	uchar m_cENum = m_pL_Data->cENum;
	uchar i=0;

	for(i=0; i<m_cENum; i++){
		if(IsExistDistOrInsel(i)){
			return 1;
		}
	}

	return 0;
}

//设置高峰停靠层(仅在从上向下运行时,停在高峰停靠层)
void SetPeekStopFloor()
{
	L_GaoFeng *pZaoGF = &(m_pL_Data->ZaoGF);
	L_GaoFeng *pWanGF   = &(m_pL_Data->WanGF);
	L_SysTime *pSysTime = &(m_pL_Data->mSysTime);
	E_FangXiang	*pFangXiang /*= &(pEleData->FangXiang)*/;

	E_DianTi  *pEleData;
	uchar m_cENum	= m_pL_Data->cENum;
	uchar i=0;
	uchar cHour   = 0;
	uchar cMinute = 0;
	uchar cSecond = 0;
	uchar cInSelIdx=0;

	if(IsPeekTime(pSysTime,pZaoGF)){			//早高峰
		for(i=0; i<m_cENum; i++){
			if(m_InterData[i].bVeto==0){
				pEleData = &(m_pE_InputData->mDianTi[i]);
				pFangXiang = &(pEleData->FangXiang);

				if(GetArrayData(pEleData->bNeiXuan, pEleData->cZaoGFCeng)==0)
				if((pFangXiang->bShang==0)&&(pFangXiang->bXia==1)){
					cInSelIdx = pEleData->cZaoGFCeng-LNum_MAX_UNDERGROUND;
//					cInSelIdx = pEleData->cZaoGFCeng;
					m_SendPeekInSelDataFlg[i]=1;
					choose_out[i]=cInSelIdx;
					yes_no[i]=1;
				}
			}
		}	
	}else if(IsPeekTime(pSysTime,pWanGF)){	//晚高峰

	}else{																		//其他时段

	}
}

//是否至少有一路电梯群控在线
uchar IsExistEleOnLine()
{
	uchar m_cENum = m_pL_Data->cENum;
	uchar i=0;

	for(i=0; i<m_cENum; i++){
		if(e_online[i]==1){
			return 1;
		}
	}

	return 0;
}

//当前层以上是否有外呼或内选
//2004.05.20 added by LHM 
uchar IsExistCurFloorUp(uchar cEIdx)
{
	E_DianTi	*pEleData   = &(m_pE_InputData->mDianTi[cEIdx]); 
//	E_WaiHu *pWaiHu = &(m_pE_InputData->mWaiHu);//外呼分配数据
	E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);//外呼分配数据
	uchar cTopFloor    = pEleData->cZuiGaoCeng-1;
	uchar cBottomFloor = pEleData->cZuiDiCeng-1;
	uchar cCurFloorIdx = pEleData->cDangQianCeng-1;
	uchar i=0;

//	if(cCurFloorIdx==cTopFloor)
//		return 0;
	for(i=(cCurFloorIdx+1); i<=cTopFloor; i++){
		if((GetArrayData(pXiangYing->bShang, i)==1)  || (GetArrayData(pEleData->bNeiXuan, i)==1))
			return 1;
	}
//	for(i=0; i<ARRAY_BYTENUM; i++){
//		if((pXiangYing->bShang[i]==1) || (pXiangYing->bXia[i]==1) || (pEleData->bNeiXuan[i]==1))
//			return 1;
//	}
//end

	return 0;
}

//当前层以下是否有外呼或内选
//2004.05.20 added by LHM 
uchar IsExistCurFloorDown(uchar cEIdx)
{
	E_DianTi	*pEleData   = &(m_pE_InputData->mDianTi[cEIdx]); 
//	E_WaiHu *pWaiHu = &(m_pE_InputData->mWaiHu);//外呼分配数据
	E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);//外呼分配数据

	uchar cTopFloor    = pEleData->cZuiGaoCeng-1;
	uchar cBottomFloor = pEleData->cZuiDiCeng-1;
	uchar cCurFloorIdx = pEleData->cDangQianCeng-1;
	uchar i=0;

	if(cCurFloorIdx==cBottomFloor)
		return 0;
	for(i=(cCurFloorIdx-1); i<=cBottomFloor; i--){
		if((GetArrayData(pXiangYing->bXia, i)==1)  || (GetArrayData(pEleData->bNeiXuan, i)==1))
			return 1;
	}
//	for(i=0; i<ARRAY_BYTENUM; i++){
//		if((pXiangYing->bShang[i]==1) || (pXiangYing->bXia[i]==1) || (pEleData->bNeiXuan[i]==1))
//			return 1;
//	}
//end

	return 0;
}

//第cEIdx电梯是否有外呼分配或内选
uchar IsExistDistOrInsel(uchar cEIdx)
{
	E_DianTi	*pEleData   = &(m_pE_InputData->mDianTi[cEIdx]); 
	E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);//外呼分配数据
	uchar cTopFloor    = pEleData->cZuiGaoCeng-1;
	uchar cBottomFloor = pEleData->cZuiDiCeng-1;
	uchar i=0;

//2004.05.12 LHM
//	for(i=cBottomFloor; i<=cTopFloor; i++){
//		if((GetArrayData(pXiangYing->bShang, i)==1) || (GetArrayData(pXiangYing->bXia, i)==1) || (GetArrayData(pEleData->bNeiXuan, i)==1))
//			return 1;
//	}
	for(i=0; i<ARRAY_BYTENUM; i++){
		if((pXiangYing->bShang[i]!=0) || (pXiangYing->bXia[i]!=0) || (pEleData->bNeiXuan[i]!=0))
				return 1;
	}
//end

	return 0;
}

//各电梯是否在静态停靠层停靠
uchar IsStaticStopPos()
{
	E_DianTi	*pEleData;   
	uchar cMinBottomLIdx = GetMinBottomFloor() - 1;		//最小的可到最低层
	uchar cMaxTopLIdx = GetMaxTopFloor() - 1;			//最大的可到最高层
	uchar m_cLNum = cMaxTopLIdx - cMinBottomLIdx + 1;
	uchar m_cCanDistEleCount = GetCanDistEleCount();
	uchar m_cENum = m_pL_Data->cENum;
	uchar interval = m_cLNum/(m_cCanDistEleCount);	//静态停靠层间隔
	uchar accCnt = 0;
	uchar i=0;
	uchar j=0;

	for(i=0; i<m_cCanDistEleCount; i++){
		if(i==0){
			for(j=0; j<m_cENum; j++){
				pEleData = &(m_pE_InputData->mDianTi[j]);
				if((pEleData->cDangQianCeng==(LNum_MAX_UNDERGROUND+1))&&(m_InterData[j].bVeto==0)){
					accCnt++;
					//若有两部及以上电梯停靠在同一层,只记一部
					break;
				}
			}
		}else if((i!=(m_cCanDistEleCount-1)) && (i!=0)){
			for(j=0; j<m_cENum; j++){
				pEleData = &(m_pE_InputData->mDianTi[j]);
				if((pEleData->cDangQianCeng==(LNum_MAX_UNDERGROUND+i*interval+1))&&(m_InterData[j].bVeto==0)){
					accCnt++;
					//若有两部及以上电梯停靠在同一层,只记一部
					break;
				}
			}
		}else{								//最高层
			for(j=0; j<m_cENum; j++){
				pEleData = &(m_pE_InputData->mDianTi[j]);
				if((pEleData->cDangQianCeng==(cMaxTopLIdx+1))&&(m_InterData[j].bVeto==0)){
					accCnt++;
					//若有两部及以上电梯停靠在同一层,只记一部
					break;
				}
			}
		}
	}

	if(accCnt==m_cCanDistEleCount)
		return 1;
	else
		return 0;

	return 1;
}

//判断当前时间是否是高峰时间
uchar IsPeekTime(L_SysTime *pSysTime, L_GaoFeng *pGaoFeng)
{
	uchar ret=0;
	uint nHour=0;
	uint nMinute=0;

	uint  nsystime=0;
	uint  nstarttime=0;
	uint  nendtime=0;

	//构造自定义的时间变量
	nHour=pSysTime->mHourMinSec.cHour;
	nMinute=pSysTime->mHourMinSec.cMinute;
	nsystime=(nHour<<8)|nMinute;

	nHour=pGaoFeng->lStartTime.cHour;
	nMinute=pGaoFeng->lStartTime.cMinute;
	nstarttime=(nHour<<8)|nMinute;

	nHour=pGaoFeng->lEndTime.cHour;
	nMinute=pGaoFeng->lEndTime.cMinute;
	nendtime=(nHour<<8)|nMinute;

	if(nsystime>=nstarttime && nsystime<=nendtime){
		ret=1;
	}else{
		ret=0;
	}
	return ret;
}

⌨️ 快捷键说明

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