Lebview入门到精通.docx
- 文档编号:29587440
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:32
- 大小:479.05KB
Lebview入门到精通.docx
《Lebview入门到精通.docx》由会员分享,可在线阅读,更多相关《Lebview入门到精通.docx(32页珍藏版)》请在冰豆网上搜索。
Lebview入门到精通
《LabVIEW8.20程序设计从入门到精通》样章试读:
顺序结构、多面板程序设计、TCP编程
入门篇中《程序结构》一章中的容节选:
5.1顺序结构(SequenceStructure)5.1.1LabVIEW程序的执行顺序 如果你用传统的文本程序语言写过程序,你一定相当然的认为程序是按照语句的顺序从上到下一条条执行的,除非遇到goto语句或是函数才会跳到另外一段代码去执行。
但是作为一种图形化开发语言,LabVIEW有它独特的方法来确定它的执行顺序。
首先是根据数据流执行,只有当节点的所有输入点的数据都“流到”时,才会执行该节点。
一般来说荻际前凑沾幼蟮接业姆较颉傲鞫钡摹H缤?
/SPAN>5.1所示,这段代码就代表了Result=(5+Rand)×2这个表达式。
图5.1 数据流式的编程方法
如果你再放一段类似代码在同一个BlockDiagram里的话,它又是如何执行的呢?
如图5.2所示,这两段代码并不是按照从左到右或从上到下地顺序执行的,而是并行独立地执行的。
这是因为LabVIEW实现了自动多线程。
它使代码的执行效率大大提高了。
如果用文本程序语言,实现多线程编程是非常费力的。
图5.2 多段代码同时执行 5.1.2FlatSequenceStructure和StackedSequenceStructure
按照上述办法虽然能提高代码执行效率,但你不知道哪一段代码是先执行的。
在很多情况下,程序员也会需要多段代码能按照设定的顺序执行。
这时候,我们就需要顺序结构(SequenceStructure)来帮忙了。
有两种顺序结构,一种是FlatSequenceStructure,它是按照从左到右的顺序执行的。
这样的好处是你能看到所有的代码,但是当代码段数太多时就会很难看了。
另一种是StackedSequenceStructure,它按照标定的顺序执行代码。
与FlatSequenceStructure不同的是,它将每段代码都“叠放”在了一起,因此你同时只能看一段代码。
它们在FunctionsPalette中的位置如图5.3所示。
图5.3 顺序结构在FunctionsPalette中的位置
当鼠标单击FunctionsPalette中对应的图标后,再在BlockDiagram中按住鼠标左键向右下方拉动,估计大小合适的时候放开鼠标左键即可。
可以看出它很像电影胶片,意思就是一帧一帧的按顺序执行。
通过右击其边框选择AddFrameBefore或AddFrameAfter来增加Frame。
同理,可以选择DeleteThisFrame来删除Frame。
下面我们将图5.2中的两段代码重新改写为按照顺序结构执行的两段代码。
分别如图5.4和图5.5所示。
图5.4 FlatSequenceStructure
图5.5 StackedSequenceStructure 5.1.3在Frame间传递数据
对于FlatSequenceStructure,只需要将Frame间的数据流用线连起来就能实现将前一个Frame的数据传递到后一个Frame中去。
如图5.5所示。
其中Frame之间的数据连接点是可以用鼠标拖动的,你可以通过拖动来合理布线。
下面介绍到各种程序结构的数据连接端子都是一样可以拖动的。
图5.6 在FlatSequenceStructure的Frame间传递数据
而对于StackedSequenceStructure则要复杂些。
首先右击前一个Frame的下边框,选择AddSequenceLocal,于是右击之处就出现了一个小黄色端子,可以将其拖拽到边框的任何位置。
然后将需要传递的数据与该端子连接。
接着进入后一个Frame,这时你仍然能看到这个端子,将其与你需要连接的点连接即可。
如图5.7所示。
图5.7 在StackedSequenceStructure的Frame间传递数据 高级篇中《动态程序控制技术》一章中的容节选:
17.3.3多面板程序设计
在设计稍具规模的系统时,往往一个前面板很难显示下所有的容,就算勉强显示得下,也会使界面臃肿难看。
有些情况下,我们可以通过TabControl控件进行分页显示,但是如果前面板控件过多,程序框图必然会更加繁乱。
其实,类似于常见的Windows程序,我们可以通过按钮或菜单弹出更多的界面。
这样,无论多么复杂的系统都可以用很简洁的多面板人机界面实现。
下面我们来看如何在LabVIEW中实现多面板的程序设计。
这里,我们将多面板程序分为两种情况:
一种是在弹出子面板时,主程序处于等待状态,直到子面板运行完成。
另一种是弹出子面板后,子面板与主程序相互独立运行。
对于第一种情况,我们可以简单的通过子VI实现。
在子VI的File->VIProperties...->WindowAppearance->Customize...对话框中使能“Showfrontpanelwhencalled”选项,当主VI调用到该子VI时,该子VI的前面板便会自动弹出。
子VI可以是静态调用也可以是动态调用。
对于第二种情况,则需要通过VIReference的方法节点来实现。
下面我们通过一个实例来说明,其前面板和程序框图如图17.11所示。
前面板的Panel1、Panel2和Panel3三个按钮分别对应三个VI面板。
每当用户点击其中一个按钮就会弹出相应的程序面板。
运行过程中,我们可以看到各个面板之间是互不相关的,即其中一个面板的运行不影响另一个面板的操作。
下面来看程序框图是如何实现的。
程序框图中最主要的是一个事件结构,该事件结构的触发条件来源于用户点击界面上四个按钮中的任何一个按钮。
譬如当用户点击Panel1按钮时,我们通过CtlRef的Label.Text属性获得按钮的Label,由此得到该按钮对应VI的绝对路径。
通过OpenVIReference函数获得VIReference后,由VI的Execution.State属性获得VI的运行状态,如果VI处于Idle状态(即不运行状态),则通过RunVI方法运行该VI,设置WaitUntilDone参数为False表明该动态加载的VI与主VI相互独立运行。
最后通过设置FrontPanelWindow.Open属性为True来打开动态加载VI的前面板。
图17.11 多面板程序示例
下面我们来看子面板的写法,如图17.12所示。
为了使用户点击按钮Quit实现面板的关闭,我们用到了VI的FrontPanel.Close方法。
图17.12 子面板程序示例
子面板可以有不同的行为模式,譬如子面板始终在界面最前面,或者是对话框方式,即子面板打开时用户不能操作其它面板。
这可以在子面板程序的File->VIProperties...->WindowAppearance->Customize...对话框中设置,对应与WindowBehavior栏。
它有三种模式:
Default:
普通模式,即如同普通面板一样没有特殊行为。
Floating:
面板总是浮在窗口最前面,用户此时仍然可以操作其它面板。
Modal:
对话框模式,即如图对话框一样,当该面板运行时,用户不可以操作其它面板。
除了通过按钮实现多面板的调用,我们也可以通过菜单实现,如图17.13所示。
这里我们是通过选中菜单项的ItemTag来实现菜单项与相应面板VI的对应。
图17.13 通过菜单实现多面板程序
以上的例子中,子面板与主面板之间不存在数据流,因此可以用同一段代码实现打开多个面板。
若主面板VI与子面板VI存在数据流则会稍微复杂一些,请参考图17.10所示的例子。
如果对数据的流向没有要求,我们则可以通过全局变量来实现数据的交换,从而简化编程。
高级篇中《LabVIEW网络编程》一章中的容节选:
20.4.2TCP通信
LabVIEW中用于TCP编程的VI函数位于FunctionsPalette的DataCommunication->Protocols->TCP面板下,如图20.22所示。
图20.22 TCP编程VI函数面板
通过这些函数,原本复杂的TCP编程在LabVIEW中也变得简单起来。
具体函数的含义如表20-4所示。
表20-4 TCP编程VI函数列表
VI函数名称
功能
TCPListen
在指定端口创建一个监听端(Listener),并等待客户端的连接。
TCPCreateListener
在指定端口创建一个监听端(Listener)。
TCPWaitOnListener
在指定端口等待客户端的连接。
TCPOpenConnection
打开与远程Server端的连接。
TCPRead
从指定的TCP连接读取数据。
TCPWrite
向指定的TCP连接写入数据。
TCPCloseConnection
关闭指定的TCP连接。
IPToString
将IP地址转换为计算机名称。
StringToIP
将计算机名转换为IP地址。
ResolveMachineAlias
通过VIServer或计算机别名返回计算机的IP地址。
TCP通信的两端分别为服务器端(Server)和客户端(Client)。
服务器端先对指定的端口(Port)监听,客户端向服务器端被监听的端口发出请求,服务器端接收到请求后便建立客户端与服务器端的连接,然后就可以利用该连接进行通信了。
通信完毕后,两端通过关闭连接函数断开连接。
其过程如图20.23所示。
注意:
由于有些端口已经被分配给指定的用途,例如80被分配给HTTP服务,20通常被分配给FTP服务,因此在选择端口时,最好不要选择小于1024的端口号,1024以下的端口号是保留给特定用途的,例如FTP,HTTP和Telnet等。
图20.23 双机TCP通讯流程图
下面通过几个代表性的实例来介绍具体如何在LabVIEW中进行TCP编程。
例20.1利用TCP协议进行简单点对点通信
本例中,Server端不断的向客户端发送数组数据,Client不断接收数据。
Server端程序如图20.24所示。
首先通过TCPListen函数在指定端口2052监听是否有Client端请求连接,当Client端发出连接请求后,进入主循环发送数据。
最后关闭连接,并过滤掉因为正常关闭导致的错误信息。
Client程序如图20.25所示。
首先通过TCPOpenConnection函数向Server端请求连接并建立连接,建立连接后,进入主循环接收数据。
最后关闭连接,并过滤掉因为正常关闭导致的错误信息。
运行程序时,必须先运行Server端再运行Client端。
注意:
1. 由于TCPWrite函数的数据输入只能是字符串,因此你需要通过TypeCast或FlattenToString函数将数据类型转换为字符串。
同样,在接受端需要再通过TypeCast或UnflattenFromString函数将字符串重新转换为原始数据。
2. 由于TCP传递的数据没有结束符,因此你最好在数据发送前先发送该数据包的长度给接收端,接收端获知数据包的长度后才能知道应该从发送端读出多少数据。
图20.24 利用TCP协议进行点对点通信——Server端程序
图20.25 利用TCP协议进行点对点通信——Client端程序
例20.2利用TCP协议进行交互式点对点通信
在上例中只是进行了简单的服务器端发送数据,客户端接收数据。
实际上,服务器端与客户端可以同时进行交互式通信,即服务器端可以同时向客户端发送数据并从客户端接收数据,客户端也一样。
由于TCP协议自动管理数据分组、排队等,因此不会照成冲突。
用户可以打开本书自带实例:
交互式点对点通讯举例_TCPServer.vi和交互式点对点通讯举例_TCPClient.vi学习。
运行程序时,必须先运行Server端再运行Client端。
例20.3利用TCP协议进行一点对多点通信
上面两个例子都是点对点通信,实际上对于TCP编程也可以进行一点对多点进行通信。
Server端只需要添加一个循环不断的监听连接,一旦有Client端请求连接,则与该Client建立连接,并将连接放入队列。
主循环对队列中的每一个元素逐个进行读写。
当然,这实际上仍然利用的是点对点的通信,即客户端与服务器必须建立点对点的连接。
只不过这里是通过连接队列来逐个处理每一个连接。
因此,这里并不是“广播”通讯,真正的“广播”需要通过UDP协议才能实现。
该例Server端程序框图和Client端程序框图分别如图20.26与图20.27所示。
Server端程序利用到了队列,关于队列的知识将在下一章介绍。
运行程序时,必须先运行Server端再运行Client端,Client端可以有多个。
图20.26 利用TCP协议进行一点对多点通信——Server端程序框图
图20.27 利用TCP协议进行一点对多点通信——Client端程序框图
《LabVIEW8.20程序设计从入门到精通》样章试读:
顺序结构、多面板程序设计、TCP编程
入门篇中《程序结构》一章中的容节选:
5.1顺序结构(SequenceStructure)5.1.1LabVIEW程序的执行顺序 如果你用传统的文本程序语言写过程序,你一定相当然的认为程序是按照语句的顺序从上到下一条条执行的,除非遇到goto语句或是函数才会跳到另外一段代码去执行。
但是作为一种图形化开发语言,LabVIEW有它独特的方法来确定它的执行顺序。
首先是根据数据流执行,只有当节点的所有输入点的数据都“流到”时,才会执行该节点。
一般来说荻际前凑沾幼蟮接业姆较颉傲鞫钡摹H缤?
/SPAN>5.1所示,这段代码就代表了Result=(5+Rand)×2这个表达式。
图5.1 数据流式的编程方法
如果你再放一段类似代码在同一个BlockDiagram里的话,它又是如何执行的呢?
如图5.2所示,这两段代码并不是按照从左到右或从上到下地顺序执行的,而是并行独立地执行的。
这是因为LabVIEW实现了自动多线程。
它使代码的执行效率大大提高了。
如果用文本程序语言,实现多线程编程是非常费力的。
图5.2 多段代码同时执行 5.1.2FlatSequenceStructure和StackedSequenceStructure
按照上述办法虽然能提高代码执行效率,但你不知道哪一段代码是先执行的。
在很多情况下,程序员也会需要多段代码能按照设定的顺序执行。
这时候,我们就需要顺序结构(SequenceStructure)来帮忙了。
有两种顺序结构,一种是FlatSequenceStructure,它是按照从左到右的顺序执行的。
这样的好处是你能看到所有的代码,但是当代码段数太多时就会很难看了。
另一种是StackedSequenceStructure,它按照标定的顺序执行代码。
与FlatSequenceStructure不同的是,它将每段代码都“叠放”在了一起,因此你同时只能看一段代码。
它们在FunctionsPalette中的位置如图5.3所示。
图5.3 顺序结构在FunctionsPalette中的位置
当鼠标单击FunctionsPalette中对应的图标后,再在BlockDiagram中按住鼠标左键向右下方拉动,估计大小合适的时候放开鼠标左键即可。
可以看出它很像电影胶片,意思就是一帧一帧的按顺序执行。
通过右击其边框选择AddFrameBefore或AddFrameAfter来增加Frame。
同理,可以选择DeleteThisFrame来删除Frame。
下面我们将图5.2中的两段代码重新改写为按照顺序结构执行的两段代码。
分别如图5.4和图5.5所示。
图5.4 FlatSequenceStructure
图5.5 StackedSequenceStructure 5.1.3在Frame间传递数据
对于FlatSequenceStructure,只需要将Frame间的数据流用线连起来就能实现将前一个Frame的数据传递到后一个Frame中去。
如图5.5所示。
其中Frame之间的数据连接点是可以用鼠标拖动的,你可以通过拖动来合理布线。
下面介绍到各种程序结构的数据连接端子都是一样可以拖动的。
图5.6 在FlatSequenceStructure的Frame间传递数据
而对于StackedSequenceStructure则要复杂些。
首先右击前一个Frame的下边框,选择AddSequenceLocal,于是右击之处就出现了一个小黄色端子,可以将其拖拽到边框的任何位置。
然后将需要传递的数据与该端子连接。
接着进入后一个Frame,这时你仍然能看到这个端子,将其与你需要连接的点连接即可。
如图5.7所示。
图5.7 在StackedSequenceStructure的Frame间传递数据 高级篇中《动态程序控制技术》一章中的容节选:
17.3.3多面板程序设计
在设计稍具规模的系统时,往往一个前面板很难显示下所有的容,就算勉强显示得下,也会使界面臃肿难看。
有些情况下,我们可以通过TabControl控件进行分页显示,但是如果前面板控件过多,程序框图必然会更加繁乱。
其实,类似于常见的Windows程序,我们可以通过按钮或菜单弹出更多的界面。
这样,无论多么复杂的系统都可以用很简洁的多面板人机界面实现。
下面我们来看如何在LabVIEW中实现多面板的程序设计。
这里,我们将多面板程序分为两种情况:
一种是在弹出子面板时,主程序处于等待状态,直到子面板运行完成。
另一种是弹出子面板后,子面板与主程序相互独立运行。
对于第一种情况,我们可以简单的通过子VI实现。
在子VI的File->VIProperties...->WindowAppearance->Customize...对话框中使能“Showfrontpanelwhencalled”选项,当主VI调用到该子VI时,该子VI的前面板便会自动弹出。
子VI可以是静态调用也可以是动态调用。
对于第二种情况,则需要通过VIReference的方法节点来实现。
下面我们通过一个实例来说明,其前面板和程序框图如图17.11所示。
前面板的Panel1、Panel2和Panel3三个按钮分别对应三个VI面板。
每当用户点击其中一个按钮就会弹出相应的程序面板。
运行过程中,我们可以看到各个面板之间是互不相关的,即其中一个面板的运行不影响另一个面板的操作。
下面来看程序框图是如何实现的。
程序框图中最主要的是一个事件结构,该事件结构的触发条件来源于用户点击界面上四个按钮中的任何一个按钮。
譬如当用户点击Panel1按钮时,我们通过CtlRef的Label.Text属性获得按钮的Label,由此得到该按钮对应VI的绝对路径。
通过OpenVIReference函数获得VIReference后,由VI的Execution.State属性获得VI的运行状态,如果VI处于Idle状态(即不运行状态),则通过RunVI方法运行该VI,设置WaitUntilDone参数为False表明该动态加载的VI与主VI相互独立运行。
最后通过设置FrontPanelWindow.Open属性为True来打开动态加载VI的前面板。
图17.11 多面板程序示例
下面我们来看子面板的写法,如图17.12所示。
为了使用户点击按钮Quit实现面板的关闭,我们用到了VI的FrontPanel.Close方法。
图17.12 子面板程序示例
子面板可以有不同的行为模式,譬如子面板始终在界面最前面,或者是对话框方式,即子面板打开时用户不能操作其它面板。
这可以在子面板程序的File->VIProperties...->WindowAppearance->Customize...对话框中设置,对应与WindowBehavior栏。
它有三种模式:
Default:
普通模式,即如同普通面板一样没有特殊行为。
Floating:
面板总是浮在窗口最前面,用户此时仍然可以操作其它面板。
Modal:
对话框模式,即如图对话框一样,当该面板运行时,用户不可以操作其它面板。
除了通过按钮实现多面板的调用,我们也可以通过菜单实现,如图17.13所示。
这里我们是通过选中菜单项的ItemTag来实现菜单项与相应面板VI的对应。
图17.13 通过菜单实现多面板程序
以上的例子中,子面板与主面板之间不存在数据流,因此可以用同一段代码实现打开多个面板。
若主面板VI与子面板VI存在数据流则会稍微复杂一些,请参考图17.10所示的例子。
如果对数据的流向没有要求,我们则可以通过全局变量来实现数据的交换,从而简化编程。
高级篇中《LabVIEW网络编程》一章中的容节选:
20.4.2TCP通信
LabVIEW中用于TCP编程的VI函数位于FunctionsPalette的DataCommunication->Protocols->TCP面板下,如图20.22所示。
图20.22 TCP编程VI函数面板
通过这些函数,原本复杂的TCP编程在LabVIEW中也变得简单起来。
具体函数的含义如表20-4所示。
表20-4 TCP编程VI函数列表
VI函数名称
功能
TCPListen
在指定端口创建一个监听端(Listener),并等待客户端的连接。
TCPCreateListener
在指定端口创建一个监听端(Listener)。
TCPWaitOnListener
在指定端口等待客户端的连接。
TCPOpenConnection
打开与远程Server端的连接。
TCPRead
从指定的TCP连接读取数据。
TCPWrite
向指定的TCP连接写入数据。
TCPCloseConnection
关闭指定的TCP连接。
IPToString
将IP地址转换为计算机名称。
StringToIP
将计算机名转换为IP地址。
ResolveMachineAlias
通过VIServer或计算机别名返回计算机的IP地址。
TCP通信的两端分别为服务器端(Server)和客户端(Client)。
服务器端先对指定的端口(Port)监听,客户端向服务器端被监听的端口发出请求,服务器端接收到请求后便建立客户端与服务器端的连接,然后就可以利用该连接进行通信了。
通信完毕后,两端通过关闭连接函数断开连接。
其过程如图20.23所示。
注意:
由于有些端口已经被分配给指定的用途,例如80被分配给HTTP服务,20通常被分配给FTP服务,因此在选择端口时,最好不要选择小于1024的端口号,1024以下的端口
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Lebview 入门 精通
