3) 由于此算法导致出现一台电梯过忙的情况,为实现负载平衡,采用有效原则。当两台电梯因轿厢内指令而到达基站后关门待命时,则应按照有效利用的原则,执行相互交替程序段。原先充当忙梯的电梯现在即作为基站电梯来使用,而原先作为基站电梯使用的电梯此时即成为忙梯。不论是A梯还是B梯均停留在最后停靠的层站待命。这样的改进就避免了一台电梯过忙的情况。
B梯A梯 a
B梯A梯 b7-3 改进后的电梯调度情况
第 20 页 共 36 页
A梯B梯 c图
7.4 电梯调度算法流程
核心的调度算法主要有外部请求调度算法和内部请求调度算法,两算法之间也有关联,具体调度过程如图7-4所示。
startvoid scheduleExterUp(uchar)orvoid scheduleExterDown(uchar)Floor, Directvoid scheduleExterLeft(uchar floor, uchar direct)orscheduleExterRight(uchar floor,uchar direct)leftExterUp[ ]orleftExterDown[]void scheduleLeft(void)orvoid scheduleRightvoid)void scheduleLeftDown(void)/void scheduleLeftUp(void)Orvoid scheduleRightDown(void)/void scheduleRightUp(void)leftdirect,leftdest,LefttypeOrrightdirect, rightdest,righttyperunning 图7-4 电梯调度算法流程图
7.5 程序代码及说明
7.5.1 确定请求类型函数
电梯运行方向上,对请求合理响应,以较优的方式到达目的地。 1) 则搜寻上行方向的内部请求和外部向上的请求,以离电梯当前位置最
近的先响应。
第 21 页 共 36 页
2) 如果没有这两个请求,则搜寻上行方向的向下请求。按最远的先响应。 3) 如果仍然无请求,则搜寻下行方向的内部请求和向下请求,按最近的
先响应。
4) 仍无请求,则搜寻下行方向的向上请求。按最远响应。 5) 如果都无请求,则为空闲,停在当前层待命。
void scheduleLeftUp(void) //确定请求类型,目的地和运行方向。请
求类型0x01表示内部请求,0x02为外部向上请求,0x04为外部向下请求 {
int i;
for(i = leftFloor + 1; i < 7; i++) //从当前层的上一层开始逐层搜寻请求 {
if(leftRequest[i - 1]) //有内部请求,则设置请求类型和目的地 {
leftType |= 0x01; //0x01为内部请求表示 leftDest = i; }
if(leftExterUp[i - 1]) //有外部请求 {
leftType |= 0x02; leftDest = i; }
if(leftType != 0x00) //在运行方向上行,确定请求类型和目的地之后及时返回 {
leftDirect = 1; // 运行方向为向上 return; } }
for(i = 6; i > leftFloor; i--) //上行方向没有前面两种请求,则从上往下搜寻是否有向下请求。 {
if(leftExterDown[i - 1]) //has external down request {
leftType = 0x04; //0x04 为外部向下请求 leftDest = i;
leftDirect = 1; //运行方向仍然为上,要运行到呼梯楼层。
return; }
第 22 页 共 36 页
}
}
if(leftType != 0x00) {
leftDirect = 1; return; }
7.5.2 运行参数设置函数
根据不同的运行方向,调用上述函数,确定电梯请求类型,目的地,运行方向,然后启动电梯运行。
void scheduleLeft(void) 函数 {
if(leftDirect == 1) {
leftType = 0x00; scheduleLeftUp();
//左边电梯运行的调度
//电梯向上运行
if(leftType == 0x00) {
scheduleLeftDown(); //电梯运行方向可以在此改变 if(leftType == 0x00) //下行方向上没有请求 {
leftRequest[leftFloor - 1] = 0; leftExterUp[leftFloor - 1] = 0; leftExterDown[leftFloor - 1] = 0; leftDirect = 0; leftStatus = idle;
if(leftFloor == 1 && rightFloor == 1 && rightStatus == idle)
{
busyEle++;
busyEle %= 2; //当两部电梯都在1楼空闲时,交替忙梯标志 }
return; } else {
leftExterDown[leftFloor - 1] = 0;//若有请求,则电梯继续向上运行,清除该楼层外部请求。
//左边电梯的请求类型,目
的地,运行方向
//上行方向没有请求
第 23 页 共 36 页
} } else {
leftExterUp[leftFloor - 1] = 0; } }
else //向下运行,过程基本同向上运行 {
leftType = 0x00; scheduleLeftDown(); if(leftType == 0x00) {
scheduleLeftUp(); if(leftType == 0x00) {
leftRequest[leftFloor - 1] = 0; leftExterUp[leftFloor - 1] = 0; leftExterDown[leftFloor - 1] = 0; leftDirect = 0; leftStatus = idle; return; } else {
leftExterUp[leftFloor - 1] = 0; } } else {
leftExterDown[leftFloor - 1] = 0; } }
if(leftStatus == idle) //启动电梯 leftStatus = running; }
7.5.3 外部请求处理函数
外部请求处理过程:
1) 外部请求与电梯所在位置相同,然后判断电梯的状态,若为idle或
者closing,则响应外部请求,立即开门。若为running,则记录下
第 24 页 共 36 页