NI LabVIEW是一类图形化数据流编程环境。 使用LabVIEW中的数据流时,您能通过创建展现数据如何在函数(所知的虚拟仪器,或称VI)间移动的程序框图,界定代码中的执行流程。 然而,借助LabVIEW,您能够在单一应用程序中结合除了图形数据流(G)之外的更多种类的编程方式。 利用这种灵活性来选用您中意的工具,从而创建算法并且解决各类工程问题。
定义编程方法
“编程方法”一词囊括:不同的编程语言、运算模型、抽象级别、与现有代码交互的方式、表示算法的途径。 过去几年,National Instruments在LabVIEW通信中加入多种接口和方法,以提供更多的编程方法。
您能编写多种方法,并将其作为熟悉的G数据流语言导入相同的程序框图。 LabVIEW编译所有这些针对合适硬件对象的方式;这些硬件对象的范围涵盖:台式计算机、实时操作系统、现场可编程门阵列(FPGA)、移动设备和嵌入式处理器(如:ARM)。
图1. LabVIEW图形化系统设计平台提供诸多选择。
深入了解获得支持的对象和平台。
发送并接收不同编程方法间的信息,可通过LabVIEW轻松实现。 数据���是将不同语言和计算模式黏连在一起的胶合剂。 信息和数据值能够轻松地从自定义用户界面(已知的前面板)、网络接口、分析库、数据库和I/O,被传送至使用G的不同语言或界面。
用G进行的编程
当NI在1986年引入LabVIEW 1.0时,数据流作为基本的LabVIEW编程方式是原创而且惟一的编程途径。不同于顺序类型的编程,数据流程序里的数据流动反映了操作执行的时间与顺序。 在C和C++等顺序语言里,源代码中的命令顺序(相对于数据的可用性)决定着执行时的顺序。
G依照数据流模式运行函数与基元,或称VI。当所有输入俱在时,程序框图函数或节点运行。 节点运行结束时,将数据提供给输出接线端并将输出数据传送给数据流路径中的下一个节点。
图2. 在该模型中,A和B被加入,结果乘以C并得以显示。
图2中的图形化代码表现了数学公式如何能被G代表。该框图包含2个节点(1个加节点和1个乘节点),并具有3个数值输入(A、B和C)。 首先,加入A和B。 在提供两个输入前,乘节点一直不执行,因此它仰赖加节点完成并提供A + B的结果;然后,它才计算结果——(A+B)*C。
虽然有可能明确界定G中的变量,G代码和其他语言之间最明显的一处差异在于:功能上等同于传统变量的是一条连线。 连线没有在函数间传递变量,而界定着接纳值的函数。 其他熟知的编程概念(如:While循环、For循环、条件代码、回调函数和数字逻辑)都是G数据流编程语言的部件。
更深入了解图形化编程。
使用基于配置的编程
2003年,National Instruments发布了NI LabVIEW 7 Express,它具备Express VI——一种用来进一步简化常用编程任务和算法创建的新技术。 不同于传统的VI,Express VI通过提供基于配置的编程方式,对任务加以抽象。
图3. 这里有出现在选板上的Express VI,被率先放在程序框图上的1个Express VI,用图标代表的1个Express VI。
LabVIEW用大型蓝色图标区分Express VI。 当您将1个Express VI放在程序框图上时,会出现1个对话框以便您配置函数的执行方式。 完成配置后,LabVIEW开发环境为您编写必要的代码(用Express VI代表)。 您能查看并修改该代码,而且您只需双击Express VI图标就能修改Express VI配置。
将读取实际信号的任务纳入软件考虑范畴,用于分析。 凭借针对数千类仪器的自带驱动与支持,LabVIEW的设计使得与硬件I/O集成简单轻松。 然而,即便是一项需要一批VI执行的任务也能被简化为单个Express VI。 DAQ Assistance Express VI可促进您选择自己希望往返传送和接受I/O的通道,并配置参数(如:采样率、终端配置、标尺、触发和同步)。 保存配置前,您还能在界面中预览数据。
图4. DAQ Assistant Express VI令配置定时与通道参数异常简单。
图5. DAQ Assistant Express VI功能上等同于G代码。
Express VI不提供与VI一样的低层输入控件,这就是您为何更喜欢用VI完整编写代码的原因。有兴趣学习低层结构的新用户,可通过右单击Express VI并选择打开前面板(Open Front Panel),轻松地将Express VI转化为内部的G代码。 普通VI能够完成Express VI做的任何事。LabVIEW专业版开发系统还纳入1项工具来创建自定义Express VI。
结合.m文件格式
凭借LabVIEW MathScript RT模块,您能导入、编辑并且执行.m文件,一种针对数值分析、信号处理和高等数学的通用编程方式。 通过将它们与配有G的VI结合,您能将这些脚本构建至运行在台式计算机以及确定性实时硬件上的独立可执行程序。
结合LabVIEW中的MathScript有多种方式。 对于帮助下载、保存、开发并执行.m文件脚本的交互界面,您能使用MathScript窗口,如图6所示。
图6. 利用MathScript窗口,交互式开发文本算法。
将.m文件脚本部署为LabVIEW应用程序的部件并结合图形化与文本编程,可用MathScript节点。 借助MathScript节点,如图7中显示的程序框图上的蓝色结构,您能够通过LabVIEW图形化程序运行.m文件脚本。 您能使用MathScript节点将文本算法插入VI,然后使用LabVIEW图形化编程环境并通过添加旋钮、滑动杆、按钮、图表和其他用户输入控件与显示控件来装配文本。 MathScript节点可利用用户自定义函数;这些函数既能接受应用程序的其他部分定义,也能从磁盘加载。
图7. MathScript节点能够轻松连接G编程与.m脚本。
LabVIEW MathScript RT模块无需更多第三方软件,就将自带的.m文件脚本支持加入LabVIEW。 因为您能使用MathScript节点纳入并且运行.m脚本,所以您能使用流行的编程方式,同时仍旧利用LabVIEW与I/O的紧密集成、交互式用户界面和此处描述的其他方式。
借助面向对象开发
面向对象是一类跨越广大编程语言的流行编程方式。 它允许各类相似却不同的项目,被代表为软件中的一类对象。 类的定义包括:各个对象的特性和类能够完成的行为,通常将他们称为属性和方法。 类能够拥有继承这些属性与动作的子类,而您能添加更多特征或者重写现有类。
图8. 面向对象采用一个类(例如这一个)及其相关属性与方式VI。
LabVIEW开发者如果更适宜面向对象的编程方式,可在LabVIEW 8.2或更高版本中定义一个类。 在LabVIEW中采用类的首要优势是:
封装: 封装就是将数据和方法合并到一个类中,类中数据仅可由类成员VI访问。通过封装可创建模块化代码块,以便轻松更新或修改代码而不影响应用程序中其他部分的代码。
继承: 通过“继承”可在现有类的基础上创建新类。 若创建一个新的LabVIEW类并将它设置为继承另一个类的数据及成员VI,这个新类可使用它继承的类中“公共”及“保护”型的成员VI。 这个新类还可添加自己的数据和成员VI以丰富其功能
动态分配: 有时也可在类层次结构的多个VI中定义同名的方法。 这些方法称为动态分配方法,因为直到运行才可确定LabVIEW调用的是哪一个VI。
这些面向对象的特征强化操作,使得代码更加可读、可扩展并且限制访问明确获得准许的VI中的信息。 这种开发方式是另一类采用G来代表算法与操作的途径,因此让您能够灵活选择您更加适宜也是最适合应用的设计与方法。
建模和仿真程序框图
如果您在设计一类能够被微分方程描述的复杂系统,在软件中进行物理系统的仿真和建模是一种流行方式。 借助它,您能够分析模型从而了解动态系统的特征并且创建能够实现理想行为的控制器。
图9中的控制和仿真循环实现了微分方程根据常微分求解的确定性执行——其中许多都存在于LabVIEW中。 这种编程方式采用一种看起来酷似G、但作为信号流被更好表达的数据流。 如图9所示,您能够将基于模型的编程方式与其他方式(包括:G和MathScript节点)结合。
图9. 这个仿真程序框图展现了:信号流、硬件I/O和MathScript节点。
控制和仿真循环支持的函数,有助您将离散线性时间不变(LTI)系统模型部署至NI实时硬件。 您能使用这些函数,在传递函数、零点—极点—增益或状态空间模型中,界定离散控制器模型。 通过时间和频率分析工具(如:时间阶跃响应或伯德图),您能交互式地分析开环和闭环行为。 您还能采用内置工具转换在MathWorks, Inc. Simulink®软件中开发的模型,以搭配LabVIEW。多亏LabVIEW Real-Time模块,这些动态系统无需任何中间步骤就能被部署至硬件目标,这非常适合快速控制原型和硬件在环应用。
搭配状态图的文档编制
NI LabVIEW状态图模块提供状态图;状态图属于高层设计文档,有助您用图解释系统功能。 结合LabVIEW图形化数据流来定义各状态的行为时,状态图(statechart diagram)可作为可执行规范运行。 状态图通过扩展经典状态图加入并发(concurrency)与层次结构,以便您能表述包含并行任务的系统。 此外,状态图还纳入一种正规方式来响应事件,从而理想地描述反应系统。 这特别适合设计嵌入式设备、控制系统和复杂的用户界面。
图10. LabVIEW状态图模块采用状态图来图解系统功能。
您往往可以创建高层程序框图来阐释应用程序中不同系统和子系统之间的工作关系。 例如,应用程序可能具有相互独立的进程,各进程负责数据采集、数据输出、网络通信、数据记录和更新用户界面等任务。 这些通常被用来断定在不同系统上提供并共享哪些信息,以及指定系统执行次序的逻辑。 您能轻松将这些程序框图转译为LabVIEW状态图表程序框图,从而在软件中轻松开发实际系统。
状态图运算模型能够繁复地进行复杂的应用开发。 状态图特别适用于事件响应方面的应用(如复杂的用户界面等),和用于实现动态系统控制器、机器控制逻辑和数字通信协议的高级状态机。
了解NI LabVIEW状态图模块。
编写面向FPGA终端的VHDL
您能采用LabVIEW FPGA模块来编写运行在采用G的FPGA上的代码。然而,和使用之前的编程方式一样,您可能希望复用现有代码或者灵活选择执行方式。 大多数FPGA在采用VHDL进行编程,VHDL是一种基于文本的数据流描述语言。 借助组件级IP (CLIP)节点,无需重新在图形化语言中编写已有的VHDL IP即可将VHDL导入VI。
CLIP节点提供的框架,可将外部FPGA IP导入LabVIEW FPGA模块。 CLIP XML文件通常用来将现有IP接口映射至能够在VI程序框图采用的值,但LabVIEW包含一个可自动创建该接口的CLIP导入向导。 它列示了LabVIEW项目中方便您拖曳至程序框图并在FPGA上使用的IP的输入与输出,如图11所示。
图11. 该LabVIEW状态图表程序框图展现了CLIP节点。
由于NI将Xilinx FPGA和Xilinx工具链作为LabVIEW FPGA模块的部件,您能轻松使用Xilinx内核生成器(CORE Generator)来创建兼容的内核。 您还能使用Xilinx嵌入式开发套件来创建各类软性微处理器。 此外,许多第三方IP供应商可提供各类信号处理、总线解决方案或特定应用的内核。
更深入了解NI LabVIEW FGPA模块和CLIP节点。
结合基于C的语法
您能够在多种技术中择取一种,将接受顺序执行的文本语法纳入VI程序框图。 公式节点提供一类在线结构,支持一种类似传统C编程的语法。 类似C,每行以分号终止而且变量必须具有一个指定的范围。
内嵌C节点类似于针对底层编程和头文件的具备额外支持与功能的公式节点,省去了函数调用的开销(overhead)。 您能采用针对各类C代码的内嵌C节点(包括:装配指令),并且定义它语法上存在于C文件内的波形括号之间。
内嵌C节点只适合采用生成的C代码的对象。 内嵌C节点不支持Windows桌面对象。
连接构建的程序集
若不将源代码导入LabVIEW程序框图,您可能希望在其他环境中调入构建的程序集或者复用构建的LabVIEW应用程序。 在LabVIEW中编写的应用程序,能够轻松复用通过其他语言或编程方式开发的现有代码与算法。 此外,您或许需要通过LabVIEW代码(这包括上面讨论过的编程方式)构建汇编,从而接受不同环境的调用。
LabVIEW提供针对两种情形的多项解决方案。 LabVIEW能够调用DLL或共享库里的外部代码或者通过ActiveX或.NET接口显露的代码。 此外,您能通过构建LabVIEW DLL或共享库,或通���采用ActiveX,复用其他编程语言中的LabVIEW代码。
如果您具备现有C代码并且需要在LabVIEW中加以复用,有一项技术可用来将代码构建为DLL并且采用“调用库函数节点”对其进行调用。 事实上,基于C应用程序架构,您能采用简单的LabVIEW并行编程来并行运行两个或更多现有的C例程,舍弃了基于C的多线程编程的更多复杂性。 为了轻松导入外部库,LabVIEW纳入“导入共享库向导”,从而自动创建或更新针对Windows .dll文件、Mac OS .framework文件或Linux .so文件函数的LabVIEW包装VI项目库。
还可以结合System Exec.vi连接命令行;它提供特定操作系统的界面,用以调用可执行文件和其他内置库。
利用灵活式编程
将多种编程方法结合在单一的开发环境中,就能复用由其他语言开发的现有代码和算法。 还可以搭配低层代码来结合简单的高度抽象,以便更好地显示和控制应用程序。 这些抽象层用简单易读的形式代表极为复杂的操作,却能接受对应用行为和硬件接口进行低层控制的函数的耦合。 凭借与I/O的紧密集成,您能将这些方式与实际信号结合从而利用最新的硬件技术,如:多核CPU、FPGA和嵌入式处理器。
可通过多种方式解决各类问题——LabVIEW还能让您灵活选择多种编程方式。
Simulink® 是MathWorks, Inc.公司的注册商标。
ARM, Keil与 µVision是ARM有限责任公司或其子公司的商标或注册商标。
1 并非所有的编程方式都适合列示的对象,取决于实际资源和特征支持。
评论
查看更多