zz10741572发帖:1
发送消息  该帖被浏览 384 次,回复 0 次
发表于:2016-02-01 15:01
楼主
 之所以选择这个软件作为例子分享给大家,最主要的目的是想通过这个例子让刚刚入门LabVIEW的程序员接触程序架构的概念,其所利用的队列状态机,相对来说较简单,是复杂架构的基础,通过这类结构,可以让大家窥探到复杂代码编写的思路,希望大家在阅读代码之后能有所体会。

在《【实例】细说动态注册事件实例(附程序框图+代码)》这篇文章的末尾,我贴出了几张软件中实际应用动态注册事件的图片,该软件是今年虚拟仪器大赛软件组进入复审作品,今天在这里我将详细的解读该作品的编程思路以及一些编写背后的故事。

虚拟仪器大赛的赛制时间比较长,不过2014年我并没有花太多时间投入到这项比赛中(因为其他比赛的原因),接手该软件的时间在2015年1月中旬(放松了2个月后),距离提交代码2个星期左右。从这个角度说,没有进入决赛也属于正常,毕竟投入的时间太少,创意自然也不足。

 

 

代码结构

打开项目文件SmartCampus.lvproj,启动项目管理器,如下图所示。其中前三个文件夹:Database、Map、Video分别用于存储软件的附件;StartPage、DigitalMap、Inquiry、Workbench、Surround、Setting(未启用)是软件的6个模块;Menu用于存储软件菜单文件;Main函数为程序入口。

 

 

程序采用subpanel技术,因此各个模块是独立的,将不同的功能分配到不同的模块,同时本程序采用各个模块分时运行的方式,节省了程序运行的资源。(当然,也可以采用各个模块同时后台运行,只显示1个模块的方式,这可根据实际设计的需要而定。)

程序入口

双击Main.vi进入Main函数。Front panel由功能按钮、滚动条、状态栏、时间显示栏以及subpanel构成,利用splitter将界面分为不同的pane,以适应不同屏幕的分辨率;由于Main函数功能较少,没有设计复杂的结构,只是用了简单的单线程队列状态机,来实现各个模块的调用。需要注意的是,程序需要在每个状态后添加Idle状态,使程序重新回到事件检测状态,否则程序将无法运行;也可在Dequeue处添加超时,并设Idle为default,但是此时错误处理需要注意,大家可自己根据情况设计不同的结构。

 

 

 

 

除了结构,main函数需要额外说明的是文字滚动条的实现。此功能主要是利用了移位寄存器来改变字符串的位置,来实现文字的滚动。需要注意的有两点:

1. 1个汉字占2个字符,因此移动是2个字符;

2. 字符串显示控件需要设置limit to single line,否则可能出现混乱。

 

 

开始界面

Start page是程序运行后的起始界面。其实现的功能相对简单,同样利用了单线程的队列状态机。首先调用.net控件播放MP4短片,同时在右侧的文字显示区域显示介绍性文字。需要注意的是:文字显示控件上面用了一块透明的装饰阻挡了鼠标对字符串显示控件的操作,这样既没有选中文字的效果,同时垂直滚动条依旧可用;MP4播放器做了同样的处理,挡住了操作按钮。

 

 

导航界面

地点查询和导航界面在初始设计时是一个界面,但是被我师弟在前期无情的分成了2个界面,我接手后只能将计就计了,因此这里只介绍导航界面的编辑过程以及实现方法,当然,这也是这款软件最出色的地方所在。(地点查询实际和导航实现的方式很类似。)

 

 

软件的设计过程这就不再赘述,也不画出状态图等说明,只对导航算法做简要说明,同时对代码的实现方法做必要的解释。

导航算法:这里仅做原理性说明,此部分算法不是我研究,因此我也没有公开代码的权力。首先要对地图进行处理,绘制出地图上可行走区域的范围,并最终生成一个矩阵(4个坐标确定1个范围,多个范围因此是一个矩阵);其次定位出地图上所有地点的坐标;再次利用4种算法按像素计算任意两个坐标之间的在可行走范围内的4条路径;找出4条路径中最短路径作为导航的结果。

代码实现:该部分代码不同于main函数和startpage界面的单线程队列状态机,由于功能较多,采用了双线程队列状态机,即将事件结构独立以更快的响应前面板事件。

 

 

这里想简单的介绍一个编程的思想:

程序编写应分为三个层次去设计,UI表现层、数据处理层、接口通信层。由于这里没有硬件接口通信,因此我将UI层分为UI和Operation,分别处理对UI的一些控制;Core为数据处理事件。采用分层设计,绘制合理的状态图,可实现代码的高聚类低耦合,优化整个软件的编写。

这里仅仅是在一个程序内就代码的三层设计进行了简要说明,在更大的范围内,即项目的范围内,可采用同样方法设计vi的功能,这样也就实现了整个项目的高聚类低耦合。

 

 

课表查询

这一模块在之前的编写中没有完成,为了增加软件的工作量,我临时增加了该模块,因此设计上很不完善,而且也仅仅考虑了一栋教学楼的情况。不过在考虑程序扩展性上,我留出了充分的接口,这部分主要体现在对数据库的设计,将每栋教学楼的每一层设计为一个独立的数据库文件,通过文件名来区分,这样就方便了文件的添加。

 

 

界面设计

程序说到这里,仅仅是将功能全部完成,UI的美工也是需要考虑的一个主要方面,由于采用了sub panel技术,以及splitter的使用,界面的颜色配置需要注意一下几点:

1. Splitter不能设置为透明,因此其周围只能选择纯色;

2. Subpanel中各个子vi需要在颜色上和main有很好的衔接;

3. 注意子vi运行时候的位置。

根据以上特点,我选择了切合主题的北航图书馆前的星轨图作为主背景,同时将各个splitter以及各个子pane设置为与图片切合准确的颜色,使整个软件脱离灰色系。(灰色系适合在工控软件中使用,研究发现,灰度高的颜色适合人眼长时间观看而不觉得疲劳,这也是为什么LabVIEW的默认颜色为灰色的原因。)

总结

以上就是该软件主要功能的说明,由于我接手的时间比较紧迫,因此后面几个模块要么砍掉,要么就没有改动,这里就不再一一详细解释。整个软件的编写比较顺利,基本完成了导航的主要功能,同时切合主题,运行顺利稳定,结构较合理,扩展性较强;不足之处在于软件的整体功能设计还很单薄,同时导航没有结合定位功能,同时课表查询如果可以直接联网更新,将使功能变得更加强大。



 
       
     
您需要登录后才可以回复 登录 | 立即注册

 
发帖说明:如果不能直接拷贝粘贴到编辑框中,请在编辑框中点击右键选粘贴也可粘贴拷贝内容!