61011207姜蘅育

发布者:系统管理员发布时间:2013-10-14浏览次数:3

61011207姜蘅育
四层电梯控制器
1.首先是编译不通过的问题,这个问题几乎存在于整个系统设计的过程中,其中大都由于编程不细心造成,比如用了中文输入方式,分号忘了写了,if 和 end if 不对应,信号和变量赋值运算符用错了,以及一些输入方面的错误等等等。这些小的错误往往会报出一代堆错误出来,这是由于编译的原理决定的,编译器只会按照固有的规则进行语法检查,它不像人脑那样会灵活的思维,所以前面的一个错会多米诺效应般的推倒后面,从而弄出一大堆错,这是编程中常见的事,从第一个错开始检查。问题就会解决的。
另一方面,我们也要养成良好的编程习惯,书写要工整,结构要有层次感,if else end if对应好。
2.稍复杂的程序不可能一次就能考虑的十分全面的。在调试的过程中,我遇到以下问题:
(1)报过一次警以后,alarming就一直亮着了!后来发现程序中只有alarm为高电平时将alarming置1,反之就没有了,所以当alarm不为高时就清alarming,这个放在了每个时钟上升沿开始来处理的,解决了问题。
(2)新的问题来了,当电梯开门时,如果overweight报警时,门的确一直开着,貌似是有反应了,但是报警灯就是不闪烁!奇怪了,后来发现就是在时钟上升沿时清了alarming,要知道程序中故障报警和overweight我都用的是alarming来显示的,所以就不能仅仅只根据alarm为低就清了alarming。后来我就加了一个mark_ alarm来标记超载的报警,成功解决了问题。详见开门状态的编写部分。
反思:其实这个问题是由于设计不好造成的,我完全可以用两个信号来分别表示故障报警和超载报警,想要使用一个LED来显示报警也很简单,只要二者有一个为有效时就闪烁报警就可以了。所以初始设计的时候还是很难做到周到。
(3)调试时发现电梯的优先权不对。这就奇怪了,明明程序中是严格的按照优先权控制规则来编写的啊。仔细观察发现有的请求根本就没有被响应。比如在一楼时按下2楼下和三楼上,电梯现在2楼听开门了,然后到3楼把3楼的送到了4楼,完了,电梯不下来载2楼的乘客了!后来发现原来在关门时我没有根据运行模式直接把当前层所有请求都清掉了!这就是问题了,比如在刚才上行时在2楼就把2楼的那个下行请求也给清掉了。所以后来电梯没有下来载2楼的乘客。
反思:当然这个问题是由于编程时考虑问题没有严谨的逻辑思维所致。而这在编程中十分重要。我开始用了一大堆辅助变量来记忆各个请求信号。这样做显然逻辑思路不清晰,事实上只要我们锁存了所有有效的请求信号,并在信号被响应的时候清掉相应的信号不就行了吗?根本不需要那么多允余的变量。上行时清掉当前层的上行请求,下行时同样,这又是多么简单的逻辑啊,但我却犯了这个低级错误。所以说在设计时就要细心的考虑,逻辑上一定要严谨。
(4)实际上调试的时候遇到了很多小的问题,让我很郁闷着急,甚至抱怨板子有问题,自己真倒霉。其实,硬件的问题绝对属于少数,几乎没有,问题来源于程序!出现问题时我们要冷静,问题一定对应着程序中的相应语句,只要这样冷静的分析,问题都会被很快的解决的,实际上我发现的重大问题都是这么解决的,可是说我收获了很多。
另外要想使程序完善人性化,很多问题都需要加一系列的标记变量,而这些标记信号的设置就带了何时清除它们的问题,我的程序就遇到了很多这样的问题。详见解析部分。