分享

LabVIEW程序应该怎样模块化?

 龙之吻6iinxl8c 2020-07-06

正在用LabVIEW写一个上位机,基本所有功能都集中在main里,只有两个子vi。

如果要模块化,因为很多变量都是相互关联的,难道都需要从子vi的接口中引出来吗?

如果用全局变量的话,听说速度会慢?

请问大家,有什么好的模块化的方法吗?

答:

实际上LabVIEW的模块化方法和任何其他程序的模块化方法并没有什么本质的不同。

这里我简单说一下在LabVIEW环境下我是怎么模块化的。题主现在面临的问题是已经有了一个程序,希望进行拆分,那么在这种情况下主要有2种思路。

第一种是重构,把局部程序抽取出来,进行打包。这个LabVIEW提供了一个很方便的打包工具:创建子系统,在菜单栏的 编辑 下面,选中你要打包的子VI和连线,就可以打包了,接口也自动连上了。当然打包了以后还是要做一些调整。如果没有太高的要求,直接简单粗暴的把各个功能块一框,创建子VI就完了,就算接线很多也没有关系,LabVIEW里的子VI可接的输入输出是相当多的,多层调用也不慢。

当然了,只是这么打包就谈不上模块化了。重构过程是从局部开始,但也需要对整个程序的结构有一定的梳理。比如把变量和函数进行分类,把属性相似的变量打包成cluster,把一个数据流的程序单独列出来排整齐,这样更容易发现数据流之间的共通性。有些已知的处理流程可以做很好的参考,比如串口读数一般采用Open-Config-Read-Write-Close,数据库处理有CRUD,那么一个程序里总会有这些功能,可以考虑按照类似的程序进行打包。比如我曾经做了个读Access数据库的程序,除了LabVIEW自带的工具包外还外接了很多跟我这个程序相关的变量、处理函数和数据接口等,我还是按照Open-Config-Search-Update-Close的流程来重构的,把相关的变量就打包到对应的子函数里。

第二种方法当然就是重新设计了。如果一个程序实在是跟乱麻一样,这个时候单纯局部重构和迭代就不容易了,必须先理清楚现有的程序结构,根据模块化的要求做一些调整。LabVIEW虽然提倡数据流,但也给出了不少模板,比较常用的是状态机,再用上Event组成生产-消费模型,一般程序都够用的,这就已经进行了初步的模块划分。在每个功能模块里应该就是上述的流程化的东西。

题主考虑到用全局变量,看来是已经绝望了。我个人用全局变量主要是用来定义具名常量,以及全局关闭的ExitFlag。代替全局变量的一个不错的选择是用队列。LabVIEW除了队列提供了相当多的数据通道工具,比如集合点、用户定义的事件,但本质上和队列是相通的。使用队列可以给不同的模块输送自己所需的变量值,并严格定义数据类型,比较容易养成一致的编程习惯。比队列再进一步就是设计类了,但是现在阶段不建议这么激进。

考虑题主的程序应该还不大,但是布线已经有点乱了,这个时候最好还是把程序架构以及子模块的接口好好理一理。把前面板更新和数据计算分开,即数据计算只有算法,结果通过队列的方式输送给前面板更新模块。理清楚以后,每个模块一个while框,while里用数据流也好,用并行的流水线也好,用状态机也好,可以根据实际需要来调整。模块和模块之间用队列做数据通道,当然通道的数据类型最好是定义,而不要太依赖Variant类型。做到这些以后,main里就只剩一个个的子模块和相互之间的粗粗的队列线。在这个基础上,有个更高级的玩意儿叫QMH(Queue Message Handler)。到时候再看有没有兴趣了,有的话可以升级成这个。网上也有很多推荐用Class的,但是我个人不是很喜欢。

我大概目前就知道这么多,题主没事可以去LAVA论坛逛逛,多挖掘LabVIEW的自带例程,里面各种惊艳的想法和程序,都值得作为范本。

LabVIEW程序应该怎样模块化?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多