以前面试考官出的一道题,要求口头作答。今天简单整理了一下一个电梯的上下运行逻辑。
//2019-6-25 17:06:59 鉴于排版一塌糊涂,今日整修了一下。
一、简单归纳
系统:window7
语言:不涉及
探究事物:一部电梯的运行逻辑的分析
电梯个数:1
电梯状态:int staTi:0.1.2 //0,表示上升,1表示停止,2表示下降。电梯所在层数:int nTi; //梯 中文拼音前两个字母
使用者按键:int staAn: 0,1,2 //0,表示上升,1表示未使用,2表示下降。使用者所在层:int nAn;希望到达层:int hAn; //按中文拼音前两个字母
总楼层数:int nNu; //number 前二个字母
优先级问题:①同层同时点上下。分作两次按键事件处理。
②不同层同时点击。 最优处理,参照下行“优化”说明。
最优处理:每次电梯运行状态(非1)转变(0,2切换)时,需要先判断,是否还有满足此时运行条件的需求。有则继续保持当前运行状态,否,则开始切换。
二、运行逻辑
使用者按键状态staAn改变为0,或者2;此处要由线程随时监控staAn的改变。然后对比电梯状态。
三种情况:
①staAn=0;//希望上升
{
switch staTi:
{
//电梯上升
case 0:
{
//电梯高于人,人类等待电梯本次运行完毕,状态修改为1时,响应状态修改为2下降至nAn层搭载客户,而后上升,此时状态修改为0。
if nti-nAn=>-1
//其它操作
if nTi-nAn<-1 电梯在人类下面一层 电梯运行至此层停止
//电梯停止
}
case 1:
{
//电梯高于人 //电梯状态改为2,下降至nAn层,而后上升至hAn层
if nti-nAn>0
//其它操作
if nTi-nAn=0 //电梯停在同层,人类上电梯。
//其它操作
nTi-nAn<0 电梯停在人类下面,电梯状态改为0,上升至nAn搭载人类,而后上行。
//电梯下降
}
case 2:
{
//电梯高于人,电梯运行至nAn层停下,搭载客户,期间状态不改变。
if nti-nAn=>1
//其它操作
if nTi-nAn<1 //电梯在人类下面, 电梯运行完毕状态修改为零时,上升。
//其它操作
nTi-nAn<0 电梯停在人类下面,电梯状态改为0,上升至nAn搭载人类,而后上行。
//电梯下降
}//结束switch
}//结束①
②staAn=1;//没有人类使用。
{
//始终保存最后一次运行结束的时间,每五分钟对比一次当前时间。15分钟始终未运行。电梯运行至 楼层中间层nNu/2 层。(nTi>nNu/2 ? nTi:nNu)判断nTi及nNu/2的大小,确定电梯运行方向。修改电梯运行状态。
}//结束②
③staAn=0;//希望下降
{
swicth staTi:
{
//电梯上升
case 0:
{
nti-nAn<=-1 电梯低于人,电梯至nAn层搭载客户。
nTi-nAn>-1 电梯在人类上面,电梯运行完毕状态修改为零时,下降搭载客户。
//电梯停止
}
case 1:
{
nti-nAn>0 电梯高于人 //电梯状态改为2,下降至nAn层,而后上升至hAn层
nTi-nAn=0 电梯停在同层,人类上电梯。
nTi-nAn<0 电梯停在人类下面,电梯状态改为0,上升至nAn搭载人类,而后下行,状态改为2。
//电梯下降
}
case2:
{
//电梯高于人,电梯运行至nAn层停下,搭载客户,期间状态不改变。
nti-nAn=>1
//电梯在人类下面,电梯运行完毕状态修改为1时,响应上升,状态修改为0,搭载客户,而后状态修改为2。
nTi-nAn<1
}
}//结束switch
}//结束③
三、其它注意问题
①双击楼层按键应可以取消选择。按照数据库存入操作信息的存储方式的话,此操作应该将该层该类操作信息删除,最好数据库中存在一个字段为status,表示是否可用/删除,将其置为一个删除状态。
②关于电梯的各个楼层的按键可以按照一定结构存入数据库,运行时可通过当前运行方向及楼层,搜索数据库中最近楼层的操作(这样也能实现按键的及时性,即在电梯即将运行到某层时,某层用户立即按键,此数据实时记录到数据库中,电梯实时判断按照当前运行情况搜索数据库,是否存在最近楼层操作,如果存在即停止),以达到最优效果。
③数据库设计。可分为上行和下行进行数据存入。其中运行表中,应包含,”排队序号、电梯编号、上行/下行、操作楼层等主要信息。电梯上行时实时查询上行运行表。下行时访问下行运行表。各楼层请求操作将分上下行存入运行表中。
④某些地方存在高层电梯(停靠>20层),中层电梯(20>停靠>10),底层电梯(停靠<10)。此种类型电梯可以采用两种方式实现,第一种取消硬件按钮,即取消了非停靠层的请求来源。一种是对电梯响应请求时附加条件(即搜索查询数据库时只响应满足停靠要求的请求)。
⑤断电重启之后的考虑。重新上电之后,肯定得清空数据库中一切待运行信息。不然,一上电就运行了。清空之后重新等待按键指令。
⑥检修模式。可直接从硬件着手,点击(或钥匙开启)后,进入静默模式。停止响应一切按键操作。
⑦关门优化。电梯门关门和开门速度是可控的。开门快些,关门,先快后慢。
⑧实时响应按键优化。2019-6-25 17:28:40 如果通过读取数据库来获取用户按键,实际肯定会非常缓慢且耗费系统资源。比较好的修改方案:按键的同时通过硬件传输某个串口或单片机某个引脚一个电压或电流信号,通过约定的通信规则,进行信息处理。这样,既可以节省系统资源,响应时间也会变得快许多。
⑨数据库容器的选择:信息量较少,可使用一般的数据库即可,如:mysql、access、sqlite,此容器作为数据分析、查询用。实时响应要求较高,可使用redis(一种专门为快速存储而生的数据库)。系统运行时定时将mysql、access、sqlite中的主要信息加载至redis中,运行时,软件主要使用的是redis库,后期非定时将数据从redis转储至mysql、access、sqlite中即可。
10、系统的选择:电梯的系统不会存在经常关机。但是从性能上、实时性上考虑应非windows系统。其余系统不太了解,此时需要综合考虑单片机的配置。