ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LabVIEW新手入门:数据流编程、一维随机数组与仪器通信

LabVIEW新手入门:数据流编程、一维随机数组与仪器通信 第一次打开LabVIEW的人十有八九会愣住双击图标之后屏幕上弹出两个窗口一个叫前面板一个叫程序框图工具栏上一排按钮看着眼熟却说不上来干什么在空白处右键一下跳出来一个巨大的函数选板翻了半天不知道从哪儿下手。我当年也是这样盯着那个随机数图标看了五分钟不知道它该往哪儿放更不明白为什么线连上了还是灰的。这篇东西就是写给这个阶段的你——不管你是因为课程要求被迫上手还是要做仪器控制、数据采集、自动化测试只要你是第一次接触LabVIEW下面这些内容能帮你把最前面的那段弯路走直一点。我不会把帮助文档里的东西抄一遍那玩意儿你按F1就能看到。我打算按真实上手顺序讲先把脑子里那套写文本代码的习惯拆掉再处理安装和驱动这些地基问题然后手把手把一个能跑起来的一维随机数组VI做出来接着讲程序跑不动、电脑卡死的时候怎么查最后交代一下入门之后该往哪些方向走。每一节我都会说清楚为什么这么做因为LabVIEW这东西光记步骤是会忘的理解了它为什么长这样后面遇到新问题你才能自己推。1. 先拆掉写文本代码那套思维再往下走1.1 数据流执行到底和行顺序有什么不一样写惯了C、Python或者C#的人脑子里的执行模型是从上往下一行一行跑。LabVIEW不是这样。它判断一个节点该不该执行的唯一依据是这个节点的所有输入端子是不是都已经拿到数据了。拿到就跑跑完把结果从输出端子送出去送给下一个等着这份数据的节点。整套程序的推进靠的是数据在线上流动所以叫数据流编程。举个厨房里的例子。文本代码像是一张按顺序写的菜谱先切菜再热锅再下油。LabVIEW更像一个厨房里同时站着好几个人谁手上的原料备齐了谁就动手互相不用等。切菜的人不需要等烧水的人只要菜在他手上就行。这就带来一个很关键的结论——程序框图里那些没有数据依赖的分支是自动并行执行的不需要你开线程、写异步画出来它就这样跑。这个特性是LabVIEW在测控领域吃香的根本原因。你想想一个采集任务一路读温度、一路读电压、一路刷界面、一路存盘文本语言里你得费劲搞多线程和锁LabVIEW里就是四条线各画各的天然并行。但反过来说新手最常踩的坑也在这儿以为代码的左右位置决定了执行顺序把两个节点上下摆好就以为会先跑上面那个——不会只要没连线谁先谁后完全看调度甚至可能同时。1.2 前面板和程序框图谁是谁的脸和脑子LabVIEW的一个VIVirtual Instrument虚拟仪器固定包含两部分理解这两部分的分工比记住任何函数的位置都重要。前面板是给用户看的是脸。上面放的是输入控件旋钮、数值框、布尔开关、字符串框和显示控件波形图表、数值指示器、LED、表格。用户在这个界面上输入参数、看结果不关心里面怎么算的。程序框图是给自己看的是脑子。前面板上的每一个控件在程序框图里都会自动对应一个端子你把端子跟函数、结构连起来逻辑才成立。注意这句话控件不是变量它只是一个端子。文本语言里你可以声明一个变量然后到处用LabVIEW里你必须在框图上把线连过去数据才能流通。很多新手在前面板放了一堆控件跑到框图里发现它们孤零零地挂在那儿就是因为没连线。还有个很反直觉的点一个控件到底算输入还是输出是在前面板右键菜单里定的。同一个布尔控件做成开关就是输入做成指示灯就是显示。你要是把显示控件当输入控件用连线上会直接报错LabVIEW会用断开的箭头提示你——那根断线不是软件坏了是它在告诉你数据方向不对。1.3 新手几乎都会犯的三个认知错误第一个错误把LabVIEW当画图软件。线是可以随便画但每根线都有数据类型。数值型的线接不进字符串端子数组的线接不进单个数值端子LabVIEW会给你一根断线加一个红叉。这时候别急着删线重来把鼠标停在断线上错误提示会告诉你具体哪里不匹配。养成看断线提示的习惯比到处问人快得多。第二个错误认为运行一次和连续运行是一回事。工具栏上那个实心箭头是运行一次跑完就停旁边那个循环箭头的按钮是连续运行它会一遍遍重跑。做交互界面的时候你肯定要连续跑但如果循环里没加延时CPU能被它拉满风扇呼呼转笔记本烫手。这一点在第4节会展开讲。第三个错误以为关掉窗口程序就停了。LabVIEW的连续运行状态下你点窗口右上角那个叉有时候程序还在后台跑。正确的停法是前面板放一个停止按钮逻辑里接到循环的停止条件上跑完了自然退出。这个习惯从第一天就要养成不然后面做长时间采集任务的时候会吃大亏。2. 安装这件事比想象中更容易出岔子2.1 版本、位数和模块装之前先想清楚LabVIEW的版本节奏是每年一个年度版比如2020、2021、2023这种。新手常见的纠结是我该装哪个版本。我的建议是装你手头教程或同事用的那个版本版本差太远打开别人的VI可能提示要升级升级之后又回不去了。另外还有一个社区版功能上和基础版接近学习和非商业用途够用。位数上32位和64位要选一个。32位对老驱动和第三方库兼容性更好很多仪器厂商提供的LabVIEW驱动包在32位下装得最顺64位处理大数组、大图像时内存不受4GB限制。做视觉、做大数据量采集的选64位做仪器控制、跟着老项目走的选32位。两个可以共存但别在同一台机器上装得太乱卸载残留是后面很多怪问题的源头。模块方面基础安装包里其实已经把常用的东西带上了。真正需要额外装的主要是这几类NI-VISA仪器通信的核心几乎必装、NI-488.2走GPIB总线时要、NI-Serial走串口时要新版本已经整合进VISA、数据库连接、报表生成、视觉与图像处理、FPGA与实时模块。新手阶段装基础包加VISA就够用了别一上来全都勾上装一堆用不上的模块只会拖慢启动、增加出问题的面。2.2 安装报错的高频雷区和安装路径的讲究安装报错是搜得最多的关键词之一我按遇到的频率排一下现象常见原因处理方向安装程序启动就退包管理器组件缺失或版本太旧先单独装/更新包管理器再用它拉起主安装中途卡住或报依赖失败杀毒软件拦截写入临时关闭实时防护装完再打开提示已有旧版本之前卸载没清干净用官方卸载工具彻底清再重启安装装完打开提示缺少运行库.NET 或 VC 运行库版本不满足按提示补装对应运行库安装到一半蓝屏或重启驱动签名、系统补丁问题更新系统补丁关掉第三方系统优化工具安装路径这条单独拎出来说因为它引起的麻烦特别隐蔽。默认路径一般是在系统盘的 Program Files 下面建一个厂商目录这个默认值建议不要改。要改的话有两件事必须注意一是路径里绝对不能出现中文字符也不建议出现空格和特殊符号很多编译器和驱动在解析路径时对非 ASCII 字符处理得不好表现就是安装成功但运行时报找不到文件二是不要装到移动硬盘或网络盘上这类路径在系统重启后盘符可能变化导致一堆组件失联。我见过有人为了省C盘空间把软件装到D盘的某个中文名文件夹里结果驱动怎么都装不上折腾一下午才发现是路径的问题。2.3 第三方仪器驱动什么时候装、怎么装这里多说一句因为很多人卡在软件装好了但设备连不上。NI-VISA 是底层的通信抽象层串口、USB、GPIB、TCPIP 这些物理连接在上面统一成一套API。装完VISA你在系统里能用一个配置工具看到当前识别到的资源名形如ASRL3::INSTR串口、GPIB0::22::INSTRGPIB设备、USB0::0x...::INSTRUSB设备。资源名就是设备在LabVIEW里的身份证后面所有通信代码都靠它。如果用的是第三方厂商的仪器比如 Pico Technology 这类数据采集设备通常要装厂商自己的驱动和SDK装完之后它会在系统里放一套LabVIEW可以调用的VI库你直接把这些VI拖到自己的框图里用就行不需要从零写通信。而像源表、纳伏表这类支持SCPI命令的仪器即使没有现成的LabVIEW驱动包也可以只用VISA的读写函数把命令字符串发过去、把返回字符串读回来自己解析。这两条路都成立区别是有现成驱动就省事没驱动就自己写但更灵活。装驱动的顺序记住一条先装VISA再装厂商驱动反过来厂商驱动找不到底层库经常会装失败。3. 动手做第一个VI十个随机数装进一维数组3.1 新建VI和前面板该放什么理论讲够了上真家伙。热词里有个很典型的练习——产生一个包含10个随机数的一维数组这个例子麻雀虽小把循环、数组、显示、时序几个核心概念全占了特别适合做第一个上手项目。从菜单新建一个VI你会得到一个空白前面板加一个空白程序框图。先在前面板干活空白处右键打开控件选板找到数值分类拖一个波形图表出来注意是图表不是图形图表能滚动着显示历史数据图形是画一次就固定再拖一个数组容器出来往数组容器里塞一个数值显示控件这样你就得到一个能显示一维数组的指示器最后拖一个停止按钮布尔类型。这里有个新手一定会踩的坑数组指示器必须先放好再去连程序框图的线。因为数组的输出端子只有在前面板存在对应的数组容器时才存在你先连线再回来放控件会发现找不到目标端子。反过来的操作顺序在LabVIEW里非常多记住这个原则就行要在框图上用到的端子前面板先准备好。3.2 循环、随机数和自动索引这三件事怎么配合切到程序框图开始搭逻辑。整个逻辑用文字描述出来就是这样开始 For循环循环次数 N 10 循环体内 调用 随机数(0-1) 函数 输出连到循环边界的隧道上 隧道右键启用自动索引 For循环结束后 隧道输出 → 一维数组长度10 把数组送到前面板的数组指示器 把数组送到波形图表显示 While循环包裹整体可选 循环体末尾加 100ms 延时 停止按钮 → 循环停止条件 结束具体操作是这样右键空白处结构和函数选板里找For循环画一个框框左上角那个N端子右键创建一个常量填10这就是循环次数。在循环内部再右键数值分类里找到随机数(0-1)函数它没有输入端子只有一个输出端子每次执行吐出一个0到1之间的双精度浮点数。把这个输出连到For循环右边框上会形成一根穿过边界的线这个穿过的位置叫隧道。鼠标放到隧道上右键你会看到一个选项叫隧道模式选自动索引。这一步是整个例子的灵魂启用自动索引之后循环每转一圈产生一个元素转完10圈隧道输出的就自动攒成一个长度为10的一维数组。如果自动索引是关的隧道输出的只会是最后一次循环的那个数前面的全丢了。很多人做完发现数组里只有一个数基本都是这里没设对。接着把这个数组线连到前面板的数组指示器和波形图表上。到这儿逻辑就通了点运行数组指示器里应该整整齐齐地躺着10个0到1之间的小数。3.3 让它真的动起来时序和显示的两个细节只跑一次看不出什么东西我们要它连续刷新才能感受到LabVIEW那种实时界面的味道。做法是把刚搭好的这段整个塞进一个While循环里停止条件端子接前面板的停止按钮按钮的机械动作设成释放时触发避免按下不弹回。然后在While循环体内加一个延时函数参数给100毫秒。延时这个动作看着不起眼但它是新手程序的ICU。不加延时While循环会以CPU能跑多快的速度空转一个核能吃到满笔记本的散热风扇立刻开始咆哮加了100毫秒循环每秒刷新10次界面看着流畅CPU占用几乎可以忽略。**记住这个数量级人眼能感知的刷新10到20赫兹足够也就是50到100毫秒。**做采集的时候延时或者等待应该由采样周期决定不能拍脑袋乱给。显示上还有个细节波形图表默认是每条曲线一个颜色我们这里每次循环都在往图表里追加一个新的点它会自动滚动。如果你希望每次刷新都清空重画就用波形图形如果希望看到历史趋势就用波形图表。还有一个更省事的做法把数组整体做成簇直接喂给图表不过这属于进阶用法第一个例子先别急着上。3.4 保存、命名和一个从第一天就该坚持的习惯做完之后按保存选一个纯英文路径的文件夹存下来比如在文档目录下建个LV_Practice里面再按日期或者主题分子目录。文件名叫什么很重要别用未命名1.vi这种默认名也别用a.vitest.vi过两天你自己都不知道哪个是哪个。用能说明功能的英文或者拼音加下划线的形式比如random_array_demo.vi。还有一个小习惯我强烈建议从第一个VI就开始养在前面板空白处右键找到VI属性里的说明信息把这个VI干什么、输入是什么、输出是什么写进去三行。三天之后你回头看这三行能救你半小时。我见过太多人攒了几十个VI最后一个都看不懂只能重写。4. 程序跑不动的时候怎么一步步查下去4.1 探针、高亮执行和断点三件套怎么配合程序不按预期跑第一反应不要是改代码是先看数据到底流到哪儿去了。工具栏上有个灯泡图标叫高亮执行点开之后再运行你会看到线上一颗一颗的圆点在流动圆点的速度就代表数据流动的快慢。它能帮你快速定位卡在哪一步——如果圆点停在某个节点前面不动说明那个节点还没拿到完整的输入问题就在它上游。探针更精确。在任意一根线上右键选探针程序运行到那根线的时候它会弹出一个窗口显示当前这根线上的实际值。比如你怀疑随机数函数没出数就在它的输出线上打探针跑一下看有没有值你怀疑数组长度不对就在数组线上打探针能直接看到数组元素个数。探针是排查数据不对类问题最直接的手段。断点用来抓瞬间。在框图的某根线或者某个节点上右键设断点程序跑到那里会暂停这时候你可以用单步执行一个节点一个节点地走。适合的场景是循环体内部某一圈出了问题你想让它停在第7圈看看状态。三个工具配合用基本能覆盖八成的逻辑错误。4.2 一运行就死机或者卡死先排除这几类原因热词里运行LabVIEW程序电脑死机出现频率不低这个问题得分层看不能一概而论。最底层是系统资源被耗尽。最常见的就是While循环里没加延时或者循环里在不断地往数组里追加元素而从不清理——数组无限增长内存一路吃满系统开始疯狂换页表现就是整个机器卡住不动。这类问题看任务管理器就能确认内存占用一路飙升。第二层是通信阻塞。做仪器通信的时候如果VISA读函数没有设置超时而设备那边没有数据返回程序会一直等在那里界面完全无响应看起来就像死机。任何一次通信操作都必须设超时这是铁律超时之后程序能走错误分支至少界面还能动你能看到错误信息。第三层是环境和硬件相关。老版本的软件跑在新系统上、显卡驱动不兼容、远程桌面或者多屏切换时界面刷新异常、外接USB设备拔插导致的驱动崩溃这些都可能让整个程序僵住。排查方法是先在一个最小的VI上跑确认基础环境正常再逐步加回你的功能模块看到哪一步挂掉。二分排查比盯着代码看有用得多。4.3 几个看起来没事其实很要命的写法除了上面三类还有几个写法上的坑值得单独说。一是在循环里创建引用或者打开文件却不在循环外关闭。引用和文件句柄是有上限的循环跑几万次之后资源耗尽程序直接报错退出。二是在不同循环之间直接连大数组。数据是复制传递的一个几百兆的数组在多个循环之间传内存瞬间翻好几倍。正确的做法是用队列或者通知器这类数据结构来传数据这也是后面做多循环架构必须掌握的东西。三是把界面刷新塞进高速循环。有人做采集采样循环跑到1千赫兹同时每一圈都去更新界面控件结果界面根本反应不过来程序看起来像卡了。正确做法是把采集和显示分开采集循环负责存数据另一个慢速循环负责按20赫兹刷界面中间用队列传递。这个思路在LabVIEW里叫生产者消费者模式属于入门之后最重要的一个进阶点。5. 入门之后的三条岔路各自怎么起步5.1 走仪器与串口通信这条路如果你做的是测控这大概是必经之路。串口通信的起步很简单先确认设备在系统里的资源名然后按顺序调用几个函数——配置串口参数波特率、数据位、停止位、校验、流控、写入命令、读取返回、最后关闭。这里的参数必须和设备的说明书完全一致一个字都不能差尤其是波特率和流控配错了要么没反应要么收回来一堆乱码。读数据的时候有个经典难点怎么知道一条完整的数据收完了。三种常见做法一是按固定字节数读适合定长协议二是设置终止符比如约定用回车换行结尾让VISA读到终止符就返回三是加一个超时超时了就先处理已经收到的部分。实际项目里这三种常常混着用。新手最容易漏掉的是清空输入缓冲区上一次会话残留的数据会混进这一次的结果表现出来就是数据莫名其妙多了一段或者对不上。至于多台仪器同步采集这种活比如源表配合纳伏表做同步测量核心难点不在LabVIEW的语法而在时钟和触发。要么用硬件触发线把几台设备串起来由一台发起触发信号要么用软件靠时间戳对齐后者精度差但实现简单。这个层次的活先把单台设备读通了再谈同步别一上来就啃。5.2 把重复代码封成子VI并且管好你的文件当你开始发现自己反复在画同一段逻辑——比如每次都要配一遍串口、都要做一次数据换算——就该考虑做成子VI了。做法很直接在框图上框选那部分代码菜单里选创建子VILabVIEW会自动生成一个新的VI被选中的代码变成它的调用节点。接着你要做的是定义接口打开这个新VI的前面板在右上角找到那个像小方格拼图的东西叫连线板右键选一种端子模式然后把前面板上的输入控件和显示控件依次点上去绑定到对应的端子上。绑定完之后主VI里那个调用节点上就会出现对应的输入输出端子接上线就能用。有几条经验值得记子VI的连线板模式要和它的实际功能匹配输入在左、输出在右是通用约定子VI的命名要能看出来它干什么最重要的是把所有VI放进一个项目文件里统一管理不要散落在文件夹中不然跨文件引用一多换个电脑打开就是一片红叉。项目文件还能帮你理清楚依赖关系避免无意识地把同一个功能写三遍。5.3 界面好看和中英文切换这些小事其实很费时间界面这块入门阶段不用投入太多但有几条底线要做到控件对齐用工具栏的对齐按钮、字体统一、不要把所有东西堆在一屏里。想做漂亮一点可以用分隔栏把界面分区用自定义控件换外观或者干脆在底层铺一张背景图控件做成透明边框叠上去。背景图和控件都是层层叠叠的顺序调整靠右键菜单里的顺序选项这个很多人第一次做会卡住。热词里提到中文英文切换这个需求在交付项目里很常见。做法上有个省事的思路把界面上所有需要切换的文案集中管理——比如做成两个字符串数组一个中文版一个英文版用循环把文字依次写进各个控件的文本属性里。控件的文本属性可以通过属性节点来访问属性节点在框图里右键就能创建。按钮的机械动作、控件的显示隐藏也都能通过属性节点批量控制。这个做法前期多花半小时整理后期改文案就是改数组的事比一个个去点控件快得多。至于图像控件显示刻度、打印对接、数据可视化这些都属于各自领域的专项问题遇到的时候再单独查不要试图在入门阶段一次学完。6. 我带过的人里能坚持下来的都有这几个共同点教过一些同事和学生之后我慢慢发现LabVIEW学得顺的人和不顺的人差别往往不在聪明程度而在几个很朴素的习惯上。第一个习惯是敢于用帮助。把鼠标停在一个函数上按 CtrlH会弹出即时帮助面板把输入输出的含义说得清清楚楚点下面的详细帮助还有完整示例。很多人遇到不认识的函数第一反应是去搜其实手边就有而且搜索结果里的版本可能跟你的对不上帮助里的永远和你的环境一致。第二个习惯是先画流程再动手。我的做法一直是拿张纸把数据从哪来、经过什么处理、存到哪去用方框和箭头画一遍再回到电脑上照着画。直接上手拖控件的十有八九搭到一半发现结构不对推翻重来。LabVIEW的图本身就是流程图想不清楚的流程图画成VI也一定是乱的。第三个习惯是保存副本。LabVIEW有个很方便的功能叫另存为副本改大结构之前先存一个带日期后缀的版本改坏了随时退回去。这个习惯在做长时间项目的时候价值极高因为LabVIEW不像文本代码那样可以方便地做逐行对比回退基本只能靠另存。第四个习惯是拿小例子试新东西。想用队列先写一个几十行的最小例子跑通再往正式项目里搬想接一个新仪器先单独写一个读一次数据的VI跑通了再谈整合。把不确定性隔离在最小的范围里是大项目少出事故的关键。热词里那个100例的说法本质上就是这个思路——把复杂功能拆成一堆独立的小例子每个都跑通组合起来就是大项目。最后一个提醒也是我踩过之后才明白的LabVIEW的上手门槛低但真正的差距在架构。能画出一个跑得通的VI一周就够了能画出一个跑三个月不出问题的采集系统靠的是对数据流、资源管理、并发结构的理解。所以入门阶段别急着把功能堆满先把每个基础概念搞扎实该加的延时加上该设的超时设上该封的子VI封好。这些东西看起来慢实际上是快。
返回列表