在 LabVIEW 中使用常量定义

    如下图所示,在C语言里,使用#define来定义一个常数是非常基本的用法。直接使用数字,时间一长,就不只到这个数字是哪来的了。而且,这种方法也便于修改在程序中多处使用的常量的值。在C++一般是用const来达到同样的目的。

图1:C 语言中的常量定义
 
    我以前在LabVIEW中编程,还从没注意过这个问题。一般哪里要用一个常数,直接就放一个constant在那里。如图2。
 
图2:在 LabVIEW 中使用常量的最普遍方法
 
 
    以前编写的LabVIEW程序都比较小,一般是一个人开发的,所以这样写,也没有太大的麻烦。现在编写的程序规模越来越大,最近做的一个项目,VI数量已经上千了,有4个人参与编程。程序规模大了,不规范就很难维护。所以开始考虑这个问题。
    但是LabVIEW里面没有类似的功能,不知道为什么以前没人提意见?
 
    下面提出几种不算太完美,但有所进步的解决方案。
    一种简单的替代方法是使用type define control,自定义一个Ring control。关于 Type Def 的详细信息,可以参考《用户自定义控件中 Control, Type Def. 和 Strict Type Def. 的区别》。把要使用的常数作为Ring的值,给他个有意义的文字标签。在需要时用常数的地方,把这个带type define 的ring常数放上去,而不是直接放数值常量。这样就解决了上面提到的一个问题:可以有自带的文字说明。如图3所示。
 
图3:利用 Type Def Ring 的解决方案
 
    但是这样做还是有很多缺陷。首先是统一修改数值的问题。在自定义Ring中修改某一项的值,相关的常量不会跟着一起更新;还有一个缺陷是 Ring control 不支持多个标签是用同一数值;另外 Ring control 也没办法像 C 语言中一样使用表达式定义值。
 
    一个改进版的解决方案是使用 Enum Type Def 把所有常量名字列出来,再写一个 VI 用于得到常量的真实值,如图4所示。这样解决了不同标签可以返回相同值的问题,也可以自动更新常量值,但是使用表达式还是不方便。
 
图4:利用 Enum Type Def 和 subVI
 
    我目前在程序中使用的方法是,把所有要用到的常量,全部做成全局变量。全局变量可以用 Global ,但我喜欢用 VI 全局变量。就是把变量记载 shift regisiter 中。然后,用一个初始化的 VI 负责在程序运行开始时初始化所有的全局变量。这样,以后如果需要更改某一常数值,就只需改这一个VI就可以了。
    不过,现在回想,还是用 Global 好一些。我以前测试过,Global 读写的速度比 VI 要慢很多,所以我不喜欢 Global 。但是,常量值在程序中用的并不频繁,所以速度不是个问题。但是数量很多,用 VI 表示就不太合适了,每个常数都要创建一个 VI 非常费事。另一个缺点是如果在后面板换用一个常量,还要再拖另一个 VI 上来,很麻烦。用 Global 会好一些,但还不是让我太满意。
 
    要想有一个完美的解决办法,只能再造一个新东西了。@#$%^&* (此处属公司机密,删去256字)
 
 
 
 
 
广告

抢先试用新 Google 界面!

 首先在 http://www.google.com 里随便搜索一个词, 然后将下方代码复制到地址栏, 代替原来的地址, 然后按回车 (注意, 下面的代码只有一行, 并没有换行, 换行不会成功)

javascript:alert(document.cookie="PREF=ID=fb7740f107311e46:TM=1142683332:LM=1142683332:S=fNSw6ljXTzvL3dWu;path=/;domain=."+location.href.split(‘/’)[2].substr(location.href.split(‘/’)[2].indexOf(‘google’)));

这时会弹出一个对话框, 点击确认。

 

重新进入 google,你就能看见新版的 Google 搜索界面了 :)

记录梦境

