Labview-测量-仪器控制

图床:labview-img/
参考笔记

Labview小知识

  1. labview的特点,图形编程,并行性运行,基于数据流。
  2. 白底的是程序框图面板(后面板),另一个是前面板(带网格),Ctrl + E可以切换到程序框图面板。
  3. 输入控件(比如numeric control)和显示控件都在前面板。
  4. 对于后面板的图标,右键visible item可以选择label,即可显示对应的文字说明
  5. 对于断了的线,用Ctrl + B。
  6. 将常用函数添加入收藏夹favorites,比如说点击instrument I/O,然后选择VISA,再点击大头针,然后可以右键,add item to  favorites。
  7. 即时帮助功能,先单击右上角的问好,然后单/双击你需要帮助的图标。
  8. 不同颜色、宽度的线条的含义,如果忘记了,可以先点击右上角的帮助,然后将鼠标放在需要了解的线上(不用点击)即可知道是什么类型的线(什么类型的数据流)
  9. 复制功能,Ctrl选中然后拖动即可复制。
  10. 鼠标选中,然后点击小扫把,可以整理图标;如果觉得图标太大了可以右键-view as icon。
  11. 数据的引用,以numeric control为例子,在程序框图面板处点击该控件,然后右键creat-property node – value即可。
  12. 局部变量(小房子图标)和全局变量:局部变量和全局变量是LabVIEW用来传递数据的工具。LabVIEW编程是一种数据流编程,它是通过连线来传递数据的。但是,在很多情况下需要在同一VI的不同位置或在不同的VI中访问同一个控件对象,这时控件对象之间的连线就无法实现。这时候我们就需要用到局部变量或全局变量,通过局部变量或全局变量你可以在程序框图中的多个地方读写同一个控件。 局部变量:只能在同一个VI中使用的变量。
    创建局部变量的方法有两种: (1)直接为前面板对象创建局部变量,右击创建 (2)通过函数选板创建局部变量 ,此在编程-结构中找。
    注意:局部变量具有读、写两种属性 ,应用时要注意切换成不同属性。
    局部变量的特点:(1)局部变量只能在同一个VI中使用,其生存期与它所在的VI模块密切相关,VI停止运行,在此VI内定义的局部变量自动消失。 (2)局部变量必须依附在一个前面板对象上。一个前面板对象可以建立多个局部变量,但一个局部变量只能有一个端点与其对应。 (3)局部变量就是其相应前面板对象的一个数据拷贝,要占用一定的内存。
    参考:局域变量、全局变量和功能型全局变量
  13. labview 移位寄存器、隧道、索引隧道的区别
  14. 子VI的引用和图标修改,将子VI放在同一个文件夹中,直接拖动到新的VI中即可,要修改图标的,直接点击右上角的图标进行绘图(涂鸦)。
  15. 数组(array)的简单操作,
    (a) 程序框图面板,右键array constant,空的会报错,因为没有内容的定义类型,然后可以创建一个数字/字符串常量,放到数组里面,即可横着拉或者竖着拉,但都是一维数组。想要二维数组,就将左侧的图标往下拉成两个(上面一个是行索引,下面的一个是列索引,索引都从0开始),然后图标右下拉即可拉出二维数组。
    (b) 后面板,选择数组array,也会报错,因为里面没有元素,比如可以放入一个输入控件(Numeric control),然后即可拉动出数组,二维的方法和上面的类似。注:数组:相同类型的数据类型元素组成的新的数据类型。簇:相同的或者不同的数据类型的元素组成的新的数据类型
  16. 排错功能高亮显示,点击灯泡图标,然后就可以缓慢运行,可以看到数据流的传输和变化
  17. Error in和out这是LabVEIW错误处理的一种方式,其实就是error in和error out两个簇,只是名称取成这样。在LabVIEW中使用这两个子VI,是为了将底层发生的错误信息原封不动地传递到顶层VI,利用error in 和error out 这两个预定义簇来作为错误信息的载体。当error in携带有错误信息时,对应的函数就会不做任何操作,直接将错误传递给error out 输出。(参考:百度知道)
  18. 程序禁用结构,相当于标注起来了,这一部分到时候不会运行。
  19. 巧用对话框图,可以实现简单交互
  20. 计算1+2+3+……+100的两种方法:
    (a) for循环的移位寄存器
    (b) 反馈节点,Move initializer loop out,可以显示每次迭代结果
  21. 三种方法计算y = ax2+ bx +c
    (a) 复合运算
  22. 构建一个3×3的二维随机数组,右键下图的连接处tunnel mode可以选择last value/index/concatenating。
  23. 四种程序结构

    (1) For 循环/While 循环/条件结构/事件结构
    (2) 无论是 for 循环还是while循环,都给出了循环次数i(变量),但是for循环还给出了终止的值N,而while循环给的是条件判断(如果为F,就一直执行下去,只有是T才会停止然后跳出循环)。
    (3) 条件结构,同一个布尔元件只能有一个后面板,条件不一定是“真”和“假”,可以是任意内容,比如我们之前labview和arduino之间通信就是看你输入的字母是什么才决定执行什么指令。必须要设定某一个值为default。
    (4) 事件结构,需要外界触发,比如OK button,不同的触发才能执行各种不同的事件。有点类似条件结构。不给timeout赋值的话,一直在等待,等待有一个事件才运行,产生新的事件,创建常量-1的话,一直在等待,如果是100,则100ms没检测到事件,那么事件就运行结束了
    (5) for循环中途停止,选中for循环,右键 – conditional terminal(条件接线端)

  24. 字符串
    (1) 字符串匹配,匹配用到的是offset past match为-1的话就是没有匹配到
  25. 文本的写入和读取,主要涉及文件I/O的内容
    (1) 首先是点击文件I/O中的write text file,然后有两种方式确定文件的路径,一个是先在文件夹A中创建一个xx.txt,然后在write text file左侧创建一个control,那么程序运行之前需要在后面板导入xx.txt所在的位置,也可以在write text file左侧创建一constant的路径。第二种方法,不用预先存在一个txt文件,而是直接在VI所在的目录生成一个新的txt文件,选择build path(其左侧的base path选择file I/O – file constants – application directory),然后接到write text file,而write text file可以在左侧确定新生成的txt文件名以及默认保存的目录(file I/O – file constants – application directory)
    (2)下图是write text file的两种状态,勾选conert EOL之后就会自动换行。

    (3) 不能一边写一边读,所以都是先写完,然后再读取,这就要选择flat sequence structure,另外对于文件I/O中的read from file,可以选择read lines和convert EOL,来变化显示效果。
    (4) 写入进去,重新存储的话,会覆盖原来的文件内容。这里可以用open/creat/replace file命令,如果该文件存在就直接在原来基础上写,文件不存在就直接创建新的。
    实例:VI可以多次运行,产生的数据存储到同一个txt中,不得把上次存储的数据清除。
  26. 暂时用不上的
    (a) 界面美化
    (b) 图片下拉类表框

 

 

