石鑫华视觉论坛

 找回密码
 注册会员
查看: 1835|回复: 0

[原创] LabVIEW Vision图像处理开发宝典-第二章 结构框架-第二节 编程框架

[复制链接]
  • TA的每日心情
    擦汗
    15 小时前
  • 签到天数: 3382 天

    连续签到: 4 天

    [LV.Master]2000FPS

    发表于 2020-5-11 17:39:04 | 显示全部楼层 |阅读模式 来自:广东省东莞市 电信

    注册登陆后可查看附件和大图,以及购买相关内容

    您需要 登录 才可以下载或查看,没有账号?注册会员

    x

    LabVIEW Vision图像处理开发宝典-第二章 结构框架-第二节 编程框架

    第二节编程框架
    LabVIEW中有许多的结构,如For循环、While循环、定时结构、条件结构、事件结构、顺序结构、禁用结构等。使用这些结构进行一定的组合,几乎可以搭建任何形式的程序框架。但是使用不同的结构搭建的框架,其编写程序的难易也会不一样。如最简单的一个程序,可能只需要一个VI就可以做了,这时不需要任何的结构。但是这样只能运行一次。这时为了能够连续循环运行,我们就需要加入WHILE循环。在WHILE循环内部,可能还需要使用条件结构来判断不同条件下的执行程序,或者使用事件结构来响应不同的前面板事件,又或者使用FOR循环来重复执行一些数据。

    图1 LabVIEW结构

    图1 LabVIEW结构
    1 LabVIEW结构
    使用文件>新建(N)…菜单,打开新建对话框,然后展开其中的基于模板。在框架里,有许多的结构框架和设计模式。

    图2 新建框架

    图2 新建框架
    2 新建框架
    这些框架,就可以用于编写不同的程序。下面来分别看一下其中的框架模式:

    图3 带错误处理的子VI-无错误

    图3 带错误处理的子VI-无错误
    3 带错误处理的子VI-无错误

    图4 带错误处理的子VI-错误

    图4 带错误处理的子VI-错误
    4 带错误处理的子VI-错误
    上面两图为带错误处理的子VI,从中看到有错误时,会将错误从错误输入传递到错误输出。而无错误时,则不会连线,而是使用默认值,因为默认值也是无错误的,所以可以使用默认值。这种子VI其实在主程序、子VI中都可以使用。主要是针对前面的函数有错误时使用。一般来讲,无错误时会当作处理VI,而有错误时,则会弹出对话框、显示信息等,以提示用户有错误发生。

    图5 带错误处理的主程序-无错误时

    图5 带错误处理的主程序-无错误时
    5 带错误处理的主程序-无错误时
    图5所示为带错误处理的主程序,无错误时,才会进行图像处理等操作,而有错误时,则为空,什么都不执行。
    下图为标准状态机。这种结构是非常经典的结构。上面提到的,在一些有引用的模块中,使用相当频繁。而在主程序中,也会配合队列、事件等构成生产者消费者模式,以完成不同的状态,如上图5中所示即为一种状态机的应用。

    图6 标准状态机

    图6 标准状态机
    6 标准状态机

    图7 队列消息处理器

    图7 队列消息处理器
    7 队列消息处理器
    这种结构相对来讲,使用的比较少,这个模板本质上没有使用队列,而是使用了数组,将可能的事件设置成数组,根据数组索引来确定需要执行什么程序内容,实际应用中很少使用此类结构。
    下图所示为生产者/消费者模式(事件)。这种模式是NI官方推荐的,公认的一种较好的编程模式。这种结构利用了队列函数、WHILE循环、事件结构、状态机等多种结构模式。
    生产者循环,主要是一个WHILE循环,其中旋转一个事件结构。主要是用于生成前面板的事件,并将事件通过入队列函数插入到队列中。
    而消费者循环,则一般是使用WHILE循环,内置一个错误处理函数,在无错误分支中,编辑需要处理的数据函数。一般会在这里放置一个状态机,这样可以根据不同的生产者生成的状态,来执行不同的状态机。

    图8 生产者消费者模式(事件)

    图8 生产者消费者模式(事件)
    8 生产者消费者模式(事件)

    图9 生产者消费者模式应用

    图9 生产者消费者模式应用
    9 生产者消费者模式应用

    图10 生产者/消费者模式(数据)

    图10 生产者/消费者模式(数据)
    10 生产者/消费者模式(数据)
    这种数据类型的生产者/消费者模式,应该也是非常多的。这个主要是用来处理数据的,而不是用于响应前面板事件的。这个在图像处理应用程序中,应用就更典型了,通常来讲,我们的应用程序会使用并行结构,这时采集图像和处理图像可以并行执行,并不一定非要采集完成图像接着就去处理,处理完后再采集图像。而是可以采集图像,然后将他使用数据模式的生产者消费者,将图像数据发送到消费者中,由消费者来处理,而生产者则继续采集图像。即上面的一个生产者循环用于采集图像,而下面的消费者循环用于处理图像、判断数据、运动、保存数据图像等。下面的图所示的,即为一图像处理程序的图像采集与图像处理,使用的就是数据型的生产者/消费者模式。

    图11 生产者/消费者模式(数据)应用实例

    图11 生产者/消费者模式(数据)应用实例
    11 生产者/消费者模式(数据)应用实例

    图12 用户界面事件处理器

    图12 用户界面事件处理器
    12 用户界面事件处理器
    用户界面事件处理,这种结构也是非常实用的一种结构,外面使用的是WHILE循环,里面使用的则是一个件事结构。其主要作用是用于响应前面板的事件。这种结构也是事件型生产者消费者模式的必要组成部分。
    使用用户界面事件结构,可以直接设置一些简单的程序或VI。如下图所示,则为一对话框,使用的就是用户界面事件结构:

    图13 用户界面事件处理器应用

    图13 用户界面事件处理器应用
    13 用户界面事件处理器应用
    图13所示的对话框,也可以直接使用WHILE结构+条件结构实现功能,但是那样会一直循环,以判断“确定”按钮的状态,不是一种优势的编程方式,因此使用事件结构是比较理想的。

    图14 主/从设计模式

    图14 主/从设计模式
    14 /从设计模式
    图14为主从设计模式。这种模式与生产者消费者模式(数据)非常相似,只是这里使用的是通知,而不是队列函数。通知器操作函数用于挂起一个程序框图的执行,直至从程序框图的另一部分或同一应用程序中运行的另一个VI收到数据后才继续执行。通知器无法用于与其它计算机上的VI通信。例如,通知器无法用于网络间的通信或VI服务器间的通信。与队列操作函数不同,通知器操作函数不缓冲已发送的消息。如消息被发送后没有任何节点在等待,则当另一消息被发送后数据将丢失。通知器的执行类似于单元素、有损耗的绑定队列。
    这种模式在一般的应用程序中应用不是很多,通常都是使用生产者/消费者模式进行设计。只有需要不同VI之间通信的时,才考虑使用这种模式。
    本书所讲解的程序框架会以生产者/消费者设计模式为主,配合其它一些条件结构、状态机、用户界面事件响应等结构来完成程序的设计,以达到简洁、高效的目的。


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

    LabVIEW HALCON图像处理入门教程(第二版)
    石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
    《LabVIEW Vision函数实例详解》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24

    QQ|石鑫华视觉论坛 |网站地图

    GMT+8, 2024-11-20 23:26

    Powered by Discuz! X3.4

    © 2001-2024 Discuz! Team.

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