[资料] 【代码】虚拟仪器大赛软件组复审作品(附程序说明+代码)

  [复制链接]

技术员

发表于 2015-5-5 17:48:52   447934 查看 318 回复 只看该作者 倒序浏览
分享
本帖最后由 zcsky 于 2016-4-1 13:06 编辑

写在前面:之所以选择这个软件作为例子分享给大家,最主要的目的是想通过这个例子让刚刚入门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的默认颜色为灰色的原因。)
总结
      以上就是该软件主要功能的说明,由于我接手的时间比较紧迫,因此后面几个模块要么砍掉,要么就没有改动,这里就不再一一详细解释。整个软件的编写比较顺利,基本完成了导航的主要功能,同时切合主题,运行顺利稳定,结构较合理,扩展性较强;不足之处在于软件的整体功能设计还很单薄,同时导航没有结合定位功能,同时课表查询如果可以直接联网更新,将使功能变得更加强大。
   
    附件已删除,如有需要请联系作者。
    2016.04.01

inquiry back.jpg (22.13 KB, 下载次数: 115)

inquiry back.jpg

1.png (55.44 KB, 下载次数: 123)

1.png

2.png (130.5 KB, 下载次数: 115)

2.png
标签:仪器
举报

技术员

发表于 2015-5-5 20:36:12    楼主|
是不是版本太高了?
回复

举报

实习生

发表于 2015-5-5 20:54:38  
确实。。。。我的是2013
回复

举报

技术员

发表于 2015-5-5 21:07:55    楼主|
dengzi641 发表于 2015-5-5 20:54
确实。。。。我的是2013

明天换成2010试试
回复

点赞 举报

发表于 2015-5-5 22:49:29  
感谢超哥的分享,每次看超哥的代码都能学到新东西
回复

点赞 举报

技术员

发表于 2015-5-5 22:59:32    楼主|
ymj120572092 发表于 2015-5-5 22:49
感谢超哥的分享,每次看超哥的代码都能学到新东西

刷评论inggggg
回复

点赞 举报

发表于 2015-5-5 23:03:11  
多谢超哥分享,期待更多优秀作品。。。。
回复

点赞 举报

技术员

发表于 2015-5-5 23:03:52    楼主|
dengzi641 发表于 2015-5-5 20:54
确实。。。。我的是2013

有人帮我转了2013 我把地址帖出来了
回复

点赞 举报

技术员

发表于 2015-5-5 23:06:31    楼主|
小鹰fighting 发表于 2015-5-5 23:03
多谢超哥分享,期待更多优秀作品。。。。

{:23:}
在你们的影响下,我也开始混论坛了呵呵
回复

点赞 举报

工程师

发表于 2015-5-6 08:29:40  
感谢楼主分享!!
回复

举报

技术员

发表于 2015-5-6 09:10:42    楼主|
ShuiMoLise 发表于 2015-5-6 08:29
感谢楼主分享!!

有问题再交流!!
回复

点赞 举报

技术员

发表于 2015-5-6 09:40:24    楼主|
TJDXP2009 发表于 2015-5-6 09:34
学习一下!学习一下!学习一下!学习一下!

希望测试一下附件的下载,看看代码是否可运行,我把代码转成2010版本了!
回复

点赞 举报

实习生

发表于 2015-5-6 09:45:36  
超哥作品 不顶可好?
回复

举报

技术员

发表于 2015-5-6 09:49:38    楼主|
1061190315 发表于 2015-5-6 09:45
超哥作品 不顶可好?

多交流呵呵,我也就是拿出来和大家分享一下,一起讨论讨论
回复

点赞 举报

技术员

发表于 2015-5-6 11:14:41  
顶一个现在原创性的作品太少,精华的东西也太少,,,,,,,,,,,,,,,,,,,,,,,,,
回复

点赞 举报

技术员

发表于 2015-5-6 11:30:52    楼主|
远行@流浪 发表于 2015-5-6 11:14
顶一个现在原创性的作品太少,精华的东西也太少,,,,,,,,,,,,,,,,,,,,,,,,,

多整理整理 其实有很多东西大家可以互相交流的!
回复

点赞 举报

实习生

发表于 2015-5-6 15:21:07  
谢谢
楼主的分享。。。。。。。。。。。
回复

举报

技术员

发表于 2015-5-6 15:35:40    楼主|
小单1234hi 发表于 2015-5-6 15:21
谢谢
楼主的分享。。。。。。。。。。。

回帖光荣 呵呵!!!
回复

点赞 举报

助理工程师

发表于 2015-5-6 16:17:15  
感謝感謝   啊啊啊啊啊啊    非常有用
回复

点赞 举报

助理工程师

发表于 2015-5-6 17:00:15  
多谢分享。。。。。。。。。。。。
回复

举报

高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区