最近可能是因为换了个环境,有几个晚上睡觉做梦都是情景清晰,内容连贯的故事。把昨晚的故事记录下来吧,说不定哪天又有一部电影和我做的梦差不多。
我梦见:
 
    我们一群宇航员接到了一个去火星完成任务的项目,名额有限,需要考试。我考试考得很差,而且我本来就是这群人里水平比较差的一个。结果最终任务小组人员确定下来的时候我居然榜上有名。
    我欢天喜地的背着包上了飞船。这个飞船主要由两部分组成:一架航天飞机,可以返回地球,航天员主要的生活工作空间;一个火星登陆舱,可以搭载一部分航天员降落的火星,完成任务后再返回轨道。我想当然的跑到航天飞机,结果却发现里面没有我的位置。航天飞机总共就提供了8名宇航员的位置,已经被另外8个人占了。而我和其他5名宇航员被安排呆在狭小的登录舱内。登录舱内设备简陋,地方又挤,所以我心里很不平衡,大家都是宇航员,我的待遇却这么差。
    当飞船飞离地球后。我们几个住在登陆舱内的人发现原来这里是有更大阴谋的。原因是一个宇航员自己带了一台无线通讯设备来,可以接入到地面的互联网。我们在查看政府对这次任务的报道时,发现官方宣称这次任务有8名宇航员参与,计划是如何如何。根本不提我们生活在登陆舱内的6个人。我们6个人觉得这里一定有不可告人的秘密,于是对这次任务的计划和物资安排重新计算一遍。
    我们发现,这次任务需要14名队员共同完成。然而,一架航天飞机所携带的补给远不能满足14个人往返火星大约1年时间所需。并且航天飞机内就只有8个座位,无法搭载其他人升降地球。而登陆舱的能量只够升降火星两次,剩余的能量也不够返回地球之用了。
 
    我们与地面上一位参与这次行动计划的高官取得了联系,他觉得无法违背良心,对我们说出了真相。原来这次任务非常紧急,政府来不及装备其他的航天飞机了。于是决定牺牲掉我们几个平时比较差劲的航天员,以保证任务成功。当我们在火星完成任务后,就连同登陆舱一起丢到太空里。而在航天飞机中的8名宇航员,仍然有足够补给返回地球。这样就解决了能量和供给不足的问题。
    由于这么做很不人道,所以这件事是高度机密。政府对外的宣传是不会提到我们6个人的。外界会以为,这次行动只有8个人,全部都安全返回了。
   
    我们登陆舱内的6个人得知真相以后非常气愤。我们可不想这样白白牺牲,于是决定放弃行动,返回地球,并且要揭露这个阴谋。我做为这六个人的代表,去跟航天飞机里的8个人谈判。这几位宇航员也是比较有正义感的,在了解了真相后也表示支持我们,要和我们一起抵制这次的行动返回地球。
    在分离了登陆舱和航天飞机之后,我们登陆舱先行返回。能够在火星升降两次的登陆舱,恰好可以为降落地球一次提供足够能量。我们小心翼翼的操纵登陆舱降落在了宇航中心的机场上。
    不料,政府为了掩盖真相,已经下令干掉我们灭口。我们一出舱门就发现很多持枪荷弹的武装人员已经在等着我们了。因为我们这次航天的任务是有军事目的的,所以我们6个宇航员也带着武器。我们不愿意束手就擒,于是便和地面的武装人员交上了火。
    本来我们6个人肯定不是地面上大批武装人员的对手。但是世上没有不透风的墙,这件事已经被反政府人员得知,他们想利用我们来反对政府,于是也派了武装人员来抢救我们。机场上3伙人打成了一团。
 
    就在这时,按计划后期降落的航天飞机飞到机场上空准备降落。可是由于机场上一片混乱,航天飞机为了躲避障碍,滑离了跑道,一头撞在机场围墙上,冲了出去。于是又有一大批两派的武装人员,记者从围墙坍塌的地方冲了进来,场面更加混乱了。
    我就趴在地上东躲西藏。
 
    后来的情节就记不清楚了……      
 
相关文章:
 
 

使用虚拟仪器搭建射频下变频模块仪器校准系统

 
 
 
文本:
使用虚拟仪器搭建射频下变频模块仪器校准系统
阮奇桢
E-mail:ruanqizhen@gmail.com
摘 要:本文介绍了射频下变频模块仪器的自动化校准技术,以及虚拟仪器技术在校准系统中的应用。文章详细讲解了PXI-5600下变频模块仪器自动校准程序的工作原理以及软硬件系统的搭建方法。
关键词:LabVIEW,虚拟仪器,校准,下变频模块
 
