转自与非博客:宜昌城老张的博客
LabVIEW(Laboratory Virtual Instrumentation Engineering Workbench,实验室虚拟仪器工程平台)是由美国国家仪器(NI)公司所开发的图形化程序编译平台,发明者为杰夫·考度斯基(Jeff Kodosky),程序最初于1986年在苹果电脑上发表。LabVIEW早期是为了仪器自动控制所设计,至今转变成为一种逐渐成熟的高级编程语言。
LabVIEW是一种用图标代替文本行创建应用程序的图形化编程语言。传统文本编程语言根据语句和指令的先后顺序决定程序执行顺序,而LabVIEW则采用数据流编程方式,程序框图中节点之间的数据流向决定了VI及函数的执行顺序。VI指虚拟仪器,是LabVIEW的程序模块,类似于C和BASIC的子函数。
LabVIEW提供很多外观与传统仪器(如示波器、万用表)类似的控件,可用来方便地创建用户界面。用户界面在LabVIEW中被称为前面板。使用图标和连线,可以通过编程对前面板上的对象进行控制。这就是图形化源代码,又称G代码。LabVIEW的图形化源代码在某种程度上类似于流程图,因此又被称作程序框图代码。
Labview官方中文网址:http://china.ni.com/。
Labview中文门户网站:http://www.gsdzone.net/classroom.aspx。
美国国家仪器公司NI 通过LabVIEW软件平台率先引入了特别的虚拟仪表(VI)的概念,用户可通过人机界面直接控制,自行开发仪器。虚拟仪器的引入,引发了传统仪器领域的一场重大变革,使得计算机和网络技术得以长驱直入仪器领域,计算机技术和仪器技术结合起来,从而开创了“软件即是“仪器”的先河。
虚拟仪器包括Labview图形化编程软件和模块化硬件采集设备,Labview提供了两者之间相互通信的多种协议,如VXI、GPIB,RS232和RS485等,其中最基本的通信协议就是RS232串口通信协议。因为Labview支持RS232协议,使得Labview与各种嵌入式微控制器的通信变得很容易实现,Arduino控制器作为嵌入式微控制器的一种,当然可行。Arduino控制器在处理I/O信号方面很在行,但是在人机界面方面的能力,却是软肋,正好Labview可以弥补Arduino这方面的不足。
我的博客文章《基于Labview与Arduino的上下位机的蓝牙通信实验》,网址:http://www.eefocus.com/zhang700309/blog/12-06/280982_e03c3.html 。介绍了LabVIEW与Arduino结合,通过串口上下位机通信,制作出“温湿度”虚拟仪表,如下图。
那么LabVIEW软件如何编写串口通信程序呢?看看这篇文章介绍的虚拟电压表项目,就知道了,该项目的全景图如下图所示。(所有图片可双击,放大观看!)
双击网址,全屏看仿真实验现象,
http://www.tudou.com/v/AytwNvJpY3E/&rpid=96368873&resourceId=96368873_04_05_99/v.swf
Labview虚拟仪器程序由前面板和框图程序组成,前面板是人机交互的界面,界面上有用户输入和显示输出两类控件;框图程序则是用户编制的程序源代码,以定义和控制在前面板上的控件输入和输出功能。下面分别为虚拟数字电压表的前面板和框图程序。
虚拟数字电压表的前面板
虚拟数字电压表的框图程序
LabVIEW前面板的UI设计比较酷,但支撑它的后台框图程序,却很简单,花短短20分钟来设计这个程序足以。在这个框图程序中就包含了LabVIEW串口通信程序段。
要编写串口通信程序,不仅要具备Labview软件,还必须另外安装NI_VISA串口通讯协议驱动。NI_VISA串口驱动是一个免费的Labview附加组件,可以在官网下载到,或者点击网址下载:ftp://ftp.ni.com/support/visa/drivers/win32/4.0/visa400full.exe。
安装完NI_VISA,在框图程序界面右击鼠标,出现函数工具库面板,再点击“仪表I/O”→“串口”,就会出现串口函数VI子面板,如下图。
框图程序是采用NI_VISA“串口”函数来访问和控制串口的。VISA中的“串口”函数库里包含如上图所示的八个子函数VI。本设计用到的三个VISA串口子函数分别是VISA 配置串口、VISA读取和VISA关闭。
VISA 配置串口函数的作用是完成串口参数的初始化设置,包括了串口资源名称,波特率,奇偶校验、数据比特、是否启用终止符等,虚拟数字电压表的框图程序中该函数连接了两个输入变量,它们分别连在串口资源名称和波特率参数端子上,变量值由前面板上的相应控件来设定,另外该函数在“是否启用终止符”的端子上还连接了一个布尔常量,常量值为false,含义是不启用终止符,其它输入参数采用默认值。VISA串口配置函数有两个输出端子,它的图标上面输出端子输出的是串口资源名称,下面输出端子输出的是错误码,输出端子向下游函数传递信息。
VISA读取函数有三个输入端子,图中VISA读取函数图标的上面输入端子是前面VISA 配置串口函数传递的串口资源名称,下面的输入端子传递的是错误码,意思是若前面的函数出错了,会往这里输入一个错误码,然后继续往下面传递,有错误码出现时程序是不会工作的。中间输入端子是每次从串口读取的字符串字节数,本文串口通信的字节数应设置为1。
框图程序中VISA读取函数包含在一个While循环结构中,每20ms从串口读取一个字节,并从该函数的中间输出端子,以字符串的形式输出。VISA读取函数图标上面输出端子输出的是串口资源名称,下面的输出端子输出的是错误码,继续向下游函数传递信息。在前面板按下“EXIT”按钮,可结束While 循环。
VISA关闭函数的作用是当程序停止时,必须要把所用到的串口设备关闭,若不关闭,其他程序就不能使用该设备。
从VISA读取函数输出的字符串,通过“字符串至字符数组转换”函数把字符串转换为字符数组,这个字符数组里只有一个字节数据,可以通过“索引数组”函数的第0元素,把这个字节数据从字符数组中取出,它包含了电位计电压值信息,一个字节的数值范围是0~255,如果为0,则电压值为0V,如果为255,电压值就对应着5V。所以在框图程序里做个正比换算,就可以把读取的字节数据换算为0~5V电压值。
然后把换算后的电压值,发送到数据和图形显示VI,显示在LabVIEW前面板上。
谈完了上位机Lavbiew程序,接下来,下位机Arduino的程序如何设计?Arduino程序的任务有两点:一、把电位计的电压值采样出来,由于Arduino模拟采集数据范围为10位二进制数据,范围是0~1023,因此要通过正比换算,处理成8位字节数据,范围为0~255,以便Arduino以单字节形式上传给LabVIEW;二、把包含电位计电压信息的单字节数据,通过串口不断上传给上位机,以便上位机Labview程序实时显示电压信息。
Arduino程序:
/*任务:调节电位计滑动抽头与地之间的电压,并把
电压值采样到Arduino控制器,经数据换算后,通过串口,
发送到上位机软件处理。*/
int potpin = 0; //把电位计连在Arduino模拟端口0
//初始化
void setup()
{
Serial.begin(9600);//启动串行通讯,波特率为9600b/s
}
//主程序
void loop()
{
//读取电位计的电压量采样值,采样值范围0-1023
int sensorValue = analogRead(potpin);
//把采样值正比转换为0-255字节值
int data= sensorValue/4;
Serial.print(data,BYTE); //发送到上位机处理
delay(20);
}