仪器控制小知识

  1.  USB6002数据采集卡 数据采集卡的作用是将模拟信号(analog signal)变成数字信号(Digital signal)。
  2. PT100/1000 温度传感器 是一种将温度变量转换为可传送的标准化输出信号的仪表。主要用于工业过程的温度参数的测量和控制。 PT100热电阻的温度与阻值变化关系,人们便利用它的这一特性,发明并生产了PT100热电阻温度传感器。温度的采集范围可以在-200℃~+850℃。温度越高,电阻越大。
  3. 模拟信号和数字信号的转换,看视频
  4. 为什么需要4-20 mA电流来传输信号?
    答:工业上普遍需要测量各类非电物理量,比如温度、压力、速度、角度,这些都需要转换成模拟量电信号才能传输到几百秒外的控制室或者显示设备上。工业上最防范采用的是4-20 mA电流来传输模拟量。
    (a) 采用电流信号的原因是不容易受到干扰,因为工业现场的噪声电压可能达到数个V,但是噪声功率很弱,所以噪声电流通常小于nA级别,因此给4-20 mA传输带来的误差非常小;电流源内阻无穷大,导线电阻串联在回路中,不影响精度,因此在普通双绞线上可以传输数百米。
    (b) 由于电流源的大内阻和恒流输出,在接收端我们只需要放置一个250欧姆的电阻到地的电阻就可以获得0-5V的电压,低输入阻抗的接收器的好处是nA级的输入电流噪声只产生非常微弱的电压噪声。
    (c) 上线取20mA是因为防爆的要求:20mA的电流通断引起的火花能量不足以引燃瓦斯。下限没有取0mA的原因是为了能检测断线:正常工作时不会低于4mA,当传输线因故障断路,环路电流降为0。常取2mA作为断线报警值。
  5. 工业测量用的电源是什么?
    答:是恒流源(电流恒定),随着现代技术的发展,恒定电流源的应用将十分重要,如机器人、工业自动化、卫星通信、电力通讯、智能化仪器仪表以及其它数字控制等方面都迫切需要应用恒定电流器件,因此,研究和开发恒流器件具有十分重要的意义。
  6. 恒流电源什么时候才能实现恒流输出?
    答:如果负载电阻太大,使电源输出电流不能达到恒流值,那么恒流源的输出电压就会自动升到电源的最大输出电压,只有当负载电阻小到一定的程度,使电源输出电流达到恒流值,电源才真正处于恒流工作状态,随着负载电阻值的逐步减小,输出电压也按规律下降,以保持输出电流的恒定不变。这就是恒流的概念。
  7. TTL是什么?
    答:Transistor-Transistor Logic,TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑”1″,0V等价于逻辑”0″,这被称做TTL(晶体管-晶体管逻辑电平)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。
    电平是个电压范围,规定输出高电平>2.4V,输出低电平<0.4V。在室温下,一般输出高电平是3.5V,输出低电平是0.2V。最小输入高电平和低电平:输入高电平>=2.0V,输入低电平<=0.8V,噪声容限是0.4V。
    电平即”电压平台”,指的是电路中某一点电压的高低状态,在数字电路中常用高电平和低电平分别表示”1”或”0”(也可以是”0”或”1”).电平的高低是个相对概念,3V对于7V是低电平,但对于1V就是高电平。
    脉冲指电子电路中的电平状态突变,既可以是突然升高(脉冲的上升沿),也可以是突然降低(脉冲的下降沿).一般脉冲在电平突变后,又会在很短的时间内恢复原来的电平状态。
    TTL电路的速度快,传输延迟时间短(5-10纳秒),但是功耗大。
  8. TTL如何利用三极管来实现?
    答:参见笔记MIT-电路和电子学
  9. TTL和CMOS的对比?
    答:与TTL分庭抗礼的是CMOS,旧时两者相比较TTL主要是速度快,CMOS则是速度慢,但省电、成本比TTL低。随着CMOS技术的进步,其反应速度已经超越TTL。而且CMOS内部不具有制作麻烦的电阻,所以TTL可说几乎没有发展。目前TTL主要应用于教育或是较简单的数字电路。
  10. 什么是双绞线?
    答:双绞线(twisted pair,TP)是一种综合布线工程中最常用的传输介质,是由两根具有绝缘保护层的铜导线组成的。把两根绝缘的铜导线按一定密度互相绞在一起,每一根导线在传输中辐射出来的电波会被另一根线上发出的电波抵消,有效降低信号干扰的程度。 双绞线一般由两根22~26号绝缘铜导线相互缠绕而成,“双绞线”的名字也是由此而来。实际使用时,双绞线是由多对双绞线一起包在一个绝缘电缆套管里的。如果把一对或多对双绞线放在一个绝缘套管中便成了双绞线电缆,但日常生活中一般把“双绞线电缆”直接称为“双绞线”。 与其他传输介质相比,双绞线在传输距离,信道宽度和数据传输速度等方面均受到一定限制,但价格较为低廉。
  11. 对于串口通信来说,最麻烦的就是数据转换,最常见的,就是 16 进制转 10 进制,浮 点数转 16 进制,10 进制转 16 进制。还有正常显示的 16 进制到 HEX 显示的字符串转换的。
  12. VISA:是Virtual Instrument Software Architecture的缩写,是仪器编程的标准I/O API(应用程序接口)。 VISA可以控制GPIB、串口、USB、以太网、PXI或VXI仪器,并根据使用仪器的类型调用相应的驱动程序,用户无需学习各种仪器的通信协议。VISA独立于操作系统、总线和编程环境。换言之,无论使用何种设备、操作系统和编程语言,均使用相同的API。
  13. Labview和python自动化测量的差异:南京大学赵清源-课题组-PPT

 

 

