optimize.c
来自「一整套电梯控制器源程序」· C语言 代码 · 共 971 行 · 第 1/3 页
C
971 行
E_DianTi *pEleData = &(m_pE_InputData->mDianTi[cEIdx]);
E_FangXiang *pFangXiang = &(pEleData->FangXiang);
E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);
schar i=0;
uchar cTopFloor = pEleData->cZuiGaoCeng-1; //最高层(-1是因为楼层计数从1开始)
uchar cBottomFloor = pEleData->cZuiDiCeng-1; //最底层(-1是因为楼层计数从1开始)
uchar cCurFloor = pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)
if(bStartDirect==1){ //初始搜索方向向上
//首先,检查"电梯向上运行阶段,是否有停靠层"
if((*bDirect==D_Up) && (cStartFloorIdx>=cCurFloor)){
//2004.02.12 Modified by LHM
// for(i=(cStartFloorIdx+1); i<=cTopFloor; i++){
for(i=(cStartFloorIdx); i<=cTopFloor; i++){
//可到最高层处,切换搜索方向
if(i==cTopFloor)
*bDirect = D_Down;
//如果有停靠层,返回该值
// if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bShang[i]==1) )
if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bShang, i)==1) )
return i;
}
//若直至"可到最高层"都未发现停靠层,改变运动趋势
cStartFloorIdx = cTopFloor;
}
//然后,检查"向下运行阶段,是否有停靠层"
if(*bDirect == D_Down){
*cStartSearchEnd=1;
for(i=cStartFloorIdx; i>=cBottomFloor; i--){
//可到最底层处,切换搜索方向
if(i==cBottomFloor)
*bDirect = D_Up;
//如果有停靠层,返回该值
// if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bXia[i]==1) )
if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bXia, i)==1) )
return i;
}
//若直至"可到最底层"都未发现停靠层,改变运动趋势
cStartFloorIdx = cBottomFloor;
}
//最后,检查"电梯再次向上运行阶段,是否有停靠层"
if(*bDirect == D_Up){
for(i=cStartFloorIdx; i<=cCurFloor; i++){
//搜索完毕
if(i==cCurFloor)
return 0xFF;
//如果有停靠层,返回该值
// if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bShang[i]==1) )
if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bShang, i)==1) )
return i;
}
}
}else/*if(bStartDirect==0)*/{ //初始搜索方向向下
//首先,检查"电梯向下运行阶段,是否有停靠层"
if(*bDirect == D_Down){
// for(i=(cStartFloorIdx-1); i>=cBottomFloor; i--){ //2003.02.12 Modified by LHM
for(i=(cStartFloorIdx); i>=cBottomFloor; i--){
//可到最底层处,切换搜索方向
if(i==cBottomFloor)
*bDirect = D_Up;
//如果有停靠层,返回该值
// if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bXia[i]==1) )
if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bXia, i)==1) )
return i;
}
//若直至"可到最底层"都未发现停靠层,改变运动趋势
cStartFloorIdx = cBottomFloor;
}
//然后,检查"向上运行阶段,是否有停靠层"
if(*bDirect == D_Up){
*cStartSearchEnd=1;
for(i=cStartFloorIdx; i<=cTopFloor; i++){
//可到最高层处,切换搜索方向
if(i==cTopFloor)
*bDirect = D_Down;
//如果有停靠层,返回该值
// if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bShang[i]==1) )
if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bShang, i)==1) )
return i;
}
//若直至"可到最高层"都未发现停靠层,改变运动趋势
cStartFloorIdx = cTopFloor;
}
//最后,检查"电梯再次向下运行阶段,是否有停靠层"
if(*bDirect == D_Down){
for(i=cStartFloorIdx; i>=cCurFloor; i--){
//搜索完毕
if(i==cCurFloor)
return 0xFF;
//如果有停靠层,返回该值
// if( (pEleData->bNeiXuan[i]==1)||(pXiangYing->bXia[i]==1) )
if( (GetArrayData(pEleData->bNeiXuan, i)==1)||(GetArrayData(pXiangYing->bXia, i)==1) )
return i;
}
}
}/*else if((pFangXiang->bShang==0) && (pFangXiang->bXia==0)){ //无方向
}else if((pFangXiang->bShang==1) && (pFangXiang->bXia==1)){
//do nothing
}*/
return 0xFF; //其后暂无任务(既无内选又无外呼分配)
}
//估算中间无停靠的电梯运行,所要花费的时间
//单位:十分之一秒
//
//公式:1)平均楼层高度 = 平均楼层脉冲数/编码器脉冲数*所选曲线匀速段速度*60/转速
//单位: (mm) (分米/秒) (转/分)
//
//公式:2)所选曲线匀速段速度 = 运行速度*100*所选曲线速度/额定频率
//单位: (毫米/秒) (分米/秒) (Hz) (Hz)
uint CalTimeToDest(uchar cEIdx, uchar cStartFloor, uchar cEndFloor)
{
/* E_DianTi *pEleData = &(m_pE_InputData->mDianTi[cEIdx]);
uchar cCurFloor = pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)
uchar cQuXianShu = pEleData->cQuXianShu;
ulong lHeightPerFloor = 0;
uchar cQuXianFloorNum = 0;
uchar cFloorNum = 0;
uchar cSpeedHz = 0;
uint nSpeed = 0;
uint nTime = 0;
uint nYinZi = 100; //2004.06.23 added by LHM(为解决nSpeed计算为0的问题)
//两次停靠之间的楼层数
if(cStartFloor>cEndFloor)
cFloorNum = cStartFloor - cEndFloor;
else
cFloorNum = cEndFloor - cStartFloor;
if(cStartFloor == cCurFloor) //第一阶段的曲线数选择,要使用起始层
cStartFloor = m_cCurStageStartFloor[cEIdx];
if(cStartFloor>cEndFloor)
cQuXianFloorNum = cStartFloor - cEndFloor;
else
cQuXianFloorNum = cEndFloor - cStartFloor;
//零楼层间距
// if(cQuXianFloorNum==0)
if(cFloorNum==0)
return 0;
//所选曲线的匀速段速度(单位:Hz)
//(选曲线的原则:间隔1层选曲线1,间隔2层选曲线2...,超过最大间隔层选择最高曲线)
if(cQuXianFloorNum <= pEleData->cQuXianShu)
cSpeedHz = pEleData->nTiSu[cQuXianFloorNum-1];
else
cSpeedHz = pEleData->nTiSu[pEleData->cQuXianShu-1];
//速度值转换为"毫米/秒"
nSpeed = (pEleData->cYunXingTiSu*nYinZi*cSpeedHz)/pEleData->cPinLv;
//平均每层的高度(单位:毫米)
//2004.04.22 Modified by LHM
lHeightPerFloor = pEleData->lDGCMaiChongShu/pEleData->lBMQMaiChongShu*nSpeed*60/pEleData->nZhuanSu;
//end
//中间无停靠运行,所要花费的时间
nTime = (uint)(lHeightPerFloor*cFloorNum*10/nSpeed);
return nTime;
*/
E_DianTi *pEleData = &(m_pE_InputData->mDianTi[cEIdx]);
uchar cCurFloor = pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)
uchar cQuXianShu = pEleData->cQuXianShu;
ulong lHeightPerFloor = 0;
uchar cFloorNum = 0;
uchar cSpeedHz = 0;
uint nSpeed = 0;
uint nTime = 0;
uint nYinZi = 100; //2004.06.23 added by LHM(为解决nSpeed计算为0的问题)
//两次停靠之间的楼层数
if(cStartFloor>cEndFloor)
cFloorNum = cStartFloor - cEndFloor;
else
cFloorNum = cEndFloor - cStartFloor;
if(cStartFloor == cCurFloor) //第一阶段的曲线数选择,要使用起始层
cStartFloor = m_cCurStageStartFloor[cEIdx];
//零楼层间距
if(cFloorNum==0)
return 0;
//所选曲线的匀速段速度(单位:Hz)
//(选曲线的原则:间隔1层选曲线1,间隔2层选曲线2...,超过最大间隔层选择最高曲线)
if(cFloorNum <= pEleData->cQuXianShu)
cSpeedHz = pEleData->nTiSu[cFloorNum-1];
else
cSpeedHz = pEleData->nTiSu[pEleData->cQuXianShu-1];
//速度值转换为"毫米/秒"
nSpeed = (pEleData->cYunXingTiSu*nYinZi*cSpeedHz)/pEleData->cPinLv;
//平均每层的高度(单位:毫米)
lHeightPerFloor = pEleData->lDGCMaiChongShu/pEleData->lBMQMaiChongShu*nSpeed*60/pEleData->nZhuanSu;
//中间无停靠运行,所要花费的时间
nTime = (uint)(lHeightPerFloor*cFloorNum*10/nSpeed);
return nTime;
}
//确定当前无方向电梯的运行趋势方向
//说明:1)与单梯定方向方法相同;
// 2)若无运动趋势则优先假定运动趋势向上;
//返回值:1-上 0-下
uchar GetNoDirectEleTrend(uchar cEIdx)
{
E_DianTi *pEleData = &(m_pE_InputData->mDianTi[cEIdx]);
E_XiangYing *pXiangYing = &(m_pE_OutputData->mXiangYing[cEIdx]);
uchar i=0;
uchar cTopFloor = pEleData->cZuiGaoCeng-1; //可到最高层(-1是因为楼层计数从1开始)
uchar cBottomFloor = pEleData->cZuiDiCeng-1; //可到最底层(-1是因为楼层计数从1开始)
uchar cCurFloor = pEleData->cDangQianCeng-1;//当前层(-1是因为楼层计数从1开始)
/* //若当前层以上有内选,运动趋势向上
for(i=(cCurFloor+1); i<=cTopFloor; i++){
// if(pEleData->bNeiXuan[i]==1)
if(GetArrayData(pEleData->bNeiXuan, i)==1)
return 1;
}
//若当前层以下有内选,运动趋势向下
for(i=cBottomFloor; i<=cCurFloor; i++){
// if(pEleData->bNeiXuan[i]==1)
if(GetArrayData(pEleData->bNeiXuan, i)==1)
return 0;
}
//若当前层以上有上呼分配,运动趋势向上
for(i=(cCurFloor+1); i<=cTopFloor; i++){
// if(pXiangYing->bShang[i]==1)
if(GetArrayData(pXiangYing->bShang, i)==1)
return 1;
}
//若当前层以下有上呼分配,运动趋势向下
for(i=cBottomFloor; i<=cCurFloor; i++){
// if(pXiangYing->bShang[i]==1)
if(GetArrayData(pXiangYing->bShang, i)==1)
return 0;
}
//若当前层以上有下呼分配,运动趋势向上
for(i=(cCurFloor+1); i<=cTopFloor; i++){
// if(pXiangYing->bXia[i]==1)
if(GetArrayData(pXiangYing->bXia, i)==1)
return 1;
}
//若当前层以下有下呼分配,运动趋势向下
for(i=cBottomFloor; i<=cCurFloor; i++){
// if(pXiangYing->bXia[i]==1)
if(GetArrayData(pXiangYing->bXia, i)==1)
return 0;
}
*/
//若当前层以上有内选,运动趋势向上
if((pEleData->bNeiXuan[0]!=0)||(pEleData->bNeiXuan[1]!=0)||(pEleData->bNeiXuan[2]!=0)||(pEleData->bNeiXuan[3]!=0)
||(pEleData->bNeiXuan[4]!=0)||(pEleData->bNeiXuan[5]!=0)||(pEleData->bNeiXuan[6]!=0)){
for(i=(cCurFloor+1); i<=cTopFloor; i++){
if(GetArrayData(pEleData->bNeiXuan, i)==1)
return 1;
}
//若当前层以下有内选,运动趋势向下
for(i=cBottomFloor; i<=cCurFloor; i++){
if(GetArrayData(pEleData->bNeiXuan, i)==1)
return 0;
}
}
if((pXiangYing->bShang[0]!=0)||(pXiangYing->bShang[1]!=0)||(pXiangYing->bShang[2]!=0)||(pXiangYing->bShang[3]!=0)
||(pXiangYing->bShang[4]!=0)||(pXiangYing->bShang[5]!=0)||(pXiangYing->bShang[6]!=0)){
//若当前层以上有上呼分配,运动趋势向上
for(i=(cCurFloor+1); i<=cTopFloor; i++){
if(GetArrayData(pXiangYing->bShang, i)==1)
return 1;
}
//若当前层以下有上呼分配,运动趋势向下
for(i=cBottomFloor; i<=cCurFloor; i++){
if(GetArrayData(pXiangYing->bShang, i)==1)
return 0;
}
}
if((pXiangYing->bXia[0]!=0)||(pXiangYing->bXia[1]!=0)||(pXiangYing->bXia[2]!=0)||(pXiangYing->bXia[3]!=0)
||(pXiangYing->bXia[4]!=0)||(pXiangYing->bXia[5]!=0)||(pXiangYing->bXia[6]!=0)){
//若当前层以上有下呼分配,运动趋势向上
for(i=(cCurFloor+1); i<=cTopFloor; i++){
if(GetArrayData(pXiangYing->bXia, i)==1)
return 1;
}
//若当前层以下有下呼分配,运动趋势向下
for(i=cBottomFloor; i<=cCurFloor; i++){
if(GetArrayData(pXiangYing->bXia, i)==1)
return 0;
}
}
//若内选和外呼分配都没有,假定运动趋势向上
return 1;
}
//第cEIdx电梯是否有内选
uchar IsExistInsel(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;
for(i=cBottomFloor; i<=cTopFloor; i++){
if(GetArrayData(pEleData->bNeiXuan, i)==1)
return 1;
}
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?