Virtual Instrument System for RF Down Converter Modular Instruments
Qizhen Ruan
E-mail:ruanqizhen@gmail.com
Abstract
This article introduces the technology of RF modular instrument automatic calibration system, and how does the virtual instrument concept help in the system. The article also introduces the environment, requirements and process of implementing an RF calibration system.
Keywords:LabVIEW,Virtual Instrument, Calibration, Down Converter
一. 引言
为了保证测量精度,仪器需要定期做校准。传统仪器可设定的校准参数并不多,通常采用手工校准的方式。随着集成化、模块化仪器的出现和大量使用,这类仪器所需的校准过程变得非常复杂。加之模块化仪器没有直接供用户操作的界面,只能与计算机共同使用,迫使我们不得不采用编程的方法为模块化仪器进行校准。虚拟仪器的概念为搭建校准系统提供了便捷的途径。[2]
射频下变频仪器就是模块化仪器中目前应用前景最为广阔的一种,其代表产品有National Instruments公司的PXI-5600下变频模块。[3]
二. 射频下变频模块仪器的校准原理和校准参数
1. 射频下变频模块仪器的工作原理
射频下变频模块仪器通常与数字化模块仪器(或示波器模块)共同时用,以代替传统的频谱仪。
射频下变频模块用于把输入的射频调制信号的载波频率由射频段降低至中频段,以供数字化模块将调制信号数字化。数字化模块采样率较低,不能用来直接采集频率过高的信号。PXI-5600模块可将载波频率在9k~2.7GHz,带宽在20MHz以内的调制信号变频为载波频率为20MHz、带宽不变的调制信号[3]。经过此转换过程,输出信号可被采样率大于50MHz的数字化模块采集,并在计算机内使用软件对采集的数据进行分析、处理、显示,以完成频谱仪甚至部分网络分析仪的功能。
2. 射频下变频模块仪器的校准原理
模块化仪器的校准原理与传统仪器略有不同。模块化仪器校准的本质是使用软件来补偿硬件误差。模块化仪器总是与计算机相协同使用的,我们可以在高层应用程序使用模块化仪器的采集数据之前,对模块化仪器测量的原始数据进行补偿,然后将补偿后的数据作为最终测量值传递给上层应用程序,以提高仪器的测量精度。[2]
以温度补偿为例,通常,随着温度的升高,仪器的测量值也随之增加,并且两者具有近似的线性关系。这样我们可以对测量得到的原始值进行修正,以补偿温度变化引起的误差。
公式为:V=Vo*(Ca+Cb*T)
其中V是最终测量值;Vo是仪器测量的原始值;Ca是温漂误差的常量参数;Cb是温漂误差的一次参数;T为仪器的温度。
仪器温度校准的过程就是获得以上两个温度补偿参数的过程。
3. 校准参数
对于射频下变频模块仪器,除了上面提到的温漂参数,还有其它一些重要参数需要校准。
内置时钟的频率:下变频一般会有一个频率为10MHz内置时钟。
射频范围内的功率补偿:对于不同频率的输入信号,下变频模块对信号的衰减是不同的,所以必须用校准参数补偿下变频模块对输入信号衰减。
 
