LabVIEW里怎么边送模拟数据边操作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LabVIEW里怎么边送模拟数据边操作?相关的知识,希望对你有一定的参考价值。

我设计了一个LabVIEW程序里面可以画趋势图,输出xls,我现在要加一个自己通过随机数模拟的信号输入,用while套在事件结构里后运行发现模拟信号时送出来了,但程序进死循环了,除了送信号其他功能按键无法使用了。
希望哪位大侠能告诉我一边产生模拟数据,同时能实时的对数据进行操作的方法,非常感谢!!!

事件结构里面是绝对不能放循环的,这个会导致前面板锁死 不再相应任何事件。
如果一定要用事件结构和循环的话,试试按照 生产者-消费者模式(事件) 模板的方式来做。

你的程序修改下就可以了。
在 文件->新建->基于模板->设计模式 里可以看到。追问

按照你说的,我在生产者的while里放了个条件结构来产生数据,数据是产生了,但是停下一次后再运行就不再产生数据了,其它功能正常。高亮检验时发现外部的输入判断是TRUE没错,但循环不进行,必须将vi关闭再开后才有反应,这是什么原因?莫非我的机子的问题?

追答

事件结构的生产者循环是产生事件队列用的。 你的采集数据部分应该放在消费者循环里面。
不是有响应事件么? 当事件分支被激活的时候,是可以继续采集数据的。

追问

抱歉编程的问题,我用了开关的局部变量来控制数据发送的开始却没注意要在开始前初始化那个开关 问题已解决,非常感谢

参考技术A 可以用labview的生产者/消费者 设置模式框架编写。

生产者循环实时产生模拟数据,消费者循环进行数据处理;两者是通过Queue队列进行通讯的。功能键可以放在消费者循环中。追问

按照你说的,我在生产者的while里放了个条件结构来产生数据,数据是产生了,但是停下一次后再运行就不再产生数据了,其它功能正常。高亮检验时发现外部的输入判断是TRUE没错,但循环不进行,必须将vi关闭再开后才有反应,这是什么原因?莫非我的机子的问题?

LabVIEW控制Arduino采集多路模拟量数字量(进阶篇—1)

目录

1、项目概述

2、项目架构

3、硬件环境

4、Arduino功能设计

5、LabVIEW功能设计

5.1、前面板设计

5.2、程序框图设计


1、项目概述

数据采集,是指从传感器和其他待测设备的模拟和数字被测单元中自动采集信息的过程。能够实现数据采集功能的系统叫作数据采集系统。

数据采集系统的任务,就是将传感器输出的信号转换成计算机能识别的信号并送入计算机进行处理,然后将处理得到的数据进行显示或打印,以便实现对某些物理量的监测,其中一些参数还会被计算机控制系统用于计算输出的控制量,以实现将某些物理量的控制在某一水平。

Arduino控制器均具有模拟输入功能,Uno拥有6路模拟输入端口(A0到A5),每一路具有10位的分辨率(即输入有1024个不同值),默认输入信号范围为0到5V,并且可以通过AREF调整参考电压。

2、项目架构

采用Arduino Uno与LabVIEW来实现低成本上下位机数据采集系统,具有模拟量和数字量两种采集功能,可以满足低速、低成本的数据采集需求。其中,Arduino Uno作为下位机,负责A/D转换以及数据传输,LabVIEW编写的数据采集软件作为上位机,上下位机通过USB-TTL接口实现通信。如下图所示为多路数据采集系统框图。

项目资源下载请参见:LabVIEW控制Arduino采集多路模拟量、数字量-单片机文档类资源

3、硬件环境

数据采集系统中的Arduino下位机部分采用Arduino Uno控制器,模拟量采用电位器分压来实现不同电压值,数字量采用拨动开关在5V和GND之间切换实现高电平与低电平。多路数据采集系统硬件连接如下图所示:

​4、Arduino功能设计

Arduino下位机部分需要完成两个功能:数据采集和数据传输,Arduino Uno控制板通过USB-TTL电缆接收上位机发来的命令,完成相应的数据采集,并将采集的数据回传至LabVIEW上位机软件。

数据采集分为模拟量采集和数字量采集两种,此处设置采集路数各为2路,分别采用Arduino Uno控制器上具有模拟量输入的管脚A0、A1和具有数字量输入的管脚2、3。

Arduino Uno控制器负责读取LabVIEW上位机发来的采集命令,并采集相应的数据,通过串口发送回上位机LabVIEW软件。Arduino Uno控制器的程序代码如代码如下所示:

#define A0_Command  0x10   //A0采集命令字
#define A1_Command  0x11   //A1采集命令字
#define D0_Command  0x20   //D0采集命令字
#define D1_Command  0x21   //D1采集命令字
 
