LabVIEW学习笔记(2)

您所在的位置:网站首页 labview实现数据采集 LabVIEW学习笔记(2)

LabVIEW学习笔记(2)

2023-11-09 15:10| 来源: 网络整理| 查看: 265

前言

这几天用LabVIEW给师兄的液压缸试验台做了一套上位机,设计模式借鉴了LabVIEW例程中的连续采集和测量,软件,硬件方面都学到了很多东西。硬件方面:运动控制卡的API,各种数据采集(编码器,电压),信号发生器(硬件条件限制,只能单点输出),转换时钟和采样时钟的区别。软件方面,多循环并行的设计模式,循环状态,文件IO(文件路径名[:]),使用用户事件停止程序,队前插入元素(如果插入数组要注意数组顺序,等等)

1.试验台组成

这次做的液压缸试验台主要由伺服电机,丝杠和液压缸组成,丝杠上的工作台连接到液压缸上,工作台往复运动,来检测液压缸的工作情况。液压缸不在实验室,所以没有安装。传感器有扭矩传感器,直线光栅尺,分别用来检测扭矩和位移,实物大概和下图差不多。除此之外,还有伺服驱动器,控制电机的运动控制卡和采集传感器信号的数据采集卡和计数器卡,和一个模拟量输出卡(当电机处于力矩模式下,用来给伺服驱动器发送模拟电压),以及各种接线端子和限位开关。数据采集卡和运动控制卡都选择了研华的产品,研华提供了运动控制卡和数据采集卡Labview驱动的和相关的VI,在LabVIEW可以方便的调用。 图片摘自《LabVIEW案例实战》

2.程序框架

程序框架使用了LabVIEW多循环程序框架,参考借鉴了LabVIEW中自带的项目例子:连续采集和测量。主要就是用户事件处理器+消息队列状态机组成。用户界面处理器接收前面板上的用户操作,根据用户不同的操作,将命令发送至主状态机,主状态机再根据用户的操作,将具体命令发送至各个功能模块。共有以下几个功能模块:电机状态监测,电机运动,AO模拟电压发送,数据采集(光栅尺和扭矩),数据记录五个部分。程序在运行时给各个模块发送初始化的命令,完成初始化操作。

2.1 电机部分

这一部分主要包括电机状态检测,电机运动两个模块。除此之外还有一小部分,功能是打开设备(DevOpen),打开轴(AxOpen),然后向电机状态监测和电机运动提供设备和轴的引用。我将这一小部分封装成一个子VI。 一些题外话:)刚开始没有电机状态检测这一模块的,后来考虑到电机处于运动状态(HOME或START时)时,用户只能按下STOP或者EXIT,其他按钮应该禁用,所以加了一个电机状态检测来实现此功能。分成三部分也受研华给的例程的启发,例程中就是打开设备,轴,放在一个CASE中,状态监测放到一个定时结构中,控制电机运动放到另一个循环中。 电机检测模块流程:

打开设备Dev 打开轴Ax 初始化Initialize 监测轴状态 退出Exit

打开设备(Dev),轴(Ax),初始化(Initialize),一直检测轴状态(GetState),如果轴状态为Ready或Stopping,则启用控件,否则禁用并变灰,直到接收到Exit命令。 电机运动模块:

打开设备Dev 打开轴Ax 初始化Initialize 接收命令 清除错误 关闭轴Ax设备Dev伺服SV 退出Exit

流程与上面相似,打开设备(Dev),轴(Ax),初始化(Initialize),设置参数(ParaSet),然后就是各种命令了,包括原点(Home),往复运动(Start),停止(Stop)等等,因为这个运动控制卡还有数字IO输出的功能,所以用这个数字IO来控制电机的动作模式:力矩/位置,最后就是退出Exit,退出前要执行清理错误(CLEARERROR),关闭轴(AXCLOSE),关闭伺服(SVOFF)。 最后Exit中都会清除队列。

2.2 AO模拟电压发送

这一部分主要用来给伺服驱动器发送模拟电压,通过电压的不同来控制伺服电机力矩模式下的力矩大小。 程序流程:

初始化Initialize 开始Start 输出OUTPUT 停止Stop 退出Exit

初始化Initialize,【开始Start(创建虚拟通道)→输出OUTPUT】,停止Stop,退出Exit。开始后就下发输出命令,这两个命令是连着的。 输出波形由于硬件只能单点输出,不能波形输出,所以用单点+循环次数i模拟了出几个波形的幅值,然后发送给伺服驱动器。

2.3 数据采集

数据采集部分采集光栅尺和扭矩传感器接收到的物理量。开始的时候将采集光栅尺和扭矩传感器放到了两个循环中,后来,考虑到这两个传感器采样率相同,流程也基本相同,又放到了一个循环里。 程序流程和AO输出一样:

初始化Initialize 开始Start 读取Read 停止Stop 退出Exit

同样,创建虚拟通道和读取Read的命令是连在一起的。 在数据采集和AO模拟电压发送的时候,都使用了开始任务VI,如果不使用开始任务,直接使用读取或者写入VI,读取或者写入VI在工作签会自动开始任务,这样每次循环都开始一次任务,影响系统性能。

2.4 数据记录

将采集到的值记录到文件中,主要用了文件操作,字符串,定时中的几个函数,流程与上面类似,(其实各子模块的流程都类似,数据采集,数据记录,AO电压这三个流程几乎一模一样)。 这个模块中遇到了问题就是:无法进入退出Exit状态,最后还是在QQ群中高手给了回复,在此循环中设置了一个定时,比数据采集循环中的定时稍微慢了一点,就进入了退出循环,具体机制仍然不了解,如果有网友知道欢迎讨论。 最后注意的要点就是,结束任务的时候要把所有数据清除队列,然后保存至文件中。

2.5 其他

这个项目的程序主要参考的是自带范例:连续测量和记录。其中有一些要点值得注意,我目前学习到的有:

在子模块中加一个CASE结构来判断程序的状态,是空闲(IDLE)还是工作(比如LOGGING),如果空闲,则进入状态,如果工作,则略过此状态,在程序开始时初始化状态为(IDLE),在进入工作时将状态改为(LONGGING),这样做可以避免重复操作,(比如一直按DAQ)可能产生的程序错误。使用用户事件退出。这种方法为什么好,还得在后面的实践中体会(如果有机会的话)。使用队前插入消息的时候要注意消息数组插入的顺序和元素入队列正好相反。目前程序中用的都是先清除消息,再插入命令,这也是某位QQ群里的群主推荐的方法,虽然我还没觉得好到哪去。。在设置文件路径的时候,试了几个名字,都出现非法路径的错误,今天看书看到,文件命名的时候,文件路径名中不要出现这四个符号,因为他们是文件路径的定界符[:]。(LabVIEW大学实用教程)与程序无关,在使用研华的DAQNavi时,接触到了转换时钟这一概念,最后在NI官网上找到了答案采样时钟和转换时钟的区别,主要就是因为采集卡里面的各通道共用一个ADC,故转换时钟频率应远远大于采样时钟,转换的说的也是AD转换。 3. 下一篇

今天看完了LabVIEW大学实用教程,下一次整理一下这本书上的内容以及新学习到的一些知识点。和接下来的学习打算。有可能下一个项目不用LabVIEW了,学习可能要缓一缓,不过我还是想把这门语言学好。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3