为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Labview串口

2012-02-09 28页 ppt 1MB 42阅读

用户头像

is_335912

暂无简介

举报
Labview串口nullLabview串口Labview串口Master/Slave Deisgn Pattern(主从设计模式)       在这种模式下,Master循环通过Notifier(通知器)来控制Slave循环的工作。这种模式有什么用呢?如果是传统的单循环结构,当程序处理代码耗时过长的话,很有可能会造成控制指令响应的滞后。而在主从模式下,Master循环可以用来接收控制指令,Slave循环用来执行相应的代码,从响应上来说,就能够避免长时间不响应的情况出现。       Producer/Consumer Design Patte...
Labview串口
nullLabview串口Labview串口Master/Slave Deisgn Pattern(主从设计模式)       在这种模式下,Master循环通过Notifier(通知器)来控制Slave循环的工作。这种模式有什么用呢?如果是传统的单循环结构,当程序处理代码耗时过长的话,很有可能会造成控制指令响应的滞后。而在主从模式下,Master循环可以用来接收控制指令,Slave循环用来执行相应的代码,从响应上来说,就能够避免长时间不响应的情况出现。       Producer/Consumer Design Pattern (Events)(响应事件的生产者/消费者模式)       这种模式的结构很类似于主从模式,这里的两个循环变成了Producer循环和Consumer循环。在主循环里,用一个Event Structure响应用户的界面操作,每一步操作通过Queue送到Consumer循环里执行。这样,实现了界面和事物代码的分离,有助于代码的模块化设计。       Producer/Consumer Design Pattern (Data)(处理数据的生产者/消费者模式)       跟前面一种模式基本一样。这种模式一个很典型的应用环境就是高速数据采集和保存。因为高速数采对数据读取速度要求很高,而对磁盘的操作是一件很花时间的事情,用这种模式把两者分开,可以保证数据读取的速度。实际上,这里的Queue也就是起到了一个Buffer的作用,把数据先暂存在内存里,然后一点一点交给硬盘写入。       Queued Message Handler(消息队列处理器)       这是一个非常有意思的结构,以这种结构为基础,可以做出非常好的程序结构,可读性和紧凑性都非常好。  Standard State Machine(状态机)       这也是一种非常好的结构,跟Queued Message Handler配合,用在前面说的三种模式里,搭建的程序框架,已经是我LabVIEW程序开发的标准框架了。       User Interface Event Handler(用户事件处理器)       其实就是一个Event Structure,没有什么特别之处。 何谓数据流何谓数据流    从计算机的发展过程可以看出,计算机的硬件体系架构对计算机编程语言有着深远的影响。长期以来,绝大多数计算机编程语言都是依据冯.诺伊曼硬件体系架构来设计的,这种类型的语言被称为命令式(过程式)语言。以汇编语言为例,它就是基于冯.诺伊曼硬件体系运行机制的一种抽象,它把程序看作是由若干行动指令和变量组成的有序列,并用变量来存储数据,用语句来执行指令。这种命令式(过程式)的程序,其运行机制是基于控制流的,所以也被称为控制流编程。     尽管LabVIEW图形化编程语言也是基于冯.诺伊曼硬件体系架构,但它在创建图形化代码之初就确定为基于数据流运行机制,也被称为数据流编程。这是图形化语言与传统编程语言不同之处。     实际上,数据流编程是一种软件体系架构,它最初存在于电子表格数据处理软件中。在电子表格中,我们可以指定某个公式依赖于电子表格中某些行、列单元格中的数值(公式在后台进行计算),当这些单元格中的任何一个数值发生改变时,电子表格会按公式自动重新进行计算,从而得到新的、准确的计算结果。 null数据流是图形化语言中控制节点执行的一种运行机制。与大多数基于文本顺序处理的计算机语言不同,数据流要求节点中可执行代码接收到所有必须的输入数据后,节点才会被执行;另一方面,仅当节点中的代码执行完成后,数据才会流出节点。     节点间的数据是依赖于连线来进行传递的,连线确保所传递的数据类型是一致的数据流编程的基本特点数据流编程的基本特点    为了更好的了解和理解数据流编程的思想,我们简单总结图形化语言数据流编程的一些特点: 第一,数据流编程是一种显式的编程方式     数据流编程主要对象是接线端、节点和连线。但是节点中的不同连线导致了数据或者并行发生或者串行发生,这些通过程序框图我们可以直观的查看到。所以在设计和分析程序代码时我们要充分注意到这种情况。     这种显式的编程方式基本上是从左向右进行的(特例是反馈节点和移位寄存器),它的运行方式也如此。数据流编程不存在从上到下的编程方式,这一点要给与充分的注意。 所以说图形化语言天生地具有并行执行能力。这点对于测量和控制程序而言实在是太重要了。 null第二,数据序是命令式执行     数据流程序基本是命令式执行的,通过前面的一些代码可以清楚的看到这一点。但是一些彼此不相关的程序段会是并发同时执行的,这些通过前面的例子也看得很清楚。这就要求我们代码排放要有规矩,避免随意放置代码导致程序运行的逻辑混乱。     连线在执行顺序上起到了至关重要的作用。所以连线的整洁和清晰是设计者必须要引起注意的问题。 null第三,变量会破坏数据流的运行机制     因为变量可以随处放置使用,从而导致破坏了图形化语言最基本的数据流运行机制。甚用变量是图形化语言中的一种特殊要求。这也是为什么图形化语言中会出现多种变量的主要原因,目的是尽可能的缩小变量的使用范围。     其实合理的使用变量是可以避免一些问题出现的,比如变量用于初始化状态,同时尽量避免在其它地方改写变量等等。这点需要依赖设计者的警觉性。 第四,输入控件或常数是数据流的源头,显示控件是数据流的终端     我们一定还记得,控件被分为输入控件和显示控件两种。输入控件被作为数据流运行的源头,而显示控件被作为数据流运行的终端。这些特征是图形化语言数据流编程所需要的必然结果。回顾一下我们所创建的子VI,我们也必须使用输入控件和显示控件来定义子VI的接线端。实际上就是确定数据流的输入端和输出端。 nullnullnull第二种  为readbuf 创建局部变量 然后设为可读的 另外,由于得到的数据为16进制数,利用“电子表格字符串至数组转换”函数,使之换算成一维标量数组,得到实际的转矩、转速物理量的数组表示,再由转矩和转速计算出相应的功率值(注:功率=扭矩X转速XK,本文k=1/9.55,所求功率的单位是瓦特W),之后转矩、转速和功率数组合并并通过自动索引隧道进入for循环中,由“创建波形”节点创建波形数据,nullnull这三种隧道从上至下分别是:索引隧道、移位寄存器(shift register)、一般隧道。     一般隧道,就是把数据传入传出循环结构。数据的类型和值在传入传出循环结构前后不发生变化。        索引隧道是 LabVIEW 的一种独特功能。一个循环外的数组通过索引隧道连接到循环结构上,隧道在循环内一侧会自动取出数组的元素,依顺序每次循环取出一个元素。用索引隧道传出数据,可以自动把循环内的数据组织成数组。     通过移位寄存器传入传出数据,也是数据的类型和值都不会发生变化。移位寄存器的特殊之处在于在循环结构两端的接线端是强制使用同一内存的。因此,上一次迭代执行产生的某一值,传给移位寄存器右侧的接线端,如果下一次迭代运行需要用到这个数据,从移位寄存器左侧的接线端引出就可以了。 nullNotifier(消息通知器),实际上是一种特殊的队列,这个队列里最多只会存在一个数据,当有新的数据送入队列是,旧的数据就会被覆盖掉。那么,Notifier有什么用呢?可以用来进行循环间的流程控制。 通告和队列的方式有时可代替变量方式来传递数据。变量需要程序使用循环不断查询变量的值,使用通告方式传递数据时,只有写入数据并告知后才能读取数据。通告以广播的方式发布,收到广播的用户都可以去读数据。队列方式传递数据是最先去读数据的用户读完数据就将它擦掉,队列只有一个接收数据的用户。null宏观上讲,LabVIEW的运行机制已不再是传统上的冯·诺伊曼式计算机体系结构的执行方式了。传统计算机语言(如C语言)中的顺序执行结构在LabVIEW中被并行机制所代替。本质上讲它是一种带有图形控制流结构的数据流模式,程序中的每一个函数节点只有在获得它的全部输入数据后才能够被执行。既然LabVIEW程序是数据流驱动的,数据流程序设计规定,一个目标只有当它的所有输入有效时才能够被执行;而目标的输出只有当它的功能完全时才是有效的。于是LabVIEW中被连接的函数节点之间的数据流控制着程序的执行次序,而不像文本程序那样受到行顺序执行的约束。我们可以通过相互连接函数节点简洁高效地开发应用程序,还可以有多个数据通道同步运行,即所谓的多线程。http://hi.baidu.com/pizi14584/blog/item/533eb52b48766337d52af176.htmlhttp://hi.baidu.com/pizi14584/blog/item/533eb52b48766337d52af176.html由于被动方式中串口的缓冲区中一直会有数据在,为了保持数据的连续性,在读取数据时跟第一种仪器控制类型不一样。而是采取将读取的所有的串口数据都保存在移位寄存器中,在软件上处理完这些数据后再将它们从移位寄存器中删除。 由于VISA READ的输出是字符串,所以一般使用“连接字符串”这个函数将它们连接起来,然后接到循环结构中的移位寄存器中进行保存,当移位寄存器中的数据量达到一定时或满足数据处理的条件时,才停止这个循环输出读取到的数据。 null当隧道里面有个小括弧时,自动索引就被打开了,For循环中默认连线隧道就是启动自动索引的。当你把一个数组输入终端连线到For循环中并且开启自动索引功能,LabVIEW会自动设定For循环的次数和数组长度一致而无需手工设定。默认状态下LabVIEW在For循环中开启自动索引功能,程序便可以在循环中每次处理一个数组中对应的元素。如果循环中不需要每次处理一个元素可以关闭自动索引功能。同样的,如果在数组输出隧道中开启自动索引功能,输出数组每次会接受到一个循环中输出的数组元素。因此自动索引的输出数组的长度和循环次数总是一致的。要开启或者关闭自动索引,右击隧道进行选择。 null字符转换字符转换nullnull将串口读取(VISA Read)函数的输出端口读取缓冲区(read buffer)与截取字符串(String Subset)函数的输入端口字符串(string)相连。 · 将数值常量(值为4)与截取字符串(String Subset)函数的输入端口偏移量(offset)相连。 · 将数值常量(值为6)与截取字符串(String Subset)函数的输入端口长度(length)相连。 · 将截取字符串(String Subset)函数的输出端口子字符串(substring)与分数/指数字符串至数值转换(Fract/Exp String To Number)函数的输入端口字符串(string)相连。 · 将分数/指数字符串至数值转换(Fract/Exp String To Number)函数的输出端口数字(number)与减号(Subtract)函数的输入端口x相连。nullnullnullnullnull在查找串口数据帧的帧头时,我上面用的算法并不是最好的,其实可以直接使用字符串搜索函数来搜索帧头,而不需要转换为字节数组后搜索第一个字节再搜索第二个字节,可以参考下面的图片,其中帧头是以十六进制显示方式显示的,输出-1就表示没有搜索到帧头,大于0表示搜索到了帧头,然后进行相应的处理。怎样触发Labview VISA进行数据接收怎样触发Labview VISA进行数据接收串口操作为例,配置之后,可以利用Bytes at Port的属性节点判定当前是否有数据,然后read。 可以试一下Enable Terminal Character,并把Terminal Character设为'\n',还有read buffer size设为常数。上位机发送的字符串都以'\n'结尾,看下是不是能够接受完一帧即返回。 在LabVIEW程序设计过程中,变量(局部变量和全局变量)、通知器、队列常用于多个循环之间传递数据。 但是通知器不会缓冲数据,如果主循环在从循环读取第一份数据之前发送另一份数据,那么原来那份数据就会被覆盖并丢失。队列类似于通知器。但它可以存储多份数据,默认情况下,队列按照FIFO(先进先出)的方式执行。null在调试的过程中,我们经常会发现有收到的数据延迟的现象,现在提出几点解决的方法: (1)在循环中加入适量的延时,通过一个简单的例子看, 你会发现在cpu的占用率在加延时和不加的时候有很大的区别,当加的时候基本不占,而不加延时的时候达到100%。我在调试串口通信时候,发现while loop里加一个延时会有很好的效果(假如有一个或某几个线程占用了 100% 的 CPU,此时系统对其他线程就会反应迟钝。例如,程序的执行线程占用了100% 的 CPU,那么用户对界面的操作就会迟迟得不到响应,甚至于用户会误认为程序死锁了。所以在程序中要尽量避免出现 100% 占用 CPU 的情况。 目前大多数的计算机还是单核单个 CPU 的,因此要避免任何一个线程试图 100% 占用 CPU 的情况). (2)visa read 的字节总数最好用一个属性节点来代替 因为我们不知道数据缓冲区有多少个字节,这样就不需要去设定了 (3)经常看到会有人说串口里面有一堆数据,但是去读的时候却读回来一点点,每次均不相同,这种怀状况是由于串口有一个serial configuration这个节点上面,有一个termination char,大家将它设为F就可以了,因为遇到这个终止符,它就会停止读数,所以读回来的就会少了! nullLabVIEW中的同步技术——Notification、Queue、Semaphore、Rendezvous、Occurre 1, Notification Notification意思是通告,通常用于二个相互独立的框图程序之间或同一台计算机中二个不同VI之间的同步通信。 Notifier是基于Notification技术的通信工具,可以看作数据之间的邮箱,一部分框图程序向邮箱中发送数据,另一部分框图程序从这个邮箱中收取数据。这使得Notifier听起来更像一个本地变量或全局变量。但是,框图程序从Notifier中获得数据与从变量中获得数据相比,主要不同之处是:框图程序会不停地从变量中读出数据,而当框图程序从Notifier读出数据之后,就会处于等待状态,直到Notifier中有新的数据时为止。这就避免了无休止地循环检测,从而减少了计算机时间的浪费。 Notification技术不能用于网络或VI Servers之间通信。 2, Queue Queuer的意思是队列。Queue结构是一种先进先出(FIFO—First In First Out)的结构 利用Queue技术,可以将一个有序的消息(或数据)从一个应用程序中传递到另一个与之相独立的并行运行的应用程序中。用户可以在下列场合使用Queue技术:一个应用程序等待,直到另一个应用程序为其准备好一些可用的数据为止;或者是需要一个应用程序等待,直到另一个应用程序处理完毕第一个应用程序所提供的数据为止。 Queue和Notification技术不同的是,Queue技术把数据发送到一个Queue缓存中,如果没有应用程序将这些数据读出,那么,这些数据将一直保存在Queue缓存中,直到有一个应用程序将其读出并删除为止。同样,如果有二个应用程序都在等待同一个Queue中的同一条数据,那么只有动作快的应用程序会收到数据,而动作慢的那个应用程序则不会收到预期的数据,因为这条数据已经被动作快的应用程序读出并删除了。 null3,     Semaphore  Semaphore的意思是信号量。Semaphore技术可以用于限制任务的数目,这些任务可能同时对一个共享资源进行操作。受保护的资源或临界区域可能包括写入全局变量或与外部设备进行通信。 用户可以利用Semaphore技术同步二个或多个相互独立、并行的任务,这样,通过一个公用的Semaphore,可以在某一时刻仅允许一个任务招待一个受保护的临界区代码。如果需要框图程序中其他部分或VIS等待,直到另一部分或VI完成临界区代码的执行时为止。这种应用场合下,用户可能利用Semaphore技术。 4, Rendezvous  Rendezvous的意思是集合。Rendezvous技术可以使用若干并行的任务同步执行。每一个到达Rendezvous的任务都将等待,若任务数到达预先设定的值,则所有已到达的任务同步开始执行,同时集合清空。若某任务在设定的Time Out时间内没有足够的数量的任务到达,则等待Time Out时间后,该任务对应的Wait at Rendezvous将产生Time Out事件,同时集合长度减1。 5, Occurrence Occurrence的意思是事件发生,Occurrence技术也用于控制相互独立的程序同步运行,比如使一个VI(或部分框图程序)等到另一个VI(或部分框图程序)运行结束后再开始运行。使用Occurrence可以避免程序进行查询操作。当然也可以使用全局变量来完成同样的工作,如使用一个单循环来查询全局变量的值是否改变。但是这种查询方法自身在运行时将占用CPU资源。如果使用Occurrence技术,假设有二个待运行的程序,第一个程序运行时,第二个程序将处理空闲状态,不占用CPU资源。当第一个程序运行结束后,它将产生Occurrence信号,然后LabVIEW激活第二个程序。
/
本文档为【Labview串口】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索