labview仪器控制具体内容

参考资料:《 小草手把手教你 LabVIEW 串口仪器控制

  1. 串口调试助手(CM精装版),下载地址
  2. labview仪器控制的好处:
    (a) labview的VISA是一种虚拟架构,无论你用的是什么通讯协议或者接口,都可以用VISA调用;
    (b) 不需要进制转换
  3. 查看COM串口:右键我的电脑(此电脑) — 管理 — 系统工具 — 设备管理器 — 端口
    注:端口可能被隐藏起来了,这时候用点击查看 —  显示隐藏设备
  4. 常用的四个VISA函数:VISA配置串口,VISA写入,VISA读取,VISA关闭。

 

Labview实例

实例1:labview + arduino控制板子上的LED(默认引脚)的开关:

对应的arduino程序为

int comData;     //定义从串口接收过来的数据

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);       //初始化串口,波特率设置为9600
  pinMode(LED_BUILTIN, OUTPUT);     //设置数字引脚为输出模式
}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() )   //检测串口缓冲区是否有数据
  {   
    comData = Serial.read();    
    if (comData == '1')        //接收到该命令,则执行关灯
    {
      digitalWrite(LED_BUILTIN, LOW);
      Serial.write('1');
    }
    if (comData == '0')        //接收到该命令,则执行开灯
    {
      digitalWrite(LED_BUILTIN, HIGH);
    }
  }
}

