本文汇总一下不同VI之间数据传递的方式,使大家明确数据传递的几种类型并灵活使用。
本文程序均上传至云端,读者可自行下载学习。
基于目前大家所学到的基础知识,在Labview中简单来说数据类型基本包括数值、字符串、数组、簇、布尔量、引用、路径、枚举量、波形图表等,实际上最常用的数据类型可以简单说就只有四种,数值、字符串、数组、布尔。那么这些数据如果是跨VI的时候是如何传输的呢?传输方式有什么不同呢?数据流方向如何?本文针对这一问题做出归纳整理。
本文目录
- 一、跨VI数据传输的方式
- 1.1 直接调用子VI传输
- 1.2 队列数据传输
- 1.3 全局变量
- 二、使用通讯协议实现数据传输
- 2.1 UDP数据传输
- 2.2 TCP/IP协议数据传输方式
一、跨VI数据传输的方式
当我们使用数据采集卡或者其他硬件采集外部数据时,常出现一个问题,就是我们编写的采集模块程序不能实时的将数据传输到主VI中,如果出现多个采集模块程序同时调用或者对采集速度要求极高的情况下,跨VI传输数据的速度效率等就会受到影响。因为传输时可能并不能将当前数据完整从子VI传到主VI中。
1.1 直接调用子VI传输
这种方式传递数据是最便捷用的最广泛的,那么如何建立并调用子VI呢?请看下面步骤:
① 创建VI,首先新建一个子VI程序并保存在电脑的某个路径里。
② 创建子VI接口。在前面板的右上角处由两个方形选项,左侧是接线端,可以定义子VI被调用时的接口,右侧是子VI的图像,被调用时的图标。左侧接线端和控件绑定时的操作步骤为:先鼠标单击某个方块,在单击前面板的控件,当这个方块的颜色不再是白色时,就说明绑定好了。
如上图所示,绑定好的控件在方格图中,如错误簇为淡黄色,字符串为粉色。
③ 设置好子VI后,在需要调用该VI的程序中后面板,右键 — 选择VI — 在保存路径中选中子VI — 右键创建所有输入输出控件。如下图所示
此时,可以在本函数中将数据从这几个控件接口中将数据传入到子VI中,再将经子VI处理过后的数据传递回来。当然这种方式的数据传递是存串行传递的,所以需按照数据流从左到右的方式来整理程序。
1.2 队列数据传输
本章讲解队列之前呢,如果大家想更加详细的了解队列操作的理论,深入理解队列是如何使用的,大家可以去看我之前一篇关于队列介绍的文章,链接我放到下面了,大家可以直接点击跳转:
Labview数据采集–基于AMC和队列的生产者和消费者编程模式: https://blog.csdn.net/m0_52176775/article/details/133681332
队列的数据传输方式呢,题主一共提出两种,一种是软件自带的队列函数,一种就是VIPM中带的AMC队列包,当然题主比较推荐后者,AMC比较稳定高效,且对错误的处理比较灵活。
下面一个图就完好的介绍了队列是如何传输数据的。
第一个VI将想传入第二个VI的数据通过队列暂存在电脑内存中,第二个队列向电脑拿取这部分数据。
那么是如何拿取的呢,我们可以拿取这部分数据的标志是什么呢?
① 队列名称。 入队列的名称和出队列的名称只要一致,就可以告诉出队列函数,我要拿取该名称对应的队列数据。
②同时运行。 保持入队列函数和出队列函数同时运行,这样才能保证数据进入队列时,出队列的VI有数据可以拿,完全做到边生产边消费。
③传输速率。 保证采集的速率比传输的速度高,才能将实时产生的数据采集出来,因为队列的性质,传入队列的数据不会消失,拿取数据时按照传入的顺序拿取。 这就造成了,如果传入的数据太快太多,传出队列来不及拿取,拿取道德数据可能是很多秒之前传入的数据,这就使队列失去了其传输的时效性。
看下方VI举例:
这两个VI满足以上三条件的情况下,题主在第一个VI中加入了50ms的延时,以保证采集速度大于传输速度。左侧的VI是将元素中的数值传入队列中,每50ms传一次,右侧是拿取这个数值,实时拿取。并且两个队列满足名称一致的条件,均为 “hello” ,此时我们将左侧数值中输入一个随机数值6,观察右侧的变化,此时右侧数值随着左侧发生变化,数值实现了从一个VI到另一个VI的传递。
不仅仅是数值,还可以通过队列传递字符串、数组等的数据。
本文中的程序在文章结尾上传云端,同学可自行下载学习。
1.3 全局变量
题主之前在讲解局部变量和全局变量的文章中介绍过一次通过全局变量传输数据的用法,文章链接放在这里,大家如果有想理解的可以直接点击链接查看。
Labview局部变量、全局变量、引用、属性节点、调用节点用法理解及精讲:
https://blog.csdn.net/m0_52176775/article/details/135567798
全局变量建立步骤:后面板右键------结构------全局变量-------双击进入-------在全局中放入控件------回到原VI点击全局变量-----选择我刚刚建立的控件,此时就可以将数据传输到全局变量了,此时将全局变量以vi的形式保存在电脑中,可以在其他vi中调用该变量。使用该变量传递数据需要注意以下几点:
① 调用该全局变量的VI必须同时都在运行。
② 全局变量中可以同时放入多个数量、多种类型的控件。
③ 可以在多个VI中拿取全局变量的值,但对于同一个控件,只能有一个输入。
数据流的方向如下图所示:
除传递数值之外,全局变量也可以用同样的方式传递字符串、数组等所有数据。并且该方式的优点在于:传输速度高、可以多线并行、满足多个控件同时传输的特点。
二、使用通讯协议实现数据传输
Labview佩戴了多种传输接口,如它自带的UDP协议接口,TCP/IP协议接口等,本章以范例为基础,讲解通过协议方式传输数据的方法,首先以UDP协议为例讲解一下协议传输的大致原理,如下图所示:
2.1 UDP数据传输
那么UDP的程序如何去写呢,labview配备了强大的范例功能,大家可以在Labview中点击:帮助 — 查找范例 — 输入关键词:UDP — 搜索 — 打开:Simple UDP 项目,
发送方从端口处将数据发送到本地端口,UDP向电脑申请了用于发送数据的端口,最终两程序同时运行时,数据由发送方发送,由接收方获取,完成数据传输。
2.2 TCP/IP协议数据传输方式
TCP/IP数据传输的方式时类似于UDP的,该传输方式相对于UDP传输方式来讲目标明确、传输数据稳定,更适合于不丢包数据的传输条件下。同样的,我们打开范例搜索:帮助 — 查找范例 — 输入关键词:TCP — 搜索 — 打开:Simple TCP 项目,
在该程序中,服务器同样开启一个电脑端口向电脑内部发送数据,客户端通过寻找端口的方式向该端口接收来自于上一个服务器VI的数据,完成数据的传输,后期大家可以根据需要自行选择这两个项目程序做项目传输的二次开发工作。这里提一嘴UDP/TCP这两个协议传输数据的区别:
UDP: 适用于 传输速度快,要求时效性 的程序,丢包率比TCP要多。比如,开视频电话或者打游戏首先需要的是时效性而非流畅性,因此采用UDP的传输方式。
TCP: 适用于 数据稳定传输,要求稳定性 的程序,丢包率低,传输稳定。比如,实验室数据监测,要求的是数据的稳定性和不丢包,因此采用TCP的方式传输。
本文仅讲解了UDP/TCP通讯协议的传输方式,TCP等其他方式除本程序自带之外,还可以在VIPM(lanbiew安装时自带的软件),中自行搜索相关协议,在范例基础上并完成项目的开发工作。
提供一个开发经验: 大家可以在软件开发时,建议多借鉴相关程序或范例安装包等完成程序的二次开发,由于目前程序相对成熟,各类安装包及二次开发文件盛行,避免了大家直接从头开始浪费时间。直接调用子程序的方式可以节省更多的开发时间。
本文提供文章中的范例程序,下载地址:
链接: https://pan.baidu.com/s/1bGuJs-yLcwpPZqW70tIUFQ
提取码:6666