byte comdata[3]=0;      //定义数组数据,存放串口接收数据
 
int AD_Value=0;          //AD转换后的数字量
float float_AD_Value;    //数字量换算成浮点电压量
int D_Value=0;           //数字量测量的数据
 
void receive_data(void);      //接受串口数据
void test_do_data(void);         //测试串口数据是否正确,并更新数据
 
void setup()

  Serial.begin(9600);      
  pinMode(2, INPUT);
  pinMode(3, INPUT);

void loop()

  while (Serial.available() > 0)   //不断检测串口是否有数据
   
        receive_data();            //接受串口数据
        test_do_data();               //测试数据是否正确并更新标志位
   

void receive_data(void)       

   int i ;
   for(i=0;i<3;i++)
   
      comdata[i] =Serial.read();
      //延时一会,让串口缓存准备好下一个字节,不延时可能会导致数据丢失,
       delay(2);
   

 
void test_do_data(void)

  if(comdata[0] == 0x55)            //0x55和0xAA均为判断是否为有效命令
   
     if(comdata[1] == 0xAA)
     
        switch(comdata[2])
             
            case A0_Command:   
                 AD_Value = analogRead(A0);                 //读取A0电压值
                 float_AD_Value=(float)AD_Value/1023*5.00;  //换算为浮点电压值
                 Serial.println(float_AD_Value,2);          //保留两位小数发送数据                       
                 break;
            case A1_Command:   
                 AD_Value = analogRead(A1);                 //读取A0电压值
                 float_AD_Value=(float)AD_Value/1023*5.00;  //换算为浮点电压值
                 Serial.println(float_AD_Value,2);          //保留两位小数发送数据                       
                 break;
            case D0_Command:   
                 D_Value = digitalRead(2);                  //读取D2数字量
                 Serial.println(D_Value);                  //发送数字量测量数据                    
                 break;
            case D1_Command:   
                 D_Value = digitalRead(3);                  //读取D2数字量
                 Serial.println(D_Value);                  //发送数字量测量数据                     
                 break;               
          
       
   

5、LabVIEW功能设计

LabVIEW上位机部分需要完成两个功能:向下位机发送命令帧和将数据显示在前面板上,Arduino Uno控制板通过串口接收上位机命令,完成相应的数据采集,并将数据回传至上位机。

数据采集分为模拟量采集和数字量采集,设置采集路数各为2路,分别采用ArduinoUno上具有模拟量输入的管脚A0、A1和具有数字量输入的管脚2、3来实现。模拟量采用电位器分压来实现不同电压值,数字量采用拨动开关在5V和GND之间切换实现高电平与低电平。

5.1、前面板设计

LabVIEW前面板分为模拟量采集和数字量采集两个部分,模拟量采集部分主要针对模拟量输出的传感器,数字量采集部分主要针对数字量的输入。

LabVIEW上位机前面板设计如下图所示:

​5.2、程序框图设计

由于有2路模拟量和2路数字量,不同通道的模拟量或数字量的发送数据帧中,通道号不同,数字量与模拟量采集的发送数据帧中,命令号不同。发送数据帧中,具体的命令号和通道号可以自定义,此处模拟量通道0的采集命令为0x55AA10,模拟量通道1的采集命令为0x55AA11,数字量通道0的采集命令为0x55AA20,数字量通道1的采集命令为0x55AA21。

LabVIEW上位机程序框图如下所示:

Arduino Uno上的模拟输入拥有10位的分辨率,可以满足一般的数据采集的需求同时可以更改参考电压来提高最小分辨率。

对于高精度的应用,需要外部扩展高分辨率的ADC(模数转换器)和高精度的电压基准源。

对于连续数据采集的应用,可以采用LabVIEW Interface for Arduino函数库中的模拟采样库中的Get Finite Analog Sample函数节点来实现。

对于远距离的数据采集的应用,可以采用RS-485总线、无线串口方式或网络方式实现。

项目资源下载请参见:LabVIEW控制Arduino采集多路模拟量、数字量-单片机文档类资源

以上是关于LabVIEW里怎么边送模拟数据边操作?的主要内容,如果未能解决你的问题,请参考以下文章

LabVIEW控制Arduino实现模拟数据采集(基础篇—8)

LabVIEW控制Arduino实现模拟数据采集(基础篇—8)

LabVIEW控制Arduino采集多路模拟量数字量(进阶篇—1)

LabVIEW控制Arduino采集多路模拟量数字量(进阶篇—1)

LabVIEW控制Arduino采集多路模拟量数字量(进阶篇—1)

LabVIEW - 如何在数组中累积数据?