说明:接通之后,单击button virtual那么右侧的LED virtual和板子上的LED都会变点亮,再次单击,就会熄灭。

改进-实例-1:我想通添加一个数组,将数据依次写入到arduino,控制板子上灯多次亮的时间长度,目前的问题是,数组的数据都是一次性传给arduino,执行完毕了,需要想想怎么修改。

改进-实例-1:另外,由于实验测试过程中,LED点亮的时长,对应于shutter打开的时长,我们这里可以直接固定该时长,然后arduino收到点亮的命令(比如字母”o”),那么就点亮LED,持续亮一段时间后,再关闭该LED,然后arduino给labview写入一个数据(比如字母”f”),那么labview就可以去执行下一个循环。(重要)

实例2:labview上位机 + arduino 下位机
实例1中,只是labview往arduino发送命令,并没有arduino向labview传递信息。这里展示的例子是labview和arduino之间“打电话”,而不是单向传输信息。(可以参考别人的视频)

上面的程序不能单独运行,因为必须要有下位机,这里我们用arduino作为下位机,其接收到的信息,又print出去,然后被上图的read 函数读取出来。arduino的程序如下:

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);       //初始化串口,波特率设置为9600
}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial.available() )   //检测串口缓冲区是否有数据
  {   
    char pos = Serial.read();    
    Serial.print(pos);
  }  }

实例3:labview控制ocean optics的光谱仪

参考视频-OmniDriver & LabVIEW Part 2,点击运行,然后点击run,然后设置积分时间。:

实例4整合步进电机+舵机+光谱仪(HR2000+)进行radio-photo-luminescence的测试

步进电机的初始化:先把步进电机转到完全挡住X射线源的位置,然后设置反转600步,即为测试的步进电机的初始位置。调试程序如下:

