没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论








LabVIEW 程序设计模式
LabVIEW 程序设计模式
目录
LabVIEW 程序设计模式..............................................................................................1
第一章 绪论...................................................................................................................2
第二章 基本状态机模式...............................................................................................3
第三章 消息队列型状态机模式...................................................................................8
第四章 状态机和事件结构的结合.............................................................................15
第五章 生产者/消费者模式........................................................................................21
5.1 VI 的可重入性(Reentrant Execution) .....................................................22
5.2 LabVIEW 程序的动态调用...........................................................................24
5.3 生产者/消费者循环 ......................................................................................26
5.4 生产者/消费者模式扩展................................................................................31
第六章 总结.................................................................................................................36
1

LabVIEW 程序设计模式
第一章 绪论
我是从 LabVIEW 的中文版帮助文档中接触“程序设计模式”一词的,这个相
对学术化的词语是对一系列用于 LabVIEW 程序设计结构的归纳和总结。在建造
房子时,需要针对房子的用途设计整个房屋的架构,确保房子在这个架构上的
坚固性和可建造性。写程序时同样如此,不同的应用需要使用不同的程序设计
结构。例如我们在 LabVIEW 中构建一个用户界面型程序时,往往首先在背面板
中加入一个大的 while 循环以使程序持续运行。如果需要响应用户界面事件则
还需要加入一个 Event 事件结构。那么我们是否曾经考虑过以下的这些问题:
(1)"""" 应用中是否存在并行响应的情况?如在持续的数据采集过程中,是否需要
同时响应单击菜单的事件?
(2)"""" 底层获取的数据如何与上层的数据显示部分进行数据交互?
(3)"""" 上层的界面如何受底层程序的控制?
(4)"""" 同一个循环中采用哪种方式进行数据交换?是局域变量、全局变量、共享
变量还是移位寄存器?
(5)"""" 程序是否具有可扩展性?
(6)"""" 如果程序运行过程中,发生系统错误或者硬件通讯错误,是否会停止运行?
待错误排除后是否会继续运行?
(7)"""" 如何组织程序中的核心数据结构?是否需要采用面向对象程序设计?
(8)"""" 如何记录测试数据并生成报表?如何保存用户配置参数?
(9)"""" 如何处理程序运行中的断电情况?重新启动时的继续运行?数据的最低丢
失?
(10) 如何实现运行过程的采样触发和多点采样的同步?
当然,也许只是使用 LabVIEW 临时地调试或开发某个小的应用,无需考虑
上述的问题。但是,如果使用 LabVIEW 开发一个典型应用的程序却无法回避这
些问题。因此,有必要对各种程序开发的应用进行归纳和总结,提取它们对应
的 LabVIEW 程序结构中的共性。此外,针对这些共性研究哪种结构更加适合于
应用。这些结论综合起来就形成了程序设计的模式。
对于初学者而言,理解和掌握程序设计模式往往能起到事半功倍的效果;
而对高级用户而言,归纳各种程序设计模式又能够不断完善程序中遇到的问题,
并衍生一套符合特定应用的特有的程序设计模式。
"
2

LabVIEW 程序设计模式
第二章 基本状态机模式
状态机是一种最为经典的程序设计模式,在 LabVIEW 7.1(含)之前它几
乎统治了大部分的 LabVIEW 主程序。最基本的状态机结构如图 1 所示。状态是
状态机运行的经脉,在开始使用状态机模式撰写程序时需要将应用分为若干个
状态。下面以图中的应用为例说明基本状态机的使用。
【应用
1 】
前面板具有 3 个按钮(Control)和 1 个波形显示控件 Chart(Indicator),
功能分别是:
1)""""""" 开始采集:Label 是 start,单击后开始进行模拟数据采集程序(这里使用随
机数代替)。
2)""""""" 关于:Label 是 dialog,单击后弹出对话框以说明这个程序的版权、帮助等
信息。
3)""""""" 停止:Label 是 stop,单击后停止程序的运行。
4)""""""" Chart:用于显示获取的随机数。
这是一个非常简单的应用,但是具有一定的代表性。根据要求,该应用至
少包含以下 5 种状态结构。
1)""""""" Initial:初始化状态;
2)""""""" Idle:空闲状态,用于响应各种用户界面操作;
3)""""""" acquire:采集状态,用于持续模拟采集数据;
4)""""""" about:用于弹出关于和帮助对话框;
5)""""""" stop:停止状态,退出循环并中止程序。
3

LabVIEW 程序设计模式
(a)""" 背面板
(b)""" 前面板
图 1 基本的状态机结构背面板
仔细分析图中的基本状态机,可以看出状态始终贯穿整个应用程序,并由
移位寄存器进行值的寄存和传递。当前状态分支的结果将决定下一个状态,如
图中的 Idle 状态。在这个状态中,程序将自动检测前面板的三个按钮是否被按
下。如果 start 被按下,则进入 acquire 状态;如果 dialog 被按下,则进入 about
状态;如果 stop 被按下,则进入 stop 状态;否则如果没有任何按钮被按下,则
仍然进入当前的 Idle 状态继续检测。
在 acquire 状态中,为了保证程序的重复采集使得下一个状态仍然为
acquire,但是这样会导致程序无法停止(中断采集)。于是需要在 acquire 状态
4

LabVIEW 程序设计模式
分支中加入 stop 的探测,如果 stop 被按下,则不再进入 acquire 状态而直接进入
stop 状态。
从应用 1 可以看出,基本状态机模式大体上能够满足主程序结构的需要。
该模式能够很好地使得应用程序的各个功能以状态的方式有顺序地执行,并且
保证了程序的可读性(以状态图的方式显示清晰明了)和扩展性(日后只需要
扩展状态即可扩展相应的功能)。
事例中使用的是“string”型结构来标记状态,事实上也可以使用其它的数据
类型替换,如 ring、numeric 或 enum。从严格意义而言,ring 并不属于一种数据
类型,它只是一种特殊的 numeric 性,其性质与 numeric 基本上一样。尽管 ring
与 enum 控件从外观上看是一样的,如图 2 所示,但是它们实质上是不同的。主
要体现为以下 7 点。
图 2 Enum 型和 Ring 型控件
(1)"""" enum 型代表的值只能够为 U8、U16 和 U32 型,而 ring 型代表的值允许为
I8、I16、I32、I64、U8、U16、U32、U64、EXT、SGL、DBL 和 FXP 型;
(2)"""" ring 型实质上是一种 numeric 型,而 enum 型是一种独立于 numeric 之外的
数据类型;
(3)"""" 当把 ring 或 enum 型控件分别连接到 case 时,对 ring 型而言,case 结构的选
择端子只能够显示数值;而对 enum 型而言,case 结构的选择端子能够显示
具体的枚举值;
(4)"""" ring 的 strings[]属性可以在程序运行时被修改,而 enum 的 strings[]属性在程
序运行时却无法被修改;
(5)"""" 当把 ring 型和 enum 型控件分别制作成自定义类型控件(Type Def.)时,
ring 的控件实例可以任意设置其 strings[]属性的值,而 enum 的控件实例却
无法设置 strings[]属性的值,如图 3 所示;
(6)"""" 当把 ring 型和 enum 型控件分别制作成自定义类型控件(Type Def.)时,改
变 ring 的 Type Def 中控件的 strings[]属性的值,但是其对应的实例的
strings[]属性却不会改变;而改变 enum 的 Type Def 中控件的 strings[]属性的
值,其对应的实例的 strings[]属性会随之发生变化。
(7)"""" ring 型控件对应的各个状态可以表示任何值(在控件的 property>>Edit Items
对话框中),而 enum 控件对应的各个状态只能够从 0 开始顺序表示(在控
件的 property>>Edit Items 对话框中)。
由于应用程序的各个状态在设计时就是相对固定的,不会在应用程序中进
行修改。对比以上 ring 型和 enum 型的区别,可以看出在基本状态机中,enum
5
剩余39页未读,继续阅读
资源评论

- baowxz2015-01-25总结的还行,就是内容不太深入

四方茉莉UN
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
