电 梯 运 行 模 拟 系 统
(标准的状态机)
大家好,今天我们来学习虚拟仪器的状态机部分,电梯运行是状态机典型实例,通过状态判断实现对上下行和停止三个状态的协调,本节课就建立一个标准的状态机来将复杂的控制问题转换成单步的问题:
实例名称:电梯运行模拟系统
1.模拟电梯箱上下运行和开关门动作;
2.实现楼层呼叫和内部呼叫;添加控制电梯运行机制算法实现呼叫协调;
3.学习用内嵌Matlab功能实现判断呼叫优先级;
关键词:电梯运行算法、呼叫优先级、标准状态机、嵌入matlab代码、数组矩阵处理、矩阵排序;
基础部分(状态机方法)
电梯运行是接受各楼层控制和电梯载人箱体的多方控制,协调电梯的上下行问题方法有很多种算法,最常见的有布尔状态机法和呼叫优先级排序法,呼叫优先级是对呼叫进行优先级的排序来控制电梯到达楼层的顺序,方法思想简单但是不容易实现,要涉及到Matlab数据排序,今天我们先讲述较简单的状态机控制算法,另一种在后续章节来介绍;
下面是简单优化后的运行界面,每个楼层都会有上和下两个呼叫按键,我们大体的思路就是判断呼叫楼层在当前楼层的上面还是下面,在上面上行,在下面下行,当然这只是思路,上下都有呼叫时怎么办?所以要有一个协调的算法。
>>>电梯模拟前台界面
>>>状态机协调后台视图
>>>状态机协调思维导图
一共三个状态,通过呼叫与当前电梯状态判断,来协调电梯的上下行问题,把一个问题分解为三个小问题,当上行时可以继续上行或者减速停止,当下行时可以继续下行或者停止,当停止时电梯可以上行或者下行,一个问题变为三个状态间的相互转换,下面具体来分析实现方法:
if( 运行状态==stop){
上呼叫or下呼叫or电梯箱呼叫;
截取当前楼层上行和下行呼叫状态;
if(有上呼叫&&无下呼叫)进入up状态;
if(无上呼叫&&有下呼叫)进入down状态;
if(同时有呼叫)进入抢占优先级;
if(没有呼叫)进入stop状态;
清除当前楼层上下呼叫和电梯箱呼叫;
楼层不变;
}
if(运行状态==up){
上呼叫or下呼叫or电梯箱呼叫;
截取当前楼层上行和下行呼叫状态;
if(有上呼叫&&无下呼叫)进入up状态;
if(无上呼叫&&有下呼叫)进入stop状态;
if(同时有呼叫)进入up状态;
if(没有呼叫)进入stop状态;
清除当前楼层上呼叫和电梯箱呼叫;
楼层加1;
}
if(运行状态==down){
上呼叫or下呼叫or电梯箱呼叫;
截取当前楼层上行和下行呼叫状态;
if(有上呼叫&&无下呼叫)进入stop状态;
if(无上呼叫&&有下呼叫)进入down状态;
if(同时有呼叫)进入down状态;
if(没有呼叫)进入stop状态;
清除当前楼层下呼叫和电梯箱呼叫;
楼层减1;
}
为了优化程序,把通用功能做成了函数块进行调用,下面代码执行的操作是:将上下状态或集合,由于数组引索是从上往下的排序,第一个引索其实是最高层,最大的引索才是第一楼所以将引索号码翻转才是正确的楼层号;接下来我们截取当前楼层上面的状态和下面的状态,截取上面时输入宽度就可以,截取下面输入引索截取剩余部分;这里比较不好想,举个例子:
比如电梯当前在3楼,15层的大楼;输入3楼,对应的引索号是12;截取0-11的上部分数据,从零开始一共12个数据;截取13-15的下部分数据,是引索12+1=13及以后的数据,也就是13-14两个数据;
引索号前的是当前位置以上的数据,引索号后的是当前位置以下数据。截取数组控件截取长度=引索号,实现截取电梯位置以上的呼叫,记作代号A;截取数组控件起始引索=引索号+1,实现截取电梯位置以下的呼叫。
【注意】这里是通过*上下行*的数据来截取*上部分*和*下部分*的数据。
提高部分(二维优先排序算法)
电梯运行使用状态机比较简单,运行效率不高电梯到达每一层前都需要进行判断是否停下或者保持状态,所以电梯并不会 知道在去哪一层,哪一层停下。这个问题使用状态机是很难解决的,所以引入算法电梯模拟(二维优先排序法),先来解决下面一个问题:
>>>有某19层楼,当前电梯在5楼,短时间内产生一组呼叫,请根据电梯到达的先后顺序进行排序:
当前位置:5楼上行
呼叫数据:
{ 2上、3下、9上、16下、14上、5下、2、1、3、9、12、19 }
解:
:电梯在上行截取,上部分呼叫 大于 下部呼叫,高优先级:{ 9上、16下,14上、9、12、19 }
:呼叫上部分排序,[上行呼叫和电梯箱内呼叫] 大于 下行呼叫 优先级:,上部分数据处理完毕;
:电梯在下行截取,上部分呼叫 大于 下部呼叫,低优先级:
:呼叫下部分排序,[下行呼叫和电梯箱内呼叫] 大于 上行行呼叫 优先级:,下部分数据处理完毕;
:排序完的两个数据组合在一起
所以电梯运行的顺序为:{ 9上、9、12、14上、19、16下、5下、3下、3、2下、2、1 }
当前位置:x,当前状态:y
呼叫位置:m,呼叫状态:n
if( 呼叫位置 > 当前位置 )上行;
if( 呼叫位置
if( 呼叫位置 == 当前位置 ) 停止;
把电梯呼叫按钮分为6个区域,每个区域都有固定的排序方法,升序或者降序;然后按照优先级来连接数据。A和B是[上行呼叫按键数组]的上部分和下部分;C和D是[下行呼叫按键数组]的上部分和下部分;E和F是[电梯箱内按键]的上部分和下部分;这里上部分和下部分是以当前位置为基准判断的。每一次触发都对数据库重新排序,电梯到达目标楼层总是第一条记录,到达目标就销毁该条记录:
上部分:EAC
下部分:FBD
根据上下行判断排序的方法:
电梯上行时优先级:A=E>C>D=F>B
电梯下行时优先级:D=F>B>A=E>C
>用户呼叫触发时:插入新记录→重排数据库;
>到达目标楼层时:销毁第一条记录;
>缓存数据库空时:无操作或控制到达默认楼层;
把用户的每一次电梯操作,形成一条记录存入缓存数据库;用户操作或者电梯路过每一楼层触发协调运行事件,进行数据库排序;当电梯到达某一指定地点,删除记录;
一共三个字段,ID(自动编码主键)/呼叫楼层/呼叫方式,呼叫方式用-1代表下键,+1代表上键,0代表电梯内部呼叫,一个楼层有3个控制键,两个在相应楼层静止不动的,一个在电梯内部是移动的。
》》》排序算法算法实现《《《
用虚拟仪器解决上面的二维优先排序算法问题,我们需要用到labview内嵌的Matlab功能来对二维矩阵进行操作,这里我们先入门了解一下,后续专门介绍:
推荐使用教程:《LabVIEW宝典_陈树学,刘萱编著》第9章
推荐语法教程:https://www.w3cschool.cn/matlab/
(添加微信公众号可查看大图)
本设计制作为原创公益教学课程,转载请注明出处,版权归所有,不得用于获利性活动。
——梦魄@行动(2019/01/15)
lu yuan bin
" The quickest way to learn is to practice, a project will involve a wide range of knowledge, a little learning digestion, endless learning."
"This design is an original public welfare teaching course. The copyright of the content belongs to. It is only for study and not for profit-making activities."
——Dream doing(2019/01/15)
luyuanbin
千 里 教 学 基 地
微信公众号:qlyxgy
主页入口
领取专属 10元无门槛券
私享最新 技术干货