#include<Stepper.h>
// 这里设置步进电机旋转一圈是多少步(可以根据步进电机实际进行修改,28BYJ-48 八拍为64步,单四拍为32步)。
//根据您的步进电机参数修改。
#define STEPS 64
//设置步进电机的步数和引脚(就是注意点2里面说的驱动板上IN1~IN4连接的四个数字口)。
Stepper stepper(STEPS, 8, 10, 9, 11);
void setup()
{
// 以每分钟转速设置电机速度,此功能不会使电机转动,只是设置调用step()时的速度。
stepper.setSpeed(500);
// 初始化串口,用于调试输出信息
Serial.begin(9600);
}
void loop()
{
stepper.step(600); //4步模式下旋转一周用2048 步。8拍模式下旋转一周用4096步。
delay(500000);

}

舵机的初始化:将舵机设定到90的位置,然后正好挡住LED光源,然后0的位置是没有挡住光源的地方。调试程序如下:

#include <Servo.h>
 
#define PIN_SERVO 6
Servo myservo;
 
void setup()
{
  myservo.attach(PIN_SERVO);
}
 
void loop()
{
  myservo.write(0);  // 0对应于舵机没有挡住的情况,有UV
  delay(3000000);
  myservo.write(90);   // 90对应于舵机有挡住的情况,没有UV

  delay(100000);
}

调试完毕后的步骤:
(1) 启动交互的arduino程序,然后电机会逆时针转动300步。

#include<Stepper.h>
// 这里设置步进电机旋转一圈是多少步(可以根据步进电机实际进行修改,28BYJ-48 八拍为64步,单四拍为32步)。
//根据您的步进电机参数修改。
#define STEPS 64
//设置步进电机的步数和引脚(就是注意点2里面说的驱动板上IN1~IN4连接的四个数字口)。
Stepper stepper(STEPS, 8, 10, 9, 11);

#include <Servo.h>
#define PIN_SERVO 6   //设置舵机的引脚为6
Servo myservo;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);       //初始化串口,波特率设置为9600
  //Serial.setTimeout(50);
  stepper.setSpeed(500);  
  stepper.step(-300);   // 对应于电机转到挡住X射线,没有X射线
  myservo.write(90);    // 对应于舵机有挡住的情况,没有UV
  //delay(30000);
  Serial.write('s');
  myservo.attach(PIN_SERVO);
}

void loop() {

  // put your main code here, to run repeatedly:
  if(Serial.available()>0)   //检测串口缓冲区是否有数据
  {   
    char comdata=Serial.read();
    switch(comdata)  {
    case 'a':
    stepper.step(-300);   // 对应于Cu片挡住的情况,没有X射线
    myservo.write(0);     // 对应于舵机没挡住的情况,有UV
    delay(5000);          //  单次 PL测试需要的时间,完成一次PL测试(第二到第n次)。
    myservo.write(90);    // 对应于舵机有挡住的情况,没有UV
    Serial.write('d');        //  告诉labview命令执行完毕。
    stepper.step(300);    // 对应于没挡住的情况(回到有X射线),

    break;

    case 'c':   // void setup() 中只执行一次给labview写入s,labview等待一段时间(数组第一个数)后(开启XRD),labview给arduino写入c
    myservo.write(0); //  对应于舵机没有挡住的情况,有UV
    delay(5000);     // 程序第一次开始PL
    myservo.write(90);  // 对应于舵机有挡住的情况,没有UV
    stepper.step(300);  //对应于Cu片没有挡住的位置,有X射线
    Serial.write('d');  // 告诉labview,第一次PL测试执行完毕
    break;
}  
  }
}

(2) 启动labview程序并进行如下的设置:(a) 积分时间设定为2秒。 (b) 选择arduino对应的com端口。 (c) 导入辐照时间的txt程序。 (d) 给保存数据的txt起一个名字。

(3) 点击labview的run,然后点击START/PAUSE for Spectrometer,即可开始测试。首先会等待一定时间(由辐照.txt决定),这个时候可以启动X射线源,然后舵机会打开,测试没有辐照的第一个光谱数据,测完后舵机挡住LED,然后挡住X射线的步进电机打开,让X射线辐照。

Leave a Reply