LabVIEW程序设计方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LabVIEW程序设计方法
为了提高程序设计效率、保证程序设计质量、便于程序的维护,在设计程序时应遵循一些基本的设计方法。
当开发一个较大的项目时,有必要使用由顶向下的设计方法。
LabVIEW语言在使用由顶向下的设计方法上,比其他语言有优势,因为可以先做出用户的接口,然后再逐渐完善它。
1.使用由顶向下的设计方法
1)用户需求列表
先列出一个表格,包括用于用户操作的面板(指大的程序中需要弹出的子程序的面板),这些面板上一般包含控制量与显示量类型,实时分析需求以及数据的表达等。
然后创建一个临时的前面板,提供给预期的用户。
通过一系列交互的过程,按用户的要求反复调整用户接口。
在这个阶段,可能还需要做一些底层的调研,确定可以达到预期的设计要求。
2)设计程序的层次结构
LabVIEW语言的强大功能建立在它的层次特性之上。
每创建一个程序,就可以在高层程序的框图中把它当做子程序使用。
在这种层次结构下,从本质上说层数是无限的。
确定所需顶层模块之后,使用这些顶层模块创建程序代码。
为每个模块创建一个子程序,这个子程序不具备任何功能,只是代表未来子程序的一个模型。
每个子程序应有一个图标和一个包括所有必要的输入输出量的前面板。
但是暂时不必为它创建程序代码,而是确认它是否为顶层程序所必需的。
把这些模型程序组合在一起后,一般说来就应该去理解每个模块的功能,以及它们如何提供需要的结果。
研究每一个模块是否能提供后续程序所必需的信息,然后确认顶层程序代码包含了各程序间传递数据的正确连线。
尽量避免使用不必要的全局变量,因为它们会掩盖了程序间的数据依存关系。
对一个大的程序来说,如果依赖全局变量作为程序间传递信息的手段,会使调试变得困难。
3)程序编码
在程序编制过程中,应按照工作的逻辑划分和考虑代码复用的可能性,通过创建子程序实现模块化的编程,把解决一般性问题与特殊问题相结合。
子程序创建以后及时调试。
高层的调试尽管是不可避免的,但是在一个小模块中发现程序缺陷要比在多个程序的层次上方便得多。
2.规划接口板
有些子程序尽管已经具备足够的功能,但有时考虑在此基础上修改为其他的函数,并且新的函数有可能需要增加输入或输出,那么应该选择一个有富裕端口的接口板样式,暂时不为那些多余端口连线。
这样,以后如果需要另外的输入或输出时就不必再改变接口板了,从而减小这些改变对整个层次结构的影响。
把控制量和显示量连接到接口板时,把输入量放在左侧,输出量放在右侧。
这样可以避免程序中连线的混乱。
如果创建了一组经常用在一起的子程序,尽量使它们的接口板一致,通用的输入放在同样的位置。
这样容易记住每个输入的位置,而不必再使用帮助窗口。
如果我们创建了一个子程序它产生的输出是另一个子程序的输入,尽量将输入与输出端口对齐。
这种技巧使连线看上去简洁。
在前面板上可以对子程序所要求的输入进行编辑。
在窗口右上角的图标上弹出快捷菜单,然后选择Show Connector,再由接口板上某个端口弹出快捷菜单,选择This Connection Is,从子菜单中的Required、Recommended和Optional中选择一项。
3.良好的程序设计风格
一般来讲不要创建幅面大于一到两个显示器屏幕的程序代码。
如果程序很大的话,可以把某些程序组件放进其他程序,或者将程序中的某一块组成一个逻辑单元。
这样就可以考虑把程序划分为多个子程序。
有了好的规划和预见,可使这种利用子程序完成特定任务的程序设计变得容易。
使用子程序使得程序修改和调试都非常快捷。
一个结构良好的程序使人一眼就能看出它的功能。
LabVIEW的设计是从左到右,有时是从上到下的排列程序。
尽可能这样布置程序代码,以便于阅读和修改。
执行任何输入输出操作时都应该考虑到出现错误的可能。
几乎所有的IO函数都返回错误检验信息。
如果使用直接的输入输出(不使用LabVIEW的输入输出函数)。
必须确信程序有检验错误的功能并可以做出适当的处理。
LabVIEW不进行错误的自动处理,因为用户通常有各自的错误处理方法。
例如,如果程序代码中一个输入输出程序发生超时,有时可能希望整个程序停下来,也可能不希望整个程序停下来,而是要求程序在一定的时间内重试。
在LabVIEW环境下,可以在程序代码中决定这些错误的处理方法。
经常发生错误的情况有:通讯初始化不正确或写入外部设备的数据不恰当;外部设备断电、损坏或运转不正常;操作系统升级造成应用程序或库函数功能改变。
一旦错误发生,一般不希望一些后续操作继续。
例如,由于指定了错误的设备导致一个模拟输出操作失败,没有必要使后续的模拟输入操作发生。
管理类似问题的一个方法是在每个函数后进行出错测试,并把后续程序放进一个条件结构。
这种方法会使程序变得很复杂,甚至最终隐藏程序的目的。
一个很好的做法是把错误处理与执行输入输出的子程序结合在一起。
每个程序有一个错误信息端口,让程序检查是否在它前面已经有错误发生。
如果已经存在错误,我们可以设置程序不执行任何操作,将出错检验结果输出传递给用户。
如果不存在错误,则程序执行应有的操作同时将结果传递到出错检验输出。
使用上述的技巧,可以将几个程序连接在一起,让出错检验输入和出错检验输出相连,从一个程序向下一个程序传递错误检验信息。
在这一系列程序的末尾,使用简单错误处理函数,如果有错误则显示一个对话框。
简单错误处理函数位于Functions/Tune&Dialog子选板。
使用这种技巧,除了把错误处理打捆外,还可以确定多个输入输出的执行顺序。
使用出错检验输入和出错检验输出的一个主要好处是可以使用它们控制不同操作的执行顺序。
错误信息通常用一个簇的形式表达,里面包括一个数值形的错误代码、一个包含产生错误的函数名称的字符串和一个反映是否出错的布尔量用于快速查验。
找出遗漏的数据依赖关系。
在没有数据依赖关系的情况下不要假定从左到右从上到下的执行顺序,同时要避免过度使用顺序结构。
因为程序本质上具有很大的并行执行特性,尽量避免使用顺序结构。
使用顺序结构虽然能保证执行的顺序,但是妨碍了并行操作。
例如,如果没有顺序结构的阻碍,使用输入输出设备(GPIB、串口设备和数据采集卡)的并行任务,
就可以和其他操作同时运行。
顺序结构倾向于掩盖部分程序和打断自左向右的数据流。
因此不要因为使用顺序结构而牺牲程序的性能。
当需要执行顺序操作时,我们可能考虑使用数据流来代替顺序结构。
例如执行输入输出操作时,我们可以用前述的出错检验输入和出错检验输出的技巧,来保证一个操作在另一个操作前被执行。