本帖最后由 dxlwf 于 2013-3-24 00:22 编辑
程序的快速切换——“开关模块”
FLL比赛中需要的是时间,所以怎么样节省时间,挤出更多的时间去做任务是每一个指导老师和参赛学生要考虑的问题。而其中,一个好的程序切换方法可以省出不少时间来。一个常用的程序切换方法是用触碰来实现程序的快速切换,但这种方法会出现一个问题:一个不小心的误操作,碰到了触碰开关,整个程序就得重新再运行一次,而且中间运行过的程序要怎么处理?怎么跳转?是一个比较棘手的问题。曾经看到一个比赛的学生是为了解决快速切换程序问题,安装了三个触碰传感器,但这就带来了另一个问题,他没有更多的端口来安装其它的传感器了。NXT主机只提供了4个传感器输入端口。因此,怎么实现程序的快速切换?一些有经验的指导老师,使用了NXT-G软件的一个不为人所知的功能,那就是采用“多分支程序处理模块”,这个模块在哪里呢?其实,它就是我们平常所用到的“开关模块”。 NXT-G软件的“开关”图标称为切换模块,也就是通常编程语言书本所说的分支结构。在接下来的说明中,我们说到分支结构,就是指“开关”图标所提供的程序处理功能。 首先,我们来熟悉一下“开关模块”的使用,分支结构是指根据输入的条件不同,执行不同的程序指令。如下所示是一个碰磁车程序,程序开始小车前进,当小车的触碰传感器碰到障碍物时,小车后退,转弯,然后再前进。
复杂一点的分支结构是嵌套,比如双光感的小车走黑线程序,如下所示:
上面介绍的是开关模块的基本用法,熟悉的老师和学生可以跳过去,直接看下面的内容。 许多人可能还不知道,NXT-G的切换模块除了前面讲的简单分支处理功能外,还提供了“多分支程序”处理功能,如果没有仔细研究,很容易错过这个很好的功能。 首行,把“开关”模块的控制由“传感器”改成“数值”,则下面的类型会出现“逻辑、数值、文本”。选择其中的“数值”,并把“平面视图”的选项去掉,则可进入多分支程序处理功能。如下图所示:
点击如右图中的加号,可以增加新的条件,程序的流程图上方也同时增加了几个方框,如下图所示,移到第1个方块,会出现数字0,点击,此时可在里面的框框中输入程序指令。相应的,可移到后面的方框中点击选中,输入程序指令。
那么,程序怎么实现多分支呢?可定义一个变量,类型是数值型。然后通过不同的计算方法,给变量赋值,传送到开关模块的数据输入口。开关模块根据输入的不同数值去执行相应的程序指令。输入的每一个数值执行哪一个模块的指令,可在条件窗口的下现输入栏中设定。其中的“*”号可以用来设定默认执行模块,也就是当输入的数值不在窗口的条件栏中时,自动去执行默认模块的指令。
接下来是正题了,FLL比赛中,程序切换要尽量的快速,以便争取更多的比赛时间,怎么来实现呢?下面介绍的这个程序是一个很好的办法,这是一个“快速切换程序”(程序附后),它就是利用前面介绍过的多分支处理功能来编写的。程序分为两个部分,如下所示:
这个程序可以从下面这几个部分来分析: 第一部分:快速选择程序模块。 如下图所示:利用NXT主机的左、右按钮实现程序的快速切换。程序首先判断右按钮是否有按下,如有按下,则进行累加计数。
如下所示,当NXT的右键按下时,每次加1,进行一次加法操作,计算结果还是存放到该变量中。当超过设定值时,不再进行加法计算,而是强制置1,把“程序选择”变量置1,跳到第1个模块。
当NXT的左键按下时,还是进行程序切换,不过是向前切换,第次减1,当减到1时,再减1次,则变量值置为8,直接跳到最后一个,又重新可以往前。左键按下时的程序指令如下所示:
下图是一个屏幕显示程序序号的模块,“程序选择”变量的值输入到多分支开关模块中,根据不同的值,在屏幕上显示程序的序号。该模块在右键按下和左键按下时都要设置,这样才能显示当前要运行的程序是哪一个。
程序的第二部分,是快速切换程序的主程序。 如下所示,该部分仍是一个多分支处理程序。根据不同的输入数值,开关切换程序执行不同的指令模块。
下图的指令模块组1,这是由两个程序部分组成,第一个部分是一个自定义模块,这个模块由事先编写好的程序做成自定义模块,然后放到这里。第二个部分是一个计数模块,程序运行结束时,“程序选择”变量进行加1操作,同时在后面的多分支模块中显示出来。然后跳回到循环的开始部分,反复进行。
如上所述,该快速切换程序通过多分支结构模块快速的实现了程序的快速切换,并且在中间可以随时切换到其它任务模块中,很好的解决了FLL比赛的程序切换需要,这是一个很不错的解决方案。 备注:上述的快速切换程序来源于中文乐高论坛,是由杭州采荷一小的一位老师上传的,在此感谢他的无偿提供和分享,为我们大家带来一份很好的学习资料。
海天老林 2013.3.23 |