中频范围内的功率补偿:同样对于不同频率的输出信号,下变频模块也有不同的衰减。该校准参数用于补偿下变频模块对输出信号衰减。
射频和中频的功率补偿曲线与温度功率补偿曲线不同,它们都是无规则曲线。如使用直线对其拟合,其校准效果十分有限。而使用过高的阶次,会增加运算量,并在拟合曲线边缘产生振荡。根据试验结果,采用7到15阶的曲线对上述参数进行拟合,校准效果最令人满意。
三. 硬件系统
1. 结构图
下变频模块的校准平台由被测量仪器、标准仪器和计算机组成。
PXI 5600需插入PXI机箱使用,可以通过在PXI机箱上加控制器控制5600模块,也可使用MIX通讯模块将PXI机箱与台式计算机相连,使用计算机控制5600模块。
铷钟用于为频谱仪提供精准的时钟信号,从而使频谱仪能够准确测量5600发出的信号的频率。
信号发生器为5600提供RF频段的输入信号。
功率计的两个通道同时读取5600模块输入端和输出端的信号功率,以比较他们之间的误差。
信号输出
信号输入
信号输入A
5600 下变频模块
铷钟
参考频率输入
IF信号输出
参考频率输出
RF信号输入
频谱仪
RF 信号发生器
功率计
功率均分器
信号输入B
参考时钟输入
精准10MHz时钟信号输出
PXI 机箱
与计算机相连
图1: 硬件系统结构
2. 选择标准仪器
标准仪器的选择有以下两点原则:一是标准仪器的测量范围和精度要满足校准要求,二是尽量采用常用的仪器。
5600模块内置时钟校准后的频率要求是10MHz,误差在0.1Hz内。标准仪器的精度应比这高一个数量级,即1 ppb。一般的晶振时钟很难达到此精度,因此我们选择铷钟作为时钟基准。常见的铷钟型号有Datum 8040等。
因为频谱仪由外接铷钟提供基准频率,因此我们可以不用担心频谱仪的频率精度。一般频谱仪的分辨率通常大于0.1Hz,我们可以采用测量5600模块内置时钟信号的第11阶谐波的方法来提高分辨率:10MHz的信号的第11阶谐波频率为110MHz,其误差应在1Hz以内。因此,只要测量范围包括110MHz,分辨率在1Hz以内的频谱仪都可用于5600的校准。目前最常见的频谱仪是Agilent公司的AGESA系列频谱仪。
RF信号发生器需要提供频率高达3GHz的信号,可以选用Agilent公司AGESG系列信号发生器中频率范围超过3GHz的型号。
常见的功率计有Agilent公司的AGESP系列,和Rohde & Schwarz公司的NRVD系列。需要注意的是,功率计还需要选择适合的传感器探头。由于在校准过程中,功率计的两个通


道分别测量RF段和IF段的信号,因此,我们所选用的传感器探头的测量频率范围应分别为20MHz~2.8GHz和3MHz~27MHz。
四. 软件系统
仪器的校准软件往往要提供给不同的校准实验室使用,而每个实验室所拥有的标准仪器都不尽相同,这就要求编写的校准程序必须具有仪器可互换性。IVI(可互换虚拟仪器)架构为我们的校准系统实现仪器可互换提供了保证。[5]
校准程序的总体框架如图2所示。
最顶层的主程序通过调度仪器控制模块控制仪器,读取测量数据并对数据进行分析处理,得出校准数据并以此校准RF模块仪器。主程序同时也负责提供用户交户界面。
IVI架构的核心部分是对于标准仪器进行控制的部分。为了实现仪器的可互换性,校准主程序不是直接调用每个仪器的驱动程序,而是调用IVI的类驱动程序。在使用IVI类驱动程序时,用户还需要在IVI配置工具(例如:NI MAX)中指定所使用的具体仪器的型号[5]。IVI类驱动程序根据用户的配置再调用具体的仪器驱动程序。当用户换用其他型号的标准仪器时,已经编写好的校准程序本身不需要做任何改动,只需在IVI配置工具中选择新仪器的型号即可令校准程序具有新仪器的校准功能。
通常,仪器厂商会提供用于控制被校准模块仪器的仪器驱动和校准的软件接口。例如,我们所使用的PXI-5600的驱动和校准接口是由NI RFSA中提供的。[4]
编程所使用的语言为LabVIEW[1]。在校准过程中所需的标准仪器和被校准仪器都具有LabVIEW版本的驱动程序。并且LabVIEW的图形化编程特性可以大大缩短校准软件的开发时间。在项目前期调研过程中,经测试,使用LabVIEW作为本项目的开发语言开发时间仅为使用VC++或VB开发时间的20%。
校准程序主程序
RF模块仪器校准驱动
IVI类驱动程序
功率计、频谱仪、RF信号发生器
仪器驱动程序
功率计、频谱仪、RF信号发生器
RF模块仪器
标准仪器
功率计、频谱仪、RF信号发生器
图2: 软件系统结构

