实验一 编程环境与程序结构
- 理解LabVIEW的运行机制,熟悉LabVIEW编程环境。
- 掌握基本编程操作,包括VI程序的创建、编辑、运行与调试。
- 学会For循环、While循环、Case结构及顺序结构的运用,掌握定时函数的使用及移位寄存器应用。
- 熟悉公式节点。
主要设备有计算机,LabVIEW 2016软件。
1. 任务一
启动 LabVIEW ,单击“查找范例” ,单击“搜索” ,然后输入关键词“机器人” ,打开“二维系列 机器人动画”。
图1-1:【前面板】打开“二维系列 机器人动画”
1) 观察程序运行效果, 理解程序框图。
图1-2:【前面板】运行并观察程序运行效果
- 请指出有几个输入控件, 几个显示控件? 使用了什么结构?
【答】:在程序的前面板上,输入量被称为控件(Control),输出量被称为显示(Indicator)。前者有输入端子而无输出端子,后者正好相反,它们分别相当于其他编程语言中的输入参数和输出参数。
所以:有13个输入控件,1个输出控件,使用了while循环和case结构联合的结构。
图1-3:根据【程序框图】看输入输出
- 列出所有使用到的函数 (提示: 使用即时帮助查看函数名称)。
【函数】:加、乘、平方、按名称捆绑、按名称解除捆绑、捆绑、解除捆绑等。
- 任务二
构建 VI 。单击“文件”|“新建” ,选择“基于模板”|“模拟仿真” ,基于“生成和显示”模板写一个 类似于下图的正弦波发生器,要求频率、幅值、相位、偏移量等均可调。
【思路】:直接利用已有的模板,将按钮依此对应可改变的输入值即可
图2:【前面板】【程序框图】体现改变输入变换正弦波
- 任务三
构建 VI,每 1 秒产生一个 0 到 1 之间随机数, 使用移位寄存器计算 3 个随机数的滑动平均 值(当前值与前两次值的平均值),当平均值大于 0.5 时, 前面板指示灯报警,出现 3 次报 警则停止, 前面板显示平均值和报警次数。
【思路】:本实验考察了对随机数的理解, 以及利用移位寄存器来保存第一、第二个随机数和第三个随机数进行求和,然后求平均值,如果大于 5 时则布尔转为数值 1 和报警灯亮,再 利用移位寄存器对报警次数进行累次叠加,当累计次数达到 3 次时,结束循环,此时报警灯将熄灭,程序运行结束。思路较为清晰,但在操作中出现了如下问题:
【问题】:
- 应用寄存器时没有考虑输入输出循环时计数问题,循环无法结束。
- 不大于,也就是判断为假的情况下没有连线,无法输出,程序不可运行。
- 由于没有第一次报警后灯即使没有达到条件也保持长亮。
【解决方法】:
- 将输入端寄存器赋初值为0,后面就会依此对报警计数,到3后程序停止。
- 即便输出为假,不符合条件,也需要继续运行,需要连续。
- 将报警系统加入计数循环中,也就是说符合条件亮灯加计数,不符合则熄灯。
- 另一位同学还找到了集合运算函数,简化了程序,最终优化了实验。
图3-1:【前面板】报警截图
图3-2:【程序框图】和同学询问完老师后讨论结果
图3-3:改进后的【程序框图】
- 任务四
写一个油表报警程序,如下图所示,当剩余油量少于警戒值,而且开启报警时,报警灯点亮。剩余油量可以由随机数发生器产生。尝试将布尔指示灯替换为更美观的自定义控件(icom)
【思路】:生成随机数(由于随机数在0-1之间,需要乘以一个较大数值)作为剩余油量并进行显示,判断剩余油量是否小于警戒值,若小于则油量异常进行报警(此处使用一个惊讶脸表示),不小于则油量正常(此处使用一个微笑脸表示),我们在操作后不难发现,在设置警戒值较小时容易出现异常,在设置警戒值较大时不易出现异常,在设置警戒值为中间数值时容易反复变换,这是因为计算机随机值的发生其实有规律的,是周期较大的数列,落在中间值的几率较大呈现虽简单,但在操作中出现了如下问题:
【问题】:
- 设计输入时没有把随机数乘以特定数连接,导致最后0-1间几乎一直油量不足。
- 输出字符直接选显示,没有找到字符串输出,编码不统一无法连接。
- 自定义按钮使用非圆形,并且没有切换编辑模式,导致图标为大方框 。
【解决方法】:
- 了解使用部件的功能和属性,了解用于什么类型字符,才能做到合理使用
- 上网查询相关方法,最终自定义了一个直观的图标。
图4-1,4-2 【前面板】油量正常与油量异常对比图
图4-3 油量报警【程序框图】
- 任务五
使用 For 循环、 Case 结构及顺序结构构建 VI。要求分别使用公式节点和 LabVIEW 算术函数 (图标)计算表达式 y = aln x + b
, (a, b为常数) 的值,利用顺序结构和定时选板下的“时间计数 器.vi”比较两种实现方法计算 200 万次表达式所用时间。
【思路】:设计顺序结构,以第一帧和最后一帧的时间差计算程序用时,算术函数可以理解为直观的输入公式进行计算,公式节点可以理解为将每一步计算节点用图形化计算连接输出,根据公式输入输出即可。
【结论】:公式节点的计算速率比算术函数高,前者用时约为后者低一个数量级。
【易错点】:公式节点效率较高,但编写中容易错误(连线必须清晰)
图5-1,5-2 算术函数和公式节点【程序框图】
图5-3,5-4 【前面板】两种方法计算用时对比图
- 总结
实验一主要是了解程序结构,这几个小任务都很简单的。任务一是一个查找范例的小问题,我们需要通过查找“机器人”范例,将程序运行,通过后面板看出其使用的控件、结构和函数;实验二是一个仿真波形图的问题,我们可以通过调节相位、频率 等旋钮调节波形的尺寸,此实验非常容易,但也考察了我们对于仿真的理解; 实验三是报警系统设置问题,我们通过随机数的平均值进行划分,如若超过 则将进行报警,考察了我们对于 case 结构的掌握,此任务非常具有现实意义, 可以运用到体温报警系统、超速报警系统等;对于第四个实验而言,也是我最为感兴趣的,在体温监测、流感早防早控上具有重要意义,如若体温超过最大限度值就会进行报警,在系统中我们设置下限值以及上限值, 通过仪表盘以及布尔控件进行显示;第五个实验是通过算数法以及公式节点进行计算,进行运行时长对比发现公式节点效率较高。
Labview的可视化编写,使得程序较为简单,但也需注意以下问题:
- 在构建程序框图中,需要了解各个部分的用法和类型,否则会发生无法连接的问题,还是需要在多写多用中多了解一下构件,这样用到的时候才能第一时间想到。
- 总的来说,labview的使用更直观更多元,也更需要有前后端互动的思想,但是通过一些实践发现问题,解决问题真的是很有趣的一件事情。
- 实现同一个功能可能有多种方法,扩展思路,多尝试多发现,这样才能慢慢掌握,能够慢慢的编写属于自己的程序,之后可以帮助实现自己的想法。
实验二 数据集合与数据表示
- 学习构建和使用子VI,练习编辑图标和指定端子,了解VI的分层特性。
- 掌握数组和簇的创建,学习数组函数和簇函数的运用;理解数组与簇的区别。
- 学会区分图表(Chart)与图形(Graph)的异同。
- 学会使用不同的图表进行数据表示。
二、实验仪器及材料
主要设备有计算机,LabVIEW 2016软件。
三、实验内容及步骤
1.任务一
创建一个 VI ,应用循环结构和移位寄存器编程生成“斐波那契数列”(F(1)=1 ,F(2)=1, F(n)=F(n- 1)+F(n-2) (n>=3,n∈N*) )。构建子 VI,通过调用该子 VI 计算对应数列在第几项 的时候会超过设定的范围值。
【思路】:程序主要应用了移位寄存器来进行递归相加,已知项数求范围使用for循环较为简单,已知范围求项数使用while循环较为简单,而程序程序简化的关键是补充前面两个数字,即1和0,将这两个隐藏的数字考虑上那么程序就会很简单,而我前两个程序都将程序思考复杂了。
【问题】:
- 使用判断函数,将前两个数固定为1,再递归得后面的函数,虽然结果正确,但程序较复杂。
- 输出数组值为长整型,而直接输出为双精度不能直接连接,需要在循环内连出,增加了程序执行时间。
- 新建子VI时图标为灰色。
【优化方法】:
- 往前进行考虑,通过循环简化程序。
- 通过结果可知最后一个数一点是最大的数,那么可以使用数组输出最大值来输出范围。
- 需要先选中,这时还不行,右上角修改后另存可以。
图1-1 【程序框图】较复杂求解方式
图1-2 【程序框图】询问老师后简化的程序
图1-3 【前面板】创建并定义使用子VI
2. 利用簇模拟汽车控制,行车控制面板可以对显示仪表中的参量进行控制(输入簇)。下图为参考样例, 可依据实际情况进行转向灯、档位、油门、仪表显示等设置(显示簇)。
【思路】:程序的基础功能里控制面板和显示面板即输入输出通过簇的形式一一对应,总体来说没有难度。但介于真实模拟的目的,我设置了同车表的面盘, 除了显示外设置了油量显示的功能,但是由于没有找到合适的逻辑函数进行计算,出现了各种各样的问题:
【问题】:
- 表盘油量只是固定减少,没有体现与油门刹车的关系 。
- 设置的公式定量不对,会出现不减反增的情况。
- 由于公式乘除不取整,会出现-0.几的情况。
【优化方法】:
- 明确油门增大,挡位减小,耗油增加。
- 将减少的量与两个设置联系,但是不能尺度大于1.
- 转换思维,油量过低就不能前行,直接最小值设为1,合理情况下避免负值。
- 将更多的值设为可变量,符合现实情况。
图2-1:【前面板】基本功能齐全但是不加油不挂档也掉油
图2-2:公式推导及【程序框图】
图2-3:【前面板】熄火油量不减,开火继续变化
图2-4:【前面板】油量低于30报警,过低(小于1)自动熄火
3. 创建一个 VI,模拟体温监测系统,每秒生成一个体温数值,设置报警上限和下限, 分别使 用波形图表和波形图显示体温数值及监控范围值, 并进行报警,单击“停止”按钮, 程序停止 运行。参考界面如下图所示,说明波形图表与波形图的异同。
【思路】:程序设计波形图和波形图表最大的区别在于两者一个输入为簇,一个为二维数组,掌握这点就没有太大问题,:
【注意事项】:
- 数组输入时需要把隧道模式转换为“索引”
- 波形图最后需要停止后才能显示波形。
【图表与波形图的异同】:
- 异:
波形图表输入项为簇,波形图输入为各种类型的数据阵列,例如数组、波形和动态数据。
波形图表是动态的实时显示波形,而波形图是静态的停止后显示最终图形。
- 同:
波形图表与波形图具有很多相同点,均可以用来显示两维图形。
图3-1:【程序框图】波形图和波形图表温度显示对比情况
图3-2:公式推导及【程序框图】
4. 应用 XY 图绘制利萨如图形。要求两个正弦信号的幅度、频率比n以及相位差
可调整。 利萨如图形参考资料:
https://baike.baidu.com/item/%E5%88%A9%E8%90%A8%E5%A6%82%E5%9B% BE%E5%BD%A2/10517125?fr=aladdin
【思路】:根据参考资料变量一一对应即可。
图4-1:【前面板】设置相应变量输出莉萨如图形
四、总结
本实验主要是考察对数据显示的掌握,程序呈现出需要从了解其数据处理的公式再动手更为简单。第一个任务在按照自己的想法需要用选择结构的情况下,询问沈老师发现有更为简单的数列获取方式,在显示的数列前加两个0,1,使得数列更具规律,程序更为简单;第二个任务是用簇编写汽车仪表盘,由于对于这个实验比较熟悉,再加上非常感兴趣,希望能更好的仿真汽车仪表,所以在油量的减少上花费较多时间,也和老师讨论了优化方法,扩展的程序功能运行成功后也是非常自豪的,希望以后能实现更全面的功能!第三个任务是根据实验一的任务四体温报警器,对图像进行描绘,将波形图表以及波形图进行对比,在程序运行中发现他们之间最大的差别,即波形图表实时显示,而波形图只有按下停止才能看到波形图的波形;对于任务四来说,我们在物理课上已经了解了利萨茹图形以及其生成的条件,通过创造两个仿真信号以及 XY 图像进行编写,最后通过调节频率、相位得到最理想化的图像。
通过实验二的学习,我更加深入地理解了数据表示的相关方法,对于循环、图像、仿真、簇数组捆绑有了更加深入的了解,对逻辑思维也有了很大的提高。但是也出现了很多概念上的问题,连线上的错误,其实出现错误是很正常的,基于以上的错误,我归纳出以下解决方法:
- 对于需要公式计算的问题,逻辑比较复杂的,可以借助图表或者图形推导直观的缕清思路再开始编程,不要只是去出问题然后只针对问题小范围调试。
- 不要遇到问题就往复杂的方向想,labview有许多简单实用的组件可以多实践,灵活应用。
- 在完成任务的基础上,可以根据实际的情况进行优化,加入自己的想法,创造更全面实用的功能。
实验三 数据处理与读写
- 学习字符串控件的使用及字符串函数应用;学习数值数据与字符串之间的转换。
- 使用文件I/O VI将数据保存到文件,或将文件中数据读入LabVIEW。
- 掌握信号及噪声产生方法,区分波形生成与信号生成。
- 正确运用信号处理函数进行时域、频域分析;学习滤波器设计与应用。
主要设备有计算机,LabVIEW 2016软件。
三、实验内容及步骤
1. 创建一个 TXT 文件,输入文本内容。创建 VI ,使用“读取文本文件.vi”读取 TXT 文本中的 字符串,统计该字符串的长度;提取字符串中的某个字段并显示;替换该字段为其他文本, 参考界面如下图所示。
【思路】:应用字符串和文件I/O的各种功能进行设计,首先获取路径路径,对文本读取输出,将字数输出数值,设计输入的提取字符串和替换字符串,最后将结果输出就行。
【待优化的问题】:
如果我需要修改多个字段字符串进行修改,是否有办法不设置多个输入,直接编辑(比如通过序列编号)进行修改。
图1-1 【程序框图】及【前面板】
图1-2 【程序框图】添加写入文件才完成修改
图1-3 【其他】通常labview和matlab等读取文件编码格式ANSI
2. 创建一个 VI,模拟用户登录程序。在前面板输入用户名与密码 (密码以加密形式显示),单 击“登录”按钮后(使用事件结构,见参考例程),与自行预设的用户名、 密码进行对比: 1)当密码匹配时, 弹出对话框“登录成功!”;
2)当密码不匹配时,弹出对话框“用户名或者密码不正确”。
【思路】:实际就是一个循环判断的过程,程序本身并无难处:
【发现及解决的问题】:
- 注意循环的应用,不要出现死循环bug,否则无法终止程序。
- 注意密码功能只有字符串可以使用,数值不可以。
【扩展思考】:
从这个简单的登录界面便可以做许多拓展,当需要修改密码时,可将字符串设置为输入控件可进行修改,可在字符串输入控件的属性中进行更改,类型选为密码即可,还可以增加进度条进行用户提示,也可进行用户名的绑定等等。
图2-1:此【程序框图】会出现无法关闭弹窗的情况(且无法密码显示)
图2-2:【程序框图】设置密码格式后程序断开
图2-3:没有问题的【程序框图】
图2-4:美化后的前后面板
3. 在实验二内容 3 的基础上,实现体温监测数据的保存, 要求包括数据的时间信息(日期、时
间)。可将数据写入 EXCEL 文件并添加表头,参考结果如下图所示。
【思路】:程序编辑的关键是找到合适的且正确的程序模块,由于今天特别累实在听不了课趴了一下,没有听到具体用什么模块,所以实验环节就按照自己的认知选择了“写入数据”模块,然而没有找到合适的路径,一直没有验证成功,问了一下同学才知道用到“写入带分隔符电子表格”和“格式化写入字符串”此外就按照其用法配置就行,需要注意的是制表符的用法以及表头的设置方法。:
【问题】:
- 选择模块不合适导致编程困难。
- 制表位没有一一对应导致连线错误。
- 由于程序运行误操作导致数据未正常输出。
【优化方法】:
- 选择思路中讲到的相关模块,进行合理的设计。
- 需要两个量间设置一个制表符进行分隔。
- 要想正常写入数据,需要将程序正常停止运行而非直接终止。
图3-1:【程序框图】未应用合适的数据写入模块
图3-2:【程序框图】格式化写入没有对应连线
图3-3:【前面板】程序运行最后曲线
图3-4:【其他】最终保存的excel数据
4. 创建一个 VI,产生频率、占空比等参数可调、幅值范围在 0~5V 之间的 PWM 波形, 并使用
波形测量工具测量 PWM 波形参数, 参照如下界面。
【思路】:程序实则是生成波形,输出波形,检测波形的过程,只要找对了相关的模块程序就可以正常显示,但是同时也会有一些问题需要解决。
【问题】:
- 生成波形和检测波形没有找到合适模块。
- 注意限制幅值的取值
- 而幅值恰恰是后续最大的问题,进行测量时由于没有生成带频率和幅值的波形,导致程序一直报错,花费了很多时间。
【优化方法】:
- 在“波形”里寻找相关的模块,合理的进行选择
- 经过寻找“判定范围并强制转换”模块进行添加。
- 网上没有找到合适的解决方法,询问老师后老师测试VI后发现实则是需要先生成波形,即运行设置好频率和幅值才可以进行测量。
图4-1:【程序】寻找合适的生成波形,使用波形测量组件,免去复杂工作
图4-2:【程序框图】实用波形模块节省工作,状态电平使用测量工具得出
图4-3:测量工具显示幅值为0,出现报错
`图4-4:【前面板】测试生成波形显示生成正常
`图4-5:【程序框图】【前面板】询问老师,先生成波形(设置频率和幅值)后测量方正常显示
- 学习范例“c生成声音”,听一听正弦、方波、三角波、锯齿波信号的声音。
【思路】:程序就是在已有VI的基础上增加了两个功能,即使用“FFT 频谱(幅度-相位) VI ”对信号进行频谱分析, 并使用波形图显示幅度谱和将“仿真信号 Express VI”改为“基本函数发生器 VI”,增加 1 个输入控件“信号类型”,两个问题一旦找到合适的控件,那么就没有任何问题。在此次实验中遇到最大的问题是在原VI基础上修改后保存的问题。
【问题】:
无法保存vi的问题
【优化方法】:
首先想到由于其是现有VI可能存在“只读”的限制,考虑直接复制到另一个VI里,弹出警告 “LabVIEW: (Hex 0x12C0) 选中的设备无效”,由于播放声音需要麦克风,所以自然使用原vi是最方便的,最后看了官网介绍,考虑将副本以独立方式保存成功。
1) 使用“FFT 频谱(幅度-相位) VI ”对信号进行频谱分析, 并使用波形图显示幅度谱。
图5-1:【前面板】【程序框图】FFT频谱分析的结果
2)将“仿真信号 Express VI”改为“基本函数发生器 VI”,增加 1 个输入控件“信号类型”, 调试程序, 实现实时调整信号频率、信号类型和音量的功能。
提示:“基本函数发生器 VI”的采样信息 与“配置声音输出 VI”的声音格式一致, 播放出 的声音效果更好。
图5-2:【前面板】保存程序出现问题
图5-3:【前面板】【程序框图】完成“配置声音输出 VI”的波形分析
四、总结
实验一 编程环境与程序结构
一、实验目的
- 理解LabVIEW的运行机制,熟悉LabVIEW编程环境。
- 掌握基本编程操作,包括VI程序的创建、编辑、运行与调试。
- 学会For循环、While循环、Case结构及顺序结构的运用,掌握定时函数的使用及移位寄存器应用。
- 熟悉公式节点。
二、实验仪器及材料
主要设备有计算机,LabVIEW 2016软件。
三、实验内容及步骤
1. 任务一
启动 LabVIEW ,单击“查找范例” ,单击“搜索” ,然后输入关键词“机器人” ,打开“二维系列 机器人动画”。
图1-1:【前面板】打开“二维系列 机器人动画”
1) 观察程序运行效果, 理解程序框图。
图1-2:【前面板】运行并观察程序运行效果
- 请指出有几个输入控件, 几个显示控件? 使用了什么结构?
【答】:在程序的前面板上,输入量被称为控件(Control),输出量被称为显示(Indicator)。前者有输入端子而无输出端子,后者正好相反,它们分别相当于其他编程语言中的输入参数和输出参数。
所以:有13个输入控件,1个输出控件,使用了while循环和case结构联合的结构。
图1-3:根据【程序框图】看输入输出
- 列出所有使用到的函数 (提示: 使用即时帮助查看函数名称)。
【函数】:加、乘、平方、按名称捆绑、按名称解除捆绑、捆绑、解除捆绑等。
- 任务二
构建 VI 。单击“文件”|“新建” ,选择“基于模板”|“模拟仿真” ,基于“生成和显示”模板写一个 类似于下图的正弦波发生器,要求频率、幅值、相位、偏移量等均可调。
【思路】:直接利用已有的模板,将按钮依此对应可改变的输入值即可
图2:【前面板】【程序框图】体现改变输入变换正弦波
- 任务三
构建 VI,每 1 秒产生一个 0 到 1 之间随机数, 使用移位寄存器计算 3 个随机数的滑动平均 值(当前值与前两次值的平均值),当平均值大于 0.5 时, 前面板指示灯报警,出现 3 次报 警则停止, 前面板显示平均值和报警次数。
【思路】:本实验考察了对随机数的理解, 以及利用移位寄存器来保存第一、第二个随机数和第三个随机数进行求和,然后求平均值,如果大于 5 时则布尔转为数值 1 和报警灯亮,再 利用移位寄存器对报警次数进行累次叠加,当累计次数达到 3 次时,结束循环,此时报警灯将熄灭,程序运行结束。思路较为清晰,但在操作中出现了如下问题:
【问题】:
- 应用寄存器时没有考虑输入输出循环时计数问题,循环无法结束。
- 不大于,也就是判断为假的情况下没有连线,无法输出,程序不可运行。
- 由于没有第一次报警后灯即使没有达到条件也保持长亮。
【解决方法】:
- 将输入端寄存器赋初值为0,后面就会依此对报警计数,到3后程序停止。
- 即便输出为假,不符合条件,也需要继续运行,需要连续。
- 将报警系统加入计数循环中,也就是说符合条件亮灯加计数,不符合则熄灯。
- 另一位同学还找到了集合运算函数,简化了程序,最终优化了实验。
图3-1:【前面板】报警截图
图3-2:【程序框图】和同学询问完老师后讨论结果
图3-3:改进后的【程序框图】
- 任务四
写一个油表报警程序,如下图所示,当剩余油量少于警戒值,而且开启报警时,报警灯点亮。剩余油量可以由随机数发生器产生。尝试将布尔指示灯替换为更美观的自定义控件(icom)
【思路】:生成随机数(由于随机数在0-1之间,需要乘以一个较大数值)作为剩余油量并进行显示,判断剩余油量是否小于警戒值,若小于则油量异常进行报警(此处使用一个惊讶脸表示),不小于则油量正常(此处使用一个微笑脸表示),我们在操作后不难发现,在设置警戒值较小时容易出现异常,在设置警戒值较大时不易出现异常,在设置警戒值为中间数值时容易反复变换,这是因为计算机随机值的发生其实有规律的,是周期较大的数列,落在中间值的几率较大呈现虽简单,但在操作中出现了如下问题:
【问题】:
- 设计输入时没有把随机数乘以特定数连接,导致最后0-1间几乎一直油量不足。
- 输出字符直接选显示,没有找到字符串输出,编码不统一无法连接。
- 自定义按钮使用非圆形,并且没有切换编辑模式,导致图标为大方框 。
【解决方法】:
- 了解使用部件的功能和属性,了解用于什么类型字符,才能做到合理使用
- 上网查询相关方法,最终自定义了一个直观的图标。
图4-1,4-2 【前面板】油量正常与油量异常对比图
图4-3 油量报警【程序框图】
- 任务五
使用 For 循环、 Case 结构及顺序结构构建 VI。要求分别使用公式节点和 LabVIEW 算术函数 (图标)计算表达式 y = aln x + b
, (a, b为常数) 的值,利用顺序结构和定时选板下的“时间计数 器.vi”比较两种实现方法计算 200 万次表达式所用时间。
【思路】:设计顺序结构,以第一帧和最后一帧的时间差计算程序用时,算术函数可以理解为直观的输入公式进行计算,公式节点可以理解为将每一步计算节点用图形化计算连接输出,根据公式输入输出即可。
【结论】:公式节点的计算速率比算术函数高,前者用时约为后者低一个数量级。
【易错点】:公式节点效率较高,但编写中容易错误(连线必须清晰)
图5-1,5-2 算术函数和公式节点【程序框图】
图5-3,5-4 【前面板】两种方法计算用时对比图
- 总结
实验一主要是了解程序结构,这几个小任务都很简单的。任务一是一个查找范例的小问题,我们需要通过查找“机器人”范例,将程序运行,通过后面板看出其使用的控件、结构和函数;实验二是一个仿真波形图的问题,我们可以通过调节相位、频率 等旋钮调节波形的尺寸,此实验非常容易,但也考察了我们对于仿真的理解; 实验三是报警系统设置问题,我们通过随机数的平均值进行划分,如若超过 则将进行报警,考察了我们对于 case 结构的掌握,此任务非常具有现实意义, 可以运用到体温报警系统、超速报警系统等;对于第四个实验而言,也是我最为感兴趣的,在体温监测、流感早防早控上具有重要意义,如若体温超过最大限度值就会进行报警,在系统中我们设置下限值以及上限值, 通过仪表盘以及布尔控件进行显示;第五个实验是通过算数法以及公式节点进行计算,进行运行时长对比发现公式节点效率较高。
Labview的可视化编写,使得程序较为简单,但也需注意以下问题:
- 在构建程序框图中,需要了解各个部分的用法和类型,否则会发生无法连接的问题,还是需要在多写多用中多了解一下构件,这样用到的时候才能第一时间想到。
- 总的来说,labview的使用更直观更多元,也更需要有前后端互动的思想,但是通过一些实践发现问题,解决问题真的是很有趣的一件事情。
- 实现同一个功能可能有多种方法,扩展思路,多尝试多发现,这样才能慢慢掌握,能够慢慢的编写属于自己的程序,之后可以帮助实现自己的想法。
实验二 数据集合与数据表示
一、实验目的
- 学习构建和使用子VI,练习编辑图标和指定端子,了解VI的分层特性。
- 掌握数组和簇的创建,学习数组函数和簇函数的运用;理解数组与簇的区别。
- 学会区分图表(Chart)与图形(Graph)的异同。
- 学会使用不同的图表进行数据表示。
二、实验仪器及材料
主要设备有计算机,LabVIEW 2016软件。
三、实验内容及步骤
1.任务一
创建一个 VI ,应用循环结构和移位寄存器编程生成“斐波那契数列”(F(1)=1 ,F(2)=1, F(n)=F(n- 1)+F(n-2) (n>=3,n∈N*) )。构建子 VI,通过调用该子 VI 计算对应数列在第几项 的时候会超过设定的范围值。
【思路】:程序主要应用了移位寄存器来进行递归相加,已知项数求范围使用for循环较为简单,已知范围求项数使用while循环较为简单,而程序程序简化的关键是补充前面两个数字,即1和0,将这两个隐藏的数字考虑上那么程序就会很简单,而我前两个程序都将程序思考复杂了。
【问题】:
- 使用判断函数,将前两个数固定为1,再递归得后面的函数,虽然结果正确,但程序较复杂。
- 输出数组值为长整型,而直接输出为双精度不能直接连接,需要在循环内连出,增加了程序执行时间。
- 新建子VI时图标为灰色。
【优化方法】:
- 往前进行考虑,通过循环简化程序。
- 通过结果可知最后一个数一点是最大的数,那么可以使用数组输出最大值来输出范围。
- 需要先选中,这时还不行,右上角修改后另存可以。
图1-1 【程序框图】较复杂求解方式
图1-2 【程序框图】询问老师后简化的程序
图1-3 【前面板】创建并定义使用子VI
2. 利用簇模拟汽车控制,行车控制面板可以对显示仪表中的参量进行控制(输入簇)。下图为参考样例, 可依据实际情况进行转向灯、档位、油门、仪表显示等设置(显示簇)。
【思路】:程序的基础功能里控制面板和显示面板即输入输出通过簇的形式一一对应,总体来说没有难度。但介于真实模拟的目的,我设置了同车表的面盘, 除了显示外设置了油量显示的功能,但是由于没有找到合适的逻辑函数进行计算,出现了各种各样的问题:
【问题】:
- 表盘油量只是固定减少,没有体现与油门刹车的关系 。
- 设置的公式定量不对,会出现不减反增的情况。
- 由于公式乘除不取整,会出现-0.几的情况。
【优化方法】:
- 明确油门增大,挡位减小,耗油增加。
- 将减少的量与两个设置联系,但是不能尺度大于1.
- 转换思维,油量过低就不能前行,直接最小值设为1,合理情况下避免负值。
- 将更多的值设为可变量,符合现实情况。
图2-1:【前面板】基本功能齐全但是不加油不挂档也掉油
图2-2:公式推导及【程序框图】
图2-3:【前面板】熄火油量不减,开火继续变化
图2-4:【前面板】油量低于30报警,过低(小于1)自动熄火
3. 创建一个 VI,模拟体温监测系统,每秒生成一个体温数值,设置报警上限和下限, 分别使 用波形图表和波形图显示体温数值及监控范围值, 并进行报警,单击“停止”按钮, 程序停止 运行。参考界面如下图所示,说明波形图表与波形图的异同。
【思路】:程序设计波形图和波形图表最大的区别在于两者一个输入为簇,一个为二维数组,掌握这点就没有太大问题,:
【注意事项】:
- 数组输入时需要把隧道模式转换为“索引”
- 波形图最后需要停止后才能显示波形。
【图表与波形图的异同】:
- 异:
波形图表输入项为簇,波形图输入为各种类型的数据阵列,例如数组、波形和动态数据。
波形图表是动态的实时显示波形,而波形图是静态的停止后显示最终图形。
- 同:
波形图表与波形图具有很多相同点,均可以用来显示两维图形。
图3-1:【程序框图】波形图和波形图表温度显示对比情况
图3-2:公式推导及【程序框图】
4. 应用 XY 图绘制利萨如图形。要求两个正弦信号的幅度、频率比n以及相位差
可调整。 利萨如图形参考资料:
https://baike.baidu.com/item/%E5%88%A9%E8%90%A8%E5%A6%82%E5%9B% BE%E5%BD%A2/10517125?fr=aladdin
【思路】:根据参考资料变量一一对应即可。
图4-1:【前面板】设置相应变量输出莉萨如图形
图4-2:对应【程序框图】
四、总结
本实验主要是考察对数据显示的掌握,程序呈现出需要从了解其数据处理的公式再动手更为简单。第一个任务在按照自己的想法需要用选择结构的情况下,询问沈老师发现有更为简单的数列获取方式,在显示的数列前加两个0,1,使得数列更具规律,程序更为简单;第二个任务是用簇编写汽车仪表盘,由于对于这个实验比较熟悉,再加上非常感兴趣,希望能更好的仿真汽车仪表,所以在油量的减少上花费较多时间,也和老师讨论了优化方法,扩展的程序功能运行成功后也是非常自豪的,希望以后能实现更全面的功能!第三个任务是根据实验一的任务四体温报警器,对图像进行描绘,将波形图表以及波形图进行对比,在程序运行中发现他们之间最大的差别,即波形图表实时显示,而波形图只有按下停止才能看到波形图的波形;对于任务四来说,我们在物理课上已经了解了利萨茹图形以及其生成的条件,通过创造两个仿真信号以及 XY 图像进行编写,最后通过调节频率、相位得到最理想化的图像。
通过实验二的学习,我更加深入地理解了数据表示的相关方法,对于循环、图像、仿真、簇数组捆绑有了更加深入的了解,对逻辑思维也有了很大的提高。但是也出现了很多概念上的问题,连线上的错误,其实出现错误是很正常的,基于以上的错误,我归纳出以下解决方法:
- 对于需要公式计算的问题,逻辑比较复杂的,可以借助图表或者图形推导直观的缕清思路再开始编程,不要只是去出问题然后只针对问题小范围调试。
- 不要遇到问题就往复杂的方向想,labview有许多简单实用的组件可以多实践,灵活应用。
- 在完成任务的基础上,可以根据实际的情况进行优化,加入自己的想法,创造更全面实用的功能。
实验三 数据处理与读写
一、实验目的
- 学习字符串控件的使用及字符串函数应用;学习数值数据与字符串之间的转换。
- 使用文件I/O VI将数据保存到文件,或将文件中数据读入LabVIEW。
- 掌握信号及噪声产生方法,区分波形生成与信号生成。
- 正确运用信号处理函数进行时域、频域分析;学习滤波器设计与应用。
二、实验仪器及材料
主要设备有计算机,LabVIEW 2016软件。
三、实验内容及步骤
1. 创建一个 TXT 文件,输入文本内容。创建 VI ,使用“读取文本文件.vi”读取 TXT 文本中的 字符串,统计该字符串的长度;提取字符串中的某个字段并显示;替换该字段为其他文本, 参考界面如下图所示。
【思路】:应用字符串和文件I/O的各种功能进行设计,首先获取路径路径,对文本读取输出,将字数输出数值,设计输入的提取字符串和替换字符串,最后将结果输出就行。
【待优化的问题】:
如果我需要修改多个字段字符串进行修改,是否有办法不设置多个输入,直接编辑(比如通过序列编号)进行修改。
图1-1 【程序框图】及【前面板】
图1-2 【程序框图】添加写入文件才完成修改
图1-3 【其他】通常labview和matlab等读取文件编码格式ANSI
2. 创建一个 VI,模拟用户登录程序。在前面板输入用户名与密码 (密码以加密形式显示),单 击“登录”按钮后(使用事件结构,见参考例程),与自行预设的用户名、 密码进行对比: 1)当密码匹配时, 弹出对话框“登录成功!”;
2)当密码不匹配时,弹出对话框“用户名或者密码不正确”。
【思路】:实际就是一个循环判断的过程,程序本身并无难处:
【发现及解决的问题】:
- 注意循环的应用,不要出现死循环bug,否则无法终止程序。
- 注意密码功能只有字符串可以使用,数值不可以。
【扩展思考】:
从这个简单的登录界面便可以做许多拓展,当需要修改密码时,可将字符串设置为输入控件可进行修改,可在字符串输入控件的属性中进行更改,类型选为密码即可,还可以增加进度条进行用户提示,也可进行用户名的绑定等等。
图2-1:此【程序框图】会出现无法关闭弹窗的情况(且无法密码显示)
图2-2:【程序框图】设置密码格式后程序断开
图2-3:没有问题的【程序框图】
图2-4:美化后的前后面板
3. 在实验二内容 3 的基础上,实现体温监测数据的保存, 要求包括数据的时间信息(日期、时
间)。可将数据写入 EXCEL 文件并添加表头,参考结果如下图所示。
【思路】:程序编辑的关键是找到合适的且正确的程序模块,由于今天特别累实在听不了课趴了一下,没有听到具体用什么模块,所以实验环节就按照自己的认知选择了“写入数据”模块,然而没有找到合适的路径,一直没有验证成功,问了一下同学才知道用到“写入带分隔符电子表格”和“格式化写入字符串”此外就按照其用法配置就行,需要注意的是制表符的用法以及表头的设置方法。:
【问题】:
- 选择模块不合适导致编程困难。
- 制表位没有一一对应导致连线错误。
- 由于程序运行误操作导致数据未正常输出。
【优化方法】:
- 选择思路中讲到的相关模块,进行合理的设计。
- 需要两个量间设置一个制表符进行分隔。
- 要想正常写入数据,需要将程序正常停止运行而非直接终止。
图3-1:【程序框图】未应用合适的数据写入模块
图3-2:【程序框图】格式化写入没有对应连线
图3-3:【前面板】程序运行最后曲线
图3-4:【其他】最终保存的excel数据
4. 创建一个 VI,产生频率、占空比等参数可调、幅值范围在 0~5V 之间的 PWM 波形, 并使用
波形测量工具测量 PWM 波形参数, 参照如下界面。
【思路】:程序实则是生成波形,输出波形,检测波形的过程,只要找对了相关的模块程序就可以正常显示,但是同时也会有一些问题需要解决。
【问题】:
- 生成波形和检测波形没有找到合适模块。
- 注意限制幅值的取值
- 而幅值恰恰是后续最大的问题,进行测量时由于没有生成带频率和幅值的波形,导致程序一直报错,花费了很多时间。
【优化方法】:
- 在“波形”里寻找相关的模块,合理的进行选择
- 经过寻找“判定范围并强制转换”模块进行添加。
- 网上没有找到合适的解决方法,询问老师后老师测试VI后发现实则是需要先生成波形,即运行设置好频率和幅值才可以进行测量。
图4-1:【程序】寻找合适的生成波形,使用波形测量组件,免去复杂工作
图4-2:【程序框图】实用波形模块节省工作,状态电平使用测量工具得出
图4-3:测量工具显示幅值为0,出现报错
`图4-4:【前面板】测试生成波形显示生成正常
`图4-5:【程序框图】【前面板】询问老师,先生成波形(设置频率和幅值)后测量方正常显示
- 学习范例“c生成声音”,听一听正弦、方波、三角波、锯齿波信号的声音。
【思路】:程序就是在已有VI的基础上增加了两个功能,即使用“FFT 频谱(幅度-相位) VI ”对信号进行频谱分析, 并使用波形图显示幅度谱和将“仿真信号 Express VI”改为“基本函数发生器 VI”,增加 1 个输入控件“信号类型”,两个问题一旦找到合适的控件,那么就没有任何问题。在此次实验中遇到最大的问题是在原VI基础上修改后保存的问题。
【问题】:
无法保存vi的问题
【优化方法】:
首先想到由于其是现有VI可能存在“只读”的限制,考虑直接复制到另一个VI里,弹出警告 “LabVIEW: (Hex 0x12C0) 选中的设备无效”,由于播放声音需要麦克风,所以自然使用原vi是最方便的,最后看了官网介绍,考虑将副本以独立方式保存成功。
1) 使用“FFT 频谱(幅度-相位) VI ”对信号进行频谱分析, 并使用波形图显示幅度谱。
图5-1:【前面板】【程序框图】FFT频谱分析的结果
2)将“仿真信号 Express VI”改为“基本函数发生器 VI”,增加 1 个输入控件“信号类型”, 调试程序, 实现实时调整信号频率、信号类型和音量的功能。
提示:“基本函数发生器 VI”的采样信息 与“配置声音输出 VI”的声音格式一致, 播放出 的声音效果更好。
图5-2:【前面板】保存程序出现问题
图5-3:【前面板】【程序框图】完成“配置声音输出 VI”的波形分析
图5-4:在B站和官网NI上寻找解决办法
四、总结
相较于前两个实验,实验三需要对各个模块功能和应用场景更加深入的了解,更考验我们的逻辑思维以及扎实的基础。前四个任务都要对字符串控件的使用、字符串函数应用及数值数据与字符串之间的转换有一定的了解和掌握才能完成,最后一个虽然这几次课由于身体不好听的不全,但是通过沈老师的耐心的解答以及不断的实践,我成功编写出了这些程序并解决了问题,对文件 I/O 有了更加深入更加透彻的了解。
前三次实验主要是软件编程,在这三次实践中,我有了很大的提高,第一次实操的 时候很多控件都不知道在哪,几乎都是靠着摸索和百度进行控件的组装,现在我可以先分析出程序的逻辑、 需要我做的工作,然后有条不紊地进行编程,遇到问题也会冷静的思考和排查,将实在不知如何下手的问题询问老师或者在博客官网上查找最终解决问题。
在 Lebview软件程序的编程中,我感受到了其他语言少有的乐趣,可视化的页面能够让我在完成任务之外饶有兴趣的进行扩展,实现更美观的界面、更简单的程序、更全面的功能,希望之后可以用到程序设计中,比如说设计自己的网站和小程序,复杂程序是否能编写成功一定缘于是否有扎实的基本功加之严谨的思考和推导。最后感谢沈冰夏老师每次实验课上细致的讲解以及耐心的答疑,让我在程序优化上进步了许多,也更有兴趣进行扩展功能的编写。我在实验报告中看到后面两次实验的设计内容,感觉很有趣并且有动力去编程,我将把前三次实验获得的知识和经验应用到后续程序中,力求获得更加完善和独特的程序!
相较于前两个实验,实验三需要对各个模块功能和应用场景更加深入的了解,更考验我们的逻辑思维以及扎实的基础。前四个任务都要对字符串控件的使用、字符串函数应用及数值数据与字符串之间的转换有一定的了解和掌握才能完成,最后一个虽然这几次课由于身体不好听的不全,但是通过沈老师的耐心的解答以及不断的实践,我成功编写出了这些程序并解决了问题,对文件 I/O 有了更加深入更加透彻的了解。
前三次实验主要是软件编程,在这三次实践中,我有了很大的提高,第一次实操的 时候很多控件都不知道在哪,几乎都是靠着摸索和百度进行控件的组装,现在我可以先分析出程序的逻辑、 需要我做的工作,然后有条不紊地进行编程,遇到问题也会冷静的思考和排查,将实在不知如何下手的问题询问老师或者在博客官网上查找最终解决问题。
在 Lebview软件程序的编程中,我感受到了其他语言少有的乐趣,可视化的页面能够让我在完成任务之外饶有兴趣的进行扩展,实现更美观的界面、更简单的程序、更全面的功能,希望之后可以用到程序设计中,比如说设计自己的网站和小程序,复杂程序是否能编写成功一定缘于是否有扎实的基本功加之严谨的思考和推导。最后感谢沈冰夏老师每次实验课上细致的讲解以及耐心的答疑,让我在程序优化上进步了许多,也更有兴趣进行扩展功能的编写。我在实验报告中看到后面两次实验的设计内容,感觉很有趣并且有动力去编程,我将把前三次实验获得的知识和经验应用到后续程序中,力求获得更加完善和独特的程序!