第15章 模拟输出.docx
- 文档编号:10590490
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:13
- 大小:303.01KB
第15章 模拟输出.docx
《第15章 模拟输出.docx》由会员分享,可在线阅读,更多相关《第15章 模拟输出.docx(13页珍藏版)》请在冰豆网上搜索。
第15章模拟输出
第15章 模拟输出
15.1模拟输出基础知识
15.1.1关于单点模拟输出
15.1.2关于缓存模拟输出
15.2 单点模拟输出
15.2.1使用易用VI进行单点模拟输出
15.2.2使用实用VI进行单点模拟输出
15.3 波形输出
15.3.1单缓存模拟输出
15.3.2循环缓存输出
15.4模拟输入\输出控制回路
15.4.1软件定时模拟输入\输出
15.4.2硬件定时模拟输入\输出
15.4.3改进控制循环性能
15.4.4简单的容器液位控制与仿真
第15章 模拟输出
15.1模拟输出基础知识
在某些情况下需要用数据采集设备输出模拟信号。
这些模拟信号包括稳定的直流信号、缓慢变化的信号和连续变化的信号。
本章说明LabVIEW怎样产生这几种不同类型的信号。
15.1.1关于单点模拟输出
当输出信号的电平高低比输出值的变化率更重要时,需要产生的是一个稳定的直流信号。
可以使用单点模拟输出VI产生这种类型的信号。
在单点模拟输出过程中,每当需要改变一个模拟输出信道的值时,就调用一次单点刷新的VI。
因此改变输出值的速度只能和LabVIEW调用模拟输出VI的速度一样。
这种方法叫做软件定时。
在不需要高速产生信号或精确定时的情况下,就可以使用软件定时。
关于单点输出的详尽说明见15.2节。
15.1.2关于缓存模拟输出
有时在模拟输出过程中,信号的刷新率与信号的电平高低同样重要。
例如,把数据采集设备当一个信号发生器使用时就是这种情况,我们把这种情况叫做波形输出。
它需要使用缓存模拟输出的技术。
具体方法是,把一个周期的正弦波数据存储为一个数组,通过编程使数据采集设备按指定的频率,每次一个点连续输出数组中的数值。
这种情况叫做单缓存波形输出。
如果我们需要产生一个连续变化的波形,例如要输出的数据是一个存储在磁盘中的大文件,或需要在输出过程中对信号的某些参数进行改变,LabVIEW就不能存储整个波形在一个单独的缓存区内,这时就必须在信号输出的同时,连续将新的数据写入缓存区。
这种情况叫做循环缓存波形输出。
关于缓存输出的详尽说明见15.3节。
15.2 单点模拟输出
15.2.1使用易用VI进行单点模拟输出
使用易用模拟输出VI—AOUpdateChannel可以完成LabVIEW最基本的单信道单点模拟输出。
LabVIEW6.1\examples\daq\anlogout.llb库中的示例程序Generate1Pointon1Channel,就是使用这个VI从数据采集设备的单个信道一次输出一个值。
图15-1是它的图形代码。
图15-1从单个信道一次输出一个值
如果需要多次进行单信道模拟输出,可以把图15-1的图形代码放在一个While循环内,使程序连续的运行,调用一次AOUpdateChannelVI就从指定的信道输出一个数值。
如果需要同时从多个信道进行单点模拟输出就使用模拟输出函数模板中与AOUpdateChannelVI相邻的AOUpdateChannelsVI。
这个VI要求输入的数据是一个浮点数组,程序运行时数组中每一个数值从信道表参数中列出的一个信道输出。
15.2.2使用实用VI进行单点模拟输出
易用VI每运行一次就对硬件进行一次设置,所以要提高程序运行的效率以及实现极限设置、出错处理等对程序更多的控制,就使用实用模拟输出VI。
图15-2的程序使用实用的模拟输出VI—AOWriteOneUpdate进行模拟输出。
它与LabVIEW6.1\examples\daq\anlogout\anlogout.llb库中的WriteNUpdatesexample示例程序类似。
在这个程序中如果采用信道定址就不必连接设备参数。
波形数据是一个数组,数组中每一个成员包含一个信道信息,即输出信号的起始时间t0和信号幅值y。
数组第一个成员对应信道字符串中的第一个成员,第二个成员对应信道字符串中第二个成员,……。
如果在信道字符串中使用了信道向导中设置的信道名,数据值就应该对应信道向导中设置的物理单位,否则数据值的单位采用伏特。
while循环的计数端口连接到AOWriteOneUpdateVI的iteration参数输入端口,使得它只在循环数的值为0时进行设备设置,以优化程序的性能。
这个VI可以对每个信道的极限进行设置;并传递一个出错信息给简单错误处理VI。
程序运行后While循环反复调用AOWriteOneUpdateVI,直到出现错误,或按下停止按钮使布尔量的值变为TRUE。
图15-2实用模拟输出VI单点输出
这是一个软件定时的立即模拟输出程序。
也就是说循环中的软件定时控制着刷新率,这里是每秒对各个信道的输出值刷新一次。
需要程序每次计算或处理一个数据时,可以使用这种方法。
但是应注意软件定时不如硬件定时精确。
15.3 波形输出
本书15.1模拟输出基础知识中已经介绍了什么时候使用缓存模拟输出,这一节详细说明LabVIEW使用哪些VI、如何执行这种输出。
15.3.1单缓存模拟输出
进行单缓存模拟输出最简单的方法仍然是使用LabVIEW中的易用模拟输出VI,其中AOGenerateWaveform用于从一个信道输出波形,AOGenerateWaveforms用于从多个信道输出波形。
图15-3的程序使用易用模拟输出VI—AOGenerateWaveforms进行模拟输出。
AOGenerateWaveformsVI按updaterate(刷新率)参数设定的速率,向channels(信道表)参数指定的各个模拟输出信道,分别写入一个波形数组。
例如,如果channels参数包括两个信道,而波形(waveforms)参数是一个由两列数据组成的二维数组,LabVIEW在每一次刷新时从数组各列把数据写入相应的信道。
所有数据写入各个信道后,程序停止。
输出信道信号的电平保持在二维数组最后一行数据的值上,直到新的数据生成。
输出数据的物理单位与单点输出时要求是同样的。
易用VI包含出错处理的功能,如果AOGenerateWaveformsVI中发生错误,就会出现一个对话框,显示错误号和错误说明,并终止程序运行。
图15-3使用易用VI进行单缓存模拟输出图15-4使用实用VI进行单缓存定次数模拟输出
与单点模拟输出时同样,大多数情况下应使用实用模拟输出VI编程。
LabVIEW中执行单缓存模拟输出实用VI是AOWaveformGen。
这个VI具有几个易用VI不具备的输入输出参数。
generationcount(输出次数)用来选择波形数组的数据输出的次数。
这个参数默认值是1;如果将它设置为0,则表示连续输出。
图15-4是这个VI编程的示例。
使用AOWaveformGenVI要注意,如果是多信道输出,各个信道的波形数组长度必须一致,否则会发生写缓存出错。
图15-5使用实用VI进行单缓存连续模拟输出
图15-5的程序中把AOWaveformGenVI放入while循环中,并把循环数端口接入iteration(循环)输入参数,以优化这个程序的性能。
当循环数为0时,LabVIEW适当的设置模拟输出信道。
循环数大于0以后,LabVIEW使用现有的设置。
generationcount参数使用默认值1,循环每执行一次将波形数组的数据向相应信道输出一次。
直到出现错误,或按下停止按钮循环停止。
按下停止按钮的同时会清除模拟输出的设置,释放分配的系统资源。
使用AOWaveformGenVI,还可以为每个信道进行输出极限设置。
需要对模拟输出应用程序进行更多控制时,使用如图15-6所示那些中级模拟输出VI。
图15-6使用中级VI进行单缓存连续模拟输出
图中AOConfigVI设置模拟输出的设备和信道,并返回taskID和errorout;这两个参数贯穿程序始终,在传递任务标示和出错信息的同时,也保证程序按一定顺序执行。
AOWriteVI把数据写进缓存区。
AOStartVI按设定的刷新率开始实际输出数据,这个VI的输入参数numberofbufferiterations(输出缓存中数据的次数)使用了默认值1,即只输出一次;可以通过AOStartVI的clocksource参数设置其它的刷新时钟源,例如外部时钟或来自其它设备的信号时钟。
这个VI的actualupdaterate参数返回刷新率。
AOWaitVI等待波形生成完毕。
然后AOClearVI清除模拟输出信道设置。
如果有一个VI发生错误,它后面的VI不再进行任何操作,只是把出错信息向后传递,最后SimpleErrorHandlerVI弹出一个对话框提示操作者。
Labview6.1\examples\daq\anlogout\anlogout.llb库中的GenerateContinuousSinewave程序与图15-6的程序结构类似,由于AOStartVI的输入参数numberofbufferiterations输入了0,意味着连续输出缓存中的数据,所以它可以通过指定的信道连续输出正弦波。
如果需要使用这个程序由多个信道输出信号,只需要计算出其它信道的波形,然后建成二维数组,再将它行列转置输给AOWriteVI。
15.3.2循环缓存输出
当波形数据太大,缓存区放不下,或者它在不断的变化的话,就需要使用循环缓存输出数据。
虽然可以使用易用模拟输出VI在程序的循环结构中建立循环缓存的输出,但是这样会降低程序的效率,因为易用VI每次被调用时都要进行硬件设置、分配内存、释放内存,这就造成数据输出间的时间中断。
图15-7是位于LabVIEW6.1\examples\daq\anlogout\anlogout.llb程序库中的ContinuousGeneration示例程序的图形代码。
它使用实用VI—AOContinuousGen执行循环缓存的模拟输出。
当iteration参数输入为0时,它进行硬件设置,并分配一块内存缓存区;iteration大于0以后,它使用已有的设置,连续输出数据。
在AOContinuousGen
VI中设置了数据缓存区的大小。
执行第一次循环时,MyDataGeneratorVI算出的波形数据填满整个缓存区;以后各次循环中,MyDataGeneratorVI算出的波形数据只有半个缓存区大小。
在半个缓存区写入数据的同时,另一半的缓存区输出数据。
当cleargeneration参数输入为TRUE时,它清除硬件设置、释放计算机内存。
图15-7使用实用VI进行循环缓存模拟输出
如果需要对模拟输出的更多控制,就需要使用图15-8所示的中级VI。
用这些VI,可以设置另外的刷新时钟信号源,并可监视实际的刷新率。
图中AOConfigVI设置输出信道和缓存区的大小。
第一个AOWriteVI把波形数据放入整个缓存区。
AOStartVI按指定的刷新率开始连续输出。
While循环中的AOWriteVI在每次循环中把新的波形数据写入半个缓存区,另半个缓存区的波形数据执行输出,这样实现了循环缓存的模拟输出,可以在程序运行过程中修改波形数据。
按下停止键或出现错误后,AOClearVI清除对硬件的设置,释放缓存区。
最后用AOUpdataChannelsVI将输出信道的电平置零。
图15-8使用中级VI进行循环缓存模拟输出
图15-9是位于LabVIEW6.1\examples\daq\anlogout\anlogout.llb程序库中的FunctionGenerator示例程序的图形代码,它也同样可以在运行中按前面板上对信号类型、幅值、偏置、频率及相位等做的修改改变输出波形,但是这里提供了另外一种改变输出信号频率的方法。
图15-8的程序采用固定的模拟输出刷新率,通过改变输出波形数据中一个周期的数据点数来改变输出信号的频率。
采样这种方法,当缓存区大小不是信号一个周期点数的整倍数时,会造成信号的不连续。
而FunctionGenerator程序对一个周期的信号采用了固定的数据点数,使它正好是缓存区大小的二分之一,而通过调用高级模拟输出VI—AOClockConfig改变模拟输出刷新率来实现不同频率信号的输出。
图15-9函数发生器示例程序图形代码
使用这个程序在以下情况下会发生号码为10843的underFlowErr错误,即写缓存太慢:
1.计算机硬件配置太低;
2.同时运行其它程序;
3.刷新率设置太高;
4.缓存区设置太小。
如果数据采集卡的模拟输出有FIFO缓存,那么将AIConfigVI的输入参数allocatemode设置为useFIFOmemory可以解决这个问题。
但是很多低价位数据采集卡都没有模拟输出FIFO缓存,这时只有降低程序性能来保证它能够运行。
15.4模拟输入\输出控制回路
在很多实际应用程序中,不仅需要监测一些对象的状况,还要对这些对象进行控制,这就要求在采集到一些模拟输入数据以后还要输出模拟数据,即构成一个模拟输入\输出控制回路。
在大多数情况下,这种控制回路只需要单点模拟输入和输出就可以。
单点模拟输入和输出VI支持几个模拟输入\输出控制回路同时进行,因为可以在一次扫描中从几个信道采集模拟输入数据,并在一次数据刷新时写入所有模拟输出数据。
只需要执行一次模拟输入调用,处理完对所有信道模拟输出的数据后,再执行一次模拟输出调用刷新所有的信道。
本节介绍两种不同类型的模拟输入\输出控制回路:
软件定时和硬件定时模拟输入\输出。
15.4.1软件定时模拟输入\输出
软件定时就是用软件控制着模拟输入的采样率和模拟输出的刷新率。
例如用一个倍数定时器WaitUntilNextMillisecond函数控制循环执行的时间间隔,在每一次循环时调用一次单点模拟输入VI,执行一次数据采集;再调用一次单点模拟输出VI,执行一次数据输出。
在这种情况下,循环定时器可以被任何的用户干预打断,采样的速率不可能象硬件定时那样始终一致。
所以只有控制回路不需要精度太高的采样速率,软件定时才是适用的。
除了用户的干预,数量太多或尺寸太大的前面板显示件,例如图线、图形,也影响到循环速率。
刷新显示器屏幕会中断系统时钟对循环速率的控制。
因此在使用软件定时控制回路时应尽可能少用图线和图形显示件。
图15-10是LabVIEW6.1\examples\daq\anlog_io\anlog_io.llb.库中的AnalogIOControlLoop(immed)示例程序的图形代码。
程序中用了两个实用VI—AIReadOneScan和AOWriteOneUpdate执行软件定时的模拟输入输出。
用户在前面板上输入一个循环速率,这个数值被转换为以毫秒计的循环时间间隔,作为WaitUntilNextMillisecond函数的输入,控制系统的执行速度。
图15-10软件定时模拟输入输出控制回路
程序中的timesincelastVI的图形代码如图15-11所示,它返回程序实际的循环执行时间间隔。
图15-11软件计时器
如果读者在运行这个程序时,用鼠标拖动工具模板在前面板上移动,会看到程序的循环执行时间间隔有很大变化。
所以如果控制回路的模拟采样速率不需要经常保持一致,才可以使用软件定时控制循环。
程序中AIReadOneScanVI从数据采集设备模拟输入0信道和1信道采集数据,各采集到一个数据点后,在mycontrolcalcVI中执行数据计算,然后通过模拟输出0信道和1信道输出控制信号。
因为循环计数端口连接到AIReadOneScan和AOWriteOneUpdate两个VI,这个应用程序只在循环第一次执行时为模拟输入和模拟输出设置数据采集设备。
15.4.2硬件定时模拟输入\输出
使用硬件定时控制回路时数据采集不会被用户的干预打断,可以得到精确的模拟输入采样率和模拟输出刷新率。
硬件定时的模拟输入按照扫描率参数设定的时间间隔,自动把数据放进数据采集设备的FIFO缓存区。
如果在程序中反复调用AISingleScanVI去读取FIFO中最先的数据,控制回路的循环就与这个精确的模拟输入扫描率同步,从而也使控制回路的循环时间更准确。
图15-12是位于LabVIEW6.1\examples\daq\anlog_io\anlog_io.llb库中的AnalogIOControlLoop(hwtimed)程序的图形代码,这是一个硬件定时、不使用缓存的控制回路示例。
图15-12硬件定时模拟输入输出控制回路
在这个程序中使用了一系列中级模拟输入VI,AIConfigVI设置设备从0信道和1信道采集数据;这个程序不使用计算机内存建立缓存区,而是使用数据采集设备的FIFO缓存;inputlimits(输入极限)参数设定到预期的输入信号范围。
AIStartVI按照设定的扫描率开始连续采样。
在执行AIStart和AISingleScan之间可能已经采集到一些数据,所以通过设置AISingleScanVI的opcode(操作码)参数,使得在程序第一次循环时,AISingleScanVI把FIFO清空并返回最后一个数据,以后每次循环时程序读取FIFO中最先的数据,其时FIFO中只有一个采样数据。
只要数据采集设备完成下一个扫描的采样,AISingleScanVI就立即返回。
如果调用AISingleScanVI时,数据采集设备的FIFO中存有一个以上扫描的数据,那就是说程序的执行没有能够跟上采样的速率。
可以通过监视AISingleScanVI的dataremaining(剩余数据)输出参数来对此进行检测,一旦这个输出参数大于0,布尔型显示元件looptooslow就被置为TRUE。
。
这说明程序的时间开销太大,跟不上硬件定时的循环速率。
这最终将导致一种出错状态,它使循环终止。
程序结束前,AIClearVI清除模拟输入任务。
在这个程序中包括有一个波形图,它降低了程序的执行速率。
要加速控制回路循环的执行速度,可以拿掉图形显示件。
在模拟输入/输出控制回路中可以很容易的进行其它数据处理,方法是把模拟输入、数据计算和模拟输出放在一个顺序结构的第一个框中,把增加的其它处理工作放在顺序结构的下一个框中。
要注意增加的处理任务时间必须小于控制回路的周期,否则就跟不上控制回路循环的速率。
15.4.3改进控制循环性能
如果需要有其它程序和硬件定时的控制回路并行执行,就应该考虑一些程序性能方面的问题。
硬件定时的控制回路中,一旦AISingleScanVI被调用,它就使程序处于等待状态,直到一个扫描完成才返回。
这意味着CPU一直在数据采集设备的驱动程序中等待,如果在同一个程序中与硬件定时的控制回路并行运行其它的LabVIEWVI或while循环,它们可能运行非常缓慢或是间歇的。
要缓解这个问题可以用Wait(ms)函数在循环最后写完输出值后加一个软件延时。
其它LabVIEWVI和循环可以在这个时间执行。
另一种技巧是对模拟输入“截头”,以避免在驱动程序中的等待。
方法是设置AISingleScanVI的timelimitinsec参数为0。
于是这个VI在读完数据采集设备的FIFO后就立即返回,不管一次扫描是否采集完了。
如果扫描还没有完成,AISingleScanVI的scaleddata输出参数返回一个空数组。
对模拟输入“截头”的方法是把AISingleScanVI和Wait(ms)或WaitUntilNextmsMultiple函数一起放入控制循环程序中的一个while循环。
把等待时间设为小于控制回路执行的时间间隔(至少小于一半时间)。
如果scaleddata输出不是空数组,就跳出“截头”循环,传递出数据,执行控制循环程序的其它部分。
这种方法不是象前面的例子那样一次扫描采集完后立即返回数据,而是留有充裕的时间执行其它VI和循环。
这种方法对于几个VI和循环并行执行时平衡CPU的任务负荷是一种很好的技巧。
在前面介绍的技巧中,如果是对速度大于1Hz的程序使用软件延时,LabVIEW环境设置中去掉UseDefaultTimer选项,这样可以得到大约1ms软件定时器分辨率,而不是缺省的55ms的定时器分辨率。
15.4.4简单的容器液位控制与仿真
这个例子分为两个程序。
图15-2(a)是容器液位监控程序的图形代码,它采集容器液位信号pv,与液位设定值sp进行比较,按e=sp-pv计算误差。
按output=e*k(k为一个可调的比例系数)控制阀门开度。
送出控制信号。
图15-2(b)是容器仿真程序的图形代码。
它接收来自液位控制程序的液位控制信号,当外部控制信号大于0时,按一定比例增加容器阀门的开度使液位上升;当外部控制信号小于0时按一定比例减小容器阀门的开度使液位下降。
同时可以调节泄漏量使液位发生变化。
并将实际液位信号送出。
两个程序都用了单点输入输出的易用数据采集VI。
运行这两个程序时,需要带有两通道模拟输出功能的数据采集卡,用信号线将控制系统的输出与仿真系统的输入连接起来,并将控制系统的输入与仿真系统的输出连接起来,形成一个闭环负反馈的控制回路。
(a)(b)
图15-13简单的液位控制与容器仿真
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第15章 模拟输出 15 模拟 输出