Labview 学习笔记
- 格式:docx
- 大小:1.99 MB
- 文档页数:80
LV学习笔记1.调试时点右键,在菜单中probe 里和custom probe里面可以设置探针和客户定制指示器等,用来监测实时数据。
由于客户定制指示器是一个子VI,所以,它的数据可以在后面板里加上一个写数据的VI,将指示器所指示的数据记录下来2.在读写数据文件时,反复地打开和关闭文件将会占用大量的系统资源,要提高运行速度,应尽量减少打开和关闭次数,把它们放在循环体外面。
3.分别输入XY的数据组成波形可以用build xy graph,在前面板中选用graph 中的xy graph公式框在后面板的mathematical里的formular中,波形的频谱分析也在其中的waveform measurement中,滤波在waveform condition中4.在顺序结构中,排在框内的数据不能直接通过图框节点传到后面的图框中去,而是要用add sequence locall加一个数据传输节点,传输节点可以加多个,但要注意传输的输入输出要一一对应。
如果要想传输数据的话,还可以用flat sequence 结构5.用write写数据的时候,输入的数据不能是数值型,应先用formate into string转化为字符串,如果想写成电子表格形式,可以将退格符,回车符等和输入数据一起,按一定格式用bundle或build array绑在一起输入bview measurement数据文件类型为.lvm,可以用专门的express VI读写labview的波型文件后缀是dat7.选择颜色对话框在numeric里面color box8.作数据拟合用general polynomial fit.vi在mathematical--curve fit里面9.free label在后面板的decoration中,可用来作注释10。
ring and enum里面的txet&pic ring 可以以一个数组的方式插入图片,并可通过index索引找到,也可以放在一个cluster中,成为其一个元素.在前面板classic controls里面有个text&pict ring面板和这个有些区别,用途的区别不清楚.classic controls 里面还有些数字、布尔等值控件。
LABVIEW基础必学知识点
1. 控件与面板:学习如何在LabVIEW界面上添加控件(如按钮、滑块、文本框等)以及如何自定义面板布局和样式。
2. 数据流编程:熟悉数据流编程的概念及其在LabVIEW中的应用,了
解数据流图的基本结构和运行机制。
3. VI(虚拟仪器)的创建和调用:学习如何创建VI并将其用于调用
和组合成更复杂的程序。
4. 数据类型和数据结构:了解LabVIEW中的不同数据类型(如数字、
字符串、数组等),并学习如何使用数据结构来组织和处理数据。
5. 信号生成与处理:学习如何使用LabVIEW生成和处理模拟和数字信号,包括滤波、傅里叶变换等常用信号处理技术。
6. 串口通信与仪器控制:了解如何使用LabVIEW实现串口通信和控制
外部仪器,如通过串口与硬件设备进行通信或控制。
7. GUI设计和使用事件:学习如何设计漂亮的图形用户界面,并学习
如何使用事件结构实现用户交互和程序响应。
8. 数据存储与读取:了解如何使用LabVIEW将数据存储到文件中,以
及如何读取和处理已存储的数据。
9. 并行编程与多线程:学习如何使用并行编程来提高程序的性能和效率,并了解LabVIEW中多线程的概念和应用。
10. 错误处理和调试:掌握LabVIEW中的错误处理技术和调试工具,以及如何分析并解决程序中出现的错误。
以上是LabVIEW基础必学的知识点,掌握这些知识可以帮助你理解和使用LabVIEW进行数据采集、信号处理、仪器控制等应用。
1.1 生产者/消费者设计模式概念生产者/消费者设计模式包括多个并行循环,每个循环以不同的速率执行任务。
一个循环作为生产数据的循环,其他循环作为消费数据的循环。
生产数据的循环控制所有消费数据的循环,并且使用通信技术与它们进行通信。
2011.9.171.生成EXE文件步骤:点击“工具”——>点击“通过VI生成应用程序(EXE)…”——>弹出下面对话框选择存放目录——>点击“继续”在该对话框中选中左面的“信息”点击右边的“目标目录”更改目录点击“当前目录”,该对话筐还有其他设置。
点击“生成”出现如下对话框,就可以在对应位置找到*.exe文件。
2.电压电流采集的实现前面板如下图:程序框图如下:主要用到了labview功能模块中的DAQmx-数据采集中的几个模块:1、DQAmx创建任务:这个函数用来创建一个DAQmx数据采集任务2、DAQmx创建通道(AI-电压-基本):这个函数是新建虚拟通道函数,对最大值、最小值、单位、通道等参数进行设置。
3、DAQmx创建通道(AI-电流-基本):同DAQmx创建通道(AI-电压-基本)4、DAQmx定时(采样时钟):主要是对采样频率进行设置。
连续采样时的缓冲区大小。
5、DAQmx读取(模拟2D DBL N通道N采样):是一个读数据函数,用来从指定的通道或任务读取数据的数据。
这里用到循环结构实现连续采集。
6、DAQmx清除任务:VI将终止该任务,并且不能使用该任务的资源。
注:1、一个任务可以有多个通道如可以同时采集电压和电流等,但不能选择不同类型如模拟输入、数值输入。
2、注意电压电流的最大值和最小值范围。
电压:-10v~10v,电流:-0.01A~0.01A。
绘制VI曲线程序框图:在前面程序框图基础上的DAQmx读取函数的数据输出端,将二维数据(行代表通道这里就是电压,电流)拆分为两个一维,绘制成VI 曲线。
1、调用索引数组函数行数,提取电压和电流数据。
Labview培训总结(1)转眼,一周的培训结束了,回顾这周,收获还是很多的,对于完全陌生的labview逐渐变得熟悉,操作也变得熟练。
对于老师给我们布置的任务也都完成了,虽然过程中有困难,但是经过老师的讲解,以及同学之间的互相讨论和百度,我们终于一路过关斩将,披荆斩棘,打败了它们。
下面来说说这几个作业以及我做作业的思路和方法。
首先,第一个作业是求三个数平均值,这是个很简单的小程序,在前面板放置三个数字输入框和一个数字显示框,然后在程序面板通过数值按钮里的加减乘除的按钮和连线将他们连接起来即可。
如图:(求平均前面板)(求平均程序框图)第二个作业是利用labview来实现e值得计算,虽然我们都知道e的值为2.71282,但是我们同样是可以用labview来得到这个值的,我们知道e=1+1/2!+1/3!+.....+1/N!,我们可以利用这个公式来的到e的值,他的前面板很简单就一个数值输出框和一个确定按钮,如图(求e值前面板)(求e值程序框图)问题:在做这道题时我遇到了一些困难,像我们前面不知道怎么用那个确定按钮,就算写了程序可是并不知道怎么输出它的值,后来经过百度了解了结构里的事件结构的用法,解决了这一困难,当我们添加了事件分支后如把确定按钮添加进去,就回显示确定按钮值改变,这样我们按下确定后,就会执行事件结构框内的while循环结构,则会输出值。
作业的难度是一点点的上升的额,第三个任务是利用labview设计一个温度报警器,当达到温度设置上限时,警示灯就开始亮起,同时显示框中显示实时温度,当温度过高时显示“温度过高XX”假设XX为当时的过高温度,当然,字符串输出框是要有记录功能的,滚动拉右边的滚动条就可以查看以往的温度记录。
这个任务刚拿到手里时有点蒙,无从下手啊这个,后来经过百度以及和同学们的讨论,有了一定的思路,它的前后面板如下图,有一个报警上限的滑动杆和一个温度计,一个报警灯,一个报警按钮一及一个显示框,前面板没什么困难,主要是程序框图,如下(温度报警器程序框图)在课堂上老师对我们进行了一定的点播,我们利用一个随机数发生器产生一个数,输出到温度计,将这个至于报警上限值进行比较,当报警开关和大于报警上限值同时满足时,则报警灯亮起,当输出实时温度温度时用到一个字符串显示和一个字符串连接,把要输出的内容通过字符串连接器连接起来,这样就可在显示框中显示,同时这里要有一个条件判断结构,如果大于那上限温度,则输出温度过高字样,哦,别忘了换行,不然他全部显示在一行。
图形化数据显示关键词:图表、波形函数1、波形图表(GRAPH);波形图表主要功能是将新测到的数据添加到波形图表的尾端并保存至波形图表的数据缓冲区,在默认情况下,缓冲区可保存1024个数据,缓冲区的存储数量可以在波形图表的右键快捷菜单中选择“图表历史长度”进行修改通过簇绑定的方法可以同时显示多条曲线2、波形图(waeform)波形图与波形图表类似。
波形图不会像波形图表一样将数据添加的到数据尾部,而是将当前数据一次性地描述在波形曲线中,而且波形图也不能输入标量数据。
簇和一维簇数组可以输入波形图。
却不能输入波形图表B、当簇输入波形图时,簇中必须接入三个元素;第一个是横坐标的起始位置X0,第二个是很坐标的间隔dx,第三个是要输入的数据,数据可以是一维数组、二维数组或者是簇数组。
如图所示,在程序框图中先将X0,dx和一维数组/二维数组按照顺序捆绑成簇,然后将簇直接输入到波形图中显示当两个数组个数不想同时,可将两个数据捆绑成簇数组然后显示D、显示波形数据3、定制波形图表在使用波形图表时需要对其一些属性进行设置。
在属性对话框中可设置标尺的格式、精度、最大/最小值,曲线的类型颜色等属性。
在图表的右键快捷菜单中也可以对一些属性进行设置,也有一些功能键。
另外波形菜单还有一些辅助工具可以通过右键快捷菜单中的“显示”进行选择外观设置,高级—刷新模式有三种1、带状图表:显示区满后,曲线会整体向左移动,新的数据会接在曲线的尾部;2、示波器图表:在曲线填满显示区后会清空显示区,然后重新开始显示新的曲线;3、扫描图:显示区有一条垂直红线,数据会跟着红线从左向右显示。
在显示多条曲线时,可以设置是否分格显示。
右键快捷菜单-分格显示曲线(设置分格显示后需要将图例全部显示出来)设置曲线属性在属性对话框中曲线标签下可以设置各个曲线的属性。
例如可以设置曲线显示格式是点状还是线形,可以选择曲线粗细程度和颜色等。
设置坐标轴属性;在属性对话框中,的“格式与精度”标签下可以设置各个坐标轴的显示类型、显示精度,位数等。
对LabVIEW软件及虚拟仪器的学习心得一学期的Labview课程结束了,通过这一学期的学习,我主要了解到对LabVIEW软件及虚拟仪器的理解以下几方面的内容:1、一开始老师通过关于此课程的基础概念讲解是我了解了使用labview开发平台编制的程序成为虚拟仪器程序,简称为VI。
VI包括三部门:程序前面板、框图程序和图标/连接器。
每一个程序前面板都对应这一段框图程序。
框图程序用labview图形编程语言编写,可以把它理解成传统程序的源代码。
框图程序由端口、节点、图框和连线构成。
其中端口被用来同程序前面的控制和显示传递数据,节点被用来实现函数和功能调用,框图被用来实现结构化程序控制命令,而连线代表程序执行过程中的数据流,定义了框图内的数据流动方向。
2、通过上机对一些程序的制作和运行,我知道了labview具有多个图形化的操作模版,用于创建和运行程序。
这些操作模版可以随意在屏幕上移动,并可以放置在屏幕的任意位置。
操纵模版工有三类,分别为工具模版、控制模版和功能模版。
工具模版为编程者提供各种用于创建、修改和调试VI程序的工具。
该模版是用于前面板中的。
如果该模版没有出现,则可以在Windows菜单先选择show tools palette命令一现实该模版。
用控制模版可以给前面板添加输入控制和输出显示。
每个图标道标一个子模版。
如果控制模版不现实,可以用Windows菜单的show controls palette功能打开它,也可以在前面板的空白处,点击鼠标右键,以弹出控制模版。
功能模版是创建框图程序的工具。
该模版上的每一个顶层图标都是表示一个子模版,若功能模版不出现,则可以用Windows菜单先的show functions palette功能打开它,也可以在框图窗口的空白出点击鼠标右键一弹出功能模版。
3、关于程序调试技术方面,我知道了如果一个VI程序存在语法错误,则在面板工具条上的运行按钮将会变成一个折断的箭头,表示程序不能被执行。
对LabVIEW软件及虚拟仪器的学习心得一学期的Labview课程结束了,通过这一学期的学习,我主要了解到对LabVIEW软件及虚拟仪器的理解以下几方面的内容:1、一开始老师通过关于此课程的基础概念讲解是我了解了使用labview开发平台编制的程序成为虚拟仪器程序,简称为VI。
VI包括三部门:程序前面板、框图程序和图标/连接器。
每一个程序前面板都对应这一段框图程序。
框图程序用labview图形编程语言编写,可以把它理解成传统程序的源代码。
框图程序由端口、节点、图框和连线构成。
其中端口被用来同程序前面的控制和显示传递数据,节点被用来实现函数和功能调用,框图被用来实现结构化程序控制命令,而连线代表程序执行过程中的数据流,定义了框图内的数据流动方向。
2、通过上机对一些程序的制作和运行,我知道了labview具有多个图形化的操作模版,用于创建和运行程序。
这些操作模版可以随意在屏幕上移动,并可以放置在屏幕的任意位置。
操纵模版工有三类,分别为工具模版、控制模版和功能模版。
工具模版为编程者提供各种用于创建、修改和调试VI程序的工具。
该模版是用于前面板中的。
如果该模版没有出现,则可以在Windows 菜单先选择show tools palette命令一现实该模版。
用控制模版可以给前面板添加输入控制和输出显示。
每个图标道标一个子模版。
如果控制模版不现实,可以用Windows菜单的show controls palette功能打开它,也可以在前面板的空白处,点击鼠标右键,以弹出控制模版。
功能模版是创建框图程序的工具。
该模版上的每一个顶层图标都是表示一个子模版,若功能模版不出现,则可以用Windows菜单先的show functions palette功能打开它,也可以在框图窗口的空白出点击鼠标右键一弹出功能模版。
3、关于程序调试技术方面,我知道了如果一个VI程序存在语法错误,则在面板工具条上的运行按钮将会变成一个折断的箭头,表示程序不能被执行。
第一章Labview综述注意事项:1.数据流驱动:从左至右2.数据连线颜色代表:1.while循环执行后外界数据接不能传入循环内,封闭性的。
2.注意簇的元素的排列顺序。
3.局部变量,全局变量,共享变量,值属性节点会破坏Labview的数据流。
4.枚举常量仅在程序框图可见,在前面板不可见。
5.使用局部变量控制布尔开关时,按钮只能使用机械动作中的转换模式bview多线程:将没有直接数据连接的程序块单独创建一个线程,将各个模块放到循环结构中并行执行而实现多线程。
7.子VI前面板进入内存的原因是:前面板打开、VI修改后尚未保存、前面板数据打印、程序框图中有数性节点。
8.While+条件结构,while+事件结构9.自动索引功能在for循环中默认打开,whil循环默认关闭10.While循环里面一定记得要加延时,特别是多任务时,不然会十分占用CPU11.局部变量和值属性节点那个好?同一vi最好数据流,其次局部变量,绝对不要使用值属性,子vi目前可用引用+属性节点或全局变量。
多使用移位寄存器,少使用属性节点值,尽量不使用局部变量功能全局可以完全代替全局变量!一般建议尽量少用局部变量,但就局部变量与“值”属性节点来说,局部变量的写入效率要比“值”属性节点快得多,值属性只建议使用在程序启动的时候对于控件或显示器的初始化上。
当且仅当需要产生一个事件,以相应“值改变”事件时,才推荐使用值(信号)属性。
用属性结点会触发界面线程,使得程序界面被强制更新。
如果一个大型程序的某个子程序中用了属性结点,本来子vi的界面的前面板是不需要用户看见的,但由于使用了属性结点而在后台进行强制更新,这样很显然会影响程序执行的效率。
你写一个简单的程序验证一下就看出来了。
局部变量也不是越多越好,它使labview无法重用缓存,不得不开辟新的缓存区,可以尽量用移位寄存器等结构来强制内存重用。
同vi间用局部变量,不同vi间用引用+属性节点。
12.“局部变量”执行效率高,但占用内存多,“属性节点:值”带错误处理,可以更好的引导数据流,但执行效率较低。
Labview学习笔记1.数组替换先替换一号位中的,然后再把替换后的数组的二号位进行替换,替换次序依次进行。
2.数组插入操作中,若未索引,则将新增内容加到数组末尾。
不能插入标量。
需要插入标量可以用到创建数组。
多维数组若插入,行(列)时,插入的数组元素不足,则用0补齐。
顺序插入3.4.创建数组可以多个数组或者是多个元素,也可以是数组与标量。
连接输入和非连接输入,默认非连接输入,选择在快捷菜单里。
5.数组子集6.重排数组纬度多维数组变一维,或者一维数组变多维。
7.一维数组排序默认是升序排列,若想得到降序排列,可在升序排列后加一个反转一位数组。
8.搜索一维数组(字符串数组也适用)搜索一维数组是否存在指定元素。
如果存在,输出元素的索引号;若不存在,输出-1。
如需搜索多个或者全部指定元素,可用While循环。
上图中输出数组最后一位为-1,看实际需要是否保留-1。
9.一维数组移位当输入参数n>0时,将数组的后n个元素移至数组前端。
当输入参数n<0时,将数组的前n个元素移至数组后端。
10.一维数组插值11.二维数组转置第一行变第一列,第二行变第二列,依次类推。
12.数组至簇簇的大小需提前设置,默认大小为9,数组大小小于9时,用0补位;大于9时,忽略超出的部分。
簇的大小设置在快捷菜单里。
13.索引与捆绑簇数组函数14.布尔数组(布尔簇)置位复位操作布尔数组置位布尔数组复位布尔簇的置位复位15.复合运算函数16.17.18. 事件结构中停止按钮的处理方法19.一个循环中不能包括两个或者两个以上的事件结构。
多个事件结构可以响应一个事件。
20.磁盘流读写文本文件。
LABVIEW学习心得这学期的课程设计,主要讲授了一些LabVIEW的基本操作和编程技巧,LabVIEW作为一门新式的以图形化编程的语言,不仅提供了简单易学的编程方法,而且提供了海量的可调用的模块,子vi,涉及到各个方面。
LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。
LABVIEW有很多优点,尤其是在某些特殊领域其特点尤其突出。
首先在测试测量方面:LABVIEW最初就是为测试测量而设计的,因而测试测量也就是现在LABVIEW最广泛的应用领域。
经过多年的发展,LABVIEW 在测试测量领域获得了广泛的承认。
至今,大多数主流的测试仪器、数据采集设备都拥有专门的LabVIEW驱动程序,使用LabVIEW可以非常便捷的控制这些硬件设备。
同时,用户也可以十分方便地找到各种适用于测试测量领域的LabVIEW工具包。
这些工具包几乎覆盖了用户所需的所有功能,用户在这些工具包的基础上再开发程序就容易多了。
有时甚至于只需简单地调用几个工具包中的函数,就可以组成一个完整的测试测量应用程序。
控制与测试是两个相关度非常高的领域,从测试领域起家的LabVIEW自然而然地首先拓展至控制领域。
LabVIEW拥有专门用于控制领域的模块----LabVIEWDSC。
除此之外,工业控制领域常用的设备、数据线等通常也都带有相应的LabVIEW驱动程序。
使用LabVIEW可以非常方便的编制各种控制程序。
除了以上两种应用领域,LabVIEW还包含了多种多样的数学运算函数,特别适合进行模拟、仿真、原型设计等工作。
在设计机电设备之前,可以现在计算机上用LabVIEW搭建仿真原型,验证设计的合理性,找到潜在的问题。
在高等教育领域,有时如果使用LabVIEW进行软件模拟,就可以达到同样的效果,使学生不致失去实践的机会。
Labview学习笔记reference死锁问题LabVIEW中的引⽤经常需要和“In Place Element Structure”配合使⽤。
In Place Element Structure 对⼀个引⽤的数据进⾏处理时,为了保证多线程安全,它会锁住引⽤指向的数据;其它线程若需对同⼀数据做操作,必须能这个In Place Element Structure中所有代码执⾏完毕才可,这样就避免了多线程读写同⼀内存数据所产⽣的竞争问题。
举例来说,下⾯这段程序的执⾏时间是1秒:⽽下⾯这段程序的执⾏时间则是2秒:因为第⼆段程序中的两个In Place Element Structure必须顺序执⾏。
有了“锁住”这个操作,就有不⼩⼼造成死锁的可能。
⽐如对于同⼀数据的引⽤,千万不能嵌套使⽤In Place Element Structure,否则就会死锁:在上⾯这个⽰例中,程序运⾏⾄内层的In Place Element Structure,就会停在这⾥等外层In Place Element Structure运⾏结束,释放它锁住的数据;⽽对于外层In Place Element Structure来说,它内部的全部代码要运⾏结束,它才结束。
因⽽它们相互等待,造成了死锁。
Packed Project Libraries 2 –与Library的⽐较acked Project Library 从名字上来看,就是被包装好了的Project Library。
Project Library 是编程时候由程序员创建出来的。
⽐如下图这个⼯程,我在⾥⾯创建了⼀个叫做“My Algorithm Library.lvlib”的⼯程库。
它包含两个VI,其中⼀个是私有的。
Packed Project Library 并不是⼿⼯创建的,他是通过⼀个项⽬的⽣成规范,从Project Library 编译⽽来的。
⽐如上图的项⽬,我创建了⼀个Packed Library类型的⽣成规范。
labview心得第一篇:labview心得LABVIEW学习心得这学期的课程设计,主要讲授了一些LabVIEW的基本操作和编程技巧,LabVIEW作为一门新式的以图形化编程的语言,不仅提供了简单易学的编程方法,而且提供了海量的可调用的模块,子vi,涉及到各个方面。
LabVIEW是一种程序开发环境,由美国国家仪器(NI)公司研制开发的,类似于C和BASIC开发环境,但是LabVIEW与其他计算机语言的显著区别是:其他计算机语言都是采用基于文本的语言产生代码,而LabVIEW使用的是图形化编辑语言G编写程序,产生的程序是框图的形式。
LABVIEW有很多优点,尤其是在某些特殊领域其特点尤其突出。
首先在测试测量方面:LABVIEW最初就是为测试测量而设计的,因而测试测量也就是现在LABVIEW最广泛的应用领域。
经过多年的发展,LABVIEW在测试测量领域获得了广泛的承认。
至今,大多数主流的测试仪器、数据采集设备都拥有专门的LabVIEW驱动程序,使用LabVIEW可以非常便捷的控制这些硬件设备。
同时,用户也可以十分方便地找到各种适用于测试测量领域的LabVIEW工具包。
这些工具包几乎覆盖了用户所需的所有功能,用户在这些工具包的基础上再开发程序就容易多了。
有时甚至于只需简单地调用几个工具包中的函数,就可以组成一个完整的测试测量应用程序。
控制与测试是两个相关度非常高的领域,从测试领域起家的LabVIEW自然而然地首先拓展至控制领域。
LabVIEW拥有专门用于控制领域的模块----LabVIEWDSC。
除此之外,工业控制领域常用的设备、数据线等通常也都带有相应的LabVIEW驱动程序。
使用LabVIEW可以非常方便的编制各种控制程序。
除了以上两种应用领域,LabVIEW还包含了多种多样的数学运算函数,特别适合进行模拟、仿真、原型设计等工作。
在设计机电设备之前,可以现在计算机上用LabVIEW搭建仿真原型,验证设计的合理性,找到潜在的问题。
LabVIEW Actor Framework 学习笔记Actor Framework优点就不多介绍了。
现在来一步步做一个简单的Actor Framework项目示例。
计算两个数的加法和减法。
1.首先创建 LabVIEW Project打开LabVIEW,File 》Create Project 》Blank Project。
然后保存项目。
2.创建Actors。
2.1 创建一个Actor命名为:Calculate。
鼠标右键My Computer 》New 》Actor。
单击OK。
同样的方法创建Add和Multiply两个Actor。
3.新建一个空白VI:Launch.vi放置Launch Root Actor.vi到Launch.viFunctions》Data Communication》Actor Framework》Launch Root Actor.vi.然后拖拽Calculate.lvclass到Launch.vi 。
调用属性节点方法关闭前面板。
4.重写Calculate Actor中Actor Core.vi。
鼠标右键该Actor 》VI for Override 》Actor Core 。
然后在Actor Core前面板上放置如下控件:在程序框图上添加while循环和事件结构。
放置两个Launch Nested Actor.vi;拖拽Add和Multiply两个Actor到Actor Core。
放置Read Caller Enqueue.vi。
增加Stop事件。
运行Launch.vi,点击Stop按钮;程序正常停止。
5.将计算结果Result_Add的引用放入Calculate簇。
添加算法,Add Numbers.vi。
鼠标右键Actor Add 》New》VI from Static Dispatch Template,保存VI为Add Numbers。
然后在该VI前面板上放置两个数值控件。
我两个月来学习labview的过程和经验(包括PLC,GPIB,数据库,Excel以及图表显示和打包)讲讲我这两个多月来学习labview的过程和经验,希望能帮助初步使用labview的朋友们!文中提供了我认为较有用的网址,字数跟多,但我认为,如果你能认真看完,将会少走很多弯路,避免浪费时间!图1显示为我在此期间所下载的所有资料所占的大小(只包括word,VI程序,pdf这类的,还不包括下载的占有10个G的labview工具包)。
但实际上对我所要实现的功能只需要如图2所显大小的资料再加一本labview的书籍就够了!图1图2以下是正文。
在学校因为是选修课,所以学了点labview的皮毛,也就是知道labview的基本操作,如:控件是在前面板操作,函数是在程序面板操作,程序基本逻辑和C语言之类的编程语言差不多。
当时考试时老师给了个程序,让我们依葫芦画瓢,自己做出一个同样的程序来就OK了。
1. 现在工作了,需要使用labview来连接PLC来读取相关数据,在一开始的时候因为不知道如何着手,手中的labview书籍中并未提到PLC的连接,于是在网上搜索“labview连接PLC”,查询到的资料都说要通过OPC来建立连接,相关资料。
又搜索OPC(这里),随便下载了Allen-Bradley Bulletin 900 OPC Server,但是依然不能做到视频上面的操作。
继续搜索资料才知道需要按照labview工具包,便花了一下午把公司购买的正版labview2009(听说花了十几万还是几万的记不清了,总之不是我这种穷人买得起的)全装进电脑里(无论有用没用)。
安装完成后确实有了NI OPC server,如图3。
图3也能够像视频里的方法进行操作了!接下来,又不知道如何进行下去了,因为只是连接了PLC(PLC仪器在另一层楼里的办公室,所以也不知道是否真的连接上,只是模仿完成了视频里的操作),但是怎样发送PLC指令,怎样读取返回的数值对我来说完全是一片空白!这时我一方面通过网上查找这方面的资料(查到的内容只提到通过OPC连接PLC,但对如何读取数据只字未提,不过也有可能是我查找的方式不对),之后我才知道,通过OPC操作时,不能纯粹的照着之前提供的地址的内容做,要结合自己的仪器型号来操作,这里是NI OPE Server所支持的PLC仪器型号列表,如果你的PLC型号不在此列表中,那么就需要你的PLC厂家提供OPC Server,我向公司有关人询问过厂家提供的OPC Server,但是由于购买PLC时间太长,他们也找不到了。
严格类型是与自定义控件的已保存文件链接的自定义控件。
将自定义控件保存为自定义类型后,对自定义类型的任何数据类型改动将影响到所有使用该自定义类型的VI。
将自定义控件保存为严格类型后,对严格类型的任何数据类型和外观改动都会影响到使用该严格类型的VI的前面板。
但是,如改变一个严格自类型,放置在程序框图上的严格自定义类型的常量显示为非严格类型,只有数据类型改变,常量才会相应改变。
按照下列步骤,创建严格类型。
右键单击控件或常量,从快捷菜单中选择创建自定义类型。
右键单击自定义类型的实例,从快捷菜单中选择打开自定义类型,打开控件编辑器窗口。
(可选)要创建一个严格类型,从工具栏的控件类型下拉菜单中选择严格类型。
根据需要改变控件。
例如,改变控件的大小、颜色、控件中各元素的相对位置以及向控件导入图像等。
选择文件»应用改动,将改动应用于控件。
只有在对控件做出改动后,应用改动菜单项才可用。
如已对控件做出改动,并且在没有选择文件»应用改动时关闭控件编辑器窗口,LabVIEW 将显示消息提示用户是否保存改动。
选择文件»保存,将自定义控件保存为自定义类型或严格类型。
自定义类型或严格类型可保存在目录或LLB中。
VI服务器是一套函数,可实现动态控制前面板对象、VI和LabVIEW环境。
在打开一个VI 时,无需加载所有的子VI;远程调用VI;无需手动打开每个VI的VI属性对话框就可更新多个VI的属性。
把多态VI 的右键菜单,选择某个实例VI 那一项做成有层次的多级菜单。
只要Menu Name 中输入菜单的层次结构,使用冒号:作为层级分隔符就可以了.一个类型定义或严格类型定义的所有实例与其原始文件相连。
查看严格定义的自定义数值控件。
右键单击数值控件,从快捷菜单中选择属性。
注意: 可用的选项只有外观、说明信息和快捷键。
所有其它属性都由严格自定义类型定义。
如果选择了自定义类型或者严格自定义类型,那么创建的控键将和使用该控键的实例相关联。
Labview笔记
bview最大特点
图形化编程,所见即所得
2.界面
前面板和程序框图(Front Panel,Block Diagram)
Ctrl+E 面板切换
Ctrl+T 左右分屏显示
前面板中有控件选板;程序框图中有函数选板3.VI
快速VI(在控件的Express中)其实是标准许多VI封装而成,方便快速。
而标准VI复杂灵活。
4.数据流编程思想
后面的VI要等待前面的VI的输出结果,随着数据的流动方向Vi逐渐开始工作。
5.循环,条件等结构
6.测试控制领域三大工程过程:数据采集、分析、呈现。
数据采集DAQ
数据分析
报表生成与数据表达
bVIEW的广泛使用
8.学习资源
bVIEW中测量系统可以分为哪三种连接?
答:电压信号:接地;浮动。
测量系统:差分(differential)测量系统;
参考地单端(Referenced Single-Ended,RSE)测量系统;
无参考地单端(NRSE)测量系统。
选择合适的测量系统:
接地信号:差分(differential)测量系统;无参考地单端(NRSE)测量系统
浮动信号:差分(differential)测量系统;参考地单端(RSE)测量系统;无参考地单端(NRSE)测量系统。
reference死锁问题LabVIEW中的引用经常需要和“In Place Element Structure”配合使用。
In Place Element Structure 对一个引用的数据进行处理时,为了保证多线程安全,它会锁住引用指向的数据;其它线程若需对同一数据做操作,必须能这个In Place Element Structure中所有代码执行完毕才可,这样就避免了多线程读写同一内存数据所产生的竞争问题。
举例来说,下面这段程序的执行时间是1秒:而下面这段程序的执行时间则是2秒:因为第二段程序中的两个In Place Element Structure必须顺序执行。
有了“锁住”这个操作,就有不小心造成死锁的可能。
比如对于同一数据的引用,千万不能嵌套使用In Place Element Structure,否则就会死锁:在上面这个示例中,程序运行至内层的In Place Element Structure,就会停在这里等外层In Place Element Structure运行结束,释放它锁住的数据;而对于外层In Place Element Structure来说,它内部的全部代码要运行结束,它才结束。
因而它们相互等待,造成了死锁。
Packed Project Libraries 2 –与Library的比较acked Project Library 从名字上来看,就是被包装好了的Project Library。
Project Library 是编程时候由程序员创建出来的。
比如下图这个工程,我在里面创建了一个叫做“My Algorithm Library.lvlib”的工程库。
它包含两个VI,其中一个是私有的。
Packed Project Library 并不是手工创建的,他是通过一个项目的生成规范,从Project Library 编译而来的。
比如上图的项目,我创建了一个Packed Library类型的生成规范。
我在这个生成规范中指定把“My Algorithm Library.lvlib”编译成Packed Project Library 。
编译的结果是在我指定的路径下生成了一个名为“My Algorithm Library.lvlibp”的文件。
它的后缀名仅比Packed Library多了一个字母p。
双击这个文件,可以打开它,看到他里面包含的VI:如果需要在其它项目中使用到这个Packed Project Library,我们可以直接把它加到另一个项目中去,下图是一个演示项目:Packed Project Library 看上去和 Project Library 非常相似,用法也完全相同。
Packed Project Library 与 Project Library∙都是将功能相关的一组VI封装起来的方法;∙库中的VI可以具有层次机构;∙库中的VI都带有名字空间,名字空间是带有后缀名的库名;∙都可以方便的放在项目管理器里使用尽管它们十分相似,Packed Project Library 与 Project Library 相比,还是有一些明显区别的:∙Packed Project Library 是通过编译生成的;∙Packed Project Library 中的VI是编译后产生的,它们不能被修改;∙Packed Project Library 包含有私有VI,但用户无法看到也不能使用它们;∙Packed Project Library 把VI,.lvlib以及其它用到的文件都打成一个压缩包,用户在磁盘上就只能看到一个.lvlibp文件,看不到VI文件;∙Packed Project Library 很适合作为最终产品发布给用户使用;∙在项目中使用Packed Project Library 可以缩短编译时间,因为Packed Project Library 中的VI是已编译好的,不会再随项目编译一遍。
(这一条先这样写上,但我还需要再深入研究一下)LabVIEW中LVClass数据转换成XML格式的问题前一段时间,一个同事的程序出了问题。
他在程序中把一个LVClass类型的数据转换成XML格式,再保存成文件。
但是从文件中把数据转回成 LVClass时,却出了问题:在调用“Unflatten XML”这个函数时,程序有时出错,有时又不出错。
他的程序中使用了大量的LVClass,并且它们之间有着复杂的继承与包含关系,以至于花了两三天的事件,才找出问题所在。
其实是个简单的问题,只是在设计程序时他没有意识到。
我做了一个简化的程序,可以重现这个问题:首先,给一个子类的对象设置一些数据。
然后把它当做父类类型的数据,平化成XML文本,存盘:关闭LabVIEW,然后重新打开LabVIEW。
再编写一个反向程序,把XML数据转换成父类类型的数据:发现Unflatten From XML函数返回一个错误,value中是一个空的数据。
错误产生原因如下:在把子类数据转换成父类数据类型,这个类型虽然是父类的,但其数据仍然是子类的。
再转换成XML格式,XML格式中记录的仍然是子类的数据。
在反向过程中,Unflatten From XML拿到的数据是子类的,但它企图转换时,却发现内存中没有子类的类型信息,因此它也就不知道如何转换这个数据,所以报错。
如果这个程序稍微改动一下,把XML数据直接转换成子类的数据,就不会出错了:实际上,子类的数据总是可以用父类来表示的。
因此这个XML数据亦可以直接被转换成父类的类型,但前提是,一定要保证子类的类型别家在到内存中去了。
只要在程序中放置一个子类的对象,自然就可以把子类加载至内存。
像下面这个程序就可以正常工作:这个实验反映出两个问题:1.把XML中的内容如果是属于某个LVClass类型的数据,把这些数据转换回LVClass数据时,那个LVClass一定要已经存在于内存才行。
2.在之前的一篇文章“LvClass 的一个效率问题”中提到过:当子类被加载如内存时,它所有的父类也会被加载入内存。
但反过来并不成立。
因为一个类有哪些父类是确定的,父类的地址就记录在子类中。
但一个类并不知道他会有多少子类,任何人都可以从它派生出不同的子类来,因此它在装入内存时,不可能把自己的子类也都装进来。
LabVIEW中实现链表、树等数据结构LabVIEW自带的数据结构只有数组和队列。
多数情况下,这两种数据结构足够开发者使用了。
但是,我平时使用C++和C#语言更多一些,所以编写程序时常常会想到使用其它编程语言中常见的数据结构比如链表(List)、树(Tree)等。
LabVIEW中也可以编程实现这些数据结构,一个比较直观易懂的编程方法是基于LabVIEW中的类和引用来实现各类数据结构。
我在《我和 LabVIEW》一书的第13.3.5节中介绍了一个简单的链表容器的实现方法,它是基于LvClass编写的,数据流驱动的一种容器。
但是正如我在书中提到的,它虽然和有一些和文本编程语言中的链表相类似的地方,但本质并不相同。
文本编程语言中的链表,树等数据结构离不开引用(或指针),节点之间是通过引用来相互关联的。
LabVIEW可以为数据创建引用,因此也可以方便的实现与文本语言中功能相同的数据结构。
这里插一段,介绍一下数据结构和数据容器的关系,我自己理解是这样的:数据结构侧重于数据的存储方式,比如如何排序;数据结构在加上与此结构相关的操作方法,比如添加删除数据等方法,就构成了一个数据容器。
脱离了操作方法,单纯的数据结构用处非常有限。
因此,我文章中在提到数据结构或者数据容器时,指的都是同一回事:数据结构和相关的方法。
为了介绍如何在LabVIEW中实现一个数据结构,我打算以双向链表为例,讲解一下如何编写它。
双向链表中每个节点都会记录上一个节点和下一个节点的位置。
因此,在双向链表中,可以从一个节点直接跳转到它的上一个或下一个节点上去,也就是正向或反向遍历整个链表。
可以直观的想到,使用LvClass实现这样的节点,只要为这个节点创建一个类ListNode,并且这个类有两个成员变量,它们的类型都是ListNode的引用,分别用于指向前一个和后一个节点就可以了:这样的设计在文本编程语言中是没有问题的,但在LabVIEW中行不通。
其它编程语言中,程序运行时,才会对类的对象进行初始化。
LabVIEW 中,VI一打开,它上面的控件和常量就需要被初始化了。
某个对象在初始化时,它的成员变量也要被初始化,若它的成员变量的类型还是这个类,这以初始化的过程就陷入了死锁:类需要它的成员变量先初始化;它成员变量需要这个类先初始化。
基于同样的原因,一个类的成员变量的数据类型也不可以是这个类的子类:子类初始化需要先对它的父类进行初始化。
但是,一个类的成员变量的数据类型可以是这个类的父类:父类在初始化的时候,不需要理会它的任何子类。
既然父类初始化时,不依赖于子类的初始化;而子类的对象又可以被当做父类的类型来保存,咱们就可以利用这一特性在LabVIEW中实现可以数据结构的节点了。
只不过LabVIEW实现链表的节点要多一个步骤:我们需要为ListNode类再定义一个父类ListNodeVirtual。
这个父类不做任何实质性的工作,它仅用于保存相邻节点的引用。
以上两个类是针对链表节点的双向链表本身也需要做成一个类:DoubleLinkedList 类,这个类中封装有链表的属性和方法。
比如它需要一个指向链表表头的引用,需要有为链表添加删除数据的方法,为遍历链表中的数据,还需要有一个迭代器……作为演示,我只实现了链表的几个简单功能。
演示程序工程结构如下:ListNode的成员变量包括一个数据,和两个指向前后节点的引用:DoubleLinkedList类的成员变量包括指向链表头节点的引用,迭代器指向的节点的引用,并记录了链表长度下面看一下链表中几个主要方法是如何实现的。
首先是Append after Enumerator.vi这个方法,它是链表里最复杂的一个方法。
它的输入是链表中一个新的节点,它把这个新节点添加在链表迭代器指向的那个节点的后面。
在给链表添加数据时,会遇到两种情况。
首先,这个链表是一个空链表,那么被添加的节点就是这个链表的首节点,链表的迭代器也应当指向这一唯一的节点。
我设计的这个链表是一个环状链表。
当链表中只有一个节点的时候,这个链表的上一个和下一个节点都是它自己。
如果链表不是空的,就把新节点插在迭代器指向的节点的后面。
因此:新节点的前一节点指向的应当是迭代器指向的那个节点;新节点的后一节点是迭代器指向节点原来的后一节点。
迭代器指向节点的新的后一节点应当是这个新节点;原来迭代器的后一节点的前一节点也应当换成这个新的节点。