石鑫华视觉论坛

 找回密码
 注册会员
查看: 8053|回复: 7

[共享] 简单状态机-NI LabVIEW官方教程

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

    连续签到: 4 天

    [LV.Master]2000FPS

    发表于 2013-9-24 15:26:14 | 显示全部楼层 |阅读模式 来自:广东省东莞市 联通

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

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

    x
    概览
    “简单状态机”模板便于定义各代码段的执行序列。这种特定的实现通常称为摩尔机-下一个状态取决于当前状态的决定。代码段可以随意增减,执行顺序可以随意更改,不必对应用程序的结构作大改动。

    目录
    • 范例
    • 开发者走查
    • 系统要求
    • 使用条件
    • 概述
    • 运行本模板
    • 修改本模板
    • 重要信息

    1. 范例
    关于修改本模板以用于测量应用程序的范例,见创建项目对话框中的“有限次测量”范例项目。

    2. 开发者走查
    关于本模板开发者走查的详细信息见ni.com。

    3. 系统要求
    LabVIEW基础版、完整版或专业版开发系统

    4. 使用条件
    本模板适用于符合以下所有情况的应用程序:
    • 状态
    • 决策逻辑:确定何时转移至特定的状态
    例如,对下列应用程序采用状态机模式非常有效:
    • 单个页面或包含多个选项卡的对话框。对话框的每个选项卡对应用于一种状态。用户单击特定的选项卡时,启动状态转移。对于每个选项卡,用户可执行的操作都包含在相应的状态中。
    • 自动取款机(ATM)。该应用程序可能涉及以下几种状态:等待用户输入、检查请求的金额是否超过账户余额、吐钞、打印收据等。
    • 执行一次测量,将结果记录至磁盘,然后等待其他用户操作的应用程序。该应用程序可能涉及以下几种状态:等待用户输入、执行测量、记录数据、显示数据等。

    5. 概述
    image4709253861718257372.jpg
    注:
    • 上图中的每一种状态对应于Main.vi中条件结构的一个分支。同时,每种状态:
      • 执行某项操作
      • 通过向While循环的移位寄存器传递指令,指定状态机的下一个状态。
    • 初始化完成后,状态机转移至"Wait for Event"状态。该状态通过事件结构等待前面板发生改动。用户单击按钮时,由LabVIEW识别该事件,然后切换至事件结构的相应分支。接着由该分支发起状态转移,转移至相应的状态。
    • 每种状态可以访问一个数据簇。簇中包含的数据类型通过Data.ctl定义。
    • State.ctl是一个自定义类型,罗列了有效的状态。用自定义类型实现状态转移的方法限制了可能的转移操作数量,减小了状态机陷入不可识别状态的可能性。
    • 只有Stop状态可以使应用程序停止运行。这种设计可以避免应用程序意外关闭或不完全关闭,原因是:
      • 仅当用户需要停止应用程序时,才会运行关闭代码。
      • 关闭代码总是运行直到彻底完成。
    • 同一时间只运行一种状态,由于采用了单个While循环,所有任务按相同速度执行。如需实现按多种速度执行或并行执行的任务,可考虑采用“队列消息处理器”或“操作者框架”模板,上述模板均可在创建项目对话框中找到。
    • "Wait for Event"状态是唯一能识别用户输入的状态。程序接收用户输入时,状态机必须处于该状态下。

    6. 运行本模板
    • 项目浏览器窗口,打开并运行Main.vi。
    • 单击各前面板控件,显示不同的弹出对话框。

    7. 修改本模板确定需求
    对本模板进行自定义之前,应确定以下问题:
    • 应用程序包含哪些状态?该问题的答案决定了需要添加的状态。
    • 对于每一种状态,下一个状态是什么?该问题的答案决定了发送至While循环移位寄存器的枚举型Next State的值。

      单个状态在一定条件下可转移至多个状态。例如,模板的"Wait for Event"状态可根据用户输入转移至另一状态。
    • 每一种状态需要访问何种类型的数据?该问题的答案决定了需要添加至Data.ctl的数据类型。
    • 可能出现哪些错误,应用程序应该如何响应这些错误?该问题的答案确定了错误处理的工作量。
    添加初始化代码
    按照下列步骤为应用程序初始化添加代码:
    • 选择条件结构的Initialize条件分支。
    • 为应用程序初始化添加代码。例如,可能需要打开一个磁盘文件用于记录,可能需要对Data.ctl中的数据设定初始值。
    • 确定待转移的下一个状态。默认情况下,"Initialize"状态转移至"Wait for Event"状态:

      loc_state_transition_20120709225349.png

      根据应用程序的需求,用户可修改该代码,转移至其他状态。
    添加启动状态转移的控件
    • 在前面板上添加一个控件。
    • 选择条件结构的"Wait for Event"分支。
    • 在事件结构中添加事件分支。
    • 配置事件结构:当新控件的值发生变化时,触发事件。例如:


      loc_new_button_value_change_20120709225322.png
    • 单击确定。LabVIEW会在事件结构中创建一个分支。
    • 在分支中,为新控件拖曳程序框图接线端。
    • 确定用户与该控件交互后待转移的状态,将枚举型的值设为这个状态,然后连线至Next State输出隧道:

      loc_new_button_transition_20120709225335.png

      待转移的状态不存在的情况下,需要添加状态。


    添加状态
    按照下列步骤,添加状态:
    • 更新State.ctl自定义控件,其中包含有效状态:
      • 选定一个State.ctl枚举型,然后打开自定义类型:

        loc_open_states_typedef_20120709225347.png

        LabVIEW会显示控件编辑器窗口。
      • 状态枚举型中为新状态添加项。
      • 输入新状态的名称。例如:

        loc_new_state_20120709225325.png
      • 单击控件外的区域,保存名称。
      • 选择文件鐀用改动
    • 将状态添加至状态机:
      • 在Main.vi的条件结构中添加一个分支。
      • 为该状态添加执行代码。完成该步骤时,需注意下列事项:
        • 通过“按名称解除捆绑”和“按名称捆绑”函数访问和修改状态数据:

          loc_use_state_data_20120709225339.png
        • 将函数的错误接线端与错误移位寄存器相连。
        • 连线“假”常量至布尔输出隧道。只有"Stop"状态可以使循环停止运行。
        • 必须为每种状态设定待转移的下一个状态。将下一个状态的值连接至"Next State"输出隧道。连入该接线端之前,还可以按条件实现一定的逻辑。下图显示了这种逻辑的范例:

          loc_conditional_state_transition_20120709225319.png

          上述代码中,如数据大于0,则下一个状态为User State 1。否则,下一个状态为User State 2。如需实现更高级的条件逻辑,可采用条件结构。
        • 确保应用程序在一定条件下可转移至这种新的状态。



    修改状态可访问的数据类型
    按照下列步骤修改状态可访问的数据类型:
    • 选定一个Data.ctl枚举型,然后打开自定义类型:

      loc_open_data_typedef_20120709225341.png

      LabVIEW会显示控件编辑器窗口。
    • 按需求定制控件。
    • 选择文件鐀用改动
    添加关闭代码
    将关闭代码添加至条件结构的"Stop"分支。该分支是唯一能使应用程序停止执行的分支,因此必须确保添加至该分支的代码在应用程序停止之前执行。这样做可以防止意外关闭和不完全关闭。
    关闭代码通常实现下列任务:
    • 关闭全部打开的引用,释放内存。
    • 刷新使用中的缓冲区。
    • 向硬件输入通道写入安全值。

    添加错误处理
    默认情况下,任意函数的错误输出接线端返回错误时,本模板将停止执行。根据应用程序的需求,可能要忽略特定的错误,或实现更高级的错误处理。按照下列步骤,添加错误处理:
    • 添加一个错误状态。
    • 在错误状态中,按照需求创建处理错误的代码。
    • 对于其他状态,确保出错时转移至错误状态。例如:

      loc_transition_error_20120709225344.png
    删除用户界面
    如应用程序不需要用户界面,可按照下列步骤删除用户界面:
    • 删除全部前面板输入和显示控件。
    • 删除Main.vi中条件结构的"Wait for Event"分支。
    • 上一步操作会删除默认分支,默认分支会在条件选择器跳转至未知分支时执行。为便于错误处理,必须将另一个分支设为默认。
    • 修复断线。
    也可从State.ctl中删除Wait for Event。这一操作可确保状态机永远不会试图转移至这个已被删除的状态。不过在删除操作之前,应该为应用程序中所有设为该种状态的枚举型添加一项注释。保存更改后的State.ctl,枚举型的值会更新。如有需要,可输入新的状态,或对原有状态进行更改。


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-1 13:11
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]200FPS

    发表于 2013-9-25 09:48:14 | 显示全部楼层 来自:广西桂林市 电信
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2014-2-10 16:30:39 | 显示全部楼层 来自:江苏省苏州市 电信
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    11 小时前
  • 签到天数: 3382 天

    连续签到: 4 天

    [LV.Master]2000FPS

     楼主| 发表于 2014-2-13 22:56:25 | 显示全部楼层 来自:广东省东莞市 联通
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-3-5 16:19
  • 签到天数: 126 天

    连续签到: 1 天

    [LV.7]700FPS

    发表于 2014-2-16 22:02:37 | 显示全部楼层 来自:广东省东莞市 联通
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-4-7 11:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]100FPS

    发表于 2015-4-7 13:28:14 | 显示全部楼层 来自:湖北省武汉市 电信
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2015-5-10 13:45
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]300FPS

    发表于 2015-4-24 13:11:16 | 显示全部楼层 来自:安徽省合肥市巢湖市 电信
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2015-5-10 13:45
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]300FPS

    发表于 2015-4-24 13:11:46 | 显示全部楼层 来自:安徽省合肥市巢湖市 电信
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

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

    GMT+8, 2024-11-20 19:44

    Powered by Discuz! X3.4

    © 2001-2024 Discuz! Team.

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