LabVIEW的高级编程技巧
LabVIEW高级编程技巧实现多线程处理
LabVIEW高级编程技巧实现多线程处理在LabVIEW中实现多线程处理是一项高级编程技巧。
多线程处理可以提升程序的效率和性能,特别是在处理大量数据或复杂计算的情况下。
本文将介绍一些实现多线程处理的技巧和方法。
一、多线程的概念多线程是指同时执行多个线程的技术。
在LabVIEW中,线程是指程序的执行流程,可以理解为独立的程序流。
多线程处理意味着将一个程序分成多个线程并行执行,每个线程都有独立的任务和计算。
二、为何使用多线程处理1. 提高程序的响应速度:将耗时的任务分配给不同的线程,可以使程序在执行这些任务的同时响应其他操作,提高用户体验。
2. 充分利用多核处理器:多线程可以充分利用多核处理器的计算能力,提升程序的运行效率和性能。
3. 优化耗时操作:将耗时的操作分成多个线程执行,可以减少总体处理时间。
三、实现多线程处理的技巧和方法1. 使用并行循环:LabVIEW提供了并行循环结构,可以将不同任务放在不同的循环中,并行执行。
在并行循环中,每个循环都可以分配一个线程来执行任务。
2. 使用Synchronization功能:多线程处理可能存在数据访问冲突的问题,LabVIEW提供了Synchronization功能,可以解决多线程之间对共享数据的访问冲突。
通过使用锁定机制或信号机制,可以确保同时只有一个线程访问共享数据,保证数据的一致性和准确性。
3. 使用队列:队列是一种先进先出的数据结构,可以用于线程间的数据传递。
通过将需要处理的数据放入队列中,然后不同的线程从队列中获取数据进行处理,可以实现对数据的分发和多线程处理。
4. 考虑任务的划分和优先级调度:合理划分任务,将耗时的任务分配给独立的线程,可以优化多线程处理的效率。
同时,根据任务的优先级,调整线程的优先级,保证重要任务的及时执行。
四、多线程处理的注意事项1. 线程间的数据共享要注意同步机制,避免数据冲突。
2. 注意线程的优先级设置,避免出现优先级反转的情况。
第9章_labview的高级应用(事件结构编程技巧)
通过“坐标”获取鼠标的位置,并把该坐标值赋给“鼠标 按下”的控件,从而达到控件被鼠标拖动的视觉效果。
在“鼠标释放”的分支中,通过“非法引用句柄常量”取 消对“鼠标移动”事件的注册,从而实现在鼠标释放后, 控件的位置不再跟随鼠标发生变化。
• 动态注册:动态事件注册与VI服务器相结合,
允许在程序运行时使用控件、VI或应用程序 的引用来动态地指定和改变产生事件。动态 注册在控制LabVIEW产生何种事件和何时产 生事件等方面更为灵活。
用布尔控件制作 的自定义控件
为这个自定义控 件动态注册了 “鼠标按下”事
件
1:放置“注册事件”函数 2:在“注册事件”函数输入端上连接一个引用 3:在“注册事件”函数事件源,选择该引用所对应的事件
第九章
Labview 的高级应用 ——事件结构之谜
用户界面
事
件
外部I/O
程序的其它部分
超时节点
事件结构
事件选择器
动态事件注册
事件数据节点程序代码Step2:处理事件分支程序
事件结构在循环体外, 因此不再执行
Step1:值第一次被改变 Step3:值再次被改变
事件结构编写黄金法则1
将事件结构放入While循环中!
生产者消费者 循环
事件结构
• 通知事件:
如“鼠标移动”、“键按下”等
• 过滤事件:
如“鼠标移动?”、“键按下?”等
数字”0-9” “-“ ”Backspace“
事件过滤节点
事件结构注册模式
• 静态注册:事件结构的每个分支具体处理哪 些事件,一旦VI开始运行,LabVIEW将自动 注册这些事件,并且在VI运行的整个过程中 无法改变事件结构所处理的事件。
第6章 LabVIEW高级编程
第6章 LabVIEW高级编程
1.全局变量创建
建立全局变量也有两种方法,但比局部变量复杂。 (1)通过函数模板的结构子模板创建
在 函数结构 选板中选择全局变量节点,放置在后面板,此 时图标为
在图标上右键单击选择 打开前面板 或双击,打开全局变量程 序的前面板,在前面板上按照需要的数据类型加入控件,然后将 此程序关闭并保存为一个独立的文件;
向Matlab脚本节点输入Matlab文件的方法有两种: 一种是直接在框内写入文件代码; 一种是在Matlab节点的边框上单击鼠标右键,在弹出的快捷菜单中选 择 导入 选项,在弹出的对话框中选择待输入的Matlab脚本文件。 Matlab节点输入/输出变量的添加和公式节点类似,分别在快捷菜单 中选择 添加输入/添加输出 选项实现。和公式节点一样,用户可以为 Matlab脚本节点的每个输入/输出变量添加指示器或者控制器,见图6-10 。
第6章 LabVIEW高级编程
6.1.3 公式实例
【例6-1】 利用公式实现 y sin(x2) x /10 2x*cos(x) 函数,并绘制函数在x∈[0 200] 间曲线。
图6-7 程序框图和曲线
第6章 LabVIEW高级编程
【例6-2】使用公式节点创建一个VI,完成下面的公式,并绘 制x取值为0 ~100的曲线。其中参数m和b由前面板输入。
第6章 LabVIEW高级编程
在程序框图上输入数学公式或类似于C语言的表达式,可以使用的函 数如下:abs、acos、acosh、asin、asinh、atan、atan2、atanh、ceil、cos 、cosh、cot、csc、exp、expm1、floor、getexp、getman、int、intrz、ln、 lnp1、log、log2、max、min、mod、pow、rand、rem、sec、sign、sin、 sinc、sinh、sqrt、tan和tanh等。
LabVIEW编程中的数据结构与算法优化技巧
LabVIEW编程中的数据结构与算法优化技巧在LabVIEW编程中,数据结构和算法的选择与优化对于程序的性能和可维护性至关重要。
本文将介绍在LabVIEW编程中常用的数据结构和算法优化技巧,帮助开发人员提高程序的效率和可靠性。
一、数据结构的选择在LabVIEW编程中,选择合适的数据结构是实现功能的关键。
以下是几种常见的数据结构及其适用场景:1. 数组(Array):用于存储同类型的数据,并且数据的大小是固定的。
数组适用于需要按顺序访问和操作数据的场景,例如存储一组测量数据或图像像素。
2. 队列(Queue):用于实现先进先出(FIFO)的数据存储和访问方式。
队列适用于需要按顺序处理数据的场景,例如数据采集和处理时的数据缓存。
3. 栈(Stack):用于实现后进先出(LIFO)的数据存储和访问方式。
栈适用于需要按相反顺序处理数据的场景,例如函数调用的递归操作。
4. 链表(Linked List):用于存储具有动态长度的数据。
链表适用于频繁插入和删除数据的场景,例如数据缓存和排序等算法。
5. 图(Graph):用于表示多个实体之间的关系,并且这些关系保存在边中。
图适用于复杂网络分析和路径搜索等算法。
在选择数据结构时,需要考虑数据的特性、访问方式和操作需求,以及程序的性能要求等因素,综合评估后选择最合适的数据结构。
二、算法的优化除了选择合适的数据结构之外,优化算法也是提高LabVIEW程序性能的重要手段。
下面是几个常见的算法优化技巧:1. 减少循环次数:循环是LabVIEW程序中常用的操作,但过多的循环会增加程序的执行时间。
在编写程序时,应尽量减少循环次数,例如通过向量化操作或者使用矩阵运算来代替循环运算。
2. 缓存数据:对于需要频繁访问的数据,可以将其存储在缓存中,以减少对内存的访问次数。
例如使用Shift Register或者Local Variable来保存中间计算结果,避免重复计算。
3. 并行计算:LabVIEW支持并行计算,在多核处理器上可以充分利用硬件资源,提高程序的执行效率。
LabVIEW编程技巧提高效率的方法
LabVIEW编程技巧提高效率的方法LabVIEW是一种图形化编程语言,广泛应用于测量、控制和数据采集等领域。
在进行LabVIEW编程时,如何提高效率是每个程序员都关心的问题。
本文将介绍几种常用的LabVIEW编程技巧,帮助您提高编程效率。
一、使用SubVISubVI是LabVIEW中的一个重要概念,即可重用的子虚拟仪器。
通过将一段常用的代码封装成SubVI,可以提高代码的重用性和可维护性。
当我们在程序中需要多次使用同一段代码时,可以将其封装成SubVI,在需要的地方直接调用即可,避免重复编写相同的代码,提高编程效率。
二、合理使用循环结构和条件结构循环结构和条件结构是LabVIEW编程中的两个基本结构,合理使用它们可以极大地提高编程效率。
在需要重复执行一段代码时,可以使用循环结构,如For循环或While循环。
而在需要根据条件来选择执行不同的代码时,可以使用条件结构,如If条件结构或Case结构。
通过合理运用这些结构,可以简化程序逻辑,提高编程效率。
三、利用数据流控制来减少冗余代码数据流控制是LabVIEW编程的一个重要特点。
在LabVIEW中,数据流是以数据线的形式流动的,每个节点的执行都依赖于其前面节点的数据。
利用这一特点,我们可以在程序中避免冗余代码的出现。
通过合理设计数据流,将重复的代码放到相同的分支中,可以避免重复编写相同的代码,提高编程效率。
四、使用合适的数据结构LabVIEW中提供了多种数据结构,如数组、矩阵、队列等。
选择合适的数据结构可以简化程序逻辑,提高编程效率。
例如,当需要处理多个数据时,可以使用数组或矩阵来存储和处理。
而当需要对数据进行先进先出的操作时,可以使用队列来实现。
选择合适的数据结构可以使程序更加简洁、高效。
五、使用合适的LabVIEW工具和函数LabVIEW提供了丰富的工具和函数库,使用这些工具和函数可以加快编程速度。
例如,当需要进行数据分析和处理时,可以使用LabVIEW中提供的信号处理函数库。
LabVIEW编程中的最佳实践与代码优化技巧
LabVIEW编程中的最佳实践与代码优化技巧在LabVIEW编程中,遵循最佳实践和采用代码优化技巧可以大大提高程序的性能、可读性和可维护性。
本文将介绍一些常用的最佳实践和代码优化技巧,帮助开发者编写高质量的LabVIEW代码。
一、变量初始化和扩展性设计在LabVIEW中,变量的初始化非常重要,可以避免因未初始化变量而引起的错误。
对于有多个入口的程序,可以在开始处初始化变量,保证其值的合理性。
此外,扩展性设计也是LabVIEW编程中需要考虑的因素之一。
通过建立适当的结构和架构,可以使程序更加模块化、可扩展和可重用。
二、适当使用索引和循环结构在处理数组和矩阵等数据结构时,适当使用索引和循环结构可以简化代码并提高程序性能。
比如,使用索引来遍历数组元素,而不是使用多个扩展的线性连接器。
三、合理使用数据流和数据类型LabVIEW是一种数据流编程语言,充分利用数据流可以提供更清晰的程序逻辑和更直观的代码结构。
适当使用数据类型也可以提高程序的可读性和可维护性。
LabVIEW提供了很多内置数据类型,如整数、浮点数、字符串等,根据具体需求选择合适的数据类型是很重要的。
四、优化循环和条件结构在LabVIEW编程中,循环结构和条件结构是常用的控制结构。
优化循环可以提高程序的执行效率。
比如,使用“批处理”方式处理循环中的数据,而不是逐个处理。
优化条件结构可以消除冗余的条件判断,以减少程序执行时的开销。
五、适当使用并行编程技术LabVIEW提供了丰富的并行编程技术,如多线程、并行循环等。
适当使用并行编程技术可以有效利用多核处理器的性能,提高程序的吞吐量和响应速度。
但要注意合理控制并行度,避免过多的线程竞争和资源冲突。
六、代码注释和文档编写LabVIEW编程中,适当的代码注释和文档编写可以提高代码的可读性和可维护性。
在代码中添加注释,解释代码逻辑和功能,让其他开发者能够更容易理解和修改代码。
编写详细的文档,包括程序设计、功能特性和使用说明等,可以帮助使用者更好地了解和使用程序。
LabVIEW在工程应用中的编程技巧
LabVIEW在工程应用中的编程技巧LabVIEW是一种基于图形化编程的开发环境,广泛应用于科学、工程和控制系统等领域。
在工程实践中,合理的编程技巧可以提高程序的效率和可维护性。
本文将介绍一些使用LabVIEW进行工程应用时的编程技巧。
一、良好的命名规范良好的命名规范是编程的基础,对于程序的可读性和可维护性至关重要。
在LabVIEW中,命名规范包括VI名称、控件和指示器的命名等。
1. VI名称:VI(Virtual Instrument)是LabVIEW的基本单元,给VI命名时应使用具有描述性的名称,能够准确反映其功能和用途。
2. 控件和指示器的命名:在创建用户界面时,应为控件和指示器选择具有描述性的名称,以便其他人能够快速理解其功能和作用。
二、合理使用子VI子VI是将常用的代码块封装成独立的模块,便于重复使用,提高代码的可维护性和可重用性。
通过合理使用子VI,可以将复杂的程序分解为简单的模块,使程序结构更加清晰明了。
同时,子VI也方便多人协同开发,不同的开发者可以负责不同的模块,并可在不同的项目中复用。
三、利用LabVIEW提供的工具箱LabVIEW提供了丰富的工具箱,包括信号处理、控制系统、图像处理等功能。
合理利用这些工具箱,可以节省开发时间,提高编程效率。
1. 信号处理工具箱:在信号处理方面,LabVIEW提供了多种滤波器、傅里叶变换等函数和工具。
通过使用这些工具,可以方便地进行信号处理和分析。
2. 控制系统工具箱:LabVIEW提供了各种控制算法和工具,包括PID控制、系统辨识等。
在控制系统设计中,合理利用这些工具可以简化程序的实现和调试过程。
3. 图像处理工具箱:LabVIEW对于图像处理领域也提供了强大的支持,例如图像滤波、边缘检测等功能。
这些工具可以应用于计算机视觉、图像识别等项目中。
四、使用合适的数据结构和数据流程在LabVIEW中,数据流图是程序设计的重要组成部分。
合理设计数据结构和数据流程可以提高程序的可读性和可维护性。
LabVIEW编程技巧与最佳实践
LabVIEW编程技巧与最佳实践LabVIEW是一种广泛应用于工程领域的可视化编程语言,它的特点是通过图形化的编程界面进行程序设计。
在使用LabVIEW进行编程时,我们需要掌握一些技巧和遵循最佳实践,以提高程序的效率、可读性和可维护性。
本文将介绍一些LabVIEW编程的技巧和最佳实践,帮助读者更好地应用LabVIEW进行工程项目开发。
I. 命名规范在LabVIEW程序中,良好的命名规范是非常重要的,它能够使得程序代码更具可读性和易于理解。
以下是一些建议的命名规范:1. 控件和指示器:使用有意义的名称来标识控件和指示器,例如使用“按钮”作为命名,而不是默认的“Button1”。
2. VI(Virtual Instrument):给VI命名时,应使用能够准确描述功能的名称,避免使用过于简单或含糊不清的命名。
同时,还应注意使用合适的前缀来说明其功能,例如“Read_file”、“Write_data”等。
3. 数据类型:对于数据类型的命名,应使用能够表达其含义或用途的名称。
例如,对于包含温度数据的变量,可以使用“temperature”作为名称。
II. 数据流的管理在LabVIEW中,数据流是程序中的核心,良好的数据流管理可以使程序更清晰明了、易于维护。
以下是一些数据流管理的技巧:1. 数据线的走向:在连接节点时,保持数据线的整洁有序。
可以使用直线、折线等方式来使数据线的走向更加清晰。
2. 控制数据线流向:使用Bundle和Unbundle节点来管理和传递复合数据结构,而不是直接将数据线连接到复合结构的元素。
III. 错误处理良好的错误处理是编程中的重要一环,以下是一些错误处理的最佳实践:1. 错误码的使用:使用良好的错误码来标识不同类型的错误,以便于程序在发生错误时进行合适的响应。
2. 异常处理:使用异常处理来捕获和处理可能发生的异常情况,以保证程序的稳定性和可靠性。
IV. 程序调试与优化1. debug模式:在进行程序开发时,使用debug模式来逐步调试程序。
LabVIEW的高级编程技巧
LabVIEW的编程技巧本章介绍局部变量、全局变量、属性节点和其他一些有助于提高编程技巧的问题,恰当地运用这些技巧可以提高程序的质量。
8.1局部变量严格的语法尽管可以保证程序语言的严密性,但有时它也会带来一些使用上的不便。
在LabVIEW这样的数据流式的语言中,将变量严格地分为控制器(Control)和指示器(Indicator),前者只能向外流出数据,后者只能接受流入的数据,反过来不行。
在一般的代码式语言中,情况不是这样的。
例如我们有变量a、b和c,只要需要我们可以将a的值赋给b,将b的值赋给c等等。
前面所介绍的LabVIEW内容中,只有移位积存器即可输入又可输出。
另外,一个变量在程序中可能要在多处用到,在图形语言中势必带来过多连线,这也是一件烦人的事。
还有其他需要,因此LabVIEW引入了局部变量。
8.1.1局部变量的创建我们在框图上设置三个变量,两个控制器分别为Numeric和Numeric 2,现在增加局部变量。
选择Function→Structures→Local Variable 然后将其拖到框图上,就可得到一个代“?”的图标,下一步将其与框图中已有的变量建立关联,有鼠标右键单击图标,进入Select Item 选择“input1” ,最后框图就变成了图7-1右边的样子。
图7-1局部变量的创建局部变量只是原变量的一个数据拷贝,但是它的属性可以修改,并且这种改变不会影响原变量。
例如上图中的这个局部变量可以利用快捷菜单中的Change To Read 变成一个指示器。
这样的一对变量的组合,就使它既可读又可写了。
局部变量有三种基本的用途:控制初始化、协调控制功能、临时保存数据和传递数据。
下面我们通过练习来说明。
8.1.2 应用举例练习8-1 用一个开关控制两个循环]该练习中有两个While 循环,现在我们用一个开关同时控制它们的运行。
面板与框图如上所示。
在左边的一个循环中设定了一个开关。
右边的循环中做了这个开关的局部变量。
LabVIEW高级编程技巧优化算法与性能
LabVIEW高级编程技巧优化算法与性能LabVIEW高级编程技巧:优化算法与性能概述LabVIEW是一种强大的图形化编程环境,用于数据采集、信号处理、控制系统等领域。
在实际应用中,优化算法和性能是LabVIEW开发人员经常面临的问题。
本文将介绍几种高级编程技巧,以提高LabVIEW程序的算法效率和运行性能。
一、使用内存效率高的数据结构在LabVIEW中,使用合适的数据结构可以提高程序的内存使用效率。
例如,当处理大量数据时,使用固定大小的数组比使用动态数组更高效。
此外,选择正确的数据类型,如使用整型代替浮点型,也能够提高内存使用效率。
二、减少迭代次数当需要重复执行某个操作时,减少迭代次数是提高程序性能的关键。
LabVIEW提供了多种循环结构,如For循环、While循环等,可以根据实际情况选择合适的循环结构。
此外,使用并行循环可以充分利用多核处理器的优势,进一步提高程序的运行效率。
三、使用并行计算LabVIEW提供了并行计算的能力,可以将任务分解为多个独立的子任务并行执行。
这样可以充分利用多核处理器的计算能力,提高程序的运行速度。
在设计并行计算的LabVIEW程序时,需要注意任务之间的数据依赖关系,合理划分任务并进行数据分发和汇总。
四、使用快速排序算法在一些需要对数据进行排序的应用中,选择合适的排序算法可以大大提高排序的速度。
在LabVIEW中,快速排序算法通常被认为是一种高效的排序算法。
LabVIEW中提供了Sort 1D Array和Sort 2D Array等排序函数,可以方便地对数组进行排序操作。
五、适当使用缓存在处理大量数据时,适当使用缓存可以提高数据读写的速度。
LabVIEW提供了缓存读写的功能,可以将数据缓存在内存中,减少对外部存储的访问次数。
在进行数据读写时,可以选择使用缓存读写函数,将数据先缓存到内存中,再一次性读写到外部存储。
六、使用多线程技术LabVIEW支持多线程编程,可以将不同的任务分配到不同的线程中执行,提高程序的并发性和响应能力。
labview高级程序设计
LabVIEW高级程序设计1. 简介LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种图形化程序设计环境,主要用于快速开发和部署数据采集、控制系统和测试系统等应用。
LabVIEW具有丰富的工具和功能,可以帮助工程师和科学家高效地进行系统设计和开发。
本文将介绍LabVIEW高级程序设计的一些常用技巧和技术。
2. 高级数据处理2.1 数据滤波LabVIEW提供了多种滤波器函数和工具,用于对实时采集的数据进行滤波处理。
可以使用FIR滤波器或IIR滤波器对数据进行平滑处理或去除噪声。
滤波器函数可以灵活地应用于不同的应用场景,并且可以自定义滤波器参数。
// 示例:使用FIR滤波器对数据进行平滑处理double[] data = GetSensorData();double[] filteredData = Filter.FIR(data, filterCoefficients);2.2 数据拟合LabVIEW提供了多种数据拟合函数和工具,用于对实验数据进行曲线拟合。
可以根据实验数据的特点选择适当的拟合函数,例如线性拟合、多项式拟合、指数拟合等。
数据拟合功能可以帮助用户分析数据并找出趋势和规律。
// 示例:使用线性拟合函数对数据进行拟合double[] xData = GetXData();double[] yData = GetYData();double[] coefficients = Fit.Linear(xData, yData);2.3 数据分析LabVIEW提供了丰富的数据分析函数和工具,用于对实验数据进行统计分析和趋势分析。
可以计算数据的平均值、标准差、最大值、最小值等统计指标,还可以绘制直方图、散点图、曲线图等图表。
数据分析功能可以帮助用户理解数据的特性和分布。
// 示例:计算数据的平均值和标准差double[] data = GetExperimentalData();double mean = Analysis.Mean(data);double std = Analysis.StandardDeviation(data);3. 高级界面设计3.1 自定义控件LabVIEW允许用户自定义控件,以满足特定需求和界面设计的要求。
LabVIEW的高级编程技巧
7
定时循环
• • • • 精确的定时 while 循环 多个时钟频率的定时 反馈, 动态定时特性 循环优先级
• examples\general\timedloop.llb
8
定时循环的配置
9
定时循环
10
基于事件的编程
• 最早在LabVIEW 6.1中引入 • 主要用于用户界面的事件响应 • 在labview6.1之前采用轮询机制处理
20
内存优化
LabVIEW 尽量减少内存再分配 需要重新分配内存的函数
• Build Array • Concatenate Strings
High Memory Reallocation
Low Memory Reallocation
21
构建数组
Method 1 (Incorrect): 24 kB total
LabVIEW的高级编程技巧
内容概要
• • • • • 用户定义的调试指示器 定时循环 基于事件触发的编程 文件I/O的性能 内存管理
2
客户定制的调试指示器
• • • • 能够指示各种数据类型 可定制指示器外观 可定制指示器处理功能 设置条件断点
指示器的操作可以完全体现 Vi的灵活性和强大的功能
பைடு நூலகம்I的内存使用情况
• 前面板 • 需要显示前面板时或某些特殊情 况下载入。 • 程序框图 • 在需要编译时载入 • 机器码 • 经过编译的程序框图 • 数据 • 控件的指, • 默认数据, 常量等 File > VI Properties
19
内存使用情况
• Tools > Advanced > Profile VIs… • 勾选 “Profile Memory Usage” & “Memory Usage” • 在你执行应用程序之前点击“Start” • 状态只在程序执行完成后更新 • 在程序执行过程中内存使用情况不能被查看
LabVIEW的高级编程技巧
18
VI的内存使用情况
• 前面板
• 需要显示前面板时或某些特殊情 况下载入。
• 程序框图 • 在需要编译时载入
• 机器码 • 经过编译的程序框图
• 数据 • 控件的指, • 默认数据, 常量等
• 非常占用CPU资源,可能会丢失用户界面的响应
• 两种类型的事件 • 通知 • 可滤除事件
11
LabVIEW 7 事件
• LabVIEW 7 引入了一些新事件 • 更多的用户界面事件 • ActiveX 事件 • 用户定义的事件 • 动态注册的事件
12
事件处理结构
• 允许在subvi中处理事件代码 • 提供统一的,简化的事件处理机制
20
内存优化
LabVIEW 尽量减少内存再分配 需要重新分配内存的函数
• Build Array • Concatenate Strings
High Memory Reallocation
Low Memory Reallocation
21
构建数组
Method 1 (Incorrect): 24 kB total
2 GHz Pentium 4
24
子数组
在函数 Array Subset之前引线 执行只需5毫秒 子数组到真实数组的生成发生在循环之前
25
显示内存分配
• File > Tools > Advanced > Show Buffer Allocations
26
演示: 显示内存分配
Show Buffer Allocations.llb
LabVIEW编程技巧提高生产效率的实用方法
LabVIEW编程技巧提高生产效率的实用方法LabVIEW是一款功能强大的图形化编程环境,广泛应用于工业自动化和科学研究领域。
在实际应用中,熟练掌握一些编程技巧是提高生产效率的关键。
本文将介绍一些实用的LabVIEW编程技巧,帮助开发人员更高效地完成任务。
一、使用LabVIEW内置的模板和例程LabVIEW提供了丰富的模板和例程,在开始新项目时可以直接使用这些模板和例程,节省编写代码的时间。
这些模板和例程包含了常见的功能和处理方法,开发人员只需根据具体需求进行修改即可。
使用模板和例程不仅可以提高编程效率,还可以减少错误的发生。
二、充分利用LabVIEW的图形化编程特性LabVIEW以图形化的方式呈现编程逻辑,使用虚拟仪器(Virtual Instrument,简称VI)进行编程。
开发人员应该充分利用这一特点,通过拖拽、连接和配置各种函数和节点来构建自己的程序。
比如,使用数据流图和控制流图来表示程序的数据流向和控制逻辑,使用事件结构来处理用户交互等。
这种图形化的编程方式往往更直观、易于理解和维护。
三、模块化设计和可重用性在LabVIEW中,将程序分为多个模块,每个模块完成一个具体的功能。
模块化的设计可以使程序更加清晰和易于管理,同时也提高了代码的可重用性。
开发人员可以将一些常用的模块保存为子VI (SubVI),在其他程序中直接调用。
这样可以节省开发时间,并且减少了每次编写相同功能代码的机会。
四、善用标签和注释LabVIEW中可以给各种元素(如控件、连线、节点等)添加标签和注释,这对于理解和调试程序非常有帮助。
开发人员应该充分利用这些功能,为各个元素添加有意义和清晰的标签和注释,以便自己和其他人更好地理解程序的逻辑和功能。
在调试过程中,可以通过查看标签和注释快速定位问题。
五、使用合适的数据结构和数据处理方法LabVIEW中有多种数据结构和数据处理方法可供选择,开发人员需要根据具体场景选择合适的方法。
labview编程的使用技巧系列
labview编程的使用技巧系列LabVIEW 是一种用于实时数据采集、处理与控制的视觉化编程语言,它具有许多独特的特点和功能。
在使用 LabVIEW 进行编程时,我们可以使用以下技巧来提高效率和代码的质量。
1. 使用合适的图标:LabVIEW 的编程环境使用图标表示各种功能模块,使用合适的图标可以使代码更易读,也有助于减少错误。
为了让代码更具可读性,应该选择与功能相对应的图标,并正确命名图标上的输入和输出。
2. 使用模块化编程:LabVIEW鼓励使用模块化的编程方式。
将复杂的功能分解为小模块,每个模块只负责一个特定的任务。
这种方式既有助于降低代码的复杂性,也方便代码的重用和维护。
3. 使用块结构:块结构是在 LabVIEW 中进行循环和条件语句的一种常用结构。
使用块结构可以使代码更加清晰易懂,并且有利于出错调试。
块结构可以帮助我们分组逻辑和流程,使代码结构更加清晰。
4. 使用数据流编程:LabVIEW 的独特之处在于它使用了数据流编程的思想。
在数据流编程中,数据通过节点流动,而不是通过控制语句进行流动。
这种方式可以使代码更简洁、更直观,并且有利于并行计算和多线程编程。
5. 异常处理:在 LabVIEW 编程中,异常处理是非常重要的一环。
合理的异常处理可以提高程序的稳定性和可靠性。
为了保证代码的健壮性,应该针对可能发生的异常情况设置适当的错误处理程序或异常处理代码。
6. 使用图形化界面:LabVIEW 可以通过图形化界面来与用户进行交互。
合理运用图形化界面可以使程序更加友好和易用。
通过使用各种控件和指示器,用户可以方便地输入和输出数据,以及实时监视和控制程序运行状态。
7. 良好的注释和文档:良好的注释和文档对于任何编程语言来说都是必不可少的。
在 LabVIEW 编程中,应该为关键部分的代码添加注释,以便于他人理解和维护。
此外,还应该提供清晰详细的文档,包括程序的功能、输入输出、使用方法以及设计思路等。
LabVIEW中的算法开发和优化技巧
LabVIEW中的算法开发和优化技巧LabVIEW是一种广泛应用于工程和科学领域的图形化开发环境,它提供了丰富的算法开发和优化技巧,使得用户能够更高效地开发和优化算法。
本文将深入探讨LabVIEW中的算法开发和优化技巧,并提供一些实用的建议和指导。
一、算法开发技巧在LabVIEW中进行算法开发时,以下几点技巧可以帮助开发者更好地完成任务:1. 确定算法的输入和输出:在开始开发算法之前,首先需要明确算法的输入和输出信息,包括数据类型、数据范围等。
这有助于准确地编写算法,并避免后续出现错误。
2. 使用适当的数据结构:LabVIEW提供了各种数据结构,如数组、矩阵、队列等。
根据算法需求,选择合适的数据结构可以提高算法的效率和可读性。
3. 合理划分子VI:将算法划分为多个子VI,每个子VI负责一个特定的功能,这样可以增强代码的可读性和重用性。
同时,可以更好地进行模块化开发和调试。
4. 适当使用循环和条件结构:循环结构和条件结构是实现算法的基本工具,合理使用可以简化代码逻辑、提高执行效率。
在选择循环和条件结构时,需要根据算法的实际需求进行合理的选择。
二、算法优化技巧算法优化是提高算法效率和性能的关键,下面列举几个常用的算法优化技巧:1. 数据预处理:对输入的数据进行预处理,包括去除异常值、归一化等操作。
合理的数据预处理能够提高算法的鲁棒性和准确性。
2. 并行计算:LabVIEW支持并行计算,可以通过并行计算来加速算法的执行过程。
合理地利用并行计算的特性,可以提高算法的运行效率。
3. 算法复杂度分析:对算法的复杂度进行分析,找到消耗时间和资源较多的部分,进行优化。
常见的优化方法包括算法改进、数据结构优化等。
4. 减少数据传输:在算法设计和实现过程中,尽量减少数据的传输次数,避免不必要的数据拷贝和传递。
这可以有效提高算法的执行速度。
5. 使用硬件加速:LabVIEW支持与各种硬件设备的连接,如FPGA、GPU等。
LabVIEW编程九大技巧
LabVIEW编程技巧Wu YunlongbVIEW快捷键介绍Ctrl+N:新建打开一个VI;Ctrl+E: 前面板和程序框图的切换;Ctrl+/:窗口大小的切换,如最大化;Ctrl+T:前面板和程序框图左右或者上下同大小分布;Ctrl+空格/ Ctrl+Shift+空格:打开“快速放置”窗口,有些控件你如果不知道在函数选板的什么位置,但是你知道其名称的话,这个方法能帮助你快速查找。
也可以为你经常使用的函数自定义简洁的查找名称以完成快速放置;Ctrl+B:删除程序界面所以的断线;Ctrl+Z:撤销前一步操作;Ctrl+H:调出帮助窗口;Ctrl+I:编辑VI属性;Ctrl+R:运行VI;Ctrl+U:自动清理VI,使排列整齐,但程序比较大的时候,不建议使用这个功能;Ctrl+-/+:改变控件字体和控件的大小;Ctrl+0:调出字体设置窗口,通常是直接改变前面板控件的字体。
还有一些快捷方式由于应用不是很广泛,在此不做介绍。
2.使用LabVIEW自带的VI模版在刚打开的LabVIEW窗口中或者在已有的VI中选择文件/新建/基于模版,如下图所示,选择自己所要的模版进行快速编程,这将为您的程序架构节省时间。
3.在编好的线程中快速插入函数节点在连线的上方附近右击选择插入/数值选板中的减法节点,会发现减法节点会直接线程中,但此时是下输入接线端和输出接线端连入线程。
如果选择的是在线程下方附近右击做相同选择的话,会发现减法接线端的上输入接线端和输出接线端被连入线程。
但是如果节点两输入端已经连接好数据之后检查发现输入端连线接反了,那么最快捷的方法就是按住Ctrl,然后在节点附近出现下图的情况后点击鼠标左键会自动调换两接线端。
在此需要特别注意的是,这种快速调换接线端的方法只适用于输入端是双接线端的情况,其他节点并不适用。
4.快速判断2维数组的大小这种直接通过矩阵的大小判断数组的行数和列数只有2009版及以上才有的功能。
LabVIEW编程技巧提高效率的十大方法
LabVIEW编程技巧提高效率的十大方法1. 引言LabVIEW是一款强大的图形化编程语言和开发环境,广泛应用于科学研究、工程控制和数据分析等领域。
在使用LabVIEW进行编程开发过程中,提高效率是每个开发者都追求的目标。
本文将介绍十种LabVIEW编程技巧,帮助您提高编程效率,提升开发质量。
2. 为代码模块设计子VI一个好的编程习惯是将复杂的代码逻辑分解成小的、可重用的子VI。
这样可以提高代码的可读性,方便维护和修改。
因此,在编程之前,先规划好所需的子VI,并将其设计成适合复用的形式。
3. 使用功能强大的数据结构LabVIEW提供了许多功能强大的数据结构,如数组、队列、图表等。
合理地利用这些数据结构,可以简化编程过程,提高效率。
例如,使用队列来实现消息传递机制,可以提高多任务程序的并行性和稳定性。
4. 利用框图的自动功能LabVIEW的图形化编程方式可以为开发者提供许多自动化功能。
例如,通过在框图上按下Ctrl键并进行拖拽,可以实现自动创建循环结构或条件结构。
这些自动化功能可以减少开发时间,提高效率。
5. 使用图形化调试工具LabVIEW提供了丰富的图形化调试工具,如前面板控件观察、图表显示、数据检视器等。
合理利用这些工具可以更方便地调试代码,快速定位问题,并提高调试效率。
6. 利用快捷键和快捷方式LabVIEW提供了许多快捷键和快捷方式,可以极大地提高开发效率。
例如,Ctrl+E可以展开或折叠结构,Ctrl+H可以显示帮助文档,Ctrl+Space可以自动完成代码等。
熟练掌握这些快捷键和快捷方式,可以节省大量的开发时间。
7. 合理使用标签、注释和颜色为了提高代码的可读性和可维护性,合理使用标签、注释和颜色是非常重要的。
通过为控件和线条添加标签,可以清晰地表达其作用,并增加代码的可理解性。
同时,通过添加注释和使用不同的颜色来区分代码模块,可以减少错误和提高代码的可维护性。
8. 使用正确的设计模式LabVIEW提供了多种设计模式,如状态机、事件驱动、发布-订阅等。
LabVIEW中的并行编程技巧
LabVIEW中的并行编程技巧LabVIEW是一种流程控制、数据采集和信号处理的图形化编程语言。
它通过图形化界面来表示各种功能模块,并通过数据流的方式来实现模块之间的通信。
并行编程是LabVIEW的一个重要特性,可以提高程序的执行效率和响应速度。
本文将介绍LabVIEW中的一些并行编程技巧,以帮助读者更好地利用LabVIEW进行程序开发。
一、使用并行循环结构在LabVIEW中,可以使用并行循环结构来实现并行执行的功能。
并行循环结构是一种同时执行多个循环迭代的结构,可以显著提高程序的运行效率。
下面是一个简单的示例:[图片示例]在上述示例中,我们可以看到有两个相同的循环结构,分别用于计算两个不同数组的平均值。
通过并行循环结构,可以同时进行这两个计算,提高了程序的执行效率。
二、使用并行数据流在LabVIEW中,可以使用并行数据流来实现并行运行的功能。
并行数据流是一种通过数据流进行并行运算的方法,可以将数据分发到多个任务中并行处理。
下面是一个简单的示例:[图片示例]在上述示例中,我们可以看到有两个并行的子VI,分别用于计算两个不同传感器的数值。
通过并行数据流,在主VI中将数据分发到两个子VI中进行并行处理,可以更高效地完成任务。
三、使用并行状态机在LabVIEW中,可以使用并行状态机来实现多个状态的并行控制。
并行状态机是一种同时控制多个状态的方法,可以提高程序的响应速度和处理能力。
下面是一个简单的示例:[图片示例]在上述示例中,我们可以看到有两个状态机并行执行,分别用于控制两个不同的设备。
通过并行状态机,可以同时进行多个设备的控制,提高了程序的执行效率和灵活性。
四、使用并行计算在LabVIEW中,可以使用并行计算来加速数据处理和算法运算。
通过将大规模的计算任务分解为多个小任务,并行地执行这些小任务,可以提高计算的速度和效率。
下面是一个简单的示例:[图片示例]在上述示例中,我们可以看到通过并行计算的方式来实现对不同数据的处理。
LabVIEW+高级编程技巧
Reuses Buffers
May Allocate New Buffers
Allocates New Buffers
子数组
• LabVIEW 尽可能的重用内存缓冲 • 子数组不存储实际的数据 • 子数组在必要时会生成真实的数组 • 由于子数组不要对数据进行拷贝,因此提高了程 序的执行速度
子数组
Data Space
Data Space
Main VI
SubVI
Always in memory Resident sometimes
内存使用情况
• Tools > Advanced > Profile VIs… • 勾选 “Profile Memory Usage” & “Memory Usage” • 在执行应用程序之前点击“Start” • 状态只在程序执行完成后更新 • 程序执行过程中内存使用情况不能被查看
屏幕显示实例
Slow Method (每次更新一点)
Fast Method (每次更新100点)
减少循环中不必要的计算
• 避免将产生相同结果的运算放在循环内
• 避免在循环中不必要的访问全局变量
减少 SubVI 开销
• 每个subVI 都会有一些开销 (大概几十微秒); 虽然 看起来不大,但如果是在一个循环结构中,就 会累加出一个很大结果。 • 在高速运行的循环结构中,不要显示 subVI 的前 面板 • 如果可能,将循环结构移到 subVI 中完成。
Keep graphics below the text and to the right
客户指示器的结构
• 包含一个控件
– 控件的数据类型就是 所指示的数据线
• 包含一个指示器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LabVIEW的编程技巧本章介绍局部变量、全局变量、属性节点和其他一些有助于提高编程技巧的问题,恰当地运用这些技巧可以提高程序的质量。
8.1局部变量严格的语法尽管可以保证程序语言的严密性,但有时它也会带来一些使用上的不便。
在LabVIEW这样的数据流式的语言中,将变量严格地分为控制器(Control)和指示器(Indicator),前者只能向外流出数据,后者只能接受流入的数据,反过来不行。
在一般的代码式语言中,情况不是这样的。
例如我们有变量a、b和c,只要需要我们可以将a的值赋给b,将b的值赋给c等等。
前面所介绍的LabVIEW内容中,只有移位积存器即可输入又可输出。
另外,一个变量在程序中可能要在多处用到,在图形语言中势必带来过多连线,这也是一件烦人的事。
还有其他需要,因此LabVIEW引入了局部变量。
8.1.1局部变量的创建我们在框图上设置三个变量,两个控制器分别为Numeric和Numeric 2,现在增加局部变量。
选择Function→Structures→Local Variable 然后将其拖到框图上,就可得到一个代“?”的图标,下一步将其与框图中已有的变量建立关联,有鼠标右键单击图标,进入Select Item 选择“input1” ,最后框图就变成了图7-1右边的样子。
图7-1局部变量的创建局部变量只是原变量的一个数据拷贝,但是它的属性可以修改,并且这种改变不会影响原变量。
例如上图中的这个局部变量可以利用快捷菜单中的Change To Read 变成一个指示器。
这样的一对变量的组合,就使它既可读又可写了。
局部变量有三种基本的用途:控制初始化、协调控制功能、临时保存数据和传递数据。
下面我们通过练习来说明。
8.1.2 应用举例练习8-1 用一个开关控制两个循环]该练习中有两个While 循环,现在我们用一个开关同时控制它们的运行。
面板与框图如上所示。
在左边的一个循环中设定了一个开关。
右边的循环中做了这个开关的局部变量。
并且在快捷菜单中选Chang To Read ,最后与循环的条件端子连接。
这样就实现了所须的功能。
练习8-1 结束练习8-2 创建一组互锁的开关面板及框图如上所示。
这是一个精巧的程序,它非常简洁地实现了所须的功能,面板上的四个按钮开关,在任何时刻只允许有一个被按下(True 状态)。
当另一按钮被按下时,原先在按下状态的按钮将自动弹起。
下面对程序做几点说明。
1.程序的基本算法:Array在While 循环中通过一对移位寄存器将当前数组内容(开关状态)与前一次循环时的数组内容不断比较。
如果没有变化,则通过“相等判断”将选择器上输入端的数据送到选择器输出端,并送到移位寄存器。
如果有变化,则“相等判断”的输出端将把“F”送到选择器,选择器将选取其下输入端的数据到输出。
那么下输入端的数据是什么呢?现在我们举例说明,假如4个开关原来的状态从左到右是“0100”,即开关2闭合。
现在按下开关1,则当前数组内容立即变为“1100”与前一状态“0100”逐位做异或运算后,在异或门输出端得到的结果是“1000”,这个结果送给了选择器下输入端,在选择器输出端送到移位寄存器的同时还通过一个Array的局部变量,使数组内容更新为“1000”,即使开关2弹起。
2.局部变量的作用:循环内的局部变量使得更新后的数据可以写入数组,没有它数组Array只能读,不能写。
循环外的局部变量用来将数组初始化。
3.这个程序的巧妙之处还在于直接对整个数组操作,而不是对一个个数组元素操作,如果需要增加面板上的开关个数,只需要改变数组初始化中的元素个数,并在面板上拖出需要的开关个数。
练习8-2结束练习8-3仪器面板控制按钮的完善在前面的练习6-7中,我们曾给出了一个非常简洁的连续正弦波发生器的例子。
框图如上所示。
但从使用的角度这个程序不够完善。
例如程序启动后开始发生波形,这时如果你希望调试改变波形的频率和幅值。
则改完后必须再次重新启动运行。
因为这些值是作为程序的初值出现的。
这显然不太方便。
如果我们希望能在任意时刻调整参数波形都能“立即”响应,则可以利用局部变量来完善按钮的控制作用。
一个较完善的程序如下所示。
这是一个正弦波信号发生器,它允许在运行中随时调整参数而不必重新启动。
这个程序增加了内外两层循环,并且对幅值、频率设置了两套局部变量,利用内层循环监视当前时刻和前一时刻的值。
如果没有变化,信号源持续工作,内循环一直执行下去。
如果发现当前时刻和前一时刻的参数发生了变化,则结束内层循环,并使外循环前进一步(执行第二次外循环),相当于程序重新启动,则信号源按新的设置参数运行。
另外注意开关的作用,当开关按下时,先终止内层循环,然后终止内层循环,同时Clear generation。
练习8-3结束8.2全局变量全局变量是LabVIEW中一个与VI地位等同的模块,它以独立文件的形式保存在磁盘中,文件后缀为.gbl。
通过全局变量不同VI之间可以交换数据。
8.2.1全局变量的创建和调用创建步骤如下:1.在Function→Structures下选择Global Variable,将其图标拖到框图中,得到2.双击Global Variable图标,得到其前面板3.在其前面板上放上所需要的变量,例如一个数组、一个布尔量、一个字符串变量如下图所示。
3.保存这个变量,例如文件名称为a.gbl。
至此,全局变量创建完备,下面我们通过例子来说明它的调用。
练习8-4全局变量的调用该例中我们首先在一个VI中产生十个随机数,然后将它传给全局变量a.gbl,然后再创建第二个VI,让它由全局变量a.gbl中读取数据,并用Graph显示出来。
下图分别是VI1的框图和VI2的面板及框图。
在做调用全局变量的VI中有三个问题要注意:●在一个VI中调用全局变量的方法同调用子VI的方法,即在Function下选择Se lect a VI…,然后打开所需的全局变量文件。
●全局变量中所需变量的选定。
本例中a.gbl中含3个变量,如果需要的是字符串变量,可用鼠标指向全局变量图标,然后点右键,在出现的快捷菜单中选择Select Item,即可出现该全局变量中包含的变量列表,选择其中的String。
如下图所示。
有时需要从全局变量中读数,有时需要向全局变量写数。
这时可利用快捷菜单改变其属性,以上图为例,选择Change To Write 就可以向全局变量写数。
练习8-4 结束练习8-5 用全局变量控制程序流程这是一个使用全局变量控制程序流程的例子。
下图的左上边是主程序的前面板,有三个按钮,分别控制调用子程序1和子程序2和终止程序运行。
右边是对应的框图,下方是两个子程序的框图。
所期望的功能是在打开子程序1的同时还在主面板上打开子程序2,同时也可在主面板上直接关闭程序,不管子程序是否在运行。
为了在主程序上关闭子程序的运行,设置了全局变量quit ,当按下EXIT 按钮时,其值(TURE )同时传给全局变量quit ,如果有子程序在运行,则按照设定的逻辑(STOP 按钮为T OR Quit 为T 停止运行)子程序退出运行,同时主程序也退出运行。
如果没有这个全局变量,则在主程序上无法控制子程序的退出。
为了保证程序中开关初态的正确,需要在程序开始运行前置初态,为此主程序增加了分为两步的顺序结构。
程序开始运行时,首先置全局变量为F.在顺序结构的第二步中,外循环中的三个循环是并行的,程序运行中将巡回执行这三个循环,这样保证Exit按钮能起作用。
练习8-5结束8.2.2使用全局变量和局部变量的注意事项全局变量不仅可以在不同VI间传递数据,而且可以通过它传递消息,控制各VI的协调执行。
它在程序设计中很有用.但无论是全局变量,还是局部变量使用过多也会带来一些其它问题,必须引起注意。
首先,从程序的静态结构上看,会使程序结构不直观,造成混乱。
其次在程序运行过程中可能带来数据状态的竞态现象,这主要指因为全局变量作为一种可读可写的中间变量,应当严格控制读写的操作,最好是使它们处于“一写多读”的状态。
否则可能带来问题。
8.3属性节点(Property Node)作为面向对象的软件,其前面板对象自然应当有其属性,不同类型的对象可能的属性种类和个数也不同。
通过属性的控制,可以使程序界面更加丰富多彩,实现更好的人机交互功能。
Labview引入属性节点(Property Node)的概念来设置前面板对象的属性,并且允许在程序运行中动态地改变属性。
8.3.1属性节点的创建我们举例来说明属性节点的创建。
1.在前面板上创建一个对象,例如Tank如下图左。
2.在Tank图标上点右键,在出现的快捷菜单上选Create →Property Node,则在框图上出现属性节点如上图右,注意这是显示了一个属性Visible。
3.用鼠标右键点击Tank的属性节点,在出现的快捷菜单上选Properties项,可以看到大量的属性供选择。
如果需要从中提出3种属性使用,可以先用鼠标在属性节点的右下角向下拖拉,直到出现3个默认的属性描述拦。
然后在快捷菜单下逐个选择所需的属性修改其内容。
这样就完成了一个属性节点的创建一个面板对象所具有的属性可能有数十个,不同面板对象所具有的属性也有差别。
例如对于一个数字控制量对象,它的属性有●Visible数据类型为布尔型。
当Visible值为False时,面板对象被隐藏。
相反则可见。
●Disabled数据类型为整型。
当输入参数为0或1时,用户可以访问该对象,当输入参数为2时,用户不能访问。
Blinking 数据类型为布尔型。
当输入值为True时,面板对象闪烁,相反为正常状态。
但是这里闪烁的速度和颜色是由LabVIEW主菜单下的Tools→Options→FrontPanent(和→Colors)两个对话框完成的。
8.3.2属性节点的使用练习8-6使用属性节点控制屏幕初始化和指示灯闪烁通常Chart图有一个默认的特点,第二次运行程序时,前一次运行时画出的曲线不会抹去,而是接着往后画,有时我们希望先清屏,再从头画起。
该例子中将实现这个功能。
同时还希望制作一个闪烁的指示灯。
程序面板和框图如下。
该程序产生101个随机数,在一个Chart图表上显示,当产生的数据大于0.5时面板上的指示灯闪烁。
为此给指示灯配了一个Blinking属性节点,并将其置为可写状态。
连接框图如上右所示。
为了在程序开始运行时先对Chart清屏,为Chart配了一个History属性节点,在循环开始之前,首先将0.00赋给History。
注意这里在程序执行顺序上的一个技巧。
本来我们可以画分两步执行的一个顺序结构,但那样做不仅程序不直观,也复杂化了。
这里只画了一个单步的顺序框,省去了第二步的框,通过一条(可以认为是虚设的)由初始化50ms的延时连线,规定了执行的顺序,保证初始化在先。