LabVIEW程序风格协定II
Block diagram是其他人看懂VI如何工作的主要途径,因此它常常需要我们遵循一些简单的步骤来使Block diagram组织性更强,更易阅读。
VI的Block diagram的样式是非常重要的就如前面板的样式一样。用户可能看不到Block diagram,但是其他的开发人员可能看到。一个计划好的,格调一致的Block diagram是很容易理解以及便于修改的。
连线技术
你可以使用在工具条上的下拉菜单来排列分配目标对象在Block diagram中的对称位置。当对象被整齐的排列分配好后,你可以使用直线来连接这些对象。使用直线连接可使得Block diagram更易阅读。
下面一些好的提示,告诉你如何使得Block diagram更加整洁:
1)避免把线置于Block diagram中如子VI或结构对象之下,因为LabVIEW可能隐藏一些结果线的片断。你所画的线务必要让你清楚的看到它是否正确的连接到终端上。
2)尽可能少加弯曲,缩短线长。避免把线拉的太长,这样不容易阅读。
3)删掉无关紧要的线。
4)在你使用连线来传递数据的时候避免使用局部变量。每个读取数据的局部变量都会建立一个数据的拷贝。
5)在数据没有被用于结构之中,不要把线连通结构。
6)使平行的线间空隙均匀。
内存和速度优化
优化LabVIEW VI的使用和运行时间,你有很多需要做。当程序有大量的数组或者严格时间限制的时候,优化显得尤为重要。
虽然优化是一个非常棘手的题目,以下可以作为程序的一些基本的优化操作:
1)如果在While loop中速度不是很重要的,添加一个等待功能块,可以避免拖慢其他任务。一般来说,LabVIEW会以最快的循环速度来运行While loop中的代码,这样会很耗费系统资源,从而使得其他一些代码得不到最有效的执行。这样会看上去电脑运行的非常慢,及时它仅仅实在运行几个简单的循环。
用Wait(ms)功能块来加入稍许的延迟可以帮助电脑正常运行循环以外的其他任务,而不影响循环的正常工作。一般设置一个50到100ms的延迟完全足够了,但是程序中的其他一些因素可能影响到延迟。延迟不合任何数据发生关系,如图6所示。
图11 While Loop 50毫秒延迟
如要完全避免这一问题,使用事件结构。事件结构不会消耗处理器资源,它会等待用户界面事件发生后才进行相应的动作。
2)如果可能,尽量避免在循环中使用建立数组功能块来建立数组,因为功能块会不停的调用LabVIEW的内存管理器。建立数组一个更有效的方法是使用自动索引或者数组大小预定义并使用数组元素替换功能块来添加数据到其中。在字符串处理时同样会有这样的问题存在,因为在内存中LabVIEW是把字符串按照字符数组来处理的。
3)尽可能珍惜使用全局和局部变量。你可以使用全局和局部变量来有效的书写VI。然而,如果你滥用全局或局部变量,特别是数据类型,会增加VI的内存使用量并影响性能的表现。
除此之外,你同一个程序中同时读写全局变量的时候可能碰到紊乱的情况。这些紊乱的情况在调试的时候很难被发现,因为同一个全局变量在不同的VI中没有数据关联。
考虑使用功能全局变量来替代全局变量。功能性全局变量不会建额外的数据拷贝,并且允许如初始化,读写和置空等操作。
4)选择合适的数据类型数组来操作数据,对于控制程序在内存中使用量控制来说是很重要的。例如,如果你有100000个扩展精度的浮点数组,但是实际上只需要以单精度浮点值来进行存储,这样会出现内存不够使用的情况。使用单精度浮点值数组进行储存,可以有效的减少内存的使用量。下表可以看出不同数据类型占用内存的情况。
Array Data Type | Memory Used |
Array of 100000 EXT Values | 1MB |
Array of 100000 SGL Values | 400KB |
Memory Saved | 600KB |
5)避免强迫数值类型转换的情况出现,可以有效的降低内存的使用量和速度。强迫类型转换出现会使得LabVIEW在转换过程中再复制一份数据。特别是在你的数组特别大的时候,其效果更为明显。
6)前面板指示器数据的频繁更新会影响到VI的性能,特别是如果你在用图形或者图表显示数据的时候尤为明显。为了优化这些VI,在前面板上只显示必要的信息,并且只有在更新数据和指示器中数据不同时候才进行数据的刷新。
大小和位置
Block diagram窗口的大小会影响你LabVIEW代码的可读性。不要让Block diagram窗口的大于你的屏幕尺寸。在确保LabVIEW代码能显示完的情况下,尽量缩小Block diagram窗口的尺寸。如果代码大于窗口大小的话,会很难于阅读,因为这不得不使使用者来回拉动滚动条。如果代码实在太多了,而一个屏幕不能显示完的话,建议只在一个方向上进行滚动(推荐滚动方向为左右方向,因为LabVIEW为数据流格式传输数据,推荐的格式也是从左到右,所以我们也建议程序代码太大的情况下,左右移动为好,见下条规则)。
从左到右布局
LabVIEW使用从左到右的布局,所以Block diagram也需要遵循这一规则。因为程序中的元素不能决定执行的顺序,所以要避免从右到左的连接。只有连线和结构可以决定执行的顺序。
Block Diagram注释
对程序进行修改和维护的开发者需要一个对block diagram好的文档说明。没有这个,修改代码是一件十分耗时和容易造成新的错误根源。以下是一些对Block diagram注释的建议。
1)使用注释来帮助解释Block diagram代码的作用是什么。LabVIEW代码虽然是图形化的,但是它没有自注释功能。在功能面板上的自由标签可做block diagram注释之用,加上一定的背景颜色,可达到注释的效果。
2)不要在功能块和子VI调用上显示标签,因为他们可能会很大,而且显得十分笨拙。开发者可通过Context Help窗口看到功能块或者子VI的名字。
3)在连线上使用自由标签来确定他们作用。贴上标签的连线对于来自shift register和跨越了整个block diagram的长线线条来说十分有用。
4)在结构上使用标签来确定结构的主要功能。
5)使用标签来显示常量的特性和功能。
6)在调用库功能节点时候使用标签可以明确功能节点的作用和调用者路径。
7)用注释来解释Block diagram中运算法则的功能。如果使用某本书或者参考资料的运算法则,可用注释来提供这些参考的信息。
调用库功能节点和代码接口节点
包括调用库功能节点和代码接口节点(CINs)的VI是根据平台而定的。使用调用库功能节点来调用共享库的VI由平台而定,如果你在不同的平台下调用,可能你的到的结果是完全不同。如果你把包含调用库功能节点的VI移植到其他平台上,你必须更新节点调用共享库所用到的目录路径。
如果你写的VI含有CINs,对于不同的平台你需要不同的VI版本,因为不同的平台编译的CINs可能不同。当你移植包含CINs的VI到其他平台时,你必须重新在信的平台上重新编译代码,并重新把它加载到CIN中去。
如果VI包括调用库功能节点或者CIN,你又想在不同的平台上使用该VI,一定要考虑提供不同版本的VI来适应不同平台的调用需要。
类型定义
当你在超过一个地方使用同样的唯一的控件或者当你有非常的数据结构需要在几个VI间传递的时候,请使用类型定义。使用类型定义控件,LabVIEW会在各个VI间自动把改变传递到控件或者数据结构中。
顺序结构
少使用顺序结构,因为他们会隐藏代码。尽量靠数据流来控制运行的顺序,而不是用顺序结构。当你在顺序结构中用到顺序局部变量时,你会破坏从左到右的数据流规范。为了帮助控制数据流,你可以使用错误簇。
如果你必须使用顺序结构,尽量使用Flat顺序结构,它不会隐藏任何代码。如果你在VI中使用Stacked顺序结构,一定要把最重要的一帧显示出来。
IX.图标和连接板风格
在为VI建立图标和连接块时使用好的风格技术对那些VI的使用者来说是非常有益的。
图标
图标是VI在面板和Block diagram中VI的代表。当子VI拥有设计好的图标,开发者可以很好的理解子VI的意思,而不需要过多的文档描述。
在建立图标时,使用一下建议:
1)为每个VI分别建立一个有意义的图标。LabVIEW库中有许多设计好的图标,通过图标可以很容易理解程序的功能用途;在可用的地方使用他们作为原型。如果你没有图片,文字也是可以用来表达的。如果你局部化应用程序,同样务必局部化图标中的文字。
提示 在文字图标中8p的小字体看上去是最舒服的。
2)建立图标的时候不要使用口语化的文字。口语化的文字是很难翻译的。翻译不好可能导致用户对图标错误的理解。例如,一个数据采集的VI使用一副树枝图片或者伐木工人的图片,则不好表示其意思。
3)为关联的VI建立统一的样式。这能帮助使用者直观上上层VI和被调用子VI之间的关系。
4)如果需要打印用,则需要使用黑白图标。不是每个用户都有彩色打印机。
5)建立图标使用尺寸为32×32象素。小于该尺寸的图标在选择和连接的时候看上去会很难使用。看上去也很不舒服。
6)确保子VI图标在Block diagram上是可见的。右键点击子VI,选择可是项目》终端。确保终端选项没有被选中。子VI图标比Block diagram上的连接块更有用。
图标形象例子
图12 PID VI
上面的PID VI可以看出自整定等以及其各个VI的功能。可以看出每个VI都很少用到文字来描述VI的意义。所以可以说这些VI适合于各种语言的使用者。
连接块
连接块反映VI的输入与输出的终端情况。
建立连接块时,使用以下建议:
1)一定要选用足够多的终端的连接块样式。因为你很难确定是否以后还会需要更多的终端。而改变样式在重新调用VI时需要重新连接子VI,这会导致不相容的错误发生。
好的连接块样式是4×2×2×4的样式,如下所示。
2)左边连接输入,右边连接输出,这样符合标准的从左到右的数据流格式。
分配终端作为输入和输出时,务必合理分配连接块的各个终端。如果你需要使用4×2×2×4块中的中间4个终端,要么按照上下,或者左右进行分配。例如,要么把上面两个分配给输入,下面两个分配给输出,或者把左面两个分配给输入,右面两个分配给输出。如下所示。
3)相关的VI选用同样的连接块。这样便于相关的VI间进行连接,References,taskIDs,error clusters或者其他的通用终端能正确的连接在一起。
4)选择连接块样式不要超过16个终端。太多的终端可能看上去很有用,但他们在连接上会非常困难。如果有太多的数据需要传递的话,请使用簇。
5)连接块至少应该具有8个终端,使用4×4样式,如下所示。这一样式确保所有的VI,甚至是很少输入的VI,都能正确的用直线连接起来。
6)在分配终端时,一定要想好各个VI应该怎样连接起来。如果你建立了一组你经常一起使用的子VI,给子VI一个一致的连接块,使常用的输入使用同一个位置,这样可以帮助你记住他们的位置。如果你要建立一些输出,作为另外一个VI的输入,把这些输入和输出排列好,尽量简化连线。
7)为每一个终端设置必须,推荐,可选,以避免使用者忘记子VI的连接。如下所示
图13 Required,Recommended,Optional
必须表示使用者必须正确连接才能进行运行。可选使用缺省设置,大多数情况下不需要连接输入。
8)把所有子VI中的包括error in和error out簇,甚至子VI可能没有错误处理。Error in和error out簇对于控制运行流是非常有帮助的。如果子VI有错误的进入,你可以使用Case结构来发送错误,而不执行其他子VI。
9)尽量是前面板和连接块的布局一致。
X.菜单格式
菜单尽量遵循系统菜单格式。对于Windows系统来说通常的格式是
============
文件 编辑 查看 工具 帮助
============
我们在LabVIEW测控程序中可能使用的菜单格式会有所不同,但大的方向我们应该遵循。建议使用同上面相同的菜单作为总的菜单栏。其下的可以有所不同。因为在测控程序可能会有一些通用菜单没有的项目。比如说“开始测试”等。在以往所做一些项目程序中,总结出如下的菜单格式。
============
文件 设置 测控 图形 帮助
============
以上菜单格式这是一个参考,但希望大家都能遵循这一样式。
文件(File)
文件主要对当前数据的保存和历史文件的读取,打印,程序的退出。
文件
保存
另存为
---
读取数据
---
打印报表
---
退出
设置(Settings)
设置包括的信息很多,包括设备的校准,仪器的参数设置,程序的初始值设定,记录时间的设定,采集间隔设定,判稳参数等等。由于设置的参数比较多,也可以根据需要对有些参数设定进行增减和并和。
设置
初始设定
仪表参数
校准
被测机信息
设定一致
记录时间设定
判稳依据
采集间隔
电源设定
测控(Control)
测控设定控制的顺序,开始测试,控制设备起停等。
测控
开始新测试
结束当前测试
喷嘴开关
机组起停
图形(Graph)
图形对于当前测试数据的图形表示,或者历史数据的图形表示。便于用于直观的了解被测体的运行情况,或者整个工作环境工况。
图形
被测机参数
环境参数
---
历史数据
帮助(Help)
本程序一些操作说明,以及支持信息注册信息等等。
帮助
主题帮助
支持信息
在线支持
注册信息
---
关于
XI.模块定义
模块,可以重复利用的程序块。通过模块使用,可是使得程序在开发过程中加快程序开发进度,也使得更加的容易阅读和理解。对于经常使用的代码,可以通过写入子VI中的形式来进行模块化。把这些模块放入LabVIEW安装目录的User.lib中,对于同一类模块,建成.llb的格式,便于进行归类。
图14 User.lib
目前我们建立和拥有的的模块有:
A.设备通讯模块
1)FX三菱PLC通讯模块,PLC_FX2n.llb
2)
B.通用模块
1)OpenG模块,OpenG.lib
2)Windows API Fucntion Utilities(32-bit) for LabVIEW模块,WinAPI.lib
3)工具条模块,Toolbar.llb
C.专业模块
1)湿空气参数计算模块,Calculation of Moist Air Properties.llb
2)
在后续的项目里,我们可以加入更多的模块,为我们的开发带来便利。
XII.整体结构样式
整体结构样式,对于整个程序的合理运行至关重要。好的结构不仅能为整个程序的可读性带来极大的提高,而且对于整个程序的运行性能,稳定性也能带来提升。
在整个程序结构中我们提倡的“初始化”-》“读取”-》“事件控制”-》“保存退出”的整体构架。如下图10所示。
图15 整体结构
这是主程序的整体构架。对于子VI,如果是要实现采集控制功能,也同样建议使用这样的结构。其他情况可以用“初始化”-》“事件控制”-》“保存退出”的结构。
Style Checklist
使用一下Checklist来帮助你维护好程序的样式和质量。你可以把这些Checklist应用到你的整个LabVIEW工程项目中。但这只是一些指导性的规范,你可以根据你的意见提出更好的Checklist,只要是大家都遵循的,可以提高程序性能和可读性的,我们都可以采用。
VI Checklist
® 把VI以分等级的目录组织好,使顶层VI和子目录下的子VI便于找到。
® 不要把太多的VI放在一个库下,因为过大的LLB要花较长时间来保存。
® 使用Tools》Edit VI Libary来标记在LLB中的顶层VI。
® 如果VI会被用于子VI中,建立一个.mnu文件。排列好面板,菜单名称,隐藏依存的子VI。
® 为VI取个有意义的名字,不要加入特殊的字符,如(\),(/),(:)和(~)。
® 使用标准的扩展名,以便操作系统能识别出来。
® 每个VI名字首字母大写。
® 区分VI例程,顶层VI,子VI,控件和全局变量,把他们分别放在子目录中或同一目录下的不同的库中,或者给他们赋以有描述性的名字,如X_main.vi,X_Example.vi,X_Global.vi,X_TypeDef.ctl。
® 书写VI的描述,并校正,检查Context Help窗口。
® 把你名字或者公司名字,包括修改日期放在VI描述中,位置VI Properties》Documentation》VI Description。
® 除了建一个彩色的图标外,同时建立一个有意义的黑白图标。
® 选择4×2×2×4的连接块样式,为以后的扩展预留额外的接口。相似的VI使用同样的连接布局。
® 避免使用超过16个接口的连接块。
® 在连接块上使用必须,推荐和选用设置。
® 设置打印选项,在最有用的格式显示。
® 建立测试VI来检查错误状况,非法值。
® 在其他目录中保存测试VI,以便以后重新用到他们。
® 在不同的平台上加载并测试VI。确保标签显示正常,以及窗口的大小和位置正确。
® 避免使用那些只能在某中平台上使用的VI,特别是应用程序可能用到不同的平台的场合。
® 为不同平台建立不同版本的VI和功能块。
前面板Checklist
® 给控件有意义的名字
® 让控制器和指示器的标签成透明。
® 检查控件名字位置是否一致。
® 在整个前面板中使用标准,一致的字体-application,system,dialog。
® 在可移动的文档中使用Size to Text,并且在必要的时候加如回车。
® 使用路径控件代替字符串控件来指定文件和目录的位置。
® 在子VI前面板的Captions中用括弧来输入缺省值。
® 在名字里包括单位信息。如果可能,例如,使用Time Limit(10Seconds)。
® 为控制器和指示器书写描述,包括数组,簇和refnum元素。记住如果在拷贝这些控件的时候,你可能需要修改这些描述。
® 为前面板的控件添加提示条,这样使用者可以很容易的明白用户界面上控件的功能。
® 认真排列控件的位置,使用下拉菜单的排列对象和分配对象。
® 控件间不要重叠。
® 最好少使用过多的颜色。
® 如果必须的话,请提供停止按钮。不要使用Abort按钮来停止程序,隐藏Abort按钮。
® 恰当的使用Ring和枚举控件。如果你正在使用布尔控件来控制两个选项,考虑使用枚举控件来替代,因为以后可能会有更多的选项加入。
® 使用自定义控件和类型定义,特别是Rings和枚举类型。
® 用和文件一样的名字来标签自定义控件。例如,Alarm Booleam.ctl和缺省名一样Alarm Boolean。
® 确保前面板上的所有控件是同一种风格。例如,不要在前面板上即使用经典控件,又使用3D控件。
Block Diagram Checklist
® 避免建立过大的Block diagram。必要的限制滚动的方向。以便只超一个方向滚动就能看到所有的Block diagram。
® 为每个控件,重要的功能块,常量,属性节点,局部变量,全局变量,以及结构贴上标签。
® 加上注释。如果注释太长,使用自由标签来替代对象标签。
® 可能的话把标签放在对象之下,如果对象左边有其他对象的时候,让文字右对齐。
® 整个界面使用标准统一的字体。
® 所以文字都使用Size to Text,并加上回车。
® 数据流是从左到右。连接线也从左开始,右结束。
® 排列分配功能块,终端和常量的位置。
® 用小的自由标签并配上白色背景来长线左上标记。
® 对象下不要连线。
® 制定文件和目录位置,使用路径常量来代替字符串常量。
® 好好利用可重复使用,可反复测试的子VI。
® 在所有子VI中使用错误进和错误出簇。
® 确保程序能应对错误状况和非法值的输入。
® 为原代码取名,包括所有的CINs。
® 如果VI用到顺序结构,考虑使用Flat顺序结构。
® 保存的时候把多帧结构中最重要的一帧显示出来(Case,Stacked顺序和事件驱动)。
® 仔细查看VI的效率,数据拷贝,精度,特别是没有依存关系的数据。
® 确保子VI的图标,在Block diagram中是可见的。
® 当你在不同的地方使用同一个控件或者当你有非常大的数据结构需要在子VI间传递的时候,使用类型定义。
® 当你在LabVIEW中打开了一个对象,如应用程序,控件,或者VI,请使用关闭LV对象来关闭该references。否则,这个reference会一直保留在内存中。
® 确保属性节点和调用节点的名字格式是设为短名字,这样能确保最佳的可读性。
® 把控制器都放在子VI的左边。
® 当设计子VI的时候,避免把连接块上的终端是来自结构内部。
posted on 2005-03-19 00:42 LabVIEW开发者 阅读(3237) 评论(0) 编辑 收藏 举报