图3: 校准PXI-5600内部时钟的LabVIEW程序

参考文献:

    [1] National Instruments,LabVIEW Advanced Course [M]. US. 2003.
    [2] National Instruments,Calibration Executive Manual [M]. US. 2005.
    [3] National Instruments,NI PXI-5600 Specification [M]. US. 2005.
    [4] National Instruments,NI RFSA Manual [M]. US. 2005.
    [5] IVI Foundation,IVI Specifications [M]. US. 2002.
    [6] 可互换虚拟仪器驱动程序的开发,阮奇桢. 2006.
    [7] 其它相关技术文章
 
 
 

Gloria写的一篇小文

    今天跟朋友去吃素了,慕名找到了“早吃素”的枣子树。刚拐到嵩山路上就把吃素的心情和意境破坏了。周围乱糟糟闹哄哄的环境真的跟网上介绍的格调大不相符,虽然枣子树自己门前的布局还算雅致。排了一会儿队终于坐进了餐馆里,不知道是因为期望过高呢还是怎么的,就是感觉不太好。店里面黑黑的,吵吵的,找不到一点吃素的感觉;尤其是还遇到了一个有点智障的服务员,光是点菜就折腾了我们半天。不是我故意找茬啊,且不说写字跟不上吧,明明是要无锡酱排,她偏偏说是黑椒醋排,而且前前后后重复了三遍;好不容易点完菜了,刚想清静一会儿,谁知道那服务生扭过头又来问,“要点菜吗?”旁边有个知趣的服务员朝我们略带歉意的无可奈何的笑笑,算是给我们的安慰吧。
第一道菜也是这顿饭里最可口的一道了,素炒时蔬,就是一盘草头。其实这道菜不能算是有特色的菜了,因为它就是最最普通的蔬菜而已,任何一家店里都有的吃。不得不说的一句就是这家素菜馆之所以让我找不到吃素的感觉很大程度上是由于菜里的油实在是多,让人觉得很腻,像是吃了很多肉。
第二道菜就是最倒我们胃口的无锡酱排了。原以为肯定会有那么一点点排骨的味道吧,可万万没想到那竟然是一盘黑油油的糖醋藕,而且放足了糖和醋。只吃了一口我就顿时没了胃口。朋友也像我一样哑然失笑。这菜名还不如写得实在一些。
    第三道菜叫做荷香豆腐,听起来很美,看上去很多,可实际上真是坑人,只有小小的一片豆腐,加了一些蘑菇之类的点缀,关键还是太油腻!
    还点了一道点心叫做综合水饺,就是两种混在一起的饺子了。看上去还挺赏心悦目的,白白的几个,绿绿的几个,但吃起来还是一样的腻。勉强压抑了胃部不适的感觉,吞下了最后一口,便匆匆离开了这个让我不想回头的地方。
    对比起来还是觉得普罗旺斯的树好多了。

LabVIEW 黑白棋程序

今天因为工作需要,察看了我原来备份的一些文件。
结果我翻出来了好多已经被我遗忘了的东西,都拿来跟大家分享吧,也作为一个纪念。
 
先分享一个 LabVIEW 下黑白棋的程序。这不是我说过的使用遗传算法的那个程序。
这是我刚开始学习 LabVIEW 时编写的程序。那时还是1999年,使用的是LabVIEW 5.1。
程序里基本只有界面,没有实现什么算法。
 
程序在LabVIEW 5.1上开发之后,我再也没有再维护过。我今天在LabVIEW 8.1 上试着打开它,发现以前所使用的一些库VI已经找不到了,不过只影响到了Othello server.vi。其他VI还可以正常运行。
 
 
解开zip包:
Othello.vi             是在本机两人对战的主VI
Othello auto.vi   或 Othello super.vi  是人机对战的主VI
Othello server.vi   是在局域网两人对战的服务端VI
Othello client.vi   是在局域网两人对战的客户端VI
 
 
相关文章: