<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://labviewwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Smercer</id>
	<title>LabVIEW Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://labviewwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Smercer"/>
	<link rel="alternate" type="text/html" href="https://labviewwiki.org/wiki/Special:Contributions/Smercer"/>
	<updated>2026-04-20T19:27:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=XControl&amp;diff=12752</id>
		<title>XControl</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=XControl&amp;diff=12752"/>
		<updated>2020-04-05T04:40:51Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Tricks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;XControls&#039;&#039;&#039; were first introduced in [[LabVIEW 8]] and enhance the power of front panel objects. An XControl is a front panel object with dedicated UI logic code linked and encapsulatedin the XControl in order to react to  user events on the controls in contains. An XControl consists of several parts, managed in a &#039;&#039;.xctl&#039;&#039; file. The &#039;&#039;.xctl&#039;&#039; file is a XML-file like the project-file or [[Library]] files. Other parts of the XControl are called:&lt;br /&gt;
*[[XControl:Properties|Properties]]&lt;br /&gt;
*[[XControl:Abilities|Abilities]]&lt;br /&gt;
*[[XControl:Methods|Methods]]&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
An XControl functions like a subpanel in the hosting VI. Subpanels (and therefore XControls) &#039;&#039;can not&#039;&#039; be placed inside an array. Note that you &#039;&#039;can&#039;&#039; define your XControl data as an array of any LabVIEW data type, and you &#039;&#039;can&#039;&#039; use array controls in the facade vi. &lt;br /&gt;
&lt;br /&gt;
Using LabVIEW native objects (.lvclass files) inside the state control of an XControl tends to crash LabVIEW for versions less than 8.5.1 when the XControl is used in a different application instance.&lt;br /&gt;
&lt;br /&gt;
Also, XControls have limitations when running in VIs that are part of a [[Library]] (or [[Packed Project Library|Packed Project Library (PPL)]]), or a [[LabVIEW Class]].  This makes it difficult to use in a large application using [[Actor Framework]] or plugin architectures using [[Packed Project Library|PPLs]].  See more in the [[QControl|QControls]] article.&lt;br /&gt;
&lt;br /&gt;
== Tricks ==&lt;br /&gt;
*If you require a variable number of runtime instances of your XControl, Jarrod Slocum of [[National Instruments]] has created an example [http://community.ni.com/examples/linked-object-list-in-labview-8-0-using-xcontrols Linked Object List] based on a Subpanel &#039;&#039;inside&#039;&#039; an XControl.&lt;br /&gt;
&lt;br /&gt;
* If you want to react to dynamic events (or user events) you need them to register at the XControl Facade &#039;&#039;&#039;before&#039;&#039;&#039; the event happens.&lt;br /&gt;
* If Façade is not executing fast enough to keep up with data updates, it causes the updates to queue up. The updates will happen even after the VI stops running. To reduce data updates:&lt;br /&gt;
Thanks to Ram Kudukoli (of NI R&amp;amp;D) for sharing this with us at the recent CLA Summit:&lt;br /&gt;
&lt;br /&gt;
** Open the Xcontrol .xctl file in a text editor like Notepad.&lt;br /&gt;
** Add the bolded line shown below:&lt;br /&gt;
 &amp;lt;Property Name=&amp;quot;NI.Lib.Version&amp;quot; Type=&amp;quot;Str&amp;quot;&amp;gt;1.0.0.0&amp;lt;/Property&amp;gt;&lt;br /&gt;
 &amp;lt;Property Name=&amp;quot;NI.XClass.Flags&amp;quot; Type=&amp;quot;Int&amp;quot;&amp;gt;0&amp;lt;/Property&amp;gt;&lt;br /&gt;
 &#039;&#039;&#039;&amp;lt;Property Name=&amp;quot;NI.XCtl.OptimizeDataUpdate&amp;quot; Type=&amp;quot;Bool&amp;quot;&amp;gt;true&amp;lt;/Property&amp;gt;&lt;br /&gt;
 &amp;lt;Property Name=&amp;quot;NI.XItem.DeclaredLeakProof&amp;quot; Type=&amp;quot;Bool&amp;quot;&amp;gt;false&amp;lt;/Property&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
** Save the .xctl file.&lt;br /&gt;
([http://lavag.org/topic/15680-no-update-on-x-control-value-change/page__view__findpost__p__94838 LAVAG source])&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
*[[QControl|QControls]]&lt;br /&gt;
&lt;br /&gt;
[[Category:XControl]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Songs_for_the_LabVIEW_Programmer_(songs_about_LV_and_the_dataflow_experience)&amp;diff=8933</id>
		<title>Songs for the LabVIEW Programmer (songs about LV and the dataflow experience)</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Songs_for_the_LabVIEW_Programmer_(songs_about_LV_and_the_dataflow_experience)&amp;diff=8933"/>
		<updated>2019-08-28T21:55:17Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Provide attribution and reference to the original content.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note: The content here can be found in better formatted form in this NI forum thread:&lt;br /&gt;
&lt;br /&gt;
https://forums.ni.com/t5/BreakPoint/Songs-for-the-LabVIEW-Programmer-songs-about-LV-and-the-dataflow/td-p/1205355?profile.language=en&#039;&#039;&#039;&lt;br /&gt;
===&lt;br /&gt;
Quoting from Aristos Queue:&lt;br /&gt;
    Last year at the LAVA BBQ here at NI Week, several users -- after a bit of drinking -- discussed the need for some LabVIEW drinking songs. Since NI tries to be responsive to user needs, I started creating songs to meet that need, and pulled on other R&amp;amp;D team members to help out. I already had a couple of children&#039;s songs for teaching LV to kids. So for the LAVA BBQ last night, I released Songs For The LabVIEW Programmer. There were only paper print outs available last night. Today I&#039;m posting the songs for everyone to enjoy.&lt;br /&gt;
&lt;br /&gt;
===================================&lt;br /&gt;
Songs For The LabVIEW Programmer&lt;br /&gt;
&lt;br /&gt;
Drinking Songs: Songs for singing in groups, particularly while drunk, celebrating LabVIEW.&lt;br /&gt;
&lt;br /&gt;
Teaching Songs: Songs for young children, just learning LabVIEW for the first time.&lt;br /&gt;
&lt;br /&gt;
Emotional Songs: The angst, the joy, and all the other emotions that programming LabVIEW may raise within the soul.&lt;br /&gt;
&lt;br /&gt;
The Debugging Tune*&lt;br /&gt;
(to the tune of The Itsy Bitsy Spider**)&lt;br /&gt;
&lt;br /&gt;
The execution highlight&lt;br /&gt;
goes down the wire route.&lt;br /&gt;
All along the way,&lt;br /&gt;
probes may call the data out.&lt;br /&gt;
If it hits a breakpoint then there it will remain&lt;br /&gt;
until the Pause button&lt;br /&gt;
lets the highlight move again!&lt;br /&gt;
&lt;br /&gt;
* because spiders are good at removing bugs&lt;br /&gt;
** feel free to adapt the original’s hand gestures!&lt;br /&gt;
&lt;br /&gt;
There Was An Old Lady Who Wrote A VI&lt;br /&gt;
(to the tune of There Was An Old Lady Who Swallowed A Fly)&lt;br /&gt;
&lt;br /&gt;
There was an old lady who wrote a VI.&lt;br /&gt;
I don’t know why she wrote the VI – it’s a blank VI!&lt;br /&gt;
&lt;br /&gt;
There was an old lady who dropped “Simulate Signal.”&lt;br /&gt;
I don’t know why she needed the signal&lt;br /&gt;
– perhaps she just likes a noisy signal?&lt;br /&gt;
She needed the signal to start the VI.&lt;br /&gt;
I don’t know why she wrote the VI – perhaps she’s high?&lt;br /&gt;
&lt;br /&gt;
There was an old lady who dropped “Power Spectrum.”&lt;br /&gt;
I don’t know why she needed the spectrum&lt;br /&gt;
– perhaps she just pulled it out of her rectum?&lt;br /&gt;
She needed the spectrum to filter the signal.&lt;br /&gt;
She needed the signal to start the VI.&lt;br /&gt;
I don’t know why she wrote the VI – it’s a trivial VI.&lt;br /&gt;
&lt;br /&gt;
There was an old lady who dropped a graph.&lt;br /&gt;
I don’t know why she needed the graph&lt;br /&gt;
– perhaps she did it just for a laugh?&lt;br /&gt;
She needed the graph to display the spectrum.&lt;br /&gt;
She needed the spectrum to filter the signal.&lt;br /&gt;
She needed the signal to start the VI.&lt;br /&gt;
I don’t know why she wrote the VI – to impress a guy?&lt;br /&gt;
&lt;br /&gt;
There was an old lady who dropped a while loop.&lt;br /&gt;
I don’t know why she needed a loop, why she needed a loop, why she needed a loop, why she – *SLAP*. (Oh, thanks…)&lt;br /&gt;
She needed the loop to repeat the graph.&lt;br /&gt;
She needed the graph to display the spectrum.&lt;br /&gt;
She needed the spectrum to filter the signal.&lt;br /&gt;
She needed the signal to start the VI.&lt;br /&gt;
I don’t know why she wrote the VI – it’s a broken VI.&lt;br /&gt;
&lt;br /&gt;
There was an old lady who created a button.&lt;br /&gt;
I don’t know why she created the button&lt;br /&gt;
– I’d ask her but she told me not to butt in.&lt;br /&gt;
 She needed the button to stop the loop.&lt;br /&gt;
She needed the loop to repeat the graph.&lt;br /&gt;
She needed the graph to display the spectrum.&lt;br /&gt;
She needed the spectrum to filter the signal.&lt;br /&gt;
She needed the signal to start the VI.&lt;br /&gt;
I don’t know why she wrote the VI – it’s a familiar VI.&lt;br /&gt;
&lt;br /&gt;
There was an old lady who wrote Acquire-Analyze-Present.&lt;br /&gt;
And now we know why she wrote the VI: She works for NI!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What Do You Do With A Broken Wire?&lt;br /&gt;
(to the tune of What Do You Do With A Drunken Sailor?)&lt;br /&gt;
&lt;br /&gt;
CHORUS:&lt;br /&gt;
What do you do with a broken wire?&lt;br /&gt;
What do you do with a broken wire?&lt;br /&gt;
What do you do with a broken wire to fix a broken VI?&lt;br /&gt;
&lt;br /&gt;
Verse 1:&lt;br /&gt;
Change one of its ends to an indicator!&lt;br /&gt;
Change one of its ends to an indicator!&lt;br /&gt;
Change one of its ends to an indicator!&lt;br /&gt;
That’ll fix the VI!&lt;br /&gt;
&lt;br /&gt;
Verse 2:&lt;br /&gt;
Insert a node to convert the source type!&lt;br /&gt;
…&lt;br /&gt;
That’ll fix the VI!&lt;br /&gt;
&lt;br /&gt;
Verse 3:&lt;br /&gt;
Check all ends connect to terminals!&lt;br /&gt;
…&lt;br /&gt;
That’ll fix the VI!&lt;br /&gt;
&lt;br /&gt;
Verse 4:&lt;br /&gt;
Use control-B and just remove it!&lt;br /&gt;
…&lt;br /&gt;
That’ll fix the VI!&lt;br /&gt;
&lt;br /&gt;
Verse 5:&lt;br /&gt;
Do whatever the Error Window tells ya!&lt;br /&gt;
…&lt;br /&gt;
That’ll fix the VI!&lt;br /&gt;
&lt;br /&gt;
Mary Had A Block Diagram&lt;br /&gt;
(to the tune of Mary Had A Little Lamb)&lt;br /&gt;
&lt;br /&gt;
Mary had a block diagram&lt;br /&gt;
                     block diagram&lt;br /&gt;
                     block diagram&lt;br /&gt;
Mary had a block diagram&lt;br /&gt;
     and she kept adding nodes.&lt;br /&gt;
&lt;br /&gt;
It grew larger than the screen one day&lt;br /&gt;
                                         screen one day&lt;br /&gt;
                                         screen one day&lt;br /&gt;
It grew larger than the screen one day&lt;br /&gt;
     which was against the rule.&lt;br /&gt;
&lt;br /&gt;
So Mary created subVIs&lt;br /&gt;
                              subVIs&lt;br /&gt;
                              subVIs&lt;br /&gt;
So Mary created subVIs&lt;br /&gt;
     with “Convert To SubVI” tool!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LabInterruptedVIEW&lt;br /&gt;
(to the tune of An Austrian Went Yodeling)&lt;br /&gt;
&lt;br /&gt;
Ohhh, a programmer launched LabVIEW, a new project begun,&lt;br /&gt;
When along came a power spike, interrupting the fun.  L&lt;br /&gt;
&lt;br /&gt;
Ohhhhhhhhh (lots of pounding on the table)&lt;br /&gt;
New Class! New V-I! Control+Space! Wire Click! Noooo! (howls)&lt;br /&gt;
&lt;br /&gt;
Oh, a programmer launched LabVIEW, a new project begun,&lt;br /&gt;
When along came a manager, interrupting the fun.  L&lt;br /&gt;
&lt;br /&gt;
Ohhhhhhhhh (lots of pounding on the table)&lt;br /&gt;
New Class! New V-I! Control+Space! Wire Click!&lt;br /&gt;
“That would be greaaaat.” Noooo!&lt;br /&gt;
&lt;br /&gt;
Oh, a programmer launched LabVIEW, a new project begun,&lt;br /&gt;
When along came a forced reboot, interrupting the fun.  L&lt;br /&gt;
&lt;br /&gt;
Ohhhhhhhhh (lots of pounding on the table)&lt;br /&gt;
New Class! New V-I! Control+Space! Wire Click!&lt;br /&gt;
Dum-du-du-du-duuum! (MS Windows launch sound)&lt;br /&gt;
“That would be greaaaat.” Noooo!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;and so on, each verse adding another sound or phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LAST VERSE:&lt;br /&gt;
Oh, a programmer launched LabVIEW, a new project begun,&lt;br /&gt;
When along came some spare time, and now the VI does run!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Event Structure&lt;br /&gt;
(to the tune of Pop Goes The Weasel)&lt;br /&gt;
&lt;br /&gt;
All around the front panel&lt;br /&gt;
                the user clicked the mouse&lt;br /&gt;
And as it moved or clicked or dragged…&lt;br /&gt;
                POP went the events!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unbreak My VIs by Akash Bhakta&lt;br /&gt;
(to the tune of Unbreak My Heart by Toni Braxton)&lt;br /&gt;
http://www.lyricsdomain.com/20/toni_braxton/unbreak_my_heart.html&lt;br /&gt;
&lt;br /&gt;
Un-break my VI&lt;br /&gt;
Say you can run it again&lt;br /&gt;
Undo this break that you caused&lt;br /&gt;
When I broke something else&lt;br /&gt;
That does not affect my VI&lt;br /&gt;
Un-open this error list&lt;br /&gt;
I scrolled so many times&lt;br /&gt;
Un-break my VI&lt;br /&gt;
My VI...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
LabVIEW Rhapsody (by Stephen Mercer, Christina Rogers, &amp;amp; Jeff Boettcher)&lt;br /&gt;
(to the tune of Bohemian Rhapsody -- this song is loosely based on a new hire on the LV R&amp;amp;D team breaking LabVIEW.exe when he submits his first feature into the code base. There are a couple of internal terms you should know. &amp;quot;Bowling&amp;quot; is our term for submitting code to Perforce. The &amp;quot;trolls&amp;quot; are project managers who control which developers can submit to Perforce at what times -- they ask questions like, &amp;quot;Have you tested the code? Did you get someone to review it?&amp;quot; AppLibs is the build for the lvrt.dll and InTheDark is the build for LabVIEW RealTime.)&lt;br /&gt;
&lt;br /&gt;
Is this my real job?&lt;br /&gt;
Is this just fantasy?&lt;br /&gt;
Working on LabVIEW,&lt;br /&gt;
Can’t believe they just hired me.&lt;br /&gt;
Open VIs&lt;br /&gt;
Look at diagrams in G…&lt;br /&gt;
We can do better, we need no C routine&lt;br /&gt;
Because it’s graphical, data flow,&lt;br /&gt;
Down the wires, into nodes,&lt;br /&gt;
Every way the code flows, that’s what really matters, in G, in G&lt;br /&gt;
&lt;br /&gt;
Manager, just broke the build.&lt;br /&gt;
Used Perforce, synch’d to head,&lt;br /&gt;
Hit submit, and now it’s dead.&lt;br /&gt;
Manager, the test suite used to run,&lt;br /&gt;
But now I’ve gone and blown it all away.&lt;br /&gt;
Manager, oooo,&lt;br /&gt;
Didn’t mean to make you cry.&lt;br /&gt;
I’ll have it fixed again this time tomorrow!&lt;br /&gt;
Carry on, carry on, (as if deadlines really matter…)&lt;br /&gt;
&lt;br /&gt;
Too late, release has come&lt;br /&gt;
Sends shivers down my spine&lt;br /&gt;
CAR list growing all the time.&lt;br /&gt;
OK, everybody, I’ve got to bowl,&lt;br /&gt;
Just can’t spend any more time to test the code.&lt;br /&gt;
Mama, oooo, (anyway the code bowls)&lt;br /&gt;
I don’t want to bowl…&lt;br /&gt;
I sometimes wish they’d ne’er filed this CAR at all…&lt;br /&gt;
&lt;br /&gt;
The build machine syncs all the files that it can,&lt;br /&gt;
Incredibuild, Incredibuild – can you make it build faster?&lt;br /&gt;
InTheDark and Applibs – did you build the realtime?  No!&lt;br /&gt;
LabVIEW linking, LabVIEW linking,&lt;br /&gt;
LabVIEW linking, LabVIEW linking,&lt;br /&gt;
LabVIEW linking, here we go – log files show…&lt;br /&gt;
&lt;br /&gt;
I’m just a newbie, nobody told me!&lt;br /&gt;
He’s just a new grad from college recently…&lt;br /&gt;
He’ll bring in donuts for this bowl travesty.&lt;br /&gt;
Easy bug, easy fix – will you let me bowl?&lt;br /&gt;
Broken Build! No, we will not let you bowl! Let him bowl!&lt;br /&gt;
Broken Build! We will not let you bowl! Let him bowl!&lt;br /&gt;
Broken Build! We will not let you bowl! Let me bowl!&lt;br /&gt;
We will not let you bowl! Let me bowl! Never!&lt;br /&gt;
Never let you bowl! Let me bowl!&lt;br /&gt;
Never let you bowl! Oooo&lt;br /&gt;
No, no, no, no, no, no, YES  -&lt;br /&gt;
Oh mama mia, mama mia, mama mia I can bowl!&lt;br /&gt;
The manager has given troll permission to me&lt;br /&gt;
yes me&lt;br /&gt;
yes me!&lt;br /&gt;
&lt;br /&gt;
So you think you can submit without testing real time?&lt;br /&gt;
So you think you can bowl and then leave for a while?&lt;br /&gt;
Oh, baby – can’t do this to our baby.&lt;br /&gt;
Just back it all out, just back that change right outta here.&lt;br /&gt;
&lt;br /&gt;
Ooh yeah, ooh yeah&lt;br /&gt;
LabVIEW really matters.&lt;br /&gt;
Anyone can see&lt;br /&gt;
LabVIEW really matters – LabVIEW really matters to me&lt;br /&gt;
&lt;br /&gt;
In this way the code bowls…&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We did this one in another thread Knight mares: Ben has one there too.&lt;br /&gt;
&lt;br /&gt;
(John lenon Imagine)&lt;br /&gt;
&lt;br /&gt;
Imagine there&#039;s no Visual Basic&lt;br /&gt;
It&#039;s easy if you try&lt;br /&gt;
Only Labview for coding&lt;br /&gt;
Around us only wires&lt;br /&gt;
Imagine all the people&lt;br /&gt;
Living for a day&lt;br /&gt;
&lt;br /&gt;
Imagine there&#039;s only blockdiagrams&lt;br /&gt;
It isn&#039;t hard to do&lt;br /&gt;
Nothing to kill or die for&lt;br /&gt;
And event structures too&lt;br /&gt;
Imagine all the people&lt;br /&gt;
Living life in GUI&lt;br /&gt;
&lt;br /&gt;
You may say that I&#039;m a dreamer&lt;br /&gt;
But I&#039;m not the only one&lt;br /&gt;
I hope someday you&#039;ll join us&lt;br /&gt;
And the world will program as one&lt;br /&gt;
&lt;br /&gt;
Imagine written code&lt;br /&gt;
I wonder if you can&lt;br /&gt;
No need for probes&lt;br /&gt;
A brotherhood of man&lt;br /&gt;
Imagine all the people&lt;br /&gt;
Sharing all the code&lt;br /&gt;
&lt;br /&gt;
You may say that I&#039;m a dreamer&lt;br /&gt;
But I&#039;m not the only one&lt;br /&gt;
I hope someday you&#039;ll join us&lt;br /&gt;
And the world will program as one&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As originally presented here&lt;br /&gt;
&lt;br /&gt;
(too, the tune of....&amp;quot;Mary Poppin&#039;s&amp;quot; song &amp;quot;Supercalifragilisitexpalidous&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
BE.. cause I was afraid to post when I was new to Lab(VIEW)&lt;br /&gt;
and Ben, he gave my code a tweak, and told me that I had,(Two)&lt;br /&gt;
used a local varible that made my VI bad.(oooh)&lt;br /&gt;
Then Ravens Fan explained to me what I really had(Whoo!)&lt;br /&gt;
&lt;br /&gt;
Ohhhh...&lt;br /&gt;
&lt;br /&gt;
Altenbach, smercurio and nugget for the week...&lt;br /&gt;
Altenbach, smercurio and nugget for the week...&lt;br /&gt;
Altenbach, smercurio and nugget for the week...&lt;br /&gt;
Super class of LVOOP and now my code&#039;s not weak!&lt;br /&gt;
&lt;br /&gt;
Hummmm..LabVIEW.ini  Hummmmm ditty I&lt;br /&gt;
Hummmm..LabVIEW.ini  Hummmmm ditty I&lt;br /&gt;
&lt;br /&gt;
SO.. as you&#039;ll see I&#039;m soon to be an NI gifted Knight&lt;br /&gt;
And all my LabVIEW code will be just so completely right&lt;br /&gt;
I&#039;ll never miss a single trick my postings are all tight&lt;br /&gt;
And when I send an app to you it&#039;ll sing the bugs goodnight!&lt;br /&gt;
&lt;br /&gt;
OHHHH&lt;br /&gt;
&lt;br /&gt;
Altenbach, smercurio and nugget for the week...&lt;br /&gt;
Altenbach, smercurio and nugget for the week...&lt;br /&gt;
Altenbach, smercurio and nugget for the week...&lt;br /&gt;
Super class of LVOOP and now my code&#039;s not weak! ..&lt;br /&gt;
&lt;br /&gt;
(Dick VanDyke- eat your heart out! )&lt;br /&gt;
&lt;br /&gt;
[[Category:Culture]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8192</id>
		<title>Aspects of error handling</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8192"/>
		<updated>2019-07-12T16:14:30Z</updated>

		<summary type="html">&lt;p&gt;Smercer: improve table spacing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCnestright}}&lt;br /&gt;
&#039;&#039;&#039;Error Handling&#039;&#039;&#039; refers to the anticipation, response, and recovery from error conditions.  Writing VIs and subVIs that incorporate error handling is considered good form, not only to allow the user indication of abnormal software execution, but also to allow the software to make decisions based on the status of previous operations. Including error handling in your code assists in troubleshooting ([[debugging]]), modularity, and user friendliness.&lt;br /&gt;
LV R&amp;amp;D architect Stephen Loftus-Mercer divides the topic of &amp;quot;error handling&amp;quot; into five (5) separate aspects in order to keep discussions on topic -- error handling is too broad for most conversations. The divisions below were introduced by Stephen Loftus-Mercer in several informal settings; LV R&amp;amp;D architect Darren Nattinger was the first to present them formally.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! Aspect !! Details&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Generation&#039;&#039;&#039; is the creation of an [[Error cluster|error cluster]] value at the point that something goes wrong in your LabVIEW code. Feature requests in this area cover readability of the error generation code on the diagram, simplicity of selecting the right error, and packaging valuable metadata with the error (such as the call chain, timestamp, or situation details).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|| Errors may be emitted by both VIs and built-in nodes. When writing a VI that will emit a new error, there are two options:&lt;br /&gt;
# (Preferred) Create an error value using one of the library tools, i.e. [[Error Ring]] or &#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&lt;br /&gt;
# Directly bundling &#039;&#039;&#039;status&#039;&#039;&#039; boolean, &#039;&#039;&#039;code&#039;&#039;&#039; numeric, and &#039;&#039;&#039;source&#039;&#039;&#039; string together.  Doing this will not automatically include the call chain and is very hard to find in code, as you will be searching all Bundle nodes. It is not recommended unless it is done in [[Real Time]], [[FPGA]], or if you are returning an error cluster directly from a non-G DLL.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Propagation&#039;&#039;&#039; is the act of moving an error value through your LabVIEW code.  When an error has been created it should be propagated or responded to (next section).  Feature requests in this area include ways of aggregating multiple errors together, extending case structure behaviors, stopping loops/systems when errors occur, merging errors from parallel code, hiding error wires and creating some sort of automatic error propagation rules, etc.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|| Propagation is accomplished using the error cluster and wiring from error inputs through the various code paths and out an error output.  When propagating an error to a subVI, it is considered good practice to place error cluster input and output in the lower quadrants (error in on the left, and error out on the right).  Multiple code/error paths can exist depending on data flow and parallelization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The number one rule of error propagation is &#039;&#039;Don&#039;t Break the Error Chain!&#039;&#039;&#039;&#039;&#039;  An error chain is the code path of the error from the point of generation through the VI hierarchy to the point of being handled by an Error Response, Error Display, and/or Error Logging.  A break in the error chain occurs if even one VI in the hierarchy fails to propagate the error correctly.  This causes an error from an upstream node to be lost and makes [[Debugging|debugging]] difficult.&lt;br /&gt;
&lt;br /&gt;
An error chain can be broken in three ways:&lt;br /&gt;
&lt;br /&gt;
# Neglecting to wire an output that is part of the error chain&lt;br /&gt;
# Zero-iteration [[For Loop|For Loops]]&lt;br /&gt;
# Sloppy Merge Errors ordering&lt;br /&gt;
&lt;br /&gt;
To attempt to avoid breaking the error chain, the following [[VI Analyzer]] test can be run:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Error Cluster Wired&#039;&#039;&#039; - Detects subVIs and functions with unwired error outputs&lt;br /&gt;
* &#039;&#039;&#039;Unused Code&#039;&#039;&#039; - Detects unwired output tunnels of structures&lt;br /&gt;
* &#039;&#039;&#039;For Loop Error Handling&#039;&#039;&#039; - Detects loop-related error propagation and Merge Errors ordering issues on loop error output tunnels (VI Analyzer Toolkit 2018 or later)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Response&#039;&#039;&#039; is what you do in your LabVIEW code when an error occurs and you analyze the error value within the code to respond in a certain way. Feature requests include ways to simplify coding the following behaviors:&lt;br /&gt;
* Ignoring certain errors&lt;br /&gt;
* Retrying the operation&lt;br /&gt;
* Translating or Modifying an error&lt;br /&gt;
* Failing the operation and closing the program&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
[[File:Screen Shot 2019-06-27 at 1.50.14 AM.png|600px|thumb]]&lt;br /&gt;
See Stephen Loftus-Mercer&#039;s poster on [https://forums.ni.com/ni/attachments/ni/3044/3784/2/LabVIEW%20Error%20Responses.pdf Error Responses].&lt;br /&gt;
The typical operation of a node is to execute only if no error comes in and may add its own outgoing error.  Wrapping the entire code of a SubVI within a conditional case structure can make the SubVI act as a typical node (see [[Error Case Structure]]).  However, if the code inside of the structure already operates according to a typical node then the case structure is redundant and keeps the compiler from some optimization it could do if the structure was not there.&lt;br /&gt;
&lt;br /&gt;
Also, the developer could choose to enable [[Automatic Error Handling]]. However, automatic error handling assumes all error conditions are tested during development and requires special tooling ([[VI Scripting]]) to enable or disable the entire code base unless every output is wired by the time development is complete.  The experts have strong opinions on whether automatic error handling should be used during development, although all agree that it should never occur in well-written released libraries and applications.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Display&#039;&#039;&#039; is the act of displaying error information to the end user and/or code developer. Feature requests here include error localization (i.e., generating errors on French system but displaying them on an English system), meaningful translation for error codes, and rendering of the error metadata in a user-friendly form (color, pictures, tables, etc). Display also includes ways of providing advice on common causes of the error and how to fix the error.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|| As of LabVIEW 2019, this is almost always accomplished with &#039;&#039;Simple Error Handler.vi&#039;&#039; or &#039;&#039;General Error Handler.vi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;General Error Handler.vi&#039;&#039; includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; It is recommended to use it instead of calling &#039;&#039;Error Code Database.vi&#039;&#039;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of &#039;&#039;General Error Handler CORE.vi&#039;&#039; (found on the block diagram of &#039;&#039;General Error Handler.vi&#039;&#039;) to do this.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Logging&#039;&#039;&#039; involves taking errors generated by LabVIEW code and logging them to file for later analysis. Error logging is similar to error display (above), but logging has some more interesting variations – recording in a human-readable form or is machine parseable, recording as localized or non-localized. Most importantly, whereas “no error” is not typically displayed to the user, it is critical that we be able to log “no error” so a log file can distinguish a successful run (“no error”) from an aborted/crashed run (one where the log file is empty). Feature requests in this area include mechanisms for making recorded errors readable and assistance debugging errors after the application finishes. &lt;br /&gt;
&lt;br /&gt;
|| LabVIEW has no formal error log API because typically logging of errors needs to be folded into the general event logs of an API, which vary radically between applications. The error cluster can be translated into a loggable string by using the &#039;&#039;General Error Handler.vi&#039;&#039;, wiring &amp;quot;no dialog&amp;quot; to its input, and writing its string outputs to a log. &lt;br /&gt;
&lt;br /&gt;
For more insight on why it is important to log &amp;quot;no error&amp;quot;, please contemplate [http://thecodelesscode.com/case/48 the 48th koan of Codeless Code]: &#039;&#039;&amp;quot;The Protocols tell us of no fewer than Four Silences: the Silence Before Words, the Silence Between Words, the Silence of the Broken Pipe, and the Silence of Fallen Parcels. To the initiate they are as different as the characters for “end” 末 and “not yet” 未, although the outsider cannot tell one from the other.&amp;quot;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links  ==&lt;br /&gt;
*[http://www.ni.com/getting-started/labview-basics/handling-errors Error Handling Basics by NI].&lt;br /&gt;
*[http://controlsoftwaresolutions.com/error-handling-strategies-labview/ David Maidman’s Blog Post].&lt;br /&gt;
*[https://forums.ni.com/t5/LabVIEW-Development-Best/quot-SOLID-Error-Handling-quot-presentation-at-NIWeek-2017/td-p/3629639 SOLID Error Handling by Dmitry].&lt;br /&gt;
*[http://www.ni.com/example/31253/en/ Structured Error Handler Express VI by NI]&lt;br /&gt;
*[http://thecodelesscode.com/case/48 The Codeless Code, Koan 48]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[[Category:LabVIEW fundamentals]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8191</id>
		<title>Aspects of error handling</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8191"/>
		<updated>2019-07-12T16:11:34Z</updated>

		<summary type="html">&lt;p&gt;Smercer: fix table alignment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCnestright}}&lt;br /&gt;
&#039;&#039;&#039;Error Handling&#039;&#039;&#039; refers to the anticipation, response, and recovery from error conditions.  Writing VIs and subVIs that incorporate error handling is considered good form, not only to allow the user indication of abnormal software execution, but also to allow the software to make decisions based on the status of previous operations. Including error handling in your code assists in troubleshooting ([[debugging]]), modularity, and user friendliness.&lt;br /&gt;
LV R&amp;amp;D architect Stephen Loftus-Mercer divides the topic of &amp;quot;error handling&amp;quot; into five (5) separate aspects in order to keep discussions on topic -- error handling is too broad for most conversations. The divisions below were introduced by Stephen Loftus-Mercer in several informal settings; LV R&amp;amp;D architect Darren Nattinger was the first to present them formally.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: left;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
! Aspect !! Details&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Generation&#039;&#039;&#039; is the creation of an [[Error cluster|error cluster]] value at the point that something goes wrong in your LabVIEW code. Feature requests in this area cover readability of the error generation code on the diagram, simplicity of selecting the right error, and packaging valuable metadata with the error (such as the call chain, timestamp, or situation details).&lt;br /&gt;
|| Errors may be emitted by both VIs and built-in nodes. When writing a VI that will emit a new error, there are two options:&lt;br /&gt;
# (Preferred) Create an error value using one of the library tools, i.e. [[Error Ring]] or &#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&lt;br /&gt;
# Directly bundling &#039;&#039;&#039;status&#039;&#039;&#039; boolean, &#039;&#039;&#039;code&#039;&#039;&#039; numeric, and &#039;&#039;&#039;source&#039;&#039;&#039; string together.  Doing this will not automatically include the call chain and is very hard to find in code, as you will be searching all Bundle nodes. It is not recommended unless it is done in [[Real Time]], [[FPGA]], or if you are returning an error cluster directly from a non-G DLL.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Propagation&#039;&#039;&#039; is the act of moving an error value through your LabVIEW code.  When an error has been created it should be propagated or responded to (next section).  Feature requests in this area include ways of aggregating multiple errors together, extending case structure behaviors, stopping loops/systems when errors occur, merging errors from parallel code, hiding error wires and creating some sort of automatic error propagation rules, etc.&lt;br /&gt;
|| Propagation is accomplished using the error cluster and wiring from error inputs through the various code paths and out an error output.  When propagating an error to a subVI, it is considered good practice to place error cluster input and output in the lower quadrants (error in on the left, and error out on the right).  Multiple code/error paths can exist depending on data flow and parallelization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The number one rule of error propagation is &#039;&#039;Don&#039;t Break the Error Chain!&#039;&#039;&#039;&#039;&#039;  An error chain is the code path of the error from the point of generation through the VI hierarchy to the point of being handled by an Error Response, Error Display, and/or Error Logging.  A break in the error chain occurs if even one VI in the hierarchy fails to propagate the error correctly.  This causes an error from an upstream node to be lost and makes [[Debugging|debugging]] difficult.&lt;br /&gt;
&lt;br /&gt;
An error chain can be broken in three ways:&lt;br /&gt;
&lt;br /&gt;
# Neglecting to wire an output that is part of the error chain&lt;br /&gt;
# Zero-iteration [[For Loop|For Loops]]&lt;br /&gt;
# Sloppy Merge Errors ordering&lt;br /&gt;
&lt;br /&gt;
To attempt to avoid breaking the error chain, the following [[VI Analyzer]] test can be run:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Error Cluster Wired&#039;&#039;&#039; - Detects subVIs and functions with unwired error outputs&lt;br /&gt;
* &#039;&#039;&#039;Unused Code&#039;&#039;&#039; - Detects unwired output tunnels of structures&lt;br /&gt;
* &#039;&#039;&#039;For Loop Error Handling&#039;&#039;&#039; - Detects loop-related error propagation and Merge Errors ordering issues on loop error output tunnels (VI Analyzer Toolkit 2018 or later)&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Response&#039;&#039;&#039; is what you do in your LabVIEW code when an error occurs and you analyze the error value within the code to respond in a certain way. Feature requests include ways to simplify coding the following behaviors:&lt;br /&gt;
* Ignoring certain errors&lt;br /&gt;
* Retrying the operation&lt;br /&gt;
* Translating or Modifying an error&lt;br /&gt;
* Failing the operation and closing the program&lt;br /&gt;
|| &lt;br /&gt;
[[File:Screen Shot 2019-06-27 at 1.50.14 AM.png|600px|thumb]]&lt;br /&gt;
See Stephen Loftus-Mercer&#039;s poster on [https://forums.ni.com/ni/attachments/ni/3044/3784/2/LabVIEW%20Error%20Responses.pdf Error Responses].&lt;br /&gt;
The typical operation of a node is to execute only if no error comes in and may add its own outgoing error.  Wrapping the entire code of a SubVI within a conditional case structure can make the SubVI act as a typical node (see [[Error Case Structure]]).  However, if the code inside of the structure already operates according to a typical node then the case structure is redundant and keeps the compiler from some optimization it could do if the structure was not there.&lt;br /&gt;
&lt;br /&gt;
Also, the developer could choose to enable [[Automatic Error Handling]]. However, automatic error handling assumes all error conditions are tested during development and requires special tooling ([[VI Scripting]]) to enable or disable the entire code base unless every output is wired by the time development is complete.  The experts have strong opinions on whether automatic error handling should be used during development, although all agree that it should never occur in well-written released libraries and applications.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Display&#039;&#039;&#039; is the act of displaying error information to the end user and/or code developer. Feature requests here include error localization (i.e., generating errors on French system but displaying them on an English system), meaningful translation for error codes, and rendering of the error metadata in a user-friendly form (color, pictures, tables, etc). Display also includes ways of providing advice on common causes of the error and how to fix the error.&lt;br /&gt;
|| As of LabVIEW 2019, this is almost always accomplished with &#039;&#039;Simple Error Handler.vi&#039;&#039; or &#039;&#039;General Error Handler.vi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;General Error Handler.vi&#039;&#039; includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; It is recommended to use it instead of calling &#039;&#039;Error Code Database.vi&#039;&#039;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of &#039;&#039;General Error Handler CORE.vi&#039;&#039; (found on the block diagram of &#039;&#039;General Error Handler.vi&#039;&#039;) to do this.&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &#039;&#039;&#039;Error Logging&#039;&#039;&#039; involves taking errors generated by LabVIEW code and logging them to file for later analysis. Error logging is similar to error display (above), but logging has some more interesting variations – recording in a human-readable form or is machine parseable, recording as localized or non-localized. Most importantly, whereas “no error” is not typically displayed to the user, it is critical that we be able to log “no error” so a log file can distinguish a successful run (“no error”) from an aborted/crashed run (one where the log file is empty). Feature requests in this area include mechanisms for making recorded errors readable and assistance debugging errors after the application finishes. &lt;br /&gt;
|| LabVIEW has no formal error log API because typically logging of errors needs to be folded into the general event logs of an API, which vary radically between applications. The error cluster can be translated into a loggable string by using the &#039;&#039;General Error Handler.vi&#039;&#039;, wiring &amp;quot;no dialog&amp;quot; to its input, and writing its string outputs to a log. &lt;br /&gt;
&lt;br /&gt;
For more insight on why it is important to log &amp;quot;no error&amp;quot;, please contemplate [http://thecodelesscode.com/case/48 the 48th koan of Codeless Code]: &#039;&#039;&amp;quot;The Protocols tell us of no fewer than Four Silences: the Silence Before Words, the Silence Between Words, the Silence of the Broken Pipe, and the Silence of Fallen Parcels. To the initiate they are as different as the characters for “end” 末 and “not yet” 未, although the outsider cannot tell one from the other.&amp;quot;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links  ==&lt;br /&gt;
*[http://www.ni.com/getting-started/labview-basics/handling-errors Error Handling Basics by NI].&lt;br /&gt;
*[http://controlsoftwaresolutions.com/error-handling-strategies-labview/ David Maidman’s Blog Post].&lt;br /&gt;
*[https://forums.ni.com/t5/LabVIEW-Development-Best/quot-SOLID-Error-Handling-quot-presentation-at-NIWeek-2017/td-p/3629639 SOLID Error Handling by Dmitry].&lt;br /&gt;
*[http://www.ni.com/example/31253/en/ Structured Error Handler Express VI by NI]&lt;br /&gt;
*[http://thecodelesscode.com/case/48 The Codeless Code, Koan 48]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[[Category:LabVIEW fundamentals]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8190</id>
		<title>Aspects of error handling</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8190"/>
		<updated>2019-07-12T15:55:30Z</updated>

		<summary type="html">&lt;p&gt;Smercer: specify who these people are&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCnestright}}&lt;br /&gt;
&#039;&#039;&#039;Error Handling&#039;&#039;&#039; refers to the anticipation, response, and recovery from error conditions.  Writing VIs and subVIs that incorporate error handling is considered good form, not only to allow the user indication of abnormal software execution, but also to allow the software to make decisions based on the status of previous operations. Including error handling in your code assists in troubleshooting ([[debugging]]), modularity, and user friendliness.&lt;br /&gt;
LV R&amp;amp;D architect Stephen Loftus-Mercer divides the topic of &amp;quot;error handling&amp;quot; into five (5) separate aspects in order to keep discussions on topic -- error handling is too broad for most conversations. The divisions below were introduced by Stephen Loftus-Mercer in several informal settings; LV R&amp;amp;D architect Darren Nattinger was the first to present them formally.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Aspect !! Details&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Generation&#039;&#039;&#039; is the creation of an [[Error cluster|error cluster]] value at the point that something goes wrong in your LabVIEW code. Feature requests in this area cover readability of the error generation code on the diagram, simplicity of selecting the right error, and packaging valuable metadata with the error (such as the call chain, timestamp, or situation details).&lt;br /&gt;
|| Errors may be emitted by both VIs and built-in nodes. When writing a VI that will emit a new error, there are two options:&lt;br /&gt;
# (Preferred) Create an error value using one of the library tools, i.e. [[Error Ring]] or &#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&lt;br /&gt;
# Directly bundling &#039;&#039;&#039;status&#039;&#039;&#039; boolean, &#039;&#039;&#039;code&#039;&#039;&#039; numeric, and &#039;&#039;&#039;source&#039;&#039;&#039; string together.  Doing this will not automatically include the call chain and is very hard to find in code, as you will be searching all Bundle nodes. It is not recommended unless it is done in [[Real Time]], [[FPGA]], or if you are returning an error cluster directly from a non-G DLL.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Propagation&#039;&#039;&#039; is the act of moving an error value through your LabVIEW code.  When an error has been created it should be propagated or responded to (next section).  Feature requests in this area include ways of aggregating multiple errors together, extending case structure behaviors, stopping loops/systems when errors occur, merging errors from parallel code, hiding error wires and creating some sort of automatic error propagation rules, etc.&lt;br /&gt;
|| Propagation is accomplished using the error cluster and wiring from error inputs through the various code paths and out an error output.  When propagating an error to a subVI, it is considered good practice to place error cluster input and output in the lower quadrants (error in on the left, and error out on the right).  Multiple code/error paths can exist depending on data flow and parallelization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The number one rule of error propagation is &#039;&#039;Don&#039;t Break the Error Chain!&#039;&#039;&#039;&#039;&#039;  An error chain is the code path of the error from the point of generation through the VI hierarchy to the point of being handled by an Error Response, Error Display, and/or Error Logging.  A break in the error chain occurs if even one VI in the hierarchy fails to propagate the error correctly.  This causes an error from an upstream node to be lost and makes [[Debugging|debugging]] difficult.&lt;br /&gt;
&lt;br /&gt;
An error chain can be broken in three ways:&lt;br /&gt;
&lt;br /&gt;
# Neglecting to wire an output that is part of the error chain&lt;br /&gt;
# Zero-iteration [[For Loop|For Loops]]&lt;br /&gt;
# Sloppy Merge Errors ordering&lt;br /&gt;
&lt;br /&gt;
To attempt to avoid breaking the error chain, the following [[VI Analyzer]] test can be run:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Error Cluster Wired&#039;&#039;&#039; - Detects subVIs and functions with unwired error outputs&lt;br /&gt;
* &#039;&#039;&#039;Unused Code&#039;&#039;&#039; - Detects unwired output tunnels of structures&lt;br /&gt;
* &#039;&#039;&#039;For Loop Error Handling&#039;&#039;&#039; - Detects loop-related error propagation and Merge Errors ordering issues on loop error output tunnels (VI Analyzer Toolkit 2018 or later)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Response&#039;&#039;&#039; is what you do in your LabVIEW code when an error occurs and you analyze the error value within the code to respond in a certain way. Feature requests include ways to simplify coding the following behaviors:&lt;br /&gt;
* Ignoring certain errors&lt;br /&gt;
* Retrying the operation&lt;br /&gt;
* Translating or Modifying an error&lt;br /&gt;
* Failing the operation and closing the program&lt;br /&gt;
|| &lt;br /&gt;
[[File:Screen Shot 2019-06-27 at 1.50.14 AM.png|600px|thumb]]&lt;br /&gt;
See Stephen Loftus-Mercer&#039;s poster on [https://forums.ni.com/ni/attachments/ni/3044/3784/2/LabVIEW%20Error%20Responses.pdf Error Responses].&lt;br /&gt;
The typical operation of a node is to execute only if no error comes in and may add its own outgoing error.  Wrapping the entire code of a SubVI within a conditional case structure can make the SubVI act as a typical node (see [[Error Case Structure]]).  However, if the code inside of the structure already operates according to a typical node then the case structure is redundant and keeps the compiler from some optimization it could do if the structure was not there.&lt;br /&gt;
&lt;br /&gt;
Also, the developer could choose to enable [[Automatic Error Handling]]. However, automatic error handling assumes all error conditions are tested during development and requires special tooling ([[VI Scripting]]) to enable or disable the entire code base unless every output is wired by the time development is complete.  The experts have strong opinions on whether automatic error handling should be used during development, although all agree that it should never occur in well-written released libraries and applications.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Display&#039;&#039;&#039; is the act of displaying error information to the end user and/or code developer. Feature requests here include error localization (i.e., generating errors on French system but displaying them on an English system), meaningful translation for error codes, and rendering of the error metadata in a user-friendly form (color, pictures, tables, etc). Display also includes ways of providing advice on common causes of the error and how to fix the error.&lt;br /&gt;
|| As of LabVIEW 2019, this is almost always accomplished with &#039;&#039;Simple Error Handler.vi&#039;&#039; or &#039;&#039;General Error Handler.vi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;General Error Handler.vi&#039;&#039; includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; It is recommended to use it instead of calling &#039;&#039;Error Code Database.vi&#039;&#039;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of &#039;&#039;General Error Handler CORE.vi&#039;&#039; (found on the block diagram of &#039;&#039;General Error Handler.vi&#039;&#039;) to do this.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Logging&#039;&#039;&#039; involves taking errors generated by LabVIEW code and logging them to file for later analysis. Error logging is similar to error display (above), but logging has some more interesting variations – recording in a human-readable form or is machine parseable, recording as localized or non-localized. Most importantly, whereas “no error” is not typically displayed to the user, it is critical that we be able to log “no error” so a log file can distinguish a successful run (“no error”) from an aborted/crashed run (one where the log file is empty). Feature requests in this area include mechanisms for making recorded errors readable and assistance debugging errors after the application finishes. &lt;br /&gt;
|| LabVIEW has no formal error log API because typically logging of errors needs to be folded into the general event logs of an API, which vary radically between applications. The error cluster can be translated into a loggable string by using the &#039;&#039;General Error Handler.vi&#039;&#039;, wiring &amp;quot;no dialog&amp;quot; to its input, and writing its string outputs to a log. &lt;br /&gt;
&lt;br /&gt;
For more insight on why it is important to log &amp;quot;no error&amp;quot;, please contemplate [http://thecodelesscode.com/case/48 the 48th koan of Codeless Code]: &#039;&#039;&amp;quot;The Protocols tell us of no fewer than Four Silences: the Silence Before Words, the Silence Between Words, the Silence of the Broken Pipe, and the Silence of Fallen Parcels. To the initiate they are as different as the characters for “end” 末 and “not yet” 未, although the outsider cannot tell one from the other.&amp;quot;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links  ==&lt;br /&gt;
*[http://www.ni.com/getting-started/labview-basics/handling-errors Error Handling Basics by NI].&lt;br /&gt;
*[http://controlsoftwaresolutions.com/error-handling-strategies-labview/ David Maidman’s Blog Post].&lt;br /&gt;
*[https://forums.ni.com/t5/LabVIEW-Development-Best/quot-SOLID-Error-Handling-quot-presentation-at-NIWeek-2017/td-p/3629639 SOLID Error Handling by Dmitry].&lt;br /&gt;
*[http://www.ni.com/example/31253/en/ Structured Error Handler Express VI by NI]&lt;br /&gt;
*[http://thecodelesscode.com/case/48 The Codeless Code, Koan 48]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[[Category:LabVIEW fundamentals]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8189</id>
		<title>Aspects of error handling</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8189"/>
		<updated>2019-07-12T15:54:14Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Fix statement of intro to be less factual and instead attribute to expert opinion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCnestright}}&lt;br /&gt;
&#039;&#039;&#039;Error Handling&#039;&#039;&#039; refers to the anticipation, response, and recovery from error conditions.  Writing VIs and subVIs that incorporate error handling is considered good form, not only to allow the user indication of abnormal software execution, but also to allow the software to make decisions based on the status of previous operations. Including error handling in your code assists in troubleshooting ([[debugging]]), modularity, and user friendliness.&lt;br /&gt;
Stephen Loftus-Mercer divides the topic of &amp;quot;error handling&amp;quot; into five (5) separate aspects in order to keep discussions on topic -- error handling is too broad for most conversations. The divisions below were introduced by Stephen Loftus-Mercer in several informal settings; Darren Nattinger was the first to present them formally.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Aspect !! Details&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Generation&#039;&#039;&#039; is the creation of an [[Error cluster|error cluster]] value at the point that something goes wrong in your LabVIEW code. Feature requests in this area cover readability of the error generation code on the diagram, simplicity of selecting the right error, and packaging valuable metadata with the error (such as the call chain, timestamp, or situation details).&lt;br /&gt;
|| Errors may be emitted by both VIs and built-in nodes. When writing a VI that will emit a new error, there are two options:&lt;br /&gt;
# (Preferred) Create an error value using one of the library tools, i.e. [[Error Ring]] or &#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&lt;br /&gt;
# Directly bundling &#039;&#039;&#039;status&#039;&#039;&#039; boolean, &#039;&#039;&#039;code&#039;&#039;&#039; numeric, and &#039;&#039;&#039;source&#039;&#039;&#039; string together.  Doing this will not automatically include the call chain and is very hard to find in code, as you will be searching all Bundle nodes. It is not recommended unless it is done in [[Real Time]], [[FPGA]], or if you are returning an error cluster directly from a non-G DLL.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Propagation&#039;&#039;&#039; is the act of moving an error value through your LabVIEW code.  When an error has been created it should be propagated or responded to (next section).  Feature requests in this area include ways of aggregating multiple errors together, extending case structure behaviors, stopping loops/systems when errors occur, merging errors from parallel code, hiding error wires and creating some sort of automatic error propagation rules, etc.&lt;br /&gt;
|| Propagation is accomplished using the error cluster and wiring from error inputs through the various code paths and out an error output.  When propagating an error to a subVI, it is considered good practice to place error cluster input and output in the lower quadrants (error in on the left, and error out on the right).  Multiple code/error paths can exist depending on data flow and parallelization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The number one rule of error propagation is &#039;&#039;Don&#039;t Break the Error Chain!&#039;&#039;&#039;&#039;&#039;  An error chain is the code path of the error from the point of generation through the VI hierarchy to the point of being handled by an Error Response, Error Display, and/or Error Logging.  A break in the error chain occurs if even one VI in the hierarchy fails to propagate the error correctly.  This causes an error from an upstream node to be lost and makes [[Debugging|debugging]] difficult.&lt;br /&gt;
&lt;br /&gt;
An error chain can be broken in three ways:&lt;br /&gt;
&lt;br /&gt;
# Neglecting to wire an output that is part of the error chain&lt;br /&gt;
# Zero-iteration [[For Loop|For Loops]]&lt;br /&gt;
# Sloppy Merge Errors ordering&lt;br /&gt;
&lt;br /&gt;
To attempt to avoid breaking the error chain, the following [[VI Analyzer]] test can be run:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Error Cluster Wired&#039;&#039;&#039; - Detects subVIs and functions with unwired error outputs&lt;br /&gt;
* &#039;&#039;&#039;Unused Code&#039;&#039;&#039; - Detects unwired output tunnels of structures&lt;br /&gt;
* &#039;&#039;&#039;For Loop Error Handling&#039;&#039;&#039; - Detects loop-related error propagation and Merge Errors ordering issues on loop error output tunnels (VI Analyzer Toolkit 2018 or later)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Response&#039;&#039;&#039; is what you do in your LabVIEW code when an error occurs and you analyze the error value within the code to respond in a certain way. Feature requests include ways to simplify coding the following behaviors:&lt;br /&gt;
* Ignoring certain errors&lt;br /&gt;
* Retrying the operation&lt;br /&gt;
* Translating or Modifying an error&lt;br /&gt;
* Failing the operation and closing the program&lt;br /&gt;
|| &lt;br /&gt;
[[File:Screen Shot 2019-06-27 at 1.50.14 AM.png|600px|thumb]]&lt;br /&gt;
See Stephen Loftus-Mercer&#039;s poster on [https://forums.ni.com/ni/attachments/ni/3044/3784/2/LabVIEW%20Error%20Responses.pdf Error Responses].&lt;br /&gt;
The typical operation of a node is to execute only if no error comes in and may add its own outgoing error.  Wrapping the entire code of a SubVI within a conditional case structure can make the SubVI act as a typical node (see [[Error Case Structure]]).  However, if the code inside of the structure already operates according to a typical node then the case structure is redundant and keeps the compiler from some optimization it could do if the structure was not there.&lt;br /&gt;
&lt;br /&gt;
Also, the developer could choose to enable [[Automatic Error Handling]]. However, automatic error handling assumes all error conditions are tested during development and requires special tooling ([[VI Scripting]]) to enable or disable the entire code base unless every output is wired by the time development is complete.  The experts have strong opinions on whether automatic error handling should be used during development, although all agree that it should never occur in well-written released libraries and applications.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Display&#039;&#039;&#039; is the act of displaying error information to the end user and/or code developer. Feature requests here include error localization (i.e., generating errors on French system but displaying them on an English system), meaningful translation for error codes, and rendering of the error metadata in a user-friendly form (color, pictures, tables, etc). Display also includes ways of providing advice on common causes of the error and how to fix the error.&lt;br /&gt;
|| As of LabVIEW 2019, this is almost always accomplished with &#039;&#039;Simple Error Handler.vi&#039;&#039; or &#039;&#039;General Error Handler.vi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;General Error Handler.vi&#039;&#039; includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; It is recommended to use it instead of calling &#039;&#039;Error Code Database.vi&#039;&#039;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of &#039;&#039;General Error Handler CORE.vi&#039;&#039; (found on the block diagram of &#039;&#039;General Error Handler.vi&#039;&#039;) to do this.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Logging&#039;&#039;&#039; involves taking errors generated by LabVIEW code and logging them to file for later analysis. Error logging is similar to error display (above), but logging has some more interesting variations – recording in a human-readable form or is machine parseable, recording as localized or non-localized. Most importantly, whereas “no error” is not typically displayed to the user, it is critical that we be able to log “no error” so a log file can distinguish a successful run (“no error”) from an aborted/crashed run (one where the log file is empty). Feature requests in this area include mechanisms for making recorded errors readable and assistance debugging errors after the application finishes. &lt;br /&gt;
|| LabVIEW has no formal error log API because typically logging of errors needs to be folded into the general event logs of an API, which vary radically between applications. The error cluster can be translated into a loggable string by using the &#039;&#039;General Error Handler.vi&#039;&#039;, wiring &amp;quot;no dialog&amp;quot; to its input, and writing its string outputs to a log. &lt;br /&gt;
&lt;br /&gt;
For more insight on why it is important to log &amp;quot;no error&amp;quot;, please contemplate [http://thecodelesscode.com/case/48 the 48th koan of Codeless Code]: &#039;&#039;&amp;quot;The Protocols tell us of no fewer than Four Silences: the Silence Before Words, the Silence Between Words, the Silence of the Broken Pipe, and the Silence of Fallen Parcels. To the initiate they are as different as the characters for “end” 末 and “not yet” 未, although the outsider cannot tell one from the other.&amp;quot;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links  ==&lt;br /&gt;
*[http://www.ni.com/getting-started/labview-basics/handling-errors Error Handling Basics by NI].&lt;br /&gt;
*[http://controlsoftwaresolutions.com/error-handling-strategies-labview/ David Maidman’s Blog Post].&lt;br /&gt;
*[https://forums.ni.com/t5/LabVIEW-Development-Best/quot-SOLID-Error-Handling-quot-presentation-at-NIWeek-2017/td-p/3629639 SOLID Error Handling by Dmitry].&lt;br /&gt;
*[http://www.ni.com/example/31253/en/ Structured Error Handler Express VI by NI]&lt;br /&gt;
*[http://thecodelesscode.com/case/48 The Codeless Code, Koan 48]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[[Category:LabVIEW fundamentals]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8188</id>
		<title>Aspects of error handling</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8188"/>
		<updated>2019-07-12T15:45:27Z</updated>

		<summary type="html">&lt;p&gt;Smercer: correct attribution&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCnestright}}&lt;br /&gt;
&#039;&#039;&#039;Error Handling&#039;&#039;&#039; refers to the anticipation, response, and recovery from error conditions.  Writing VIs and subVIs that incorporate error handling is considered good form, not only to allow the user indication of abnormal software execution, but also to allow the software to make decisions based on the status of previous operations. Including error handling in your code assists in troubleshooting ([[debugging]]), modularity, and user friendliness.&lt;br /&gt;
The five (5) aspects of error handling below were introduced by Stephen Loftus-Mercer in several informal settings; Darren Nattinger was the first to present them formally.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Aspect !! Details&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Generation&#039;&#039;&#039; is the creation of an [[Error cluster|error cluster]] value at the point that something goes wrong in your LabVIEW code. Feature requests in this area cover readability of the error generation code on the diagram, simplicity of selecting the right error, and packaging valuable metadata with the error (such as the call chain, timestamp, or situation details).&lt;br /&gt;
|| Errors may be emitted by both VIs and built-in nodes. When writing a VI that will emit a new error, there are two options:&lt;br /&gt;
# (Preferred) Create an error value using one of the library tools, i.e. [[Error Ring]] or &#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&lt;br /&gt;
# Directly bundling &#039;&#039;&#039;status&#039;&#039;&#039; boolean, &#039;&#039;&#039;code&#039;&#039;&#039; numeric, and &#039;&#039;&#039;source&#039;&#039;&#039; string together.  Doing this will not automatically include the call chain and is very hard to find in code, as you will be searching all Bundle nodes. It is not recommended unless it is done in [[Real Time]], [[FPGA]], or if you are returning an error cluster directly from a non-G DLL.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Propagation&#039;&#039;&#039; is the act of moving an error value through your LabVIEW code.  When an error has been created it should be propagated or responded to (next section).  Feature requests in this area include ways of aggregating multiple errors together, extending case structure behaviors, stopping loops/systems when errors occur, merging errors from parallel code, hiding error wires and creating some sort of automatic error propagation rules, etc.&lt;br /&gt;
|| Propagation is accomplished using the error cluster and wiring from error inputs through the various code paths and out an error output.  When propagating an error to a subVI, it is considered good practice to place error cluster input and output in the lower quadrants (error in on the left, and error out on the right).  Multiple code/error paths can exist depending on data flow and parallelization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The number one rule of error propagation is &#039;&#039;Don&#039;t Break the Error Chain!&#039;&#039;&#039;&#039;&#039;  An error chain is the code path of the error from the point of generation through the VI hierarchy to the point of being handled by an Error Response, Error Display, and/or Error Logging.  A break in the error chain occurs if even one VI in the hierarchy fails to propagate the error correctly.  This causes an error from an upstream node to be lost and makes [[Debugging|debugging]] difficult.&lt;br /&gt;
&lt;br /&gt;
An error chain can be broken in three ways:&lt;br /&gt;
&lt;br /&gt;
# Neglecting to wire an output that is part of the error chain&lt;br /&gt;
# Zero-iteration [[For Loop|For Loops]]&lt;br /&gt;
# Sloppy Merge Errors ordering&lt;br /&gt;
&lt;br /&gt;
To attempt to avoid breaking the error chain, the following [[VI Analyzer]] test can be run:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Error Cluster Wired&#039;&#039;&#039; - Detects subVIs and functions with unwired error outputs&lt;br /&gt;
* &#039;&#039;&#039;Unused Code&#039;&#039;&#039; - Detects unwired output tunnels of structures&lt;br /&gt;
* &#039;&#039;&#039;For Loop Error Handling&#039;&#039;&#039; - Detects loop-related error propagation and Merge Errors ordering issues on loop error output tunnels (VI Analyzer Toolkit 2018 or later)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Response&#039;&#039;&#039; is what you do in your LabVIEW code when an error occurs and you analyze the error value within the code to respond in a certain way. Feature requests include ways to simplify coding the following behaviors:&lt;br /&gt;
* Ignoring certain errors&lt;br /&gt;
* Retrying the operation&lt;br /&gt;
* Translating or Modifying an error&lt;br /&gt;
* Failing the operation and closing the program&lt;br /&gt;
|| &lt;br /&gt;
[[File:Screen Shot 2019-06-27 at 1.50.14 AM.png|600px|thumb]]&lt;br /&gt;
See Stephen Loftus-Mercer&#039;s poster on [https://forums.ni.com/ni/attachments/ni/3044/3784/2/LabVIEW%20Error%20Responses.pdf Error Responses].&lt;br /&gt;
The typical operation of a node is to execute only if no error comes in and may add its own outgoing error.  Wrapping the entire code of a SubVI within a conditional case structure can make the SubVI act as a typical node (see [[Error Case Structure]]).  However, if the code inside of the structure already operates according to a typical node then the case structure is redundant and keeps the compiler from some optimization it could do if the structure was not there.&lt;br /&gt;
&lt;br /&gt;
Also, the developer could choose to enable [[Automatic Error Handling]]. However, automatic error handling assumes all error conditions are tested during development and requires special tooling ([[VI Scripting]]) to enable or disable the entire code base unless every output is wired by the time development is complete.  The experts have strong opinions on whether automatic error handling should be used during development, although all agree that it should never occur in well-written released libraries and applications.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Display&#039;&#039;&#039; is the act of displaying error information to the end user and/or code developer. Feature requests here include error localization (i.e., generating errors on French system but displaying them on an English system), meaningful translation for error codes, and rendering of the error metadata in a user-friendly form (color, pictures, tables, etc). Display also includes ways of providing advice on common causes of the error and how to fix the error.&lt;br /&gt;
|| As of LabVIEW 2019, this is almost always accomplished with &#039;&#039;Simple Error Handler.vi&#039;&#039; or &#039;&#039;General Error Handler.vi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;General Error Handler.vi&#039;&#039; includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; It is recommended to use it instead of calling &#039;&#039;Error Code Database.vi&#039;&#039;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of &#039;&#039;General Error Handler CORE.vi&#039;&#039; (found on the block diagram of &#039;&#039;General Error Handler.vi&#039;&#039;) to do this.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Logging&#039;&#039;&#039; involves taking errors generated by LabVIEW code and logging them to file for later analysis. Error logging is similar to error display (above), but logging has some more interesting variations – recording in a human-readable form or is machine parseable, recording as localized or non-localized. Most importantly, whereas “no error” is not typically displayed to the user, it is critical that we be able to log “no error” so a log file can distinguish a successful run (“no error”) from an aborted/crashed run (one where the log file is empty). Feature requests in this area include mechanisms for making recorded errors readable and assistance debugging errors after the application finishes. &lt;br /&gt;
|| LabVIEW has no formal error log API because typically logging of errors needs to be folded into the general event logs of an API, which vary radically between applications. The error cluster can be translated into a loggable string by using the &#039;&#039;General Error Handler.vi&#039;&#039;, wiring &amp;quot;no dialog&amp;quot; to its input, and writing its string outputs to a log. &lt;br /&gt;
&lt;br /&gt;
For more insight on why it is important to log &amp;quot;no error&amp;quot;, please contemplate [http://thecodelesscode.com/case/48 the 48th koan of Codeless Code]: &#039;&#039;&amp;quot;The Protocols tell us of no fewer than Four Silences: the Silence Before Words, the Silence Between Words, the Silence of the Broken Pipe, and the Silence of Fallen Parcels. To the initiate they are as different as the characters for “end” 末 and “not yet” 未, although the outsider cannot tell one from the other.&amp;quot;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links  ==&lt;br /&gt;
*[http://www.ni.com/getting-started/labview-basics/handling-errors Error Handling Basics by NI].&lt;br /&gt;
*[http://controlsoftwaresolutions.com/error-handling-strategies-labview/ David Maidman’s Blog Post].&lt;br /&gt;
*[https://forums.ni.com/t5/LabVIEW-Development-Best/quot-SOLID-Error-Handling-quot-presentation-at-NIWeek-2017/td-p/3629639 SOLID Error Handling by Dmitry].&lt;br /&gt;
*[http://www.ni.com/example/31253/en/ Structured Error Handler Express VI by NI]&lt;br /&gt;
*[http://thecodelesscode.com/case/48 The Codeless Code, Koan 48]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[[Category:LabVIEW fundamentals]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8187</id>
		<title>Aspects of error handling</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Aspects_of_error_handling&amp;diff=8187"/>
		<updated>2019-07-12T15:44:36Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Significant rewrite... changed formatting to make it easier to review the topics. In future, may consider breaking each into separate page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCnestright}}&lt;br /&gt;
&#039;&#039;&#039;Error Handling&#039;&#039;&#039; refers to the anticipation, response, and recovery from error conditions.  Writing VIs and subVIs that incorporate error handling is considered good form, not only to allow the user indication of abnormal software execution, but also to allow the software to make decisions based on the status of previous operations. Including error handling in your code assists in troubleshooting ([[debugging]]), modularity, and user friendliness.&lt;br /&gt;
The five (5) aspects of error handling below were introduced by Stephen Loftus-Mercer in several informal settings; Darren Nattinger was the first to present them formally.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Aspect !! Details&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Generation&#039;&#039;&#039; is the creation of an [[Error cluster|error cluster]] value at the point that something goes wrong in your LabVIEW code. Feature requests in this area cover readability of the error generation code on the diagram, simplicity of selecting the right error, and packaging valuable metadata with the error (such as the call chain, timestamp, or situation details).&lt;br /&gt;
|| Errors may be emitted by both VIs and built-in nodes. When writing a VI that will emit a new error, there are two options:&lt;br /&gt;
# (Preferred) Create an error value using one of the library tools, i.e. [[Error Ring]] or &#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&lt;br /&gt;
# Directly bundling &#039;&#039;&#039;status&#039;&#039;&#039; boolean, &#039;&#039;&#039;code&#039;&#039;&#039; numeric, and &#039;&#039;&#039;source&#039;&#039;&#039; string together.  Doing this will not automatically include the call chain and is very hard to find in code, as you will be searching all Bundle nodes. It is not recommended unless it is done in [[Real Time]], [[FPGA]], or if you are returning an error cluster directly from a non-G DLL.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Propagation&#039;&#039;&#039; is the act of moving an error value through your LabVIEW code.  When an error has been created it should be propagated or responded to (next section).  Feature requests in this area include ways of aggregating multiple errors together, extending case structure behaviors, stopping loops/systems when errors occur, merging errors from parallel code, hiding error wires and creating some sort of automatic error propagation rules, etc.&lt;br /&gt;
|| Propagation is accomplished using the error cluster and wiring from error inputs through the various code paths and out an error output.  When propagating an error to a subVI, it is considered good practice to place error cluster input and output in the lower quadrants (error in on the left, and error out on the right).  Multiple code/error paths can exist depending on data flow and parallelization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The number one rule of error propagation is &#039;&#039;Don&#039;t Break the Error Chain!&#039;&#039;&#039;&#039;&#039;  An error chain is the code path of the error from the point of generation through the VI hierarchy to the point of being handled by an Error Response, Error Display, and/or Error Logging.  A break in the error chain occurs if even one VI in the hierarchy fails to propagate the error correctly.  This causes an error from an upstream node to be lost and makes [[Debugging|debugging]] difficult.&lt;br /&gt;
&lt;br /&gt;
An error chain can be broken in three ways:&lt;br /&gt;
&lt;br /&gt;
# Neglecting to wire an output that is part of the error chain&lt;br /&gt;
# Zero-iteration [[For Loop|For Loops]]&lt;br /&gt;
# Sloppy Merge Errors ordering&lt;br /&gt;
&lt;br /&gt;
To attempt to avoid breaking the error chain, the following [[VI Analyzer]] test can be run:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Error Cluster Wired&#039;&#039;&#039; - Detects subVIs and functions with unwired error outputs&lt;br /&gt;
* &#039;&#039;&#039;Unused Code&#039;&#039;&#039; - Detects unwired output tunnels of structures&lt;br /&gt;
* &#039;&#039;&#039;For Loop Error Handling&#039;&#039;&#039; - Detects loop-related error propagation and Merge Errors ordering issues on loop error output tunnels (VI Analyzer Toolkit 2018 or later)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Response&#039;&#039;&#039; is what you do in your LabVIEW code when an error occurs and you analyze the error value within the code to respond in a certain way. Feature requests include ways to simplify coding the following behaviors:&lt;br /&gt;
* Ignoring certain errors&lt;br /&gt;
* Retrying the operation&lt;br /&gt;
* Translating or Modifying an error&lt;br /&gt;
* Failing the operation and closing the program&lt;br /&gt;
|| &lt;br /&gt;
[[File:Screen Shot 2019-06-27 at 1.50.14 AM.png|600px|thumb]]&lt;br /&gt;
See Darren Nattinger&#039;s poster on [https://forums.ni.com/ni/attachments/ni/3044/3784/2/LabVIEW%20Error%20Responses.pdf Error Responses].&lt;br /&gt;
The typical operation of a node is to execute only if no error comes in and may add its own outgoing error.  Wrapping the entire code of a SubVI within a conditional case structure can make the SubVI act as a typical node (see [[Error Case Structure]]).  However, if the code inside of the structure already operates according to a typical node then the case structure is redundant and keeps the compiler from some optimization it could do if the structure was not there.&lt;br /&gt;
&lt;br /&gt;
Also, the developer could choose to enable [[Automatic Error Handling]]. However, automatic error handling assumes all error conditions are tested during development and requires special tooling ([[VI Scripting]]) to enable or disable the entire code base unless every output is wired by the time development is complete.  The experts have strong opinions on whether automatic error handling should be used during development, although all agree that it should never occur in well-written released libraries and applications.&amp;lt;ref&amp;gt;Nattinger, Darren. [http://bit.ly/dnatterrors &amp;quot;What to Expect When You&#039;re Expecting an Error&amp;quot;] (NIWeek 2018)&amp;lt;/ref&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Display&#039;&#039;&#039; is the act of displaying error information to the end user and/or code developer. Feature requests here include error localization (i.e., generating errors on French system but displaying them on an English system), meaningful translation for error codes, and rendering of the error metadata in a user-friendly form (color, pictures, tables, etc). Display also includes ways of providing advice on common causes of the error and how to fix the error.&lt;br /&gt;
|| As of LabVIEW 2019, this is almost always accomplished with &#039;&#039;Simple Error Handler.vi&#039;&#039; or &#039;&#039;General Error Handler.vi&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;General Error Handler.vi&#039;&#039; includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; It is recommended to use it instead of calling &#039;&#039;Error Code Database.vi&#039;&#039;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of &#039;&#039;General Error Handler CORE.vi&#039;&#039; (found on the block diagram of &#039;&#039;General Error Handler.vi&#039;&#039;) to do this.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Error Logging&#039;&#039;&#039; involves taking errors generated by LabVIEW code and logging them to file for later analysis. Error logging is similar to error display (above), but logging has some more interesting variations – recording in a human-readable form or is machine parseable, recording as localized or non-localized. Most importantly, whereas “no error” is not typically displayed to the user, it is critical that we be able to log “no error” so a log file can distinguish a successful run (“no error”) from an aborted/crashed run (one where the log file is empty). Feature requests in this area include mechanisms for making recorded errors readable and assistance debugging errors after the application finishes. &lt;br /&gt;
|| LabVIEW has no formal error log API because typically logging of errors needs to be folded into the general event logs of an API, which vary radically between applications. The error cluster can be translated into a loggable string by using the &#039;&#039;General Error Handler.vi&#039;&#039;, wiring &amp;quot;no dialog&amp;quot; to its input, and writing its string outputs to a log. &lt;br /&gt;
&lt;br /&gt;
For more insight on why it is important to log &amp;quot;no error&amp;quot;, please contemplate [http://thecodelesscode.com/case/48 the 48th koan of Codeless Code]: &#039;&#039;&amp;quot;The Protocols tell us of no fewer than Four Silences: the Silence Before Words, the Silence Between Words, the Silence of the Broken Pipe, and the Silence of Fallen Parcels. To the initiate they are as different as the characters for “end” 末 and “not yet” 未, although the outsider cannot tell one from the other.&amp;quot;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== External Links  ==&lt;br /&gt;
*[http://www.ni.com/getting-started/labview-basics/handling-errors Error Handling Basics by NI].&lt;br /&gt;
*[http://controlsoftwaresolutions.com/error-handling-strategies-labview/ David Maidman’s Blog Post].&lt;br /&gt;
*[https://forums.ni.com/t5/LabVIEW-Development-Best/quot-SOLID-Error-Handling-quot-presentation-at-NIWeek-2017/td-p/3629639 SOLID Error Handling by Dmitry].&lt;br /&gt;
*[http://www.ni.com/example/31253/en/ Structured Error Handler Express VI by NI]&lt;br /&gt;
*[http://thecodelesscode.com/case/48 The Codeless Code, Koan 48]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[[Category:LabVIEW fundamentals]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Software_Engineering_with_LabVIEW&amp;diff=4019</id>
		<title>Software Engineering with LabVIEW</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Software_Engineering_with_LabVIEW&amp;diff=4019"/>
		<updated>2009-04-21T14:22:42Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes software engineering practices and tools.&lt;br /&gt;
&lt;br /&gt;
The intent of the this page is to share best practices. This will include discussion of tool selection, where appropriate, and information regarding setting up and using tools.&lt;br /&gt;
&lt;br /&gt;
Following are some key tasks that are part of a software engineering process:&lt;br /&gt;
*[[Requirements Management]]&lt;br /&gt;
*[[Planning Development]]&lt;br /&gt;
*[[Software Design]]&lt;br /&gt;
*[[Source Code Control]]&lt;br /&gt;
*[[Unit and Regression Testing]]&lt;br /&gt;
*[[Issue Tracking]]&lt;br /&gt;
&lt;br /&gt;
== External links  ==&lt;br /&gt;
&lt;br /&gt;
*[http://ni.com/largeapps ni.com/largeapps] -- information collected and reviewed by NI employees &lt;br /&gt;
*[http://ni.com/community/largeapps ni.com/community/largeapps] -- information contributed by LabVIEW users worldwide (WIKI&amp;amp;nbsp;editiable)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:SW_Engineering]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Software_Engineering_with_LabVIEW&amp;diff=4017</id>
		<title>Software Engineering with LabVIEW</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Software_Engineering_with_LabVIEW&amp;diff=4017"/>
		<updated>2009-04-20T12:20:12Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Add links to the NI repositories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes software engineering practices and tools. &lt;br /&gt;
&lt;br /&gt;
The intent of the this page is to share best practices. This will include discussion of tool selection, where appropriate, and information regarding setting up and using tools. &lt;br /&gt;
&lt;br /&gt;
National Instruments maintains two massive repositories of information regarding software engineering with LabVIEW:&lt;br /&gt;
&lt;br /&gt;
*[http://ni.com/largeapps ni.com/largeapps] -- information collected and reviewed by NI employees&lt;br /&gt;
*[http://ni.com/community/largeapps ni.com/community/largeapps] -- a WIKI of information contributed by LabVIEW users worldwide &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following are some key tasks that are part of a software engineering process:&amp;lt;br&amp;gt; [[Requirements Management]]&amp;lt;br&amp;gt; [[Planning Development]]&amp;lt;br&amp;gt; [[Software Design]]&amp;lt;br&amp;gt; [[Source Code Control]]&amp;lt;br&amp;gt; [[Unit and Regression Testing]]&amp;lt;br&amp;gt; [[Issue Tracking]]&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Category:SW_Engineering]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=3213</id>
		<title>Insane Objects</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=3213"/>
		<updated>2007-11-12T14:16:14Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Change text about editing capacities of heap peek&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Firstly, there is no need to necessarily report generically to [[NI]] that LabVIEW has insane objects, as they &#039;&#039;&#039;do&#039;&#039;&#039; know about insane objects. Secondly they are NOT merely bugs: insane objects can be generated as part of the LabVIEW verification process. If you get such a message, it is good to check the known bugs of LabVIEW at ni.com and if the particular insanity in your dialog is not listed, only then should you report the insanity to NI technical support.&lt;br /&gt;
&lt;br /&gt;
The insane object message is what LabVIEW puts in a dialog when one of the objects on the diagram does not meet its &amp;quot;checksum&amp;quot;. In other words, this object isn&#039;t in a state LabVIEW expects it to be in. Most of the time these errors are not fatal -- LabVIEW simply puts the object in the state it does expect. But it raises questions about how the object got into that bad state and what might have been done with that object between the last time LabVIEW checked and it was good and the time it became insane.&lt;br /&gt;
&lt;br /&gt;
The insane object messages are something NI works on with each version of LabVIEW. But as it is a generic error message that can apply to anything from a simple cosmetic to the front panel itself, you&#039;ll still see them in any version of LabVIEW that has a bug -- a fact of life unfortunately for the foreseeable future. &lt;br /&gt;
&lt;br /&gt;
The cryptic nature of the message can be deciphered as follows:&lt;br /&gt;
Insane object at FPHP+4C in &amp;quot;name.vi&amp;quot;: {dsitem} 0x400: Panel (FPSC)&lt;br /&gt;
* FPHP -- this will be either FP or BD for &amp;quot;front panel heap&amp;quot; or &amp;quot;block diagram heap&amp;quot;&lt;br /&gt;
* 4C -- this is a hexadecimal number indicating which object.&lt;br /&gt;
* name.vi -- which VI had the insanity&lt;br /&gt;
* {dsitem} 0x400 -- really only meaningful if you know how LabVIEW internals work; I&#039;ll skip it here&lt;br /&gt;
* Panel (FPSC) -- the type of object that has problems. The four letter codes are usually descriptive (COSM for a cosmetic or simple drawn part, SGNL for a signal aka wire). A common one that you won&#039;t guess is DDOD, which stands for Data Display Object (the last D is because it has to be 4 chars). A DDO is either a control or an indicator.&lt;br /&gt;
&lt;br /&gt;
Most of the time, deleting the offending object and recreating it from scratch is sufficient to fix your VI and allow you to continue working.&lt;br /&gt;
&lt;br /&gt;
== Using Heap Peek ==&lt;br /&gt;
&lt;br /&gt;
The number &amp;quot;4C&amp;quot; is described above as the number that tells you which object. Not exactly helpful to an end user. There is a way to find and delete an insane object. When you get an insane error, you will get a code that shows the object that is insane - write down that code and then:&lt;br /&gt;
&lt;br /&gt;
* Close LabVIEW&lt;br /&gt;
* Put the key &amp;quot;LVdebugKeys=True&amp;quot; in your [[LabVIEW configuration file]]&lt;br /&gt;
* Open your VI&lt;br /&gt;
* Press CTRL+SHIFT+D+H. On Mac, use the command key instead of CTRL.  This will open a window known to LV R&amp;amp;D as &amp;quot;heap peek&amp;quot; since it gives internal views into the front panel heap and the block diagram heap.&lt;br /&gt;
* The window is divided into 4 sections: top-left, top-right, middle, and base. The functionality of the various parts is obscure and mystical, so we&#039;re just going to focus on the bits that help with finding and deleting insane objects.&lt;br /&gt;
* Check the error message given about the insane object. It includes either the letters BDHP or FPHP. Scroll through the top-left list box until you find those 4 letters and the name of your VI. Left click to select that item. This will change what is displayed in the top-right section of the window.&lt;br /&gt;
* In the top-right section, find the line that begins with the number identifying the object. These are sorted numerically. Left click to select the object when you find it. &lt;br /&gt;
* In the middle region, there is a box with an F inside it. This is a button (heap peek doesn&#039;t use a lot of advanced drawing, so it doesn&#039;t really look like a button, but it is). Click on the F button to find the offending object.&lt;br /&gt;
* LabVIEW will switch to the block diagram or front panel and select some object. Whatever object it is, delete it. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Heap peek does not have any ability to change the objects. It is display information only. There are VIs in LV that are not real VIs (for example, a pseudo VI that is created to represent a Call By Reference to another application instance on another machine), and attempting to do Find to jump to their components can cause problems because those VIs never expect to actually draw themselves. But other than that state change, there are no edits to VIs possible using this tool as of November 2007. A previous author said that few developers really know the capacities of heap peek. This is true... it&#039;s a debugging tool, and it gets hacked up to debug whatever anyone needs to debug.&lt;br /&gt;
&lt;br /&gt;
[[category:LabVIEW internals]]&lt;br /&gt;
[[category:development environment]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Numeric&amp;diff=3130</id>
		<title>Numeric</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Numeric&amp;diff=3130"/>
		<updated>2007-10-24T15:17:37Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* NaN equivalent for integer data types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[NaN]] equivalent for [[integer]] data types ==&lt;br /&gt;
NaN is defined only for floating point numbers. In a [[U32]] all the possible values are actual numbers and there is no place left for a special value that says there is nothing there. If you need an &amp;quot;empty&amp;quot; value in an integer data type you have to pick a value that never appears in your particular application (if there really is one) to serve as a flag. In other words there is no &amp;quot;empty value&amp;quot; in integer data types.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A useful trick:&#039;&#039;&#039; In most cases, zero or -1 are used as the magic sentinel value for integer work. But sometimes you&#039;d like to use &amp;quot;largest possible integer&amp;quot; as your sentinel value because zero and -1 are actual values, and you don&#039;t expect to ever actually use the large end of the spectrum. But nobody actually remembers the largest possible integer, and even if you look it up (it is in the Context Help for an integer wire, by the way), typing it is annoying. Solution: Drop a Numeric constant on the block diagram and set it to be your type of integer. Then type a long string of 9s into it, such as &amp;quot;99999999999999999999999999999999999999999&amp;quot;. LabVIEW will automatically change this to be the largest possible integer storable in your data type. If it doesn&#039;t convert and you still have the long string of 9s, then you didn&#039;t type enough 9s. This can happen if you&#039;re using unsigned 64-bit integers... those things are HUGE!&lt;br /&gt;
&lt;br /&gt;
Test a floating point wire for NaN by using [[Image:Nanfunc.png]] from the Comparison pallete.&lt;br /&gt;
&lt;br /&gt;
== Comparing real numbers ==&lt;br /&gt;
What you need is a comparison that assumes that equal is the same as close enough. One way is to define an epsilon and check to make sure that your error is greater than that epsilon where epsilon is dependent on the type of number (single, double, extended) that you are using. For example to compare A greater than or equal to B (as double precision) you could use as your test.&lt;br /&gt;
&lt;br /&gt;
A-B &amp;gt;= -1e-17*(A+B)/2&lt;br /&gt;
&lt;br /&gt;
Or maybe 1e-16 to be safe. To be really careful use 2^-31 as your criterion. This handles the case where A is already 10^-31 in magnitude or when both variables are zero.&lt;br /&gt;
&lt;br /&gt;
A simpler method is to multiply your numbers by 10 to make integers, round them and then compare. In fact you can multiply by whatever power of 10 desired.&lt;br /&gt;
&lt;br /&gt;
This is *not* a bug. It appears as a result of the limitation of finite computers. There is not now and never will be a fix. The main fix is to the programmer. As a caveat, do not ever, ever, ever compare real numbers. They are uncertain within the least significant bit.&lt;br /&gt;
&lt;br /&gt;
These uncertainties arise in several situations. Another example where this must be taken into account is the output of both&amp;quot;Format &amp;amp; Strip&amp;quot; and &amp;quot;From Exponential/Fract/Eng&amp;quot;; enter a string of &amp;quot;0.1&amp;quot; and you get the number: 0.10000000000000000100. You cannot represent 0.1 as a finite binary string.&lt;br /&gt;
&lt;br /&gt;
As to a wish for a finite conversion width, nope. The problem is that the conversion does have a finite width. It is that factor of 5 in base 10 numbers that makes a finite decimal be an infinite repeating binary string. You can represent all numbers that can be formed as sums of 1/2, 1/4, 1/8, 1/16, 1/32. Unfortunately 1/10 can only be approximated. The wish seems to indicate that the binary is converted to base 10 (with a finite conversion width) and then compared. Actually it is all compared in binary, when you display it, you can convert it to 10 digits or what ever you want.&lt;br /&gt;
&lt;br /&gt;
In summary, any binary representation will be approximate. How approximate is based on the word length. It is that factor of 5 in base 10 numbers that gets us. It appears that you have 17 digits of accuracy which is about right for a double precision number. Extended have more, singles have less. That is mathematical reality. Computers are not idealized mathematical machines. If it was easy everyone would be an expert. Knowing how things are treated by the underlying hardware can keep one from having these problems.&lt;br /&gt;
&lt;br /&gt;
[[Category:numeric]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Numeric&amp;diff=3129</id>
		<title>Numeric</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Numeric&amp;diff=3129"/>
		<updated>2007-10-24T15:08:58Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* NaN equivalent for integer data types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[NaN]] equivalent for [[integer]] data types ==&lt;br /&gt;
NaN is defined only for floating point numbers. In a [[U32]] all the possible values are actual numbers and there is no place left for a special value that says there is nothing there. If you need an &amp;quot;empty&amp;quot; value in an integer data type you have to pick a value that never appears in your particular application (if there really is one) to serve as a flag. In other words there is no &amp;quot;empty value&amp;quot; in integer data types.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A useful trick:&#039;&#039;&#039; In most cases, zero or -1 are used as the magic sentinel value for integer work. But sometimes you&#039;d like to use &amp;quot;largest possible integer&amp;quot; as your sentinel value because zero and -1 are actual values, and you don&#039;t expect to ever actually use the large end of the spectrum. But nobody actually remembers the largest possible integer, and even if you look it up (it is in the Context Help for an integer wire, by the way), typing it is annoying. Solution: Drop a Numeric constant on the block diagram and set it to be your type of integer. Then type a long string of 9s into it, such as &amp;quot;99999999999999999999999999999999999999999&amp;quot;. LabVIEW will automatically change this to be the largest possible integer storable in your data type. &lt;br /&gt;
&lt;br /&gt;
Test a floating point wire for NaN by using [[Image:Nanfunc.png]] from the Comparison pallete.&lt;br /&gt;
&lt;br /&gt;
== Comparing real numbers ==&lt;br /&gt;
What you need is a comparison that assumes that equal is the same as close enough. One way is to define an epsilon and check to make sure that your error is greater than that epsilon where epsilon is dependent on the type of number (single, double, extended) that you are using. For example to compare A greater than or equal to B (as double precision) you could use as your test.&lt;br /&gt;
&lt;br /&gt;
A-B &amp;gt;= -1e-17*(A+B)/2&lt;br /&gt;
&lt;br /&gt;
Or maybe 1e-16 to be safe. To be really careful use 2^-31 as your criterion. This handles the case where A is already 10^-31 in magnitude or when both variables are zero.&lt;br /&gt;
&lt;br /&gt;
A simpler method is to multiply your numbers by 10 to make integers, round them and then compare. In fact you can multiply by whatever power of 10 desired.&lt;br /&gt;
&lt;br /&gt;
This is *not* a bug. It appears as a result of the limitation of finite computers. There is not now and never will be a fix. The main fix is to the programmer. As a caveat, do not ever, ever, ever compare real numbers. They are uncertain within the least significant bit.&lt;br /&gt;
&lt;br /&gt;
These uncertainties arise in several situations. Another example where this must be taken into account is the output of both&amp;quot;Format &amp;amp; Strip&amp;quot; and &amp;quot;From Exponential/Fract/Eng&amp;quot;; enter a string of &amp;quot;0.1&amp;quot; and you get the number: 0.10000000000000000100. You cannot represent 0.1 as a finite binary string.&lt;br /&gt;
&lt;br /&gt;
As to a wish for a finite conversion width, nope. The problem is that the conversion does have a finite width. It is that factor of 5 in base 10 numbers that makes a finite decimal be an infinite repeating binary string. You can represent all numbers that can be formed as sums of 1/2, 1/4, 1/8, 1/16, 1/32. Unfortunately 1/10 can only be approximated. The wish seems to indicate that the binary is converted to base 10 (with a finite conversion width) and then compared. Actually it is all compared in binary, when you display it, you can convert it to 10 digits or what ever you want.&lt;br /&gt;
&lt;br /&gt;
In summary, any binary representation will be approximate. How approximate is based on the word length. It is that factor of 5 in base 10 numbers that gets us. It appears that you have 17 digits of accuracy which is about right for a double precision number. Extended have more, singles have less. That is mathematical reality. Computers are not idealized mathematical machines. If it was easy everyone would be an expert. Knowing how things are treated by the underlying hardware can keep one from having these problems.&lt;br /&gt;
&lt;br /&gt;
[[Category:numeric]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Numeric&amp;diff=3128</id>
		<title>Numeric</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Numeric&amp;diff=3128"/>
		<updated>2007-10-24T15:08:07Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* NaN equivalent for integer data types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[NaN]] equivalent for [[integer]] data types ==&lt;br /&gt;
NaN is defined only for floating point numbers. In a [[U32]] all the possible values are actual numbers and there is no place left for a special value that says there is nothing there. If you need an &amp;quot;empty&amp;quot; value in an integer data type you have to pick a value that never appears in your particular application (if there really is one) to serve as a flag. In other words there is no &amp;quot;empty value&amp;quot; in integer data types.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;A useful trick:&#039;&#039;&#039; In most cases, zero or -1 are used as the magic sentinel value for integer work. But sometimes you&#039;d like to use &amp;quot;largest possible integer&amp;quot; as your sentinel value because zero and -1 are actual values, and you don&#039;t expect to ever actually use the large end of the spectrum. But nobody actually remembers the largest possible integer, and even if you look it up, typing it is annoying. Solution: Drop a Numeric constant on the block diagram and set it to be your type of integer. Then type a long string of 9s into it, such as &amp;quot;99999999999999999999999999999999999999999&amp;quot;. LabVIEW will automatically change this to be the largest possible integer storable in your data type. &lt;br /&gt;
&lt;br /&gt;
Test a floating point wire for NaN by using [[Image:Nanfunc.png]] from the Comparison pallete.&lt;br /&gt;
&lt;br /&gt;
== Comparing real numbers ==&lt;br /&gt;
What you need is a comparison that assumes that equal is the same as close enough. One way is to define an epsilon and check to make sure that your error is greater than that epsilon where epsilon is dependent on the type of number (single, double, extended) that you are using. For example to compare A greater than or equal to B (as double precision) you could use as your test.&lt;br /&gt;
&lt;br /&gt;
A-B &amp;gt;= -1e-17*(A+B)/2&lt;br /&gt;
&lt;br /&gt;
Or maybe 1e-16 to be safe. To be really careful use 2^-31 as your criterion. This handles the case where A is already 10^-31 in magnitude or when both variables are zero.&lt;br /&gt;
&lt;br /&gt;
A simpler method is to multiply your numbers by 10 to make integers, round them and then compare. In fact you can multiply by whatever power of 10 desired.&lt;br /&gt;
&lt;br /&gt;
This is *not* a bug. It appears as a result of the limitation of finite computers. There is not now and never will be a fix. The main fix is to the programmer. As a caveat, do not ever, ever, ever compare real numbers. They are uncertain within the least significant bit.&lt;br /&gt;
&lt;br /&gt;
These uncertainties arise in several situations. Another example where this must be taken into account is the output of both&amp;quot;Format &amp;amp; Strip&amp;quot; and &amp;quot;From Exponential/Fract/Eng&amp;quot;; enter a string of &amp;quot;0.1&amp;quot; and you get the number: 0.10000000000000000100. You cannot represent 0.1 as a finite binary string.&lt;br /&gt;
&lt;br /&gt;
As to a wish for a finite conversion width, nope. The problem is that the conversion does have a finite width. It is that factor of 5 in base 10 numbers that makes a finite decimal be an infinite repeating binary string. You can represent all numbers that can be formed as sums of 1/2, 1/4, 1/8, 1/16, 1/32. Unfortunately 1/10 can only be approximated. The wish seems to indicate that the binary is converted to base 10 (with a finite conversion width) and then compared. Actually it is all compared in binary, when you display it, you can convert it to 10 digits or what ever you want.&lt;br /&gt;
&lt;br /&gt;
In summary, any binary representation will be approximate. How approximate is based on the word length. It is that factor of 5 in base 10 numbers that gets us. It appears that you have 17 digits of accuracy which is about right for a double precision number. Extended have more, singles have less. That is mathematical reality. Computers are not idealized mathematical machines. If it was easy everyone would be an expert. Knowing how things are treated by the underlying hardware can keep one from having these problems.&lt;br /&gt;
&lt;br /&gt;
[[Category:numeric]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Keyboard_shortcut&amp;diff=3127</id>
		<title>Keyboard shortcut</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Keyboard_shortcut&amp;diff=3127"/>
		<updated>2007-10-23T15:52:12Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Object Movement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a complete list of LabVIEW development environment keyboard shortcut keys.&lt;br /&gt;
[[Image:Keyboardkeys.png‎|frame]]&lt;br /&gt;
==Object Movement==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Shift-click&lt;br /&gt;
| Selects multiple objects; adds object to current selection.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-click&lt;br /&gt;
| Toggles a single object to join or leave the current selection. &lt;br /&gt;
|-&lt;br /&gt;
| Arrow keys&lt;br /&gt;
| Moves selected objects one pixel at a time.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Arrow keys&lt;br /&gt;
| Moves selected objects several pixels at a time. If the Alignment Grid is enabled, the object will move to align with the grid and thereafter will move in grid increments.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-click (drag)&lt;br /&gt;
| Moves selected objects in one axis.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-click (drag)&lt;br /&gt;
| Duplicates selected object&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-click (drag)&lt;br /&gt;
| Duplicates selected object and moves it in one axis.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-resize&lt;br /&gt;
| Resizes selected object while maintaining aspect ratio.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-resize&lt;br /&gt;
| Resizes selected object while maintaining center point.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-resize&lt;br /&gt;
| Resizes selected object while maintaining center point and aspect ratio.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-drag a rectangle&lt;br /&gt;
| Adds more working space to the front panel or block diagram.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-A&lt;br /&gt;
| Selects all front panel or block diagram items.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-A&lt;br /&gt;
| Performs last alignment operation on objects.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-D&lt;br /&gt;
| Performs last distribution operation on objects.&lt;br /&gt;
|-&lt;br /&gt;
| Double-click open space&lt;br /&gt;
| Adds a free label to the front panel or block diagram if automatic tool selection is enabled.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-mouse wheel&lt;br /&gt;
| Scrolls through subdiagrams of a Case, Event, or Stacked Sequence structure.&lt;br /&gt;
|-&lt;br /&gt;
| g or G (no modifier keys)&lt;br /&gt;
| While dragging an object with the mouse, this momentarily toggles on or off the alignment grid&lt;br /&gt;
|-&lt;br /&gt;
| a or A (no modifier keys)&lt;br /&gt;
| While dragging an object on the block diagram, this momentarily toggles on or off the automatic wiring&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar (drag)&lt;br /&gt;
| Disables preset alignment positions when moving object labels or captions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigating the LabVIEW Environment==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-F&lt;br /&gt;
| Finds objects or text.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-F&lt;br /&gt;
| Displays Search Results window or the Find Project Items dialog box with the previous search results.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-G&lt;br /&gt;
| Searches for next instance of object or text.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-G&lt;br /&gt;
| Searches for previous instance of VIs, object, or text.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Tab&lt;br /&gt;
| Cycles through LabVIEW windows in the order the windows appear onscreen. The order of the windows depends on the window manager you use.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-Tab&lt;br /&gt;
| Cycles the opposite direction through LabVIEW windows.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-L&lt;br /&gt;
| Displays the Error List window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-W&lt;br /&gt;
| Displays the All Windows dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-B&lt;br /&gt;
| Displays the Class Browser window.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigating Front Panels and Block Diagrams==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-E&lt;br /&gt;
| Displays block diagram or front panel window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-#&lt;br /&gt;
| Enables or disables grid alignment. On French keyboards, press the &amp;amp;lt;Ctrl-&amp;amp;quot;&amp;amp;gt; keys. (Mac OS) Press the &amp;amp;lt;Command-*&amp;amp;gt; keys.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-/&lt;br /&gt;
| Maximizes and restores window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-T&lt;br /&gt;
| Tiles front panel and block diagram windows.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-N&lt;br /&gt;
| Displays the Navigation window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-I&lt;br /&gt;
| Displays the VI Properties dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Y&lt;br /&gt;
| Displays the History window.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigating the VI Hierarchy Window==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-D&lt;br /&gt;
| Redraws the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-A&lt;br /&gt;
| Shows all VIs in the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-click VI&lt;br /&gt;
| Displays the subVIs and other nodes that make up the VI you select in the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Enter&lt;br /&gt;
| Finds the next node that matches the search string after initiating a search by typing in the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Enter&lt;br /&gt;
| Finds the previous node that matches the search string after initiating a search by typing in the VI Hierarchy window.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Debugging==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Down arrow&lt;br /&gt;
| Steps into node.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Right arrow&lt;br /&gt;
| Steps over node.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Up arrow&lt;br /&gt;
| Steps out of node.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==File Operations==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-N&lt;br /&gt;
| Opens a new, blank VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-O&lt;br /&gt;
| Opens an existing VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-W&lt;br /&gt;
| Closes the VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-S&lt;br /&gt;
| Saves the VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-S&lt;br /&gt;
| Saves all open files.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-P&lt;br /&gt;
| Prints the window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Q&lt;br /&gt;
| Quits LabVIEW.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Basic Editing==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Z&lt;br /&gt;
| Undoes last action.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-Z&lt;br /&gt;
| Redoes last action.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-X&lt;br /&gt;
| Cuts an object.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-C&lt;br /&gt;
| Copies an object.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-V&lt;br /&gt;
| Pastes an object.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Help==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-H&lt;br /&gt;
| Displays Context Help window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-L&lt;br /&gt;
| Locks Context Help window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-? or &amp;amp;lt;F1&amp;amp;gt;&lt;br /&gt;
| Displays LabVIEW Help.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tools and Palettes==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl&lt;br /&gt;
| Switches to next most useful tool.&lt;br /&gt;
|-&lt;br /&gt;
| Shift&lt;br /&gt;
| Switches to Positioning tool.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift over open space&lt;br /&gt;
| Switches to Scrolling tool.&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar&lt;br /&gt;
| Toggles between two most common tools if automatic tool selection is disabled.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Tab&lt;br /&gt;
| Enables automatic tool selection.&lt;br /&gt;
|-&lt;br /&gt;
| Tab&lt;br /&gt;
| Cycles through four most common tools if you disabled automatic tool selection by clicking the [[automatic tool selection]] button. Otherwise, enables automatic tool selection.&lt;br /&gt;
|-&lt;br /&gt;
| Arrow keys&lt;br /&gt;
| Navigates temporary [[Control|Controls]] and Functions palettes.&lt;br /&gt;
|-&lt;br /&gt;
| Enter&lt;br /&gt;
| Navigates into a temporary [[palette]].&lt;br /&gt;
|-&lt;br /&gt;
| Esc&lt;br /&gt;
| Navigates out of a temporary palette.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-right-click&lt;br /&gt;
| Displays a temporary version of the Tools palette at the location of the cursor.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==SubVIs==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Double-click subVI&lt;br /&gt;
| Displays subVI front panel.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-double-click subVI&lt;br /&gt;
| Displays subVI block diagram and front panel.&lt;br /&gt;
|-&lt;br /&gt;
| Drag VI icon to block diagram&lt;br /&gt;
| Places that VI as a subVI on the block diagram.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-drag VI icon to block diagram&lt;br /&gt;
| Places that VI as a subVI on the block diagram with constants wired for controls that have non-default values.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-right-click block diagram and select VI from palette&lt;br /&gt;
| Opens front panel of that VI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Execution==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-R&lt;br /&gt;
| Runs the VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-.&lt;br /&gt;
| Stops the VI, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-M&lt;br /&gt;
| Changes to run or edit mode.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Run button&lt;br /&gt;
| Recompiles the current VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-Run button&lt;br /&gt;
| Recompiles all VIs in memory.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Down arrow&lt;br /&gt;
| Moves key focus inside an array or cluster, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Up arrow&lt;br /&gt;
| Moves key focus outside an array or cluster, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Tab&lt;br /&gt;
| Navigates the controls or indicators according to tabbing order, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Tab&lt;br /&gt;
| Navigates backward through the controls or indicators, when used while VI is running.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wiring==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-B&lt;br /&gt;
| Deletes all broken wires in a VI.&lt;br /&gt;
|-&lt;br /&gt;
| Esc, right-click, or click terminal&lt;br /&gt;
| Cancels a wire you started.&lt;br /&gt;
|-&lt;br /&gt;
| Single-click wire&lt;br /&gt;
| Selects one segment.&lt;br /&gt;
|-&lt;br /&gt;
| Double-click wire&lt;br /&gt;
| Selects a branch.&lt;br /&gt;
|-&lt;br /&gt;
| Triple-click wire&lt;br /&gt;
| Selects entire wire.&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| While wiring, disables automatic wire routing temporarily.&lt;br /&gt;
|-&lt;br /&gt;
| Double-click (while wiring)&lt;br /&gt;
| Tacks down wire without connecting it.&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar&lt;br /&gt;
| Toggles automatic wiring while moving objects.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-click&lt;br /&gt;
| Undoes last point where you set a wire.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-click input on function with two inputs&lt;br /&gt;
| Switches the two input wires.&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar&lt;br /&gt;
| Switches the direction of a wire between horizontal and vertical.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Double-click&lt;br /&gt;
| Selects a single word in a string.&lt;br /&gt;
|-&lt;br /&gt;
| Triple-click&lt;br /&gt;
| Selects an entire string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Right arrow&lt;br /&gt;
| Moves forward in string by one word when using text that has characters that use single bytes, such as Western character sets. Moves forward in string by one character when using text that has characters that use multiple bytes, such as Asian character sets.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Left arrow&lt;br /&gt;
| Moves backward in string by one word when using text that has characters that use single bytes, such as Western character sets. Moves backward in string by one character when using text that has characters that use multiple bytes, such as Asian character sets.&lt;br /&gt;
|-&lt;br /&gt;
| Home&lt;br /&gt;
| Moves to beginning of current line in string.&lt;br /&gt;
|-&lt;br /&gt;
| End&lt;br /&gt;
| Moves to end of current line in string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Home&lt;br /&gt;
| Moves to beginning of entire string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-End&lt;br /&gt;
| Moves to end of entire string.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Enter&lt;br /&gt;
| Adds new items when entering items in enumerated type controls and constants, ring controls and constants, or Case structures. In string constants, press the &amp;amp;lt;Shift-Enter&amp;amp;gt; keys on the keyboard to disable autosizing if it is enabled. If autosizing is disabled, press the &amp;amp;lt;Shift-Enter&amp;amp;gt; keys on the keyboard to display a scroll bar in the constant.&lt;br /&gt;
|-&lt;br /&gt;
| Esc&lt;br /&gt;
| Cancels current edit in a string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Enter&lt;br /&gt;
| Ends text entry.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-=&lt;br /&gt;
| Increases the current font size.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl--&lt;br /&gt;
| Decreases the current font size.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-0&lt;br /&gt;
| Displays the Font dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-1&lt;br /&gt;
| Changes to the Application font in &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-2&lt;br /&gt;
| Changes to the System font in the &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-3&lt;br /&gt;
| Changes to the Dialog font in the &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-4&lt;br /&gt;
| Changes to the current font in the &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=See also=&lt;br /&gt;
*[[Tips and tricks]] - LabVIEW tips and tricks.&lt;br /&gt;
&lt;br /&gt;
[[category:lists|Keyboard shortcuts for LabVIEW]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Keyboard_shortcut&amp;diff=3126</id>
		<title>Keyboard shortcut</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Keyboard_shortcut&amp;diff=3126"/>
		<updated>2007-10-23T15:49:31Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Object Movement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a complete list of LabVIEW development environment keyboard shortcut keys.&lt;br /&gt;
[[Image:Keyboardkeys.png‎|frame]]&lt;br /&gt;
==Object Movement==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Shift-click&lt;br /&gt;
| Selects multiple objects; adds object to current selection.&lt;br /&gt;
|-&lt;br /&gt;
| Arrow keys&lt;br /&gt;
| Moves selected objects one pixel at a time.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Arrow keys&lt;br /&gt;
| Moves selected objects several pixels at a time.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-click (drag)&lt;br /&gt;
| Moves selected objects in one axis.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-click (drag)&lt;br /&gt;
| Duplicates selected object&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-click (drag)&lt;br /&gt;
| Duplicates selected object and moves it in one axis.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-resize&lt;br /&gt;
| Resizes selected object while maintaining aspect ratio.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-resize&lt;br /&gt;
| Resizes selected object while maintaining center point.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-resize&lt;br /&gt;
| Resizes selected object while maintaining center point and aspect ratio.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-drag a rectangle&lt;br /&gt;
| Adds more working space to the front panel or block diagram.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-A&lt;br /&gt;
| Selects all front panel or block diagram items.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-A&lt;br /&gt;
| Performs last alignment operation on objects.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-D&lt;br /&gt;
| Performs last distribution operation on objects.&lt;br /&gt;
|-&lt;br /&gt;
| Double-click open space&lt;br /&gt;
| Adds a free label to the front panel or block diagram if automatic tool selection is enabled.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-mouse wheel&lt;br /&gt;
| Scrolls through subdiagrams of a Case, Event, or Stacked Sequence structure.&lt;br /&gt;
|-&lt;br /&gt;
| g or G (no modifier keys)&lt;br /&gt;
| While dragging an object with the mouse, this momentarily toggles on or off the alignment grid&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar (drag)&lt;br /&gt;
| Disables preset alignment positions when moving object labels or captions.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigating the LabVIEW Environment==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-F&lt;br /&gt;
| Finds objects or text.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-F&lt;br /&gt;
| Displays Search Results window or the Find Project Items dialog box with the previous search results.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-G&lt;br /&gt;
| Searches for next instance of object or text.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-G&lt;br /&gt;
| Searches for previous instance of VIs, object, or text.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Tab&lt;br /&gt;
| Cycles through LabVIEW windows in the order the windows appear onscreen. The order of the windows depends on the window manager you use.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-Tab&lt;br /&gt;
| Cycles the opposite direction through LabVIEW windows.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-L&lt;br /&gt;
| Displays the Error List window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-W&lt;br /&gt;
| Displays the All Windows dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-B&lt;br /&gt;
| Displays the Class Browser window.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigating Front Panels and Block Diagrams==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-E&lt;br /&gt;
| Displays block diagram or front panel window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-#&lt;br /&gt;
| Enables or disables grid alignment. On French keyboards, press the &amp;amp;lt;Ctrl-&amp;amp;quot;&amp;amp;gt; keys. (Mac OS) Press the &amp;amp;lt;Command-*&amp;amp;gt; keys.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-/&lt;br /&gt;
| Maximizes and restores window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-T&lt;br /&gt;
| Tiles front panel and block diagram windows.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-N&lt;br /&gt;
| Displays the Navigation window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-I&lt;br /&gt;
| Displays the VI Properties dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Y&lt;br /&gt;
| Displays the History window.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Navigating the VI Hierarchy Window==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-D&lt;br /&gt;
| Redraws the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-A&lt;br /&gt;
| Shows all VIs in the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-click VI&lt;br /&gt;
| Displays the subVIs and other nodes that make up the VI you select in the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Enter&lt;br /&gt;
| Finds the next node that matches the search string after initiating a search by typing in the VI Hierarchy window.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Enter&lt;br /&gt;
| Finds the previous node that matches the search string after initiating a search by typing in the VI Hierarchy window.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Debugging==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Down arrow&lt;br /&gt;
| Steps into node.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Right arrow&lt;br /&gt;
| Steps over node.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Up arrow&lt;br /&gt;
| Steps out of node.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==File Operations==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-N&lt;br /&gt;
| Opens a new, blank VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-O&lt;br /&gt;
| Opens an existing VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-W&lt;br /&gt;
| Closes the VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-S&lt;br /&gt;
| Saves the VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-S&lt;br /&gt;
| Saves all open files.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-P&lt;br /&gt;
| Prints the window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Q&lt;br /&gt;
| Quits LabVIEW.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Basic Editing==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Z&lt;br /&gt;
| Undoes last action.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-Z&lt;br /&gt;
| Redoes last action.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-X&lt;br /&gt;
| Cuts an object.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-C&lt;br /&gt;
| Copies an object.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-V&lt;br /&gt;
| Pastes an object.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Help==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-H&lt;br /&gt;
| Displays Context Help window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-L&lt;br /&gt;
| Locks Context Help window.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-? or &amp;amp;lt;F1&amp;amp;gt;&lt;br /&gt;
| Displays LabVIEW Help.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Tools and Palettes==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl&lt;br /&gt;
| Switches to next most useful tool.&lt;br /&gt;
|-&lt;br /&gt;
| Shift&lt;br /&gt;
| Switches to Positioning tool.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift over open space&lt;br /&gt;
| Switches to Scrolling tool.&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar&lt;br /&gt;
| Toggles between two most common tools if automatic tool selection is disabled.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Tab&lt;br /&gt;
| Enables automatic tool selection.&lt;br /&gt;
|-&lt;br /&gt;
| Tab&lt;br /&gt;
| Cycles through four most common tools if you disabled automatic tool selection by clicking the [[automatic tool selection]] button. Otherwise, enables automatic tool selection.&lt;br /&gt;
|-&lt;br /&gt;
| Arrow keys&lt;br /&gt;
| Navigates temporary [[Control|Controls]] and Functions palettes.&lt;br /&gt;
|-&lt;br /&gt;
| Enter&lt;br /&gt;
| Navigates into a temporary [[palette]].&lt;br /&gt;
|-&lt;br /&gt;
| Esc&lt;br /&gt;
| Navigates out of a temporary palette.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-right-click&lt;br /&gt;
| Displays a temporary version of the Tools palette at the location of the cursor.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==SubVIs==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Double-click subVI&lt;br /&gt;
| Displays subVI front panel.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-double-click subVI&lt;br /&gt;
| Displays subVI block diagram and front panel.&lt;br /&gt;
|-&lt;br /&gt;
| Drag VI icon to block diagram&lt;br /&gt;
| Places that VI as a subVI on the block diagram.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-drag VI icon to block diagram&lt;br /&gt;
| Places that VI as a subVI on the block diagram with constants wired for controls that have non-default values.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-right-click block diagram and select VI from palette&lt;br /&gt;
| Opens front panel of that VI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Execution==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-R&lt;br /&gt;
| Runs the VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-.&lt;br /&gt;
| Stops the VI, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-M&lt;br /&gt;
| Changes to run or edit mode.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Run button&lt;br /&gt;
| Recompiles the current VI.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Shift-Run button&lt;br /&gt;
| Recompiles all VIs in memory.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Down arrow&lt;br /&gt;
| Moves key focus inside an array or cluster, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Up arrow&lt;br /&gt;
| Moves key focus outside an array or cluster, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Tab&lt;br /&gt;
| Navigates the controls or indicators according to tabbing order, when used while VI is running.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Tab&lt;br /&gt;
| Navigates backward through the controls or indicators, when used while VI is running.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Wiring==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-B&lt;br /&gt;
| Deletes all broken wires in a VI.&lt;br /&gt;
|-&lt;br /&gt;
| Esc, right-click, or click terminal&lt;br /&gt;
| Cancels a wire you started.&lt;br /&gt;
|-&lt;br /&gt;
| Single-click wire&lt;br /&gt;
| Selects one segment.&lt;br /&gt;
|-&lt;br /&gt;
| Double-click wire&lt;br /&gt;
| Selects a branch.&lt;br /&gt;
|-&lt;br /&gt;
| Triple-click wire&lt;br /&gt;
| Selects entire wire.&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| While wiring, disables automatic wire routing temporarily.&lt;br /&gt;
|-&lt;br /&gt;
| Double-click (while wiring)&lt;br /&gt;
| Tacks down wire without connecting it.&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar&lt;br /&gt;
| Toggles automatic wiring while moving objects.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-click&lt;br /&gt;
| Undoes last point where you set a wire.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-click input on function with two inputs&lt;br /&gt;
| Switches the two input wires.&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar&lt;br /&gt;
| Switches the direction of a wire between horizontal and vertical.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Text==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Keyboard Shortcut&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| Double-click&lt;br /&gt;
| Selects a single word in a string.&lt;br /&gt;
|-&lt;br /&gt;
| Triple-click&lt;br /&gt;
| Selects an entire string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Right arrow&lt;br /&gt;
| Moves forward in string by one word when using text that has characters that use single bytes, such as Western character sets. Moves forward in string by one character when using text that has characters that use multiple bytes, such as Asian character sets.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Left arrow&lt;br /&gt;
| Moves backward in string by one word when using text that has characters that use single bytes, such as Western character sets. Moves backward in string by one character when using text that has characters that use multiple bytes, such as Asian character sets.&lt;br /&gt;
|-&lt;br /&gt;
| Home&lt;br /&gt;
| Moves to beginning of current line in string.&lt;br /&gt;
|-&lt;br /&gt;
| End&lt;br /&gt;
| Moves to end of current line in string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Home&lt;br /&gt;
| Moves to beginning of entire string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-End&lt;br /&gt;
| Moves to end of entire string.&lt;br /&gt;
|-&lt;br /&gt;
| Shift-Enter&lt;br /&gt;
| Adds new items when entering items in enumerated type controls and constants, ring controls and constants, or Case structures. In string constants, press the &amp;amp;lt;Shift-Enter&amp;amp;gt; keys on the keyboard to disable autosizing if it is enabled. If autosizing is disabled, press the &amp;amp;lt;Shift-Enter&amp;amp;gt; keys on the keyboard to display a scroll bar in the constant.&lt;br /&gt;
|-&lt;br /&gt;
| Esc&lt;br /&gt;
| Cancels current edit in a string.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-Enter&lt;br /&gt;
| Ends text entry.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-=&lt;br /&gt;
| Increases the current font size.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl--&lt;br /&gt;
| Decreases the current font size.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-0&lt;br /&gt;
| Displays the Font dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-1&lt;br /&gt;
| Changes to the Application font in &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-2&lt;br /&gt;
| Changes to the System font in the &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-3&lt;br /&gt;
| Changes to the Dialog font in the &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|-&lt;br /&gt;
| Ctrl-4&lt;br /&gt;
| Changes to the current font in the &amp;lt;strong&amp;gt;Font&amp;lt;/strong&amp;gt; dialog box.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=See also=&lt;br /&gt;
*[[Tips and tricks]] - LabVIEW tips and tricks.&lt;br /&gt;
&lt;br /&gt;
[[category:lists|Keyboard shortcuts for LabVIEW]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=LabVIEW_object-oriented_programming_FAQ&amp;diff=1961</id>
		<title>LabVIEW object-oriented programming FAQ</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=LabVIEW_object-oriented_programming_FAQ&amp;diff=1961"/>
		<updated>2007-08-14T21:03:28Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Add external link to NI&amp;#039;s LVOOP FAQ&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a stub page for Frequently Asked Questions (FAQ) about LVOOP.  Please feel free to add to the list of FAQ and answer any of the questions that have been posted.&lt;br /&gt;
&lt;br /&gt;
You may find many questions already answered on the [http://zone.ni.com/devzone/cda/tut/p/id/3573 LVOOP FAQ on NI&#039;s website]. That FAQ will be updated by NI for new versions of LabVIEW and new OO tools as they become available. &lt;br /&gt;
==Why is class data private?==&lt;br /&gt;
In general object-oriented programming terms, attributes (like methods) can have private, protected, or public visibility.  In practice individual object-oriented programming languages have differing capabilities when it comes to specifying visibility.  In the UML attributes are generally assumed to have private visibility unless otherwise specified.  (Operations, on the other hand, are assumed to be public unless otherwise specified.)  Generally, OOP style guides say never to give attributes public visibility, and the so-called “Law of Demeter” in its strong form limits attribute visibilities to private.  In other words, access to data in a class from outside the class is always through accessor methods (‘set’ or ‘get’) methods.  In LVOOP this is the only choice, a decision designed to promote good code designs with minimal coupling.  (See further here: [http://zone.ni.com/devzone/cda/tut/p/id/3574]).  (Note that LabVIEW 8.5 introduces a “Create Accessor” dialog box to simplify the creation of accessor methods.  For more information on this dialog box see the LabVIEW 8.5 Upgrade Notes here: [http://digital.ni.com/manuals.nsf/websearch/7A60FDCEA6D2D8C4862572FD00159F5A].)&lt;br /&gt;
&lt;br /&gt;
==What are the differences between public, protected, and private class members?==&lt;br /&gt;
&lt;br /&gt;
==Why are there no class constructor and destructor?==&lt;br /&gt;
&lt;br /&gt;
==Are objects by value or by reference?==&lt;br /&gt;
&lt;br /&gt;
==What does LVOOP mean?==&lt;br /&gt;
&lt;br /&gt;
==How can I create by reference objects?==&lt;br /&gt;
&lt;br /&gt;
==How can I create active objects?==&lt;br /&gt;
&lt;br /&gt;
==Are there any add on tools for LVOOP?==&lt;br /&gt;
&lt;br /&gt;
==What does the &amp;quot;Dynamic Dispatch&amp;quot; connector pane terminal setting do?==&lt;br /&gt;
&lt;br /&gt;
[[Category:GOOP]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Functional_global_variable&amp;diff=1921</id>
		<title>Functional global variable</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Functional_global_variable&amp;diff=1921"/>
		<updated>2007-08-10T15:15:48Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Functional Globals are VIs that allow controlled access to data or resources, often allowing various actions to be performed.  Functional Globals (FGs) most often make use of uninitialized shift registers (USRs).  USRs are shift registers that do not have a wired input coming into the left side of the loop.  A USR stores its data between successive runs of the VI as long as the VI remains in memory.&lt;br /&gt;
&lt;br /&gt;
==Alternative Nomenclature==&lt;br /&gt;
Functional Globals are known by various names among LabVIEW programmers.&lt;br /&gt;
*LV2 globals – because LV2 supported uninitialized shift registers&lt;br /&gt;
*USR globals – since most FGs make use of uninitialized shift registers&lt;br /&gt;
* VIG - &amp;quot;VI Global&amp;quot; as the VI performs the functionality of a global&lt;br /&gt;
*Action Engines – it has been argued [http://forums.ni.com/ni/board/message?board.id=170&amp;amp;message.id=240328&amp;amp;query.id=618807#M240328] that the term Functional Globals should refer to VIs that just allow read/write access to data.  Action Engines would refer to the larger set of VIs that allow some defined action on the data. &lt;br /&gt;
&lt;br /&gt;
The official name for these constructs in NI literature is Functional Global Variable, and a [http://forums.lavag.org/index.php?showtopic=2469&amp;amp;st=0 survey] on LAVA indicated that Functional Globals is also the most popular choice.&lt;br /&gt;
&lt;br /&gt;
==Structure==&lt;br /&gt;
The most common form of a Functional Global is a [[While Loop]] with a TRUE wired to the stop condition.  This forces the loop to terminate after just one execution, meaning the while loop is only used to provide a place to put USRs.  A [[For Loop]] could also be used with a constant wired to the count terminal.  Another method is to use a single-element queue to store the data, though this requires more mouse clicks to implement.  The performance of each of these is very close and most likely will vary a little from computer to computer.&lt;br /&gt;
&lt;br /&gt;
[[Image:Simple_FG.PNG|frame|center|Simple Functional Global using a While Loop]]&lt;br /&gt;
&lt;br /&gt;
In order to specify what action to perform, an [[enumerated type]] is often used as an input to the Functional Global.  Other methods are possible (Booleans, First Call?, etc.), but an enumerated type provides for a readable, extensible list of actions.  Furthermore, saving the enumerated type as a typedef control makes any changes to the list automatically update wherever the Functional Global is used in the code.  The ‘action’ input is fed to a case structure which contains the code to implement for each of the defined actions.&lt;br /&gt;
&lt;br /&gt;
For more complex situations, multiple actions can be performed on a single call to the FG.  This can be a straightforward [[state machine]], or it can allow for different actions based on the data received or on the existence of resources, etc.&lt;br /&gt;
&lt;br /&gt;
The data in a Functional Global could be of any type, but very often there will be several data elements in a single FG.  It is helpful to group the data into a cluster to limit the number of wires entering and leaving the FG.  Designing the data structures and how you cluster your data should be done early on, rather than haphazardly growing your clusters as you grow your program.&lt;br /&gt;
&lt;br /&gt;
In order to deal with varying input requirements on the different actions, one can create ‘wrappers’ around the Functional Global that allow for different inputs to be required.  This also gives the benefit of being able to search your code for certain actions as you can search for a specific VI, but not a specific enumerated type’s value.&lt;br /&gt;
&lt;br /&gt;
==Uses==&lt;br /&gt;
The primary use of Functional Globals is to provide data sharing across an entire project, both horizontally and vertically.  Horizontal sharing means multiple top-level VIs running autonomously can all have access to the same data.  Vertical sharing means that subVIs at any depth will have access to the data without requiring explicit passing of parameters through VI [[connector pane]] terminals.  These are common issues in even small-sized programs.&lt;br /&gt;
&lt;br /&gt;
Another common use is to encapsulate some functionality, especially functionality that is linked to persistent data or resources like files or devices.  This encapsulation protects the resource and provides an extensible interface for interacting with the data or resource.  The encapsulation also allows you to avoid a plethora of shift registers in a single VI.  You can offload the shift-register to the Functional Global, and call it when needed, without worrying about wiring the data through all your case structures.&lt;br /&gt;
&lt;br /&gt;
To get a better idea of what can be done with Functional Globals, here is a list of things that can be done:&lt;br /&gt;
*Load information from a file into a FG, access it anywhere in your program&lt;br /&gt;
*Maintain your system’s configuration parameters in one location.&lt;br /&gt;
*Store a control reference (like a tree control) in a FG, and then define an interface to manage that control.  For complex controls like trees and multi-column listboxes this can simplify your top-level code.&lt;br /&gt;
*Timers are well implemented with FGs.  You can keep the start time in the shift register, and then check the elapsed time when you call it again.&lt;br /&gt;
*Automatically preallocate an array when the FG is first called, then use “Replace Array Subset” to efficiently manipulate the array.&lt;br /&gt;
*Keep an ‘Undo’ list (stack) that allows you to push changes onto a stack, and pop them off when you need to undo the change. &lt;br /&gt;
The list could go on and on – whatever you can dream up!&lt;br /&gt;
&lt;br /&gt;
==Race Conditions and Locking==&lt;br /&gt;
One of the main reasons that Functional Globals are encouraged in lieu of [[global variable]]s is race conditions.  The majority of Functional Globals are, by definition, not reentrant so that different calls to the FG will all refer to the same shift registers and hence the same data or resource.  This means that when a VI calls a FG, that FG is locked or reserved for use by the calling VI.  Other VIs need to wait until it is done before they can call the FG.&lt;br /&gt;
&lt;br /&gt;
Global variables are reentrant.  If you try to write a value to the global in several places in your code, updates to the value are unpredictable with respect to time. This means that changes to the global can be subject to race conditions. This is especially true if you read/write to the global where a race condition could occur between the read and the write of the variable.&lt;br /&gt;
&lt;br /&gt;
The downside for Functional Globals is that the locking that takes place can be a bottleneck in the code if many VIs are trying to access the FG at the same time.  The majority of applications will not have a problem, but care must be taken if speed is a concern.&lt;br /&gt;
&lt;br /&gt;
It is also important to note that Functional Globals are not a cure-all for race conditions.  If actions on the Functional Global are not atomic (i.e. they require more than one call to the FG) then race conditions are still possible.  Race conditions are only eliminated if all updates to the data are done inside the FG, in a single call.  Here are a couple ways to still allow race conditions with FGs.&lt;br /&gt;
*Ask for the data from the FG, change it, and then write it back to the FG.&lt;br /&gt;
*Successive modifications, such as {Set data, normalize data, sort data, output max}  By the time you sort the data, new data could have been set that hasn’t been normalized.&lt;br /&gt;
&lt;br /&gt;
==Benefits==&lt;br /&gt;
#Efficient Memory Usage – Because the VI retains the same data space regardless of it use in the code, only a single call to the memory manager is made. If arrays are stored in the USR, and replace array element primitives used, then the memory space is efficiently used wherever the VI is called.&lt;br /&gt;
#Reduces problems with race conditions, as discussed above.&lt;br /&gt;
#Error checking can be done on data writes (Global variables don’t allow this).&lt;br /&gt;
#High-level code more readable – By moving shift registers and code logic into Functional Globals with readable action lists, top-level code become simpler and cleaner.&lt;br /&gt;
#Reuse.  Many FGs are generic enough to be used over and over again.&lt;br /&gt;
&lt;br /&gt;
==Concerns==&lt;br /&gt;
===Busy connector panes===&lt;br /&gt;
Terminals get used up quickly, so be sure to design well up front and choose a connector pane with more terminals than you need.  You can avoid excessive terminal usage by grouping all of your data into a cluster (preferably, a [[Type Definition]]) that is passed in and out of your functional global which will allow you to bundle and unbundle specific variables as needed on your main VI.&lt;br /&gt;
&lt;br /&gt;
===Data Persistence===&lt;br /&gt;
Data in a USR, and hence in a Functional Global, disappears if the owning VI goes out of memory.  When a VI runs for the first time, all of its subVIs that are not already in memory are loaded into memory and they belong to that parent VI.  If that parent VI is stopped, all of the subVIs that belong to it are also released from memory – even if there are other VIs in memory still referencing those subVIs.  The next time one of those subVIs is run, it is loaded into memory again and that calling VI becomes the new parent VI.  But if there was anything stored in USRs, that data is now gone.  &lt;br /&gt;
&lt;br /&gt;
This behavior is different from a queue reference, for instance, where the queue is only destroyed when ALL VIs referencing it leave memory.  It means that if you use Functional Globals across multiple top-level VIs, then you need to have a VI that is run first and contains all of your Functional Globals as subVIs.  This ‘First Run’ VI must stay in memory until all other top-level VIs are closed to insure that the Functional Global data will be available.&lt;br /&gt;
&lt;br /&gt;
==Reentrant functional globals==&lt;br /&gt;
===Unshared data===&lt;br /&gt;
There are certain problems where you do not need to share the persistent data elsewhere in the code.  If you create a &#039;&#039;&#039;windowed average&#039;&#039;&#039; VI, it can be made reentrant and can be used in multiple places in your code to average data streams.  This is an example of an in-place operation that is not shared, but requires persistent data.  Timing a process in a single loop could be done with one instance of a Functional Global.  Making this timing FG reentrant allows the developer to use that same timing FG to time other processes.  See [[Reentrant VI]] for more information.&lt;br /&gt;
&lt;br /&gt;
===By reference===&lt;br /&gt;
It’s possible to make use of reentrancy to duplicate functional globals. This allows to create as many globals as you need (even at run time) without duplicating code or modifying the original FG. The main disadvantage of this technique is the necessity to keep a reference to every instance of the functional global and pass them to the VIs or subVIs that will use them.&lt;br /&gt;
&lt;br /&gt;
With this method, the only change to the original FG is to make the VI reentrant. Keep in mind that, from now on, this functional global can’t be used in the habitual way, since any instance will retain its own values.&lt;br /&gt;
&lt;br /&gt;
To create an instance of the functional global, open it with the &#039;&#039;&#039;Open VI Reference&#039;&#039;&#039; function (use option 0x08 to prepare for reentrant run) and use the output reference to set the control values, run the VI and get the results. To facilitate things an avoid mistakes when getting/setting values, may be advisable to use the &#039;&#039;&#039;Call by Reference node&#039;&#039;&#039;. Furthermore, the encapsulation of the FG actions in specific wrappers, as detailed in the Structure section above, is also useful.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
*[[Global variable]]&lt;br /&gt;
*[[State machine]]&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
*[http://forums.lavag.org/LV2OO-Style-Global-v20-from-NI-Week-presentation-t8780.html LAVA forum discussion about LV2OO-style globals]&lt;br /&gt;
*[http://forums.ni.com/ni/board/message?board.id=170&amp;amp;message.id=240328&amp;amp;query.id=618807#M240328 NI Forums Community Nugget on Action Engines]&lt;br /&gt;
*[http://zone.ni.com/reference/en-XX/help/371361A-01/lvconcepts/suggestions_for_exec/#Functional_Global_Variables NI Documentation on Functional Global Variables]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=List_of_acronyms&amp;diff=1886</id>
		<title>List of acronyms</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=List_of_acronyms&amp;diff=1886"/>
		<updated>2007-07-10T14:05:08Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Acronyms and abbreviations :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
A/D - Analog/Digital&amp;lt;br /&amp;gt;&lt;br /&gt;
ADatP - Automated Data Processing&amp;lt;br /&amp;gt;&lt;br /&gt;
AKA - Also Known As&amp;lt;br /&amp;gt;&lt;br /&gt;
ANSI - American National Standards Institute&amp;lt;br /&amp;gt;&lt;br /&gt;
API - Application Programming Interfaces&amp;lt;br /&amp;gt;&lt;br /&gt;
ASCII - American Standard Code for Information Interchange&amp;lt;br /&amp;gt;&lt;br /&gt;
BTW - By The Way&amp;lt;br /&amp;gt;&lt;br /&gt;
BYOB - Bring Your Own Beer&amp;lt;br /&amp;gt;&lt;br /&gt;
CAPTCHA - Completely Automated Public Turing test to tell Computers and Humans Apart ... an example would be the questions at the end of online forums that says &amp;quot;type the word you see in this image to continue.&amp;quot; They&#039;re supposed to filter out robots and automated systems and only allow real sentient beings to continue.&amp;lt;br /&amp;gt;&lt;br /&gt;
DA - Dumb @$$&amp;lt;br /&amp;gt;&lt;br /&gt;
DAQ / DAQmx - Data Acquisition&amp;lt;br /&amp;gt;&lt;br /&gt;
DB - Database&amp;lt;br /&amp;gt;&lt;br /&gt;
DILLIGAF - Do I Look Like I Give A F#ck?&amp;lt;br /&amp;gt;&lt;br /&gt;
DIY - Do It Yourself&amp;lt;br /&amp;gt;&lt;br /&gt;
DMA - Direct Memory Access&amp;lt;br /&amp;gt;&lt;br /&gt;
FIFO - First In, First Out&amp;lt;br /&amp;gt;&lt;br /&gt;
FKA - Formerly Known As&amp;lt;br /&amp;gt;&lt;br /&gt;
FYI - For Your Information&amp;lt;br /&amp;gt;&lt;br /&gt;
GL - Graphics Language&amp;lt;br /&amp;gt;&lt;br /&gt;
GNU - GNU&#039;s Not Unix&amp;lt;br /&amp;gt;&lt;br /&gt;
GOOP - Graphical Object-Oriented Programming; see also LVOOP and LabVOOP&amp;lt;br /&amp;gt;&lt;br /&gt;
GPL - GNU General Public License&amp;lt;br /&amp;gt;&lt;br /&gt;
GPS - Global Positioning System&amp;lt;br /&amp;gt;&lt;br /&gt;
HF - High Frequency&amp;lt;br /&amp;gt;&lt;br /&gt;
HH - Homework Hustlers&amp;lt;br /&amp;gt;&lt;br /&gt;
HTML - HyperText Markup Language&amp;lt;br /&amp;gt;&lt;br /&gt;
IMHO = In My Humble Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IMNSHO - In My Not So Humble Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IMO - In My Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IP - Internet Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
IR - Infrared&amp;lt;br /&amp;gt;&lt;br /&gt;
IT - Information Technology&amp;lt;br /&amp;gt;&lt;br /&gt;
JDK - Java Development Kit&amp;lt;br /&amp;gt;&lt;br /&gt;
JK - Just Kidding&amp;lt;br /&amp;gt;&lt;br /&gt;
JVM - Java Virtual Machine&amp;lt;br /&amp;gt;&lt;br /&gt;
LabVOOP - LabVIEW Object Oriented Programming; this version is not preferred by NI (as of July 2007) but is easier to pronounce and may gain currency given time. &lt;br /&gt;
LED - Light-Emitting Diode&amp;lt;br /&amp;gt;&lt;br /&gt;
LF - Low Frequency&amp;lt;br /&amp;gt;&lt;br /&gt;
LIFO - Last In, First Out&amp;lt;br /&amp;gt;&lt;br /&gt;
LOL - Laughing Out Loud&amp;lt;br /&amp;gt;&lt;br /&gt;
LVOOP - LabVIEW Object Oriented Programming; see also GOOP and LabVOOP&amp;lt;br /&amp;gt;&lt;br /&gt;
LQTM - Laughing Quietly To Myself&amp;lt;br /&amp;gt;&lt;br /&gt;
MAX - Measurement &amp;amp; Automation Explorer&amp;lt;br /&amp;gt;&lt;br /&gt;
MXI - Measurement eXtensions for Instrumentation&amp;lt;br /&amp;gt;&lt;br /&gt;
MYOB - Mind Your Own Business&amp;lt;br /&amp;gt;&lt;br /&gt;
NaN - Not A Number&amp;lt;br /&amp;gt;&lt;br /&gt;
N00b - Newbie&amp;lt;br /&amp;gt;&lt;br /&gt;
ODBC - Open DataBase Connectivity&amp;lt;br /&amp;gt;&lt;br /&gt;
OEM - Original Equipment Manufacturer&amp;lt;br /&amp;gt;&lt;br /&gt;
OMG - Oh, My God!&amp;lt;br /&amp;gt;&lt;br /&gt;
OO - Object Oriented&amp;lt;br /&amp;gt;&lt;br /&gt;
P2P - Peer-to-Peer&amp;lt;br /&amp;gt;&lt;br /&gt;
PCI - Peripheral Component Interconnect&amp;lt;br /&amp;gt;&lt;br /&gt;
PS - Post Scriptum (Latin, &amp;quot;written after&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
PS - Power Supply&amp;lt;br /&amp;gt;&lt;br /&gt;
PXI - PCI eXtensions for Instrumentation&amp;lt;br /&amp;gt;&lt;br /&gt;
RT - Real Time&amp;lt;br /&amp;gt;&lt;br /&gt;
RTFM - Read The F#cking/Fine Manual&amp;lt;br /&amp;gt;&lt;br /&gt;
RTSI - Real-Time System Integration&amp;lt;br /&amp;gt;&lt;br /&gt;
TCP - Transmission Control Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
TMI - Too Much Information&amp;lt;br /&amp;gt;&lt;br /&gt;
VBA - Visual Basic for Applications&amp;lt;br /&amp;gt;&lt;br /&gt;
VI - Virtual Instrument&amp;lt;br /&amp;gt;&lt;br /&gt;
VISTA : Virus Inside Switch To Apple&amp;lt;br /&amp;gt;&lt;br /&gt;
VIT - Virtual Instrument Template&amp;lt;br /&amp;gt;&lt;br /&gt;
VOIP - Voice Over Internet Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
W3C - World Wide Web Consortium&amp;lt;br /&amp;gt;&lt;br /&gt;
WTF - What The F#ck? ... sometimes voiced using the US military names for the letters, &amp;quot;Whisky Tango Foxtrot?!&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
XML - eXtensible Markup Language&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=List_of_acronyms&amp;diff=1885</id>
		<title>List of acronyms</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=List_of_acronyms&amp;diff=1885"/>
		<updated>2007-07-10T14:03:10Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Acronyms and abbreviations :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
A/D - Analog/Digital&amp;lt;br /&amp;gt;&lt;br /&gt;
ADatP - Automated Data Processing&amp;lt;br /&amp;gt;&lt;br /&gt;
AKA - Also Known As&amp;lt;br /&amp;gt;&lt;br /&gt;
ANSI - American National Standards Institute&amp;lt;br /&amp;gt;&lt;br /&gt;
API - Application Programming Interfaces&amp;lt;br /&amp;gt;&lt;br /&gt;
ASCII - American Standard Code for Information Interchange&amp;lt;br /&amp;gt;&lt;br /&gt;
BTW - By The Way&amp;lt;br /&amp;gt;&lt;br /&gt;
BYOB - Bring Your Own Beer&amp;lt;br /&amp;gt;&lt;br /&gt;
CAPTCHA - Completely Automated Public Turing test to tell Computers and Humans Apart ... an example would be the questions at the end of online forums that says &amp;quot;type the word you see in this image to continue.&amp;quot; They&#039;re supposed to filter out robots and automated systems and only allow real sentient beings to continue.&amp;lt;br /&amp;gt;&lt;br /&gt;
DA - Dumb @$$&amp;lt;br /&amp;gt;&lt;br /&gt;
DAQ / DAQmx - Data Acquisition&amp;lt;br /&amp;gt;&lt;br /&gt;
DB - Database&amp;lt;br /&amp;gt;&lt;br /&gt;
DILLIGAF - Do I Look Like I Give A F#ck?&amp;lt;br /&amp;gt;&lt;br /&gt;
DIY - Do It Yourself&amp;lt;br /&amp;gt;&lt;br /&gt;
DMA - Direct Memory Access&amp;lt;br /&amp;gt;&lt;br /&gt;
FIFO - First In, First Out&amp;lt;br /&amp;gt;&lt;br /&gt;
FKA - Formerly Known As&amp;lt;br /&amp;gt;&lt;br /&gt;
FYI - For Your Information&amp;lt;br /&amp;gt;&lt;br /&gt;
GL - Graphics Language&amp;lt;br /&amp;gt;&lt;br /&gt;
GNU - GNU&#039;s Not Unix&amp;lt;br /&amp;gt;&lt;br /&gt;
GOOP - Graphical Object-Oriented Programming&amp;lt;br /&amp;gt;&lt;br /&gt;
GPL - GNU General Public License&amp;lt;br /&amp;gt;&lt;br /&gt;
GPS - Global Positioning System&amp;lt;br /&amp;gt;&lt;br /&gt;
HF - High Frequency&amp;lt;br /&amp;gt;&lt;br /&gt;
HH - Homework Hustlers&amp;lt;br /&amp;gt;&lt;br /&gt;
HTML - HyperText Markup Language&amp;lt;br /&amp;gt;&lt;br /&gt;
IMHO = In My Humble Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IMNSHO - In My Not So Humble Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IMO - In My Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IP - Internet Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
IR - Infrared&amp;lt;br /&amp;gt;&lt;br /&gt;
IT - Information Technology&amp;lt;br /&amp;gt;&lt;br /&gt;
JDK - Java Development Kit&amp;lt;br /&amp;gt;&lt;br /&gt;
JK - Just Kidding&amp;lt;br /&amp;gt;&lt;br /&gt;
JVM - Java Virtual Machine&amp;lt;br /&amp;gt;&lt;br /&gt;
LED - Light-Emitting Diode&amp;lt;br /&amp;gt;&lt;br /&gt;
LF - Low Frequency&amp;lt;br /&amp;gt;&lt;br /&gt;
LIFO - Last In, First Out&amp;lt;br /&amp;gt;&lt;br /&gt;
LOL - Laughing Out Loud&amp;lt;br /&amp;gt;&lt;br /&gt;
LQTM - Laughing Quietly To Myself&amp;lt;br /&amp;gt;&lt;br /&gt;
MAX - Measurement &amp;amp; Automation Explorer&amp;lt;br /&amp;gt;&lt;br /&gt;
MXI - Measurement eXtensions for Instrumentation&amp;lt;br /&amp;gt;&lt;br /&gt;
MYOB - Mind Your Own Business&amp;lt;br /&amp;gt;&lt;br /&gt;
NaN - Not A Number&amp;lt;br /&amp;gt;&lt;br /&gt;
N00b - Newbie&amp;lt;br /&amp;gt;&lt;br /&gt;
ODBC - Open DataBase Connectivity&amp;lt;br /&amp;gt;&lt;br /&gt;
OEM - Original Equipment Manufacturer&amp;lt;br /&amp;gt;&lt;br /&gt;
OMG - Oh, My God!&amp;lt;br /&amp;gt;&lt;br /&gt;
OO - Object Oriented&amp;lt;br /&amp;gt;&lt;br /&gt;
P2P - Peer-to-Peer&amp;lt;br /&amp;gt;&lt;br /&gt;
PCI - Peripheral Component Interconnect&amp;lt;br /&amp;gt;&lt;br /&gt;
PS - Post Scriptum (Latin, &amp;quot;written after&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
PS - Power Supply&amp;lt;br /&amp;gt;&lt;br /&gt;
PXI - PCI eXtensions for Instrumentation&amp;lt;br /&amp;gt;&lt;br /&gt;
RT - Real Time&amp;lt;br /&amp;gt;&lt;br /&gt;
RTFM - Read The F#cking/Fine Manual&amp;lt;br /&amp;gt;&lt;br /&gt;
RTSI - Real-Time System Integration&amp;lt;br /&amp;gt;&lt;br /&gt;
TCP - Transmission Control Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
TMI - Too Much Information&amp;lt;br /&amp;gt;&lt;br /&gt;
VBA - Visual Basic for Applications&amp;lt;br /&amp;gt;&lt;br /&gt;
VI - Virtual Instrument&amp;lt;br /&amp;gt;&lt;br /&gt;
VISTA : Virus Inside Switch To Apple&amp;lt;br /&amp;gt;&lt;br /&gt;
VIT - Virtual Instrument Template&amp;lt;br /&amp;gt;&lt;br /&gt;
VOIP - Voice Over Internet Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
W3C - World Wide Web Consortium&amp;lt;br /&amp;gt;&lt;br /&gt;
WTF - What The F#ck? ... sometimes voiced using the US military names for the letters, &amp;quot;Whisky Tango Foxtrot?!&amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
XML - eXtensible Markup Language&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=List_of_acronyms&amp;diff=1884</id>
		<title>List of acronyms</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=List_of_acronyms&amp;diff=1884"/>
		<updated>2007-07-10T14:02:09Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Acronyms and abbreviations :&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
A/D - Analog/Digital&amp;lt;br /&amp;gt;&lt;br /&gt;
ADatP - Automated Data Processing&amp;lt;br /&amp;gt;&lt;br /&gt;
AKA - Also Known As&amp;lt;br /&amp;gt;&lt;br /&gt;
ANSI - American National Standards Institute&amp;lt;br /&amp;gt;&lt;br /&gt;
API - Application Programming Interfaces&amp;lt;br /&amp;gt;&lt;br /&gt;
ASCII - American Standard Code for Information Interchange&amp;lt;br /&amp;gt;&lt;br /&gt;
BTW - By The Way&amp;lt;br /&amp;gt;&lt;br /&gt;
BYOB - Bring Your Own Beer&amp;lt;br /&amp;gt;&lt;br /&gt;
CAPTCHA - Completely Automated Public Turing test to tell Computers and Humans Apart ... an example would be the questions at the end of online forums that says &amp;quot;type the word you see in this image to continue.&amp;quot; They&#039;re supposed to filter out robots and automated systems and only allow real sentient beings to continue.&amp;lt;br /&amp;gt;&lt;br /&gt;
DA - Dumb @$$&amp;lt;br /&amp;gt;&lt;br /&gt;
DAQ / DAQmx - Data Acquisition&amp;lt;br /&amp;gt;&lt;br /&gt;
DB - Database&amp;lt;br /&amp;gt;&lt;br /&gt;
DILLIGAF - Do I Look Like I Give A F#ck?&amp;lt;br /&amp;gt;&lt;br /&gt;
DIY - Do It Yourself&amp;lt;br /&amp;gt;&lt;br /&gt;
DMA - Direct Memory Access&amp;lt;br /&amp;gt;&lt;br /&gt;
FIFO - First In, First Out&amp;lt;br /&amp;gt;&lt;br /&gt;
FKA - Formerly Known As&amp;lt;br /&amp;gt;&lt;br /&gt;
FYI - For Your Information&amp;lt;br /&amp;gt;&lt;br /&gt;
GL - Graphics Language&amp;lt;br /&amp;gt;&lt;br /&gt;
GNU - GNU&#039;s Not Unix&amp;lt;br /&amp;gt;&lt;br /&gt;
GOOP - Graphical Object-Oriented Programming&amp;lt;br /&amp;gt;&lt;br /&gt;
GPL - GNU General Public License&amp;lt;br /&amp;gt;&lt;br /&gt;
GPS - Global Positioning System&amp;lt;br /&amp;gt;&lt;br /&gt;
HF - High Frequency&amp;lt;br /&amp;gt;&lt;br /&gt;
HH - Homework Hustlers&amp;lt;br /&amp;gt;&lt;br /&gt;
HTML - HyperText Markup Language&amp;lt;br /&amp;gt;&lt;br /&gt;
IMHO = In My Humble Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IMNSHO - In My Not So Humble Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IMO - In My Opinion&amp;lt;br /&amp;gt;&lt;br /&gt;
IP - Internet Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
IR - Infrared&amp;lt;br /&amp;gt;&lt;br /&gt;
IT - Information Technology&amp;lt;br /&amp;gt;&lt;br /&gt;
JDK - Java Development Kit&amp;lt;br /&amp;gt;&lt;br /&gt;
JK - Just Kidding&amp;lt;br /&amp;gt;&lt;br /&gt;
JVM - Java Virtual Machine&amp;lt;br /&amp;gt;&lt;br /&gt;
LED - Light-Emitting Diode&amp;lt;br /&amp;gt;&lt;br /&gt;
LF - Low Frequency&amp;lt;br /&amp;gt;&lt;br /&gt;
LIFO - Last In, First Out&amp;lt;br /&amp;gt;&lt;br /&gt;
LOL - Laughing Out Loud&amp;lt;br /&amp;gt;&lt;br /&gt;
LQTM - Laughing Quietly To Myself&amp;lt;br /&amp;gt;&lt;br /&gt;
MAX - Measurement &amp;amp; Automation Explorer&amp;lt;br /&amp;gt;&lt;br /&gt;
MXI - Measurement eXtensions for Instrumentation&amp;lt;br /&amp;gt;&lt;br /&gt;
MYOB - Mind Your Own Business&amp;lt;br /&amp;gt;&lt;br /&gt;
NaN - Not A Number&amp;lt;br /&amp;gt;&lt;br /&gt;
N00b - Newbie&amp;lt;br /&amp;gt;&lt;br /&gt;
ODBC - Open DataBase Connectivity&amp;lt;br /&amp;gt;&lt;br /&gt;
OEM - Original Equipment Manufacturer&amp;lt;br /&amp;gt;&lt;br /&gt;
OMG - Oh, My God!&amp;lt;br /&amp;gt;&lt;br /&gt;
OO - Object Oriented&amp;lt;br /&amp;gt;&lt;br /&gt;
P2P - Peer-to-Peer&amp;lt;br /&amp;gt;&lt;br /&gt;
PCI - Peripheral Component Interconnect&amp;lt;br /&amp;gt;&lt;br /&gt;
PS - Post Scriptum (Latin, &amp;quot;written after&amp;quot;)&amp;lt;br /&amp;gt;&lt;br /&gt;
PS - Power Supply&amp;lt;br /&amp;gt;&lt;br /&gt;
PXI - PCI eXtensions for Instrumentation&amp;lt;br /&amp;gt;&lt;br /&gt;
RT - Real Time&amp;lt;br /&amp;gt;&lt;br /&gt;
RTFM - Read The F#cking/Fine Manual&amp;lt;br /&amp;gt;&lt;br /&gt;
RTSI - Real-Time System Integration&amp;lt;br /&amp;gt;&lt;br /&gt;
TCP - Transmission Control Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
TMI - Too Much Information&amp;lt;br /&amp;gt;&lt;br /&gt;
VBA - Visual Basic for Applications&amp;lt;br /&amp;gt;&lt;br /&gt;
VI - Virtual Instrument&amp;lt;br /&amp;gt;&lt;br /&gt;
VISTA : Virus Inside Switch To Apple&amp;lt;br /&amp;gt;&lt;br /&gt;
VIT - Virtual Instrument Template&amp;lt;br /&amp;gt;&lt;br /&gt;
VOIP - Voice Over Internet Protocol&amp;lt;br /&amp;gt;&lt;br /&gt;
W3C - World Wide Web Consortium&amp;lt;br /&amp;gt;&lt;br /&gt;
WTF - What The F#ck?&amp;lt;br /&amp;gt;&lt;br /&gt;
XML - eXtensible Markup Language&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1110</id>
		<title>Symbolic path</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1110"/>
		<updated>2007-05-07T20:39:56Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When files are located beneath certain special folders, callers that link to these files will link to them using a &#039;&#039;pseudopath&#039;&#039;, rather than an absolute or relative path.  The &#039;&#039;pseudopath&#039;&#039; will be relative to the special folder.  The following table lists these special folders and their &#039;&#039;pseudopath&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! pseudopath&lt;br /&gt;
! description&lt;br /&gt;
! actual path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;userlib&amp;gt;&lt;br /&gt;
| User Libraries&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\user.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;vilib&amp;gt;&lt;br /&gt;
| NI Libraries and Addons&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\vi.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instrlib&amp;gt;&lt;br /&gt;
| Instrument Drivers&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\instr.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;help&amp;gt;&lt;br /&gt;
| Help Files&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\help&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;menu&amp;gt;&lt;br /&gt;
| Palette Menus&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\menus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note that some of these can have the actual path changed by changing the settings in &#039;&#039;&#039;Tools&amp;gt;&amp;gt;Options&#039;&#039;&#039;. The whole point of the pseudopath is to indicate &amp;quot;load from whatever location this path is currently defined to be.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For example, if you have a VI located in the following location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;LabVIEW&amp;gt;\user.lib\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
Callers will link to this VI using the following &#039;&#039;pseudopath&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;userlib&amp;gt;\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;pseudopath&#039;&#039; are not generally encountered.  They are used mostly under the hood of LabVIEW, for example, when using the Application &#039;&#039;&#039;Linker:Read Info From File&#039;&#039;&#039; and &#039;&#039;&#039;Linker:Write Info To File&#039;&#039;&#039; methods.&lt;br /&gt;
&lt;br /&gt;
== When Using Modules (FPGA, RT, etc) ==&lt;br /&gt;
A pseudopath may resolve to different actual files on disk depending upon which target the VI is loaded into. So a VI that is written to use &amp;lt;vilib&amp;gt;\a.vi may use &amp;lt;labview&amp;gt;\vi.lib\a.vi when loaded for the desktop target, but may use &amp;lt;labview&amp;gt;\vi.lib\fpga\a.vi when loaded for the FPGA target.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1109</id>
		<title>Symbolic path</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1109"/>
		<updated>2007-05-07T20:38:12Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When files are located beneath certain special folders, callers that link to these files will link to them using a &#039;&#039;pseudopath&#039;&#039;, rather than an absolute or relative path.  The &#039;&#039;pseudopath&#039;&#039; will be relative to the special folder.  The following table lists these special folders and their &#039;&#039;pseudopath&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! pseudopath&lt;br /&gt;
! description&lt;br /&gt;
! actual path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;userlib&amp;gt;&lt;br /&gt;
| User Libraries&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\user.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;vilib&amp;gt;&lt;br /&gt;
| NI Libraries and Addons&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\vi.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instrlib&amp;gt;&lt;br /&gt;
| Instrument Drivers&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\instr.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;help&amp;gt;&lt;br /&gt;
| Help Files&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\help&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;menu&amp;gt;&lt;br /&gt;
| Palette Menus&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\menus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example, if you have a VI located in the following location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;LabVIEW&amp;gt;\user.lib\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
Callers will link to this VI using the following &#039;&#039;pseudopath&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;userlib&amp;gt;\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;pseudopath&#039;&#039; are not generally encountered.  They are used mostly under the hood of LabVIEW, for example, when using the Application &#039;&#039;&#039;Linker:Read Info From File&#039;&#039;&#039; and &#039;&#039;&#039;Linker:Write Info To File&#039;&#039;&#039; methods.&lt;br /&gt;
&lt;br /&gt;
== When Using Modules (FPGA, RT, etc) ==&lt;br /&gt;
A pseudopath may resolve to different actual files on disk depending upon which target the VI is loaded into. So a VI that is written to use &amp;lt;vilib&amp;gt;\a.vi may use &amp;lt;labview&amp;gt;\vi.lib\a.vi when loaded for the desktop target, but may use &amp;lt;labview&amp;gt;\vi.lib\fpga\a.vi when loaded for the FPGA target.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1107</id>
		<title>Symbolic path</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1107"/>
		<updated>2007-05-07T20:36:10Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When files are located beneath certain special folders, callers that link to these files will link to them using a &#039;&#039;pseudopath&#039;, rather than an absolute or relative path.  The &#039;&#039;pseudopath&#039; will be relative to the special folder.  The following table lists these special folders and their &#039;&#039;pseudopath&#039;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! pseudopath&lt;br /&gt;
! description&lt;br /&gt;
! actual path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;userlib&amp;gt;&lt;br /&gt;
| User Libraries&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\user.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;vilib&amp;gt;&lt;br /&gt;
| NI Libraries and Addons&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\vi.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instrlib&amp;gt;&lt;br /&gt;
| Instrument Drivers&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\instr.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;help&amp;gt;&lt;br /&gt;
| Help Files&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\help&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;menu&amp;gt;&lt;br /&gt;
| Palette Menus&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\menus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example, if you have a VI located in the following location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;LabVIEW&amp;gt;\user.lib\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
Callers will link to this VI using the following &#039;&#039;pseudopath&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;userlib&amp;gt;\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
&#039;pseudopath&#039;&#039; are not generally encountered.  They are used mostly under the hood of LabVIEW, for example, when using the Application &#039;&#039;&#039;Linker:Read Info From File&#039;&#039;&#039; and &#039;&#039;&#039;Linker:Write Info To File&#039;&#039;&#039; methods.&lt;br /&gt;
&lt;br /&gt;
== When Using Modules (FPGA, RT, etc) ==&lt;br /&gt;
A pseudopath may resolve to different actual files on disk depending upon which target the VI is loaded into. So a VI that is written to use &amp;lt;vilib&amp;gt;\a.vi may use &amp;lt;labview&amp;gt;\vi.lib\a.vi when loaded for the desktop target, but may use &amp;lt;labview&amp;gt;\vi.lib\fpga\a.vi when loaded for the FPGA target.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1105</id>
		<title>Symbolic path</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Symbolic_path&amp;diff=1105"/>
		<updated>2007-05-07T20:34:40Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When files are located beneath certain special folders, callers that link to these files will link to them using a &#039;&#039;symbolic path&#039;&#039;, rather than an absolute or relative path.  The &#039;&#039;symbolic path&#039;&#039; will be relative to the special folder.  The following table lists these special folders and their &#039;&#039;symbolic path&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! symbolic path&lt;br /&gt;
! description&lt;br /&gt;
! actual path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;userlib&amp;gt;&lt;br /&gt;
| User Libraries&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\user.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;vilib&amp;gt;&lt;br /&gt;
| NI Libraries and Addons&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\vi.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;instrlib&amp;gt;&lt;br /&gt;
| Instrument Drivers&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\instr.lib&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;help&amp;gt;&lt;br /&gt;
| Help Files&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\help&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;menu&amp;gt;&lt;br /&gt;
| Palette Menus&lt;br /&gt;
| &amp;lt;LabVIEW&amp;gt;\menus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example, if you have a VI located in the following location:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;LabVIEW&amp;gt;\user.lib\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
Callers will link to this VI using the following &#039;&#039;symbolic path&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;userlib&amp;gt;\_OpenG.lib\array\array.llb\Conditional Auto-Indexing Tunnel__ogtk.vi&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;symbolic paths&#039;&#039; are not generally encountered.  They are used mostly under the hood of LabVIEW, for example, when using the Application &#039;&#039;&#039;Linker:Read Info From File&#039;&#039;&#039; and &#039;&#039;&#039;Linker:Write Info To File&#039;&#039;&#039; methods.&lt;br /&gt;
&lt;br /&gt;
== When Using Modules (FPGA, RT, etc) ==&lt;br /&gt;
A pseudopath may resolve to different actual files on disk depending upon which target the VI is loaded into. So a VI that is written to use &amp;lt;vilib&amp;gt;\a.vi may use &amp;lt;labview&amp;gt;\vi.lib\a.vi when loaded for the desktop target, but may use &amp;lt;labview&amp;gt;\vi.lib\fpga\a.vi when loaded for the FPGA target.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1017</id>
		<title>Error Cluster data type</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1017"/>
		<updated>2007-05-05T17:01:46Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Error Handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Cluster ==&lt;br /&gt;
&lt;br /&gt;
An error cluster contains a Boolean “status”, an I32 numerical “code” and a “source” string in that order.  Any cluster with this structure is treated as an error cluster in LabVIEW.  The default value, “status” = false, “code” = 0 and “source” empty, is shown in &#039;&#039;&#039;Figure 1&#039;&#039;&#039; for a typical control.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_1-error_cluster_control_and_terminal.JPG|frame|center|&#039;&#039;&#039;Figure 1&#039;&#039;&#039;:  3D error cluster control and terminal‎]]&lt;br /&gt;
&lt;br /&gt;
The “status” is true if an error has occurred but remains false for warnings.  The “code” assumes positive and negative values (see “error codes, ranges of” in &#039;&#039;LabVIEW Help&#039;&#039;), with the range 5000 through 9999 &#039;&#039;&#039;and&#039;&#039;&#039; the range -9999 to -5000 reserved for user defined error codes.  The “source” identifies a VI and possibly its call chain as the origin of an error.  Possible reasons for an error can be obtained from the &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool (see &#039;&#039;&#039;Figure 2&#039;&#039;&#039;).  This tool is activated by selecting the &#039;&#039;&#039;Explain Error…&#039;&#039;&#039; item under the &#039;&#039;&#039;Help&#039;&#039;&#039; menu in LabVIEW or by right-clicking on any element of an error cluster with “status” true and selecting &#039;&#039;&#039;Explain Error&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Explain_Error_tool.jpg|frame|center|&#039;&#039;&#039;Figure 2&#039;&#039;&#039;:  &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool]]&lt;br /&gt;
&lt;br /&gt;
LabVIEW provides several VIs for working with error clusters.  For example, the &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; generates an error cluster based on a specified “code” (see &#039;&#039;&#039;Figure 3&#039;&#039;&#039;).  You can also define custom codes using the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; or by creating an XML-based text file in the &amp;lt;labview\user.lib\ errors&amp;gt; directory (see “error codes, defining custom” and “error codes, defining custom in text files” in &#039;&#039;LabVIEW Help&#039;&#039;).  This VI outputs a “message”, like the “Explanation” from &#039;&#039;&#039;Explain Error&#039;&#039;&#039;, which identifies the “source” and describes possible causes associated with the “code”.  This information can also be displayed using several different types of dialogs.  This feature is commonly employed to identify errors in user interface applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-VI_connectors.JPG|frame|center|&#039;&#039;&#039;Figure 3&#039;&#039;&#039;:  connectors for &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; and &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Error clusters are also valid inputs to some comparison and array functions and can be used to control case structures and while loops (see &#039;&#039;&#039;Figure 4&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-error_cluster_examples.JPG|frame|center|&#039;&#039;&#039;Figure 4&#039;&#039;&#039;:  structures, comparison and array functions involving error cluster inputs]]&lt;br /&gt;
&lt;br /&gt;
The comparison functions &#039;&#039;&#039;Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Not Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Greater?&#039;&#039;&#039;, &#039;&#039;&#039;Less?&#039;&#039;&#039;, &#039;&#039;&#039;Greater Or Equal?&#039;&#039;&#039; and &#039;&#039;&#039;Less Or Equal?&#039;&#039;&#039; can operate in two modes.  The output is Boolean in the &#039;&#039;&#039;Compare Aggregates&#039;&#039;&#039; mode, while a cluster of three Booleans corresponding to each component of the error cluster is generated in the &#039;&#039;&#039;Compare Elements&#039;&#039;&#039; mode (see &#039;&#039;&#039;Figure 5&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Comparison_function_indicators.JPG|frame|center|&#039;&#039;&#039;Figure 5&#039;&#039;&#039;:  typical indicators for both modes of a comparison function]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Select&#039;&#039;&#039;, &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; and &#039;&#039;&#039;In Range and Coerce&#039;&#039;&#039; functions can output an error cluster.  While the &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; function returns ordered inputs in the Compare Aggregates mode, an output may not correspond to either error cluster if Compare Elements is selected (default).  The &#039;&#039;&#039;Array Max &amp;amp; Min&#039;&#039;&#039; function always returns ordered inputs corresponding to the first and last elements of the &#039;&#039;&#039;Sort 1D Array&#039;&#039;&#039; output.  The primary sort is performed on “status”, with secondary ordering by “code” and then “source”.  Strings are sorted by ASCII code starting with the leading character.  Note that error clusters behave like their Boolean “status” value when connected to the selector terminal of a &#039;&#039;&#039;Select&#039;&#039;&#039; function and &#039;&#039;&#039;Case Structure&#039;&#039;&#039; or the conditional terminal of a &#039;&#039;&#039;While Loop&#039;&#039;&#039;.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Selection ==&lt;br /&gt;
&lt;br /&gt;
	A common programming issue in LabVIEW involves selecting between two or more error clusters.  This process involves finding the cluster with “status” true or “code” not equal zero if no “status” is true.  The &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 4&#039;&#039;&#039; implements this search for up to three error clusters and an array of such clusters.  This subVI is relatively fast with large error arrays.  However, a significant portion of the execution time involves concatenation of inputs for the small arrays (&amp;lt;10 elements) typical in most applications.  This result suggests that time critical applications should be built around the immediate selection between two error clusters rather than their concatenation into an array.  The simplest method of comparing the “status” of two error clusters involves the Select function (see &#039;&#039;&#039;Figure 6&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Simple_error_selector_diagram.JPG|frame|center|&#039;&#039;&#039;Figure 6&#039;&#039;&#039;:  diagram for a simple error selector that does not detect warnings]]&lt;br /&gt;
&lt;br /&gt;
This function selects the first error cluster with “status” true, much like the &#039;&#039;&#039;Or&#039;&#039;&#039; function operating on Boolean inputs.  Connecting “error 2” instead of “error 1” to the selector terminal is more analogous to the &#039;&#039;&#039;And&#039;&#039;&#039; function, which is typically less useful.  While about 30 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), the &#039;&#039;&#039;Select&#039;&#039;&#039; function does not detect a warning (“status” false and “code” not equal zero).  &lt;br /&gt;
&lt;br /&gt;
Diagrams for several VIs that compare error clusters and detect warnings are shown below (fastest to slowest).&lt;br /&gt;
&lt;br /&gt;
[[Image:Error_selector_diagram_A.JPG|frame|center|]][[Image:Error_selector_diagrams_B.JPG|frame|center|&#039;&#039;&#039;Figure 7&#039;&#039;&#039;:  possible diagrams for an error selector that detects warnings]]&lt;br /&gt;
 &lt;br /&gt;
These VIs execute about 5 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), even with normal priority execution. (&#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; uses the “subroutine” priority.)  Inputs to selector terminals in the first and second diagrams are passed to “error” for the cases not shown.  Otherwise, “error 1” is checked for nonzero “code” since neither cluster has “status” true.  The last approach uses the Max &amp;amp; Min function in Compare Aggregates mode to order inputs.  If just one of these clusters has “status” true, that input will be the “max” output since true &amp;gt; false.  However, this output must be checked for “status” true or “code” nonzero to determine selection.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
Every LabVIEW programmer has their own approach to handling errors.  In fact, those with multiple personalities probably have several different approaches to handling errors.  As an example, consider the producer-consumer diagram shown in &#039;&#039;&#039;Figure 8&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Producer-consumer.PNG|center|thumb|600px|&#039;&#039;&#039;Figure 8&#039;&#039;&#039;:  producer-consumer diagram with error handling in the top loop]]&lt;br /&gt;
&lt;br /&gt;
The “event loop” (bottom) produces enumerated commands that are processed by the “cmd loop” (top).  The outer case structure in the top loop traps for errors that are placed on the lower shift register.  The corresponding error case (not shown) allows error handling by “code” with different methods of notification.  For example, a user interface application based on this design pattern might employ the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 3&#039;&#039;&#039; to display a dialog for particular errors.  However, this method would not work for applications that run continuously without user interaction.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| For continuously running applications, an error dialog (or any other kind of dialog for that matter) would disrupt execution, causing data loss or some other event you are being paid to avoid.  Logging error information to file is a useful notification method for such applications.  This approach requires an error description, which is provided by the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039; (see &#039;&#039;&#039;Figure 9&#039;&#039;&#039;) for specified error codes in LabVIEW.&lt;br /&gt;
[[Image:Error_code_database_connector.jpg|frame|center|&#039;&#039;&#039;Figure 9&#039;&#039;&#039;:  connector for the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039;]] &lt;br /&gt;
This locked VI, located in the library &amp;lt;labview\vi.lib\Utility\error.llb&amp;gt;, is easily found as a subVI of the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;.  &amp;lt;s&amp;gt;You would have to extend this database to handle user defined error codes and provide some type of error log.&amp;lt;/s&amp;gt; &#039;&#039;See General Error Handler.vi online help for two different ways of providing error descriptions for user defined error codes.&#039;&#039;  For example, some Windows applications log errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; (right-click on &#039;&#039;&#039;My Computer&#039;&#039;&#039; and select &#039;&#039;&#039;Manage&#039;&#039;&#039; from the popup menu) shown in &#039;&#039;&#039;Figure 10&#039;&#039;&#039; and &#039;&#039;&#039;Figure 11&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
|This entire section of WIKI about &amp;quot;Error Handling&amp;quot; could benefit from a deep reading of the online help for the General Error Handler.vi. That VI has more facilities than folks typically know. FOR EXAMPLE: &lt;br /&gt;
&lt;br /&gt;
The General Error Handler.vi includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; I would STRONGLY recommended instead of calling &amp;quot;Error Code Database.vi&amp;quot;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of General Error Handler CORE.vi (found on the block diagram of General Error Handler.vi) to do this. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Event_viewer.JPG|frame|center|&#039;&#039;&#039;Figure 10&#039;&#039;&#039;:  &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; in Windows]]&lt;br /&gt;
[[Image:Event_properties.jpg|frame|center|&#039;&#039;&#039;Figure 11&#039;&#039;&#039;:&#039;&#039;&#039;Event Properties&#039;&#039;&#039; in Windows]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;eventcreate&#039;&#039;&#039; command can be used in Windows to log events to this application.  A VI [[log event error]] for logging errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; should available soon.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:17, 3 May 2007 (CDT)&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1016</id>
		<title>Error Cluster data type</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1016"/>
		<updated>2007-05-05T16:59:13Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Error Handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Cluster ==&lt;br /&gt;
&lt;br /&gt;
An error cluster contains a Boolean “status”, an I32 numerical “code” and a “source” string in that order.  Any cluster with this structure is treated as an error cluster in LabVIEW.  The default value, “status” = false, “code” = 0 and “source” empty, is shown in &#039;&#039;&#039;Figure 1&#039;&#039;&#039; for a typical control.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_1-error_cluster_control_and_terminal.JPG|frame|center|&#039;&#039;&#039;Figure 1&#039;&#039;&#039;:  3D error cluster control and terminal‎]]&lt;br /&gt;
&lt;br /&gt;
The “status” is true if an error has occurred but remains false for warnings.  The “code” assumes positive and negative values (see “error codes, ranges of” in &#039;&#039;LabVIEW Help&#039;&#039;), with the range 5000 through 9999 &#039;&#039;&#039;and&#039;&#039;&#039; the range -9999 to -5000 reserved for user defined error codes.  The “source” identifies a VI and possibly its call chain as the origin of an error.  Possible reasons for an error can be obtained from the &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool (see &#039;&#039;&#039;Figure 2&#039;&#039;&#039;).  This tool is activated by selecting the &#039;&#039;&#039;Explain Error…&#039;&#039;&#039; item under the &#039;&#039;&#039;Help&#039;&#039;&#039; menu in LabVIEW or by right-clicking on any element of an error cluster with “status” true and selecting &#039;&#039;&#039;Explain Error&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Explain_Error_tool.jpg|frame|center|&#039;&#039;&#039;Figure 2&#039;&#039;&#039;:  &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool]]&lt;br /&gt;
&lt;br /&gt;
LabVIEW provides several VIs for working with error clusters.  For example, the &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; generates an error cluster based on a specified “code” (see &#039;&#039;&#039;Figure 3&#039;&#039;&#039;).  You can also define custom codes using the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; or by creating an XML-based text file in the &amp;lt;labview\user.lib\ errors&amp;gt; directory (see “error codes, defining custom” and “error codes, defining custom in text files” in &#039;&#039;LabVIEW Help&#039;&#039;).  This VI outputs a “message”, like the “Explanation” from &#039;&#039;&#039;Explain Error&#039;&#039;&#039;, which identifies the “source” and describes possible causes associated with the “code”.  This information can also be displayed using several different types of dialogs.  This feature is commonly employed to identify errors in user interface applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-VI_connectors.JPG|frame|center|&#039;&#039;&#039;Figure 3&#039;&#039;&#039;:  connectors for &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; and &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Error clusters are also valid inputs to some comparison and array functions and can be used to control case structures and while loops (see &#039;&#039;&#039;Figure 4&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-error_cluster_examples.JPG|frame|center|&#039;&#039;&#039;Figure 4&#039;&#039;&#039;:  structures, comparison and array functions involving error cluster inputs]]&lt;br /&gt;
&lt;br /&gt;
The comparison functions &#039;&#039;&#039;Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Not Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Greater?&#039;&#039;&#039;, &#039;&#039;&#039;Less?&#039;&#039;&#039;, &#039;&#039;&#039;Greater Or Equal?&#039;&#039;&#039; and &#039;&#039;&#039;Less Or Equal?&#039;&#039;&#039; can operate in two modes.  The output is Boolean in the &#039;&#039;&#039;Compare Aggregates&#039;&#039;&#039; mode, while a cluster of three Booleans corresponding to each component of the error cluster is generated in the &#039;&#039;&#039;Compare Elements&#039;&#039;&#039; mode (see &#039;&#039;&#039;Figure 5&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Comparison_function_indicators.JPG|frame|center|&#039;&#039;&#039;Figure 5&#039;&#039;&#039;:  typical indicators for both modes of a comparison function]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Select&#039;&#039;&#039;, &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; and &#039;&#039;&#039;In Range and Coerce&#039;&#039;&#039; functions can output an error cluster.  While the &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; function returns ordered inputs in the Compare Aggregates mode, an output may not correspond to either error cluster if Compare Elements is selected (default).  The &#039;&#039;&#039;Array Max &amp;amp; Min&#039;&#039;&#039; function always returns ordered inputs corresponding to the first and last elements of the &#039;&#039;&#039;Sort 1D Array&#039;&#039;&#039; output.  The primary sort is performed on “status”, with secondary ordering by “code” and then “source”.  Strings are sorted by ASCII code starting with the leading character.  Note that error clusters behave like their Boolean “status” value when connected to the selector terminal of a &#039;&#039;&#039;Select&#039;&#039;&#039; function and &#039;&#039;&#039;Case Structure&#039;&#039;&#039; or the conditional terminal of a &#039;&#039;&#039;While Loop&#039;&#039;&#039;.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Selection ==&lt;br /&gt;
&lt;br /&gt;
	A common programming issue in LabVIEW involves selecting between two or more error clusters.  This process involves finding the cluster with “status” true or “code” not equal zero if no “status” is true.  The &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 4&#039;&#039;&#039; implements this search for up to three error clusters and an array of such clusters.  This subVI is relatively fast with large error arrays.  However, a significant portion of the execution time involves concatenation of inputs for the small arrays (&amp;lt;10 elements) typical in most applications.  This result suggests that time critical applications should be built around the immediate selection between two error clusters rather than their concatenation into an array.  The simplest method of comparing the “status” of two error clusters involves the Select function (see &#039;&#039;&#039;Figure 6&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Simple_error_selector_diagram.JPG|frame|center|&#039;&#039;&#039;Figure 6&#039;&#039;&#039;:  diagram for a simple error selector that does not detect warnings]]&lt;br /&gt;
&lt;br /&gt;
This function selects the first error cluster with “status” true, much like the &#039;&#039;&#039;Or&#039;&#039;&#039; function operating on Boolean inputs.  Connecting “error 2” instead of “error 1” to the selector terminal is more analogous to the &#039;&#039;&#039;And&#039;&#039;&#039; function, which is typically less useful.  While about 30 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), the &#039;&#039;&#039;Select&#039;&#039;&#039; function does not detect a warning (“status” false and “code” not equal zero).  &lt;br /&gt;
&lt;br /&gt;
Diagrams for several VIs that compare error clusters and detect warnings are shown below (fastest to slowest).&lt;br /&gt;
&lt;br /&gt;
[[Image:Error_selector_diagram_A.JPG|frame|center|]][[Image:Error_selector_diagrams_B.JPG|frame|center|&#039;&#039;&#039;Figure 7&#039;&#039;&#039;:  possible diagrams for an error selector that detects warnings]]&lt;br /&gt;
 &lt;br /&gt;
These VIs execute about 5 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), even with normal priority execution. (&#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; uses the “subroutine” priority.)  Inputs to selector terminals in the first and second diagrams are passed to “error” for the cases not shown.  Otherwise, “error 1” is checked for nonzero “code” since neither cluster has “status” true.  The last approach uses the Max &amp;amp; Min function in Compare Aggregates mode to order inputs.  If just one of these clusters has “status” true, that input will be the “max” output since true &amp;gt; false.  However, this output must be checked for “status” true or “code” nonzero to determine selection.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
Every LabVIEW programmer has their own approach to handling errors.  In fact, those with multiple personalities probably have several different approaches to handling errors.  As an example, consider the producer-consumer diagram shown in &#039;&#039;&#039;Figure 8&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Producer-consumer.PNG|center|thumb|600px|&#039;&#039;&#039;Figure 8&#039;&#039;&#039;:  producer-consumer diagram with error handling in the top loop]]&lt;br /&gt;
&lt;br /&gt;
The “event loop” (bottom) produces enumerated commands that are processed by the “cmd loop” (top).  The outer case structure in the top loop traps for errors that are placed on the lower shift register.  The corresponding error case (not shown) allows error handling by “code” with different methods of notification.  For example, a user interface application based on this design pattern might employ the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 3&#039;&#039;&#039; to display a dialog for particular errors.  However, this method would not work for applications that run continuously without user interaction.&lt;br /&gt;
 &lt;br /&gt;
For continuously running applications, an error dialog (or any other kind of dialog for that matter) would disrupt execution, causing data loss or some other event you are being paid to avoid.  Logging error information to file is a useful notification method for such applications.  This approach requires an error description, which is provided by the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039; (see &#039;&#039;&#039;Figure 9&#039;&#039;&#039;) for specified error codes in LabVIEW.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Error_code_database_connector.jpg|frame|center|&#039;&#039;&#039;Figure 9&#039;&#039;&#039;:  connector for the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039;]] &lt;br /&gt;
This locked VI, located in the library &amp;lt;labview\vi.lib\Utility\error.llb&amp;gt;, is easily found as a subVI of the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;.  &amp;lt;s&amp;gt;You would have to extend this database to handle user defined error codes and provide some type of error log.&amp;lt;/s&amp;gt; &#039;&#039;See General Error Handler.vi online help for two different ways of providing error descriptions for user defined error codes.&#039;&#039;  For example, some Windows applications log errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; (right-click on &#039;&#039;&#039;My Computer&#039;&#039;&#039; and select &#039;&#039;&#039;Manage&#039;&#039;&#039; from the popup menu) shown in &#039;&#039;&#039;Figure 10&#039;&#039;&#039; and &#039;&#039;&#039;Figure 11&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
|This entire section of WIKI about &amp;quot;Error Handling&amp;quot; could benefit from a deep reading of the online help for the General Error Handler.vi. That VI has more facilities than folks typically know. FOR EXAMPLE: &lt;br /&gt;
&lt;br /&gt;
The General Error Handler.vi includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; This is STRONGLY recommended instead of calling &amp;quot;Error Code Database.vi&amp;quot;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of General Error Handler CORE.vi (found on the block diagram of General Error Handler.vi) to do this. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Event_viewer.JPG|frame|center|&#039;&#039;&#039;Figure 10&#039;&#039;&#039;:  &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; in Windows]]&lt;br /&gt;
[[Image:Event_properties.jpg|frame|center|&#039;&#039;&#039;Figure 11&#039;&#039;&#039;:&#039;&#039;&#039;Event Properties&#039;&#039;&#039; in Windows]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;eventcreate&#039;&#039;&#039; command can be used in Windows to log events to this application.  A VI [[log event error]] for logging errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; should available soon.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:17, 3 May 2007 (CDT)&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1015</id>
		<title>Error Cluster data type</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1015"/>
		<updated>2007-05-05T16:57:28Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Error Handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Cluster ==&lt;br /&gt;
&lt;br /&gt;
An error cluster contains a Boolean “status”, an I32 numerical “code” and a “source” string in that order.  Any cluster with this structure is treated as an error cluster in LabVIEW.  The default value, “status” = false, “code” = 0 and “source” empty, is shown in &#039;&#039;&#039;Figure 1&#039;&#039;&#039; for a typical control.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_1-error_cluster_control_and_terminal.JPG|frame|center|&#039;&#039;&#039;Figure 1&#039;&#039;&#039;:  3D error cluster control and terminal‎]]&lt;br /&gt;
&lt;br /&gt;
The “status” is true if an error has occurred but remains false for warnings.  The “code” assumes positive and negative values (see “error codes, ranges of” in &#039;&#039;LabVIEW Help&#039;&#039;), with the range 5000 through 9999 &#039;&#039;&#039;and&#039;&#039;&#039; the range -9999 to -5000 reserved for user defined error codes.  The “source” identifies a VI and possibly its call chain as the origin of an error.  Possible reasons for an error can be obtained from the &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool (see &#039;&#039;&#039;Figure 2&#039;&#039;&#039;).  This tool is activated by selecting the &#039;&#039;&#039;Explain Error…&#039;&#039;&#039; item under the &#039;&#039;&#039;Help&#039;&#039;&#039; menu in LabVIEW or by right-clicking on any element of an error cluster with “status” true and selecting &#039;&#039;&#039;Explain Error&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Explain_Error_tool.jpg|frame|center|&#039;&#039;&#039;Figure 2&#039;&#039;&#039;:  &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool]]&lt;br /&gt;
&lt;br /&gt;
LabVIEW provides several VIs for working with error clusters.  For example, the &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; generates an error cluster based on a specified “code” (see &#039;&#039;&#039;Figure 3&#039;&#039;&#039;).  You can also define custom codes using the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; or by creating an XML-based text file in the &amp;lt;labview\user.lib\ errors&amp;gt; directory (see “error codes, defining custom” and “error codes, defining custom in text files” in &#039;&#039;LabVIEW Help&#039;&#039;).  This VI outputs a “message”, like the “Explanation” from &#039;&#039;&#039;Explain Error&#039;&#039;&#039;, which identifies the “source” and describes possible causes associated with the “code”.  This information can also be displayed using several different types of dialogs.  This feature is commonly employed to identify errors in user interface applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-VI_connectors.JPG|frame|center|&#039;&#039;&#039;Figure 3&#039;&#039;&#039;:  connectors for &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; and &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Error clusters are also valid inputs to some comparison and array functions and can be used to control case structures and while loops (see &#039;&#039;&#039;Figure 4&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-error_cluster_examples.JPG|frame|center|&#039;&#039;&#039;Figure 4&#039;&#039;&#039;:  structures, comparison and array functions involving error cluster inputs]]&lt;br /&gt;
&lt;br /&gt;
The comparison functions &#039;&#039;&#039;Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Not Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Greater?&#039;&#039;&#039;, &#039;&#039;&#039;Less?&#039;&#039;&#039;, &#039;&#039;&#039;Greater Or Equal?&#039;&#039;&#039; and &#039;&#039;&#039;Less Or Equal?&#039;&#039;&#039; can operate in two modes.  The output is Boolean in the &#039;&#039;&#039;Compare Aggregates&#039;&#039;&#039; mode, while a cluster of three Booleans corresponding to each component of the error cluster is generated in the &#039;&#039;&#039;Compare Elements&#039;&#039;&#039; mode (see &#039;&#039;&#039;Figure 5&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Comparison_function_indicators.JPG|frame|center|&#039;&#039;&#039;Figure 5&#039;&#039;&#039;:  typical indicators for both modes of a comparison function]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Select&#039;&#039;&#039;, &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; and &#039;&#039;&#039;In Range and Coerce&#039;&#039;&#039; functions can output an error cluster.  While the &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; function returns ordered inputs in the Compare Aggregates mode, an output may not correspond to either error cluster if Compare Elements is selected (default).  The &#039;&#039;&#039;Array Max &amp;amp; Min&#039;&#039;&#039; function always returns ordered inputs corresponding to the first and last elements of the &#039;&#039;&#039;Sort 1D Array&#039;&#039;&#039; output.  The primary sort is performed on “status”, with secondary ordering by “code” and then “source”.  Strings are sorted by ASCII code starting with the leading character.  Note that error clusters behave like their Boolean “status” value when connected to the selector terminal of a &#039;&#039;&#039;Select&#039;&#039;&#039; function and &#039;&#039;&#039;Case Structure&#039;&#039;&#039; or the conditional terminal of a &#039;&#039;&#039;While Loop&#039;&#039;&#039;.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Selection ==&lt;br /&gt;
&lt;br /&gt;
	A common programming issue in LabVIEW involves selecting between two or more error clusters.  This process involves finding the cluster with “status” true or “code” not equal zero if no “status” is true.  The &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 4&#039;&#039;&#039; implements this search for up to three error clusters and an array of such clusters.  This subVI is relatively fast with large error arrays.  However, a significant portion of the execution time involves concatenation of inputs for the small arrays (&amp;lt;10 elements) typical in most applications.  This result suggests that time critical applications should be built around the immediate selection between two error clusters rather than their concatenation into an array.  The simplest method of comparing the “status” of two error clusters involves the Select function (see &#039;&#039;&#039;Figure 6&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Simple_error_selector_diagram.JPG|frame|center|&#039;&#039;&#039;Figure 6&#039;&#039;&#039;:  diagram for a simple error selector that does not detect warnings]]&lt;br /&gt;
&lt;br /&gt;
This function selects the first error cluster with “status” true, much like the &#039;&#039;&#039;Or&#039;&#039;&#039; function operating on Boolean inputs.  Connecting “error 2” instead of “error 1” to the selector terminal is more analogous to the &#039;&#039;&#039;And&#039;&#039;&#039; function, which is typically less useful.  While about 30 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), the &#039;&#039;&#039;Select&#039;&#039;&#039; function does not detect a warning (“status” false and “code” not equal zero).  &lt;br /&gt;
&lt;br /&gt;
Diagrams for several VIs that compare error clusters and detect warnings are shown below (fastest to slowest).&lt;br /&gt;
&lt;br /&gt;
[[Image:Error_selector_diagram_A.JPG|frame|center|]][[Image:Error_selector_diagrams_B.JPG|frame|center|&#039;&#039;&#039;Figure 7&#039;&#039;&#039;:  possible diagrams for an error selector that detects warnings]]&lt;br /&gt;
 &lt;br /&gt;
These VIs execute about 5 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), even with normal priority execution. (&#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; uses the “subroutine” priority.)  Inputs to selector terminals in the first and second diagrams are passed to “error” for the cases not shown.  Otherwise, “error 1” is checked for nonzero “code” since neither cluster has “status” true.  The last approach uses the Max &amp;amp; Min function in Compare Aggregates mode to order inputs.  If just one of these clusters has “status” true, that input will be the “max” output since true &amp;gt; false.  However, this output must be checked for “status” true or “code” nonzero to determine selection.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
Every LabVIEW programmer has their own approach to handling errors.  In fact, those with multiple personalities probably have several different approaches to handling errors.  As an example, consider the producer-consumer diagram shown in &#039;&#039;&#039;Figure 8&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Producer-consumer.PNG|center|thumb|600px|&#039;&#039;&#039;Figure 8&#039;&#039;&#039;:  producer-consumer diagram with error handling in the top loop]]&lt;br /&gt;
&lt;br /&gt;
The “event loop” (bottom) produces enumerated commands that are processed by the “cmd loop” (top).  The outer case structure in the top loop traps for errors that are placed on the lower shift register.  The corresponding error case (not shown) allows error handling by “code” with different methods of notification.  For example, a user interface application based on this design pattern might employ the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 3&#039;&#039;&#039; to display a dialog for particular errors.  However, this method would not work for applications that run continuously without user interaction.&lt;br /&gt;
 &lt;br /&gt;
For continuously running applications, an error dialog (or any other kind of dialog for that matter) would disrupt execution, causing data loss or some other event you are being paid to avoid.  Logging error information to file is a useful notification method for such applications.  This approach requires an error description, which is provided by the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039; (see &#039;&#039;&#039;Figure 9&#039;&#039;&#039;) for specified error codes in LabVIEW.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|[[Image:Error_code_database_connector.jpg|frame|center|&#039;&#039;&#039;Figure 9&#039;&#039;&#039;:  connector for the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039;]] &lt;br /&gt;
This locked VI, located in the library &amp;lt;labview\vi.lib\Utility\error.llb&amp;gt;, is easily found as a subVI of the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;.  &amp;lt;s&amp;gt;You would have to extend this database to handle user defined error codes and provide some type of error log.&amp;lt;/s&amp;gt; &#039;&#039;See General Error Handler.vi online help for two different ways of providing error descriptions for user defined error codes.&#039;&#039;  For example, some Windows applications log errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; (right-click on &#039;&#039;&#039;My Computer&#039;&#039;&#039; and select &#039;&#039;&#039;Manage&#039;&#039;&#039; from the popup menu) shown in &#039;&#039;&#039;Figure 10&#039;&#039;&#039; and &#039;&#039;&#039;Figure 11&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
|This entire section of WIKI about &amp;quot;Error Handling&amp;quot; could benefit from a deep reading of the online help for the General Error Handler.vi. That VI has more facilities than folks typically know. FOR EXAMPLE: &lt;br /&gt;
&lt;br /&gt;
The General Error Handler.vi includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; This is STRONGLY recommended instead of calling &amp;quot;Error Code Database.vi&amp;quot;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of General Error Handler CORE.vi (found on the block diagram of General Error Handler.vi) to do this. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Event_viewer.JPG|frame|center|&#039;&#039;&#039;Figure 10&#039;&#039;&#039;:  &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; in Windows]]&lt;br /&gt;
[[Image:Event_properties.jpg|frame|center|&#039;&#039;&#039;Figure 11&#039;&#039;&#039;:&#039;&#039;&#039;Event Properties&#039;&#039;&#039; in Windows]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;eventcreate&#039;&#039;&#039; command can be used in Windows to log events to this application.  A VI [[log event error]] for logging errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; should available soon.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:17, 3 May 2007 (CDT)&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1014</id>
		<title>Error Cluster data type</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1014"/>
		<updated>2007-05-05T16:56:39Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Error Handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Cluster ==&lt;br /&gt;
&lt;br /&gt;
An error cluster contains a Boolean “status”, an I32 numerical “code” and a “source” string in that order.  Any cluster with this structure is treated as an error cluster in LabVIEW.  The default value, “status” = false, “code” = 0 and “source” empty, is shown in &#039;&#039;&#039;Figure 1&#039;&#039;&#039; for a typical control.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_1-error_cluster_control_and_terminal.JPG|frame|center|&#039;&#039;&#039;Figure 1&#039;&#039;&#039;:  3D error cluster control and terminal‎]]&lt;br /&gt;
&lt;br /&gt;
The “status” is true if an error has occurred but remains false for warnings.  The “code” assumes positive and negative values (see “error codes, ranges of” in &#039;&#039;LabVIEW Help&#039;&#039;), with the range 5000 through 9999 &#039;&#039;&#039;and&#039;&#039;&#039; the range -9999 to -5000 reserved for user defined error codes.  The “source” identifies a VI and possibly its call chain as the origin of an error.  Possible reasons for an error can be obtained from the &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool (see &#039;&#039;&#039;Figure 2&#039;&#039;&#039;).  This tool is activated by selecting the &#039;&#039;&#039;Explain Error…&#039;&#039;&#039; item under the &#039;&#039;&#039;Help&#039;&#039;&#039; menu in LabVIEW or by right-clicking on any element of an error cluster with “status” true and selecting &#039;&#039;&#039;Explain Error&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Explain_Error_tool.jpg|frame|center|&#039;&#039;&#039;Figure 2&#039;&#039;&#039;:  &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool]]&lt;br /&gt;
&lt;br /&gt;
LabVIEW provides several VIs for working with error clusters.  For example, the &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; generates an error cluster based on a specified “code” (see &#039;&#039;&#039;Figure 3&#039;&#039;&#039;).  You can also define custom codes using the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; or by creating an XML-based text file in the &amp;lt;labview\user.lib\ errors&amp;gt; directory (see “error codes, defining custom” and “error codes, defining custom in text files” in &#039;&#039;LabVIEW Help&#039;&#039;).  This VI outputs a “message”, like the “Explanation” from &#039;&#039;&#039;Explain Error&#039;&#039;&#039;, which identifies the “source” and describes possible causes associated with the “code”.  This information can also be displayed using several different types of dialogs.  This feature is commonly employed to identify errors in user interface applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-VI_connectors.JPG|frame|center|&#039;&#039;&#039;Figure 3&#039;&#039;&#039;:  connectors for &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; and &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Error clusters are also valid inputs to some comparison and array functions and can be used to control case structures and while loops (see &#039;&#039;&#039;Figure 4&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-error_cluster_examples.JPG|frame|center|&#039;&#039;&#039;Figure 4&#039;&#039;&#039;:  structures, comparison and array functions involving error cluster inputs]]&lt;br /&gt;
&lt;br /&gt;
The comparison functions &#039;&#039;&#039;Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Not Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Greater?&#039;&#039;&#039;, &#039;&#039;&#039;Less?&#039;&#039;&#039;, &#039;&#039;&#039;Greater Or Equal?&#039;&#039;&#039; and &#039;&#039;&#039;Less Or Equal?&#039;&#039;&#039; can operate in two modes.  The output is Boolean in the &#039;&#039;&#039;Compare Aggregates&#039;&#039;&#039; mode, while a cluster of three Booleans corresponding to each component of the error cluster is generated in the &#039;&#039;&#039;Compare Elements&#039;&#039;&#039; mode (see &#039;&#039;&#039;Figure 5&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Comparison_function_indicators.JPG|frame|center|&#039;&#039;&#039;Figure 5&#039;&#039;&#039;:  typical indicators for both modes of a comparison function]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Select&#039;&#039;&#039;, &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; and &#039;&#039;&#039;In Range and Coerce&#039;&#039;&#039; functions can output an error cluster.  While the &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; function returns ordered inputs in the Compare Aggregates mode, an output may not correspond to either error cluster if Compare Elements is selected (default).  The &#039;&#039;&#039;Array Max &amp;amp; Min&#039;&#039;&#039; function always returns ordered inputs corresponding to the first and last elements of the &#039;&#039;&#039;Sort 1D Array&#039;&#039;&#039; output.  The primary sort is performed on “status”, with secondary ordering by “code” and then “source”.  Strings are sorted by ASCII code starting with the leading character.  Note that error clusters behave like their Boolean “status” value when connected to the selector terminal of a &#039;&#039;&#039;Select&#039;&#039;&#039; function and &#039;&#039;&#039;Case Structure&#039;&#039;&#039; or the conditional terminal of a &#039;&#039;&#039;While Loop&#039;&#039;&#039;.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Selection ==&lt;br /&gt;
&lt;br /&gt;
	A common programming issue in LabVIEW involves selecting between two or more error clusters.  This process involves finding the cluster with “status” true or “code” not equal zero if no “status” is true.  The &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 4&#039;&#039;&#039; implements this search for up to three error clusters and an array of such clusters.  This subVI is relatively fast with large error arrays.  However, a significant portion of the execution time involves concatenation of inputs for the small arrays (&amp;lt;10 elements) typical in most applications.  This result suggests that time critical applications should be built around the immediate selection between two error clusters rather than their concatenation into an array.  The simplest method of comparing the “status” of two error clusters involves the Select function (see &#039;&#039;&#039;Figure 6&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Simple_error_selector_diagram.JPG|frame|center|&#039;&#039;&#039;Figure 6&#039;&#039;&#039;:  diagram for a simple error selector that does not detect warnings]]&lt;br /&gt;
&lt;br /&gt;
This function selects the first error cluster with “status” true, much like the &#039;&#039;&#039;Or&#039;&#039;&#039; function operating on Boolean inputs.  Connecting “error 2” instead of “error 1” to the selector terminal is more analogous to the &#039;&#039;&#039;And&#039;&#039;&#039; function, which is typically less useful.  While about 30 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), the &#039;&#039;&#039;Select&#039;&#039;&#039; function does not detect a warning (“status” false and “code” not equal zero).  &lt;br /&gt;
&lt;br /&gt;
Diagrams for several VIs that compare error clusters and detect warnings are shown below (fastest to slowest).&lt;br /&gt;
&lt;br /&gt;
[[Image:Error_selector_diagram_A.JPG|frame|center|]][[Image:Error_selector_diagrams_B.JPG|frame|center|&#039;&#039;&#039;Figure 7&#039;&#039;&#039;:  possible diagrams for an error selector that detects warnings]]&lt;br /&gt;
 &lt;br /&gt;
These VIs execute about 5 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), even with normal priority execution. (&#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; uses the “subroutine” priority.)  Inputs to selector terminals in the first and second diagrams are passed to “error” for the cases not shown.  Otherwise, “error 1” is checked for nonzero “code” since neither cluster has “status” true.  The last approach uses the Max &amp;amp; Min function in Compare Aggregates mode to order inputs.  If just one of these clusters has “status” true, that input will be the “max” output since true &amp;gt; false.  However, this output must be checked for “status” true or “code” nonzero to determine selection.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
Every LabVIEW programmer has their own approach to handling errors.  In fact, those with multiple personalities probably have several different approaches to handling errors.  As an example, consider the producer-consumer diagram shown in &#039;&#039;&#039;Figure 8&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Producer-consumer.PNG|center|thumb|600px|&#039;&#039;&#039;Figure 8&#039;&#039;&#039;:  producer-consumer diagram with error handling in the top loop]]&lt;br /&gt;
&lt;br /&gt;
The “event loop” (bottom) produces enumerated commands that are processed by the “cmd loop” (top).  The outer case structure in the top loop traps for errors that are placed on the lower shift register.  The corresponding error case (not shown) allows error handling by “code” with different methods of notification.  For example, a user interface application based on this design pattern might employ the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 3&#039;&#039;&#039; to display a dialog for particular errors.  However, this method would not work for applications that run continuously without user interaction.&lt;br /&gt;
 &lt;br /&gt;
For continuously running applications, an error dialog (or any other kind of dialog for that matter) would disrupt execution, causing data loss or some other event you are being paid to avoid.  Logging error information to file is a useful notification method for such applications.  This approach requires an error description, which is provided by the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039; (see &#039;&#039;&#039;Figure 9&#039;&#039;&#039;) for specified error codes in LabVIEW.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| r[[Image:Error_code_database_connector.jpg|frame|center|&#039;&#039;&#039;Figure 9&#039;&#039;&#039;:  connector for the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039;]] &lt;br /&gt;
This locked VI, located in the library &amp;lt;labview\vi.lib\Utility\error.llb&amp;gt;, is easily found as a subVI of the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;.  &amp;lt;s&amp;gt;You would have to extend this database to handle user defined error codes and provide some type of error log.&amp;lt;/s&amp;gt; &#039;&#039;See General Error Handler.vi online help for two different ways of providing error descriptions for user defined error codes.&#039;&#039;  For example, some Windows applications log errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; (right-click on &#039;&#039;&#039;My Computer&#039;&#039;&#039; and select &#039;&#039;&#039;Manage&#039;&#039;&#039; from the popup menu) shown in &#039;&#039;&#039;Figure 10&#039;&#039;&#039; and &#039;&#039;&#039;Figure 11&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
|This entire section of WIKI about &amp;quot;Error Handling&amp;quot; could benefit from a deep reading of the online help for the General Error Handler.vi. That VI has more facilities than folks typically know. FOR EXAMPLE: &lt;br /&gt;
&lt;br /&gt;
The General Error Handler.vi includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; This is STRONGLY recommended instead of calling &amp;quot;Error Code Database.vi&amp;quot;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of General Error Handler CORE.vi (found on the block diagram of General Error Handler.vi) to do this. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Event_viewer.JPG|frame|center|&#039;&#039;&#039;Figure 10&#039;&#039;&#039;:  &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; in Windows]]&lt;br /&gt;
[[Image:Event_properties.jpg|frame|center|&#039;&#039;&#039;Figure 11&#039;&#039;&#039;:&#039;&#039;&#039;Event Properties&#039;&#039;&#039; in Windows]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;eventcreate&#039;&#039;&#039; command can be used in Windows to log events to this application.  A VI [[log event error]] for logging errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; should available soon.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:17, 3 May 2007 (CDT)&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1013</id>
		<title>Error Cluster data type</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1013"/>
		<updated>2007-05-05T16:55:54Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Error Handling */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Cluster ==&lt;br /&gt;
&lt;br /&gt;
An error cluster contains a Boolean “status”, an I32 numerical “code” and a “source” string in that order.  Any cluster with this structure is treated as an error cluster in LabVIEW.  The default value, “status” = false, “code” = 0 and “source” empty, is shown in &#039;&#039;&#039;Figure 1&#039;&#039;&#039; for a typical control.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_1-error_cluster_control_and_terminal.JPG|frame|center|&#039;&#039;&#039;Figure 1&#039;&#039;&#039;:  3D error cluster control and terminal‎]]&lt;br /&gt;
&lt;br /&gt;
The “status” is true if an error has occurred but remains false for warnings.  The “code” assumes positive and negative values (see “error codes, ranges of” in &#039;&#039;LabVIEW Help&#039;&#039;), with the range 5000 through 9999 &#039;&#039;&#039;and&#039;&#039;&#039; the range -9999 to -5000 reserved for user defined error codes.  The “source” identifies a VI and possibly its call chain as the origin of an error.  Possible reasons for an error can be obtained from the &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool (see &#039;&#039;&#039;Figure 2&#039;&#039;&#039;).  This tool is activated by selecting the &#039;&#039;&#039;Explain Error…&#039;&#039;&#039; item under the &#039;&#039;&#039;Help&#039;&#039;&#039; menu in LabVIEW or by right-clicking on any element of an error cluster with “status” true and selecting &#039;&#039;&#039;Explain Error&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Explain_Error_tool.jpg|frame|center|&#039;&#039;&#039;Figure 2&#039;&#039;&#039;:  &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool]]&lt;br /&gt;
&lt;br /&gt;
LabVIEW provides several VIs for working with error clusters.  For example, the &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; generates an error cluster based on a specified “code” (see &#039;&#039;&#039;Figure 3&#039;&#039;&#039;).  You can also define custom codes using the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; or by creating an XML-based text file in the &amp;lt;labview\user.lib\ errors&amp;gt; directory (see “error codes, defining custom” and “error codes, defining custom in text files” in &#039;&#039;LabVIEW Help&#039;&#039;).  This VI outputs a “message”, like the “Explanation” from &#039;&#039;&#039;Explain Error&#039;&#039;&#039;, which identifies the “source” and describes possible causes associated with the “code”.  This information can also be displayed using several different types of dialogs.  This feature is commonly employed to identify errors in user interface applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-VI_connectors.JPG|frame|center|&#039;&#039;&#039;Figure 3&#039;&#039;&#039;:  connectors for &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; and &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Error clusters are also valid inputs to some comparison and array functions and can be used to control case structures and while loops (see &#039;&#039;&#039;Figure 4&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-error_cluster_examples.JPG|frame|center|&#039;&#039;&#039;Figure 4&#039;&#039;&#039;:  structures, comparison and array functions involving error cluster inputs]]&lt;br /&gt;
&lt;br /&gt;
The comparison functions &#039;&#039;&#039;Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Not Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Greater?&#039;&#039;&#039;, &#039;&#039;&#039;Less?&#039;&#039;&#039;, &#039;&#039;&#039;Greater Or Equal?&#039;&#039;&#039; and &#039;&#039;&#039;Less Or Equal?&#039;&#039;&#039; can operate in two modes.  The output is Boolean in the &#039;&#039;&#039;Compare Aggregates&#039;&#039;&#039; mode, while a cluster of three Booleans corresponding to each component of the error cluster is generated in the &#039;&#039;&#039;Compare Elements&#039;&#039;&#039; mode (see &#039;&#039;&#039;Figure 5&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Comparison_function_indicators.JPG|frame|center|&#039;&#039;&#039;Figure 5&#039;&#039;&#039;:  typical indicators for both modes of a comparison function]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Select&#039;&#039;&#039;, &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; and &#039;&#039;&#039;In Range and Coerce&#039;&#039;&#039; functions can output an error cluster.  While the &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; function returns ordered inputs in the Compare Aggregates mode, an output may not correspond to either error cluster if Compare Elements is selected (default).  The &#039;&#039;&#039;Array Max &amp;amp; Min&#039;&#039;&#039; function always returns ordered inputs corresponding to the first and last elements of the &#039;&#039;&#039;Sort 1D Array&#039;&#039;&#039; output.  The primary sort is performed on “status”, with secondary ordering by “code” and then “source”.  Strings are sorted by ASCII code starting with the leading character.  Note that error clusters behave like their Boolean “status” value when connected to the selector terminal of a &#039;&#039;&#039;Select&#039;&#039;&#039; function and &#039;&#039;&#039;Case Structure&#039;&#039;&#039; or the conditional terminal of a &#039;&#039;&#039;While Loop&#039;&#039;&#039;.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Selection ==&lt;br /&gt;
&lt;br /&gt;
	A common programming issue in LabVIEW involves selecting between two or more error clusters.  This process involves finding the cluster with “status” true or “code” not equal zero if no “status” is true.  The &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 4&#039;&#039;&#039; implements this search for up to three error clusters and an array of such clusters.  This subVI is relatively fast with large error arrays.  However, a significant portion of the execution time involves concatenation of inputs for the small arrays (&amp;lt;10 elements) typical in most applications.  This result suggests that time critical applications should be built around the immediate selection between two error clusters rather than their concatenation into an array.  The simplest method of comparing the “status” of two error clusters involves the Select function (see &#039;&#039;&#039;Figure 6&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Simple_error_selector_diagram.JPG|frame|center|&#039;&#039;&#039;Figure 6&#039;&#039;&#039;:  diagram for a simple error selector that does not detect warnings]]&lt;br /&gt;
&lt;br /&gt;
This function selects the first error cluster with “status” true, much like the &#039;&#039;&#039;Or&#039;&#039;&#039; function operating on Boolean inputs.  Connecting “error 2” instead of “error 1” to the selector terminal is more analogous to the &#039;&#039;&#039;And&#039;&#039;&#039; function, which is typically less useful.  While about 30 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), the &#039;&#039;&#039;Select&#039;&#039;&#039; function does not detect a warning (“status” false and “code” not equal zero).  &lt;br /&gt;
&lt;br /&gt;
Diagrams for several VIs that compare error clusters and detect warnings are shown below (fastest to slowest).&lt;br /&gt;
&lt;br /&gt;
[[Image:Error_selector_diagram_A.JPG|frame|center|]][[Image:Error_selector_diagrams_B.JPG|frame|center|&#039;&#039;&#039;Figure 7&#039;&#039;&#039;:  possible diagrams for an error selector that detects warnings]]&lt;br /&gt;
 &lt;br /&gt;
These VIs execute about 5 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), even with normal priority execution. (&#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; uses the “subroutine” priority.)  Inputs to selector terminals in the first and second diagrams are passed to “error” for the cases not shown.  Otherwise, “error 1” is checked for nonzero “code” since neither cluster has “status” true.  The last approach uses the Max &amp;amp; Min function in Compare Aggregates mode to order inputs.  If just one of these clusters has “status” true, that input will be the “max” output since true &amp;gt; false.  However, this output must be checked for “status” true or “code” nonzero to determine selection.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
Every LabVIEW programmer has their own approach to handling errors.  In fact, those with multiple personalities probably have several different approaches to handling errors.  As an example, consider the producer-consumer diagram shown in &#039;&#039;&#039;Figure 8&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Producer-consumer.PNG|center|thumb|600px|&#039;&#039;&#039;Figure 8&#039;&#039;&#039;:  producer-consumer diagram with error handling in the top loop]]&lt;br /&gt;
&lt;br /&gt;
The “event loop” (bottom) produces enumerated commands that are processed by the “cmd loop” (top).  The outer case structure in the top loop traps for errors that are placed on the lower shift register.  The corresponding error case (not shown) allows error handling by “code” with different methods of notification.  For example, a user interface application based on this design pattern might employ the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 3&#039;&#039;&#039; to display a dialog for particular errors.  However, this method would not work for applications that run continuously without user interaction.&lt;br /&gt;
 &lt;br /&gt;
For continuously running applications, an error dialog (or any other kind of dialog for that matter) would disrupt execution, causing data loss or some other event you are being paid to avoid.  Logging error information to file is a useful notification method for such applications.  This approach requires an error description, which is provided by the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039; (see &#039;&#039;&#039;Figure 9&#039;&#039;&#039;) for specified error codes in LabVIEW.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| r[[Image:Error_code_database_connector.jpg|frame|center|&#039;&#039;&#039;Figure 9&#039;&#039;&#039;:  connector for the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039;]] &lt;br /&gt;
This locked VI, located in the library &amp;lt;labview\vi.lib\Utility\error.llb&amp;gt;, is easily found as a subVI of the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;.  &amp;lt;s&amp;gt;You would have to extend this database to handle user defined error codes and provide some type of error log.&amp;lt;/s&amp;gt; &#039;&#039;See General Error Handler.vi online help for two different ways of providing error descriptions for user defined error codes.&#039;&#039;  For example, some Windows applications log errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; (right-click on &#039;&#039;&#039;My Computer&#039;&#039;&#039; and select &#039;&#039;&#039;Manage&#039;&#039;&#039; from the popup menu) shown in &#039;&#039;&#039;Figure 10&#039;&#039;&#039; and &#039;&#039;&#039;Figure 11&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
| &#039;&#039;Note from R&amp;amp;D&#039;&#039;: This entire section of WIKI about &amp;quot;Error Handling&amp;quot; could benefit from a deep reading of the online help for the General Error Handler.vi. That VI has more facilities than folks typically know. FOR EXAMPLE: &lt;br /&gt;
&lt;br /&gt;
The General Error Handler.vi includes an input parameter for the type of dialog, one option is &amp;quot;no dialog.&amp;quot; This is STRONGLY recommended instead of calling &amp;quot;Error Code Database.vi&amp;quot;. The primary reason for the recommendation is that the translation of error code cluster into human readable strings involves much more than just looking up text in the database. The &#039;&#039;&#039;source&#039;&#039;&#039; string itself may include information to override or extend the database, and the text in either the &#039;&#039;&#039;source&#039;&#039;&#039; string or the database may include formatting commands, such as HTML tags for bold face. Encoding information in the &#039;&#039;&#039;source&#039;&#039;&#039; string is a technique that will become more common in the future. &lt;br /&gt;
&lt;br /&gt;
You may desire to display the text, fully formatted, in a string indicator of your own instead of in any dialog. Use the function of General Error Handler CORE.vi (found on the block diagram of General Error Handler.vi) to do this. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Image:Event_viewer.JPG|frame|center|&#039;&#039;&#039;Figure 10&#039;&#039;&#039;:  &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; in Windows]]&lt;br /&gt;
[[Image:Event_properties.jpg|frame|center|&#039;&#039;&#039;Figure 11&#039;&#039;&#039;:&#039;&#039;&#039;Event Properties&#039;&#039;&#039; in Windows]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;eventcreate&#039;&#039;&#039; command can be used in Windows to log events to this application.  A VI [[log event error]] for logging errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; should available soon.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:17, 3 May 2007 (CDT)&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1008</id>
		<title>Error Cluster data type</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Error_Cluster_data_type&amp;diff=1008"/>
		<updated>2007-05-05T16:44:13Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Error Cluster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Error Cluster ==&lt;br /&gt;
&lt;br /&gt;
An error cluster contains a Boolean “status”, an I32 numerical “code” and a “source” string in that order.  Any cluster with this structure is treated as an error cluster in LabVIEW.  The default value, “status” = false, “code” = 0 and “source” empty, is shown in &#039;&#039;&#039;Figure 1&#039;&#039;&#039; for a typical control.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_1-error_cluster_control_and_terminal.JPG|frame|center|&#039;&#039;&#039;Figure 1&#039;&#039;&#039;:  3D error cluster control and terminal‎]]&lt;br /&gt;
&lt;br /&gt;
The “status” is true if an error has occurred but remains false for warnings.  The “code” assumes positive and negative values (see “error codes, ranges of” in &#039;&#039;LabVIEW Help&#039;&#039;), with the range 5000 through 9999 &#039;&#039;&#039;and&#039;&#039;&#039; the range -9999 to -5000 reserved for user defined error codes.  The “source” identifies a VI and possibly its call chain as the origin of an error.  Possible reasons for an error can be obtained from the &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool (see &#039;&#039;&#039;Figure 2&#039;&#039;&#039;).  This tool is activated by selecting the &#039;&#039;&#039;Explain Error…&#039;&#039;&#039; item under the &#039;&#039;&#039;Help&#039;&#039;&#039; menu in LabVIEW or by right-clicking on any element of an error cluster with “status” true and selecting &#039;&#039;&#039;Explain Error&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Explain_Error_tool.jpg|frame|center|&#039;&#039;&#039;Figure 2&#039;&#039;&#039;:  &#039;&#039;&#039;Explain Error&#039;&#039;&#039; tool]]&lt;br /&gt;
&lt;br /&gt;
LabVIEW provides several VIs for working with error clusters.  For example, the &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; generates an error cluster based on a specified “code” (see &#039;&#039;&#039;Figure 3&#039;&#039;&#039;).  You can also define custom codes using the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; or by creating an XML-based text file in the &amp;lt;labview\user.lib\ errors&amp;gt; directory (see “error codes, defining custom” and “error codes, defining custom in text files” in &#039;&#039;LabVIEW Help&#039;&#039;).  This VI outputs a “message”, like the “Explanation” from &#039;&#039;&#039;Explain Error&#039;&#039;&#039;, which identifies the “source” and describes possible causes associated with the “code”.  This information can also be displayed using several different types of dialogs.  This feature is commonly employed to identify errors in user interface applications.&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-VI_connectors.JPG|frame|center|&#039;&#039;&#039;Figure 3&#039;&#039;&#039;:  connectors for &#039;&#039;&#039;Error Cluster from Error Code.vi&#039;&#039;&#039; and &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Error clusters are also valid inputs to some comparison and array functions and can be used to control case structures and while loops (see &#039;&#039;&#039;Figure 4&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Fig_3-error_cluster_examples.JPG|frame|center|&#039;&#039;&#039;Figure 4&#039;&#039;&#039;:  structures, comparison and array functions involving error cluster inputs]]&lt;br /&gt;
&lt;br /&gt;
The comparison functions &#039;&#039;&#039;Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Not Equal?&#039;&#039;&#039;, &#039;&#039;&#039;Greater?&#039;&#039;&#039;, &#039;&#039;&#039;Less?&#039;&#039;&#039;, &#039;&#039;&#039;Greater Or Equal?&#039;&#039;&#039; and &#039;&#039;&#039;Less Or Equal?&#039;&#039;&#039; can operate in two modes.  The output is Boolean in the &#039;&#039;&#039;Compare Aggregates&#039;&#039;&#039; mode, while a cluster of three Booleans corresponding to each component of the error cluster is generated in the &#039;&#039;&#039;Compare Elements&#039;&#039;&#039; mode (see &#039;&#039;&#039;Figure 5&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Comparison_function_indicators.JPG|frame|center|&#039;&#039;&#039;Figure 5&#039;&#039;&#039;:  typical indicators for both modes of a comparison function]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Select&#039;&#039;&#039;, &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; and &#039;&#039;&#039;In Range and Coerce&#039;&#039;&#039; functions can output an error cluster.  While the &#039;&#039;&#039;Max &amp;amp; Min&#039;&#039;&#039; function returns ordered inputs in the Compare Aggregates mode, an output may not correspond to either error cluster if Compare Elements is selected (default).  The &#039;&#039;&#039;Array Max &amp;amp; Min&#039;&#039;&#039; function always returns ordered inputs corresponding to the first and last elements of the &#039;&#039;&#039;Sort 1D Array&#039;&#039;&#039; output.  The primary sort is performed on “status”, with secondary ordering by “code” and then “source”.  Strings are sorted by ASCII code starting with the leading character.  Note that error clusters behave like their Boolean “status” value when connected to the selector terminal of a &#039;&#039;&#039;Select&#039;&#039;&#039; function and &#039;&#039;&#039;Case Structure&#039;&#039;&#039; or the conditional terminal of a &#039;&#039;&#039;While Loop&#039;&#039;&#039;.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Selection ==&lt;br /&gt;
&lt;br /&gt;
	A common programming issue in LabVIEW involves selecting between two or more error clusters.  This process involves finding the cluster with “status” true or “code” not equal zero if no “status” is true.  The &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 4&#039;&#039;&#039; implements this search for up to three error clusters and an array of such clusters.  This subVI is relatively fast with large error arrays.  However, a significant portion of the execution time involves concatenation of inputs for the small arrays (&amp;lt;10 elements) typical in most applications.  This result suggests that time critical applications should be built around the immediate selection between two error clusters rather than their concatenation into an array.  The simplest method of comparing the “status” of two error clusters involves the Select function (see &#039;&#039;&#039;Figure 6&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
[[Image:Simple_error_selector_diagram.JPG|frame|center|&#039;&#039;&#039;Figure 6&#039;&#039;&#039;:  diagram for a simple error selector that does not detect warnings]]&lt;br /&gt;
&lt;br /&gt;
This function selects the first error cluster with “status” true, much like the &#039;&#039;&#039;Or&#039;&#039;&#039; function operating on Boolean inputs.  Connecting “error 2” instead of “error 1” to the selector terminal is more analogous to the &#039;&#039;&#039;And&#039;&#039;&#039; function, which is typically less useful.  While about 30 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), the &#039;&#039;&#039;Select&#039;&#039;&#039; function does not detect a warning (“status” false and “code” not equal zero).  &lt;br /&gt;
&lt;br /&gt;
Diagrams for several VIs that compare error clusters and detect warnings are shown below (fastest to slowest).&lt;br /&gt;
&lt;br /&gt;
[[Image:Error_selector_diagram_A.JPG|frame|center|]][[Image:Error_selector_diagrams_B.JPG|frame|center|&#039;&#039;&#039;Figure 7&#039;&#039;&#039;:  possible diagrams for an error selector that detects warnings]]&lt;br /&gt;
 &lt;br /&gt;
These VIs execute about 5 times faster than the &#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; (LabVIEW 7.0), even with normal priority execution. (&#039;&#039;&#039;Merge Errors.vi&#039;&#039;&#039; uses the “subroutine” priority.)  Inputs to selector terminals in the first and second diagrams are passed to “error” for the cases not shown.  Otherwise, “error 1” is checked for nonzero “code” since neither cluster has “status” true.  The last approach uses the Max &amp;amp; Min function in Compare Aggregates mode to order inputs.  If just one of these clusters has “status” true, that input will be the “max” output since true &amp;gt; false.  However, this output must be checked for “status” true or “code” nonzero to determine selection.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:18, 3 May 2007 (CDT)&lt;br /&gt;
&lt;br /&gt;
== Error Handling ==&lt;br /&gt;
&lt;br /&gt;
Every LabVIEW programmer has their own approach to handling errors.  In fact, those with multiple personalities probably have several different approaches to handling errors.  As an example, consider the producer-consumer diagram shown in &#039;&#039;&#039;Figure 8&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Producer-consumer.PNG|center|thumb|600px|&#039;&#039;&#039;Figure 8&#039;&#039;&#039;:  producer-consumer diagram with error handling in the top loop]]&lt;br /&gt;
&lt;br /&gt;
The “event loop” (bottom) produces enumerated commands that are processed by the “cmd loop” (top).  The outer case structure in the top loop traps for errors that are placed on the lower shift register.  The corresponding error case (not shown) allows error handling by “code” with different methods of notification.  For example, a user interface application based on this design pattern might employ the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039; shown in &#039;&#039;&#039;Figure 3&#039;&#039;&#039; to display a dialog for particular errors.  However, this method would not work for applications that run continuously without user interaction.&lt;br /&gt;
 &lt;br /&gt;
For continuously running applications, an error dialog (or any other kind of dialog for that matter) would disrupt execution, causing data loss or some other event you are being paid to avoid.  Logging error information to file is a useful notification method for such applications.  This approach requires an error description, which is provided by the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039; (see &#039;&#039;&#039;Figure 9&#039;&#039;&#039;) for specified error codes in LabVIEW.&lt;br /&gt;
&lt;br /&gt;
[[Image:Error_code_database_connector.jpg|frame|center|&#039;&#039;&#039;Figure 9&#039;&#039;&#039;:  connector for the &#039;&#039;&#039;Error Code Database.vi&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
This locked VI, located in the library &amp;lt;labview\vi.lib\Utility\error.llb&amp;gt;, is easily found as a subVI of the &#039;&#039;&#039;General Error Handler.vi&#039;&#039;&#039;.  You would have to extend this database to handle user defined error codes and provide some type of error log.  For example, some Windows applications log errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; (right-click on &#039;&#039;&#039;My Computer&#039;&#039;&#039; and select &#039;&#039;&#039;Manage&#039;&#039;&#039; from the popup menu) shown in &#039;&#039;&#039;Figure 10&#039;&#039;&#039; and &#039;&#039;&#039;Figure 11&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Event_viewer.JPG|frame|center|&#039;&#039;&#039;Figure 10&#039;&#039;&#039;:  &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; in Windows]]&lt;br /&gt;
[[Image:Event_properties.jpg|frame|center|&#039;&#039;&#039;Figure 11&#039;&#039;&#039;:&#039;&#039;&#039;Event Properties&#039;&#039;&#039; in Windows]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;eventcreate&#039;&#039;&#039; command can be used in Windows to log events to this application.  A VI [[log event error]] for logging errors to the &#039;&#039;&#039;Event Viewer&#039;&#039;&#039; should available soon.&lt;br /&gt;
--[[User:wevanarsdale|wevanarsdale]] 21:17, 3 May 2007 (CDT)&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=User:Smercer&amp;diff=910</id>
		<title>User:Smercer</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=User:Smercer&amp;diff=910"/>
		<updated>2007-05-01T20:21:38Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A.K.A. Aristos Queue&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 1em auto 1em auto&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|{{NI Employee}}&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|{{LAVA Premium Member}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=User:Smercer&amp;diff=909</id>
		<title>User:Smercer</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=User:Smercer&amp;diff=909"/>
		<updated>2007-05-01T20:21:10Z</updated>

		<summary type="html">&lt;p&gt;Smercer: New page: {| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 1em auto 1em auto&amp;quot; |- align=&amp;quot;center&amp;quot; |{{NI Employee}} |- align=&amp;quot;center&amp;quot; |{{LAVA Premium Member}} |}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 1em auto 1em auto&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|{{NI Employee}}&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|{{LAVA Premium Member}}&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Development_Environment&amp;diff=886</id>
		<title>Development Environment</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Development_Environment&amp;diff=886"/>
		<updated>2007-04-25T06:02:51Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the portal for information related to enhancing or modifying the LabVIEW Development environment.&lt;br /&gt;
&lt;br /&gt;
====Pages here:====&lt;br /&gt;
*[[How to do Menu Launch VIs]]&lt;br /&gt;
*[[Most Recently Used Folders in LV8.20]]&lt;br /&gt;
*[[LabVIEW configuration file]] &amp;lt;&amp;lt; info about how to edit the config file on various platforms&lt;br /&gt;
*[[LabVIEW ini File]] &amp;lt;&amp;lt; info about why to edit the config file&lt;br /&gt;
*[[LabVIEW ini Settings]] &amp;lt;&amp;lt; info about options you have when editing the config file&lt;br /&gt;
*[[LLB]]&lt;br /&gt;
*[[Multiple Instances of LabVIEW]]&lt;br /&gt;
*[[VI Icons]]&lt;br /&gt;
*[[Insane Objects]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=879</id>
		<title>Insane Objects</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=879"/>
		<updated>2007-04-22T15:48:25Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Firstly, there is no need to necessarily report generically to [[NI]] that LabVIEW has insane objects, as they do know about insane objects. Secondly they are NOT merely bugs: insane objects can be generated as part of the LabVIEW verification process. If you get such a message, it is good to check the known bugs of LV at ni.com and if the particular insanity in your dialog is not listed, only then should you report the insanity to NI technical support.&lt;br /&gt;
&lt;br /&gt;
The insane object message is what LabVIEW puts in a dialog when one of the objects on the diagram does not meet its &amp;quot;checksum&amp;quot;. In other words, this object isn&#039;t in a state we expect it to be in. Most of the time these errors are not fatal -- we simply put the object in the state we do expect. But it raises questions about how the object got into that bad state and what might have been done with that object between the last time we checked and it was good and the time it became insane.&lt;br /&gt;
&lt;br /&gt;
The insane object messages are something we work on with each version of LV. But as it is a generic error message that can apply to anything from a simple cosmetic to the front panel itself, you&#039;ll still see them in any version of LV that has a bug -- a fact of life unfortunately for the foreseeable future. &lt;br /&gt;
&lt;br /&gt;
The cryptic nature of the message can be deciphered as follows:&lt;br /&gt;
Insane object at FPHP+4C in &amp;quot;name.vi&amp;quot;: {dsitem} 0x400: Panel (FPSC)&lt;br /&gt;
* FPHP -- this will be either FP or BD for &amp;quot;front panel heap&amp;quot; or &amp;quot;block diagram heap&amp;quot;&lt;br /&gt;
* 4C -- this is a hexadecimal number indicating which object.&lt;br /&gt;
* name.vi -- which VI had the insanity&lt;br /&gt;
* {dsitem} 0x400 -- really only meaningful if you know how our internals work; I&#039;ll skip it here&lt;br /&gt;
* Panel (FPSC) -- the type of object that has problems. The four letter codes are usually descriptive (COSM for a cosmetic or simple drawn part, SGNL for a signal aka wire). A common one that you won&#039;t guess is DDOD, which stands for Data Display Object (the last D is because it has to be 4 chars). A DDO is either a control or an indicator.&lt;br /&gt;
&lt;br /&gt;
Most of the time, deleting the offending object and recreating it from scratch is sufficient to fix your VI and allow you to continue working.&lt;br /&gt;
&lt;br /&gt;
== Using Heap Peek ==&lt;br /&gt;
&lt;br /&gt;
The number &amp;quot;4C&amp;quot; is described above as the number that tells you which object. Not exactly helpful to an end user. There is a way to find and delete an insane object. When you get an insane error, you will get a code that shows the object that is insane - write down that code and then:&lt;br /&gt;
&lt;br /&gt;
* Close LabVIEW&lt;br /&gt;
* Put the key &amp;quot;LVDebugKeys=True&amp;quot; in your [[LabVIEW configuration file]] &#039;&#039;(&#039;&#039;&#039;NOTE:&#039;&#039;&#039; On Mac and Linux, the config tokens are case sensitive. I *think* the correct capitalization is given here, but if it doesn&#039;t work, try some variations.)&#039;&#039;&lt;br /&gt;
* Open your VI&lt;br /&gt;
* In LV7.1 and earlier: press CTRL+SHIFT+D; In LV8.0 and later, press CTRL+SHIFT+D+H. On Mac, use the command key instead of CTRL.  This will open a window known to LV R&amp;amp;D as &amp;quot;heap peek&amp;quot; since it gives internal views into the front panel heap and the block diagram heap.&lt;br /&gt;
* The window is divided into 4 sections: top-left, top-right, middle, and base. The functionality of the various parts is obscure and mystical, so we&#039;re just going to focus on the bits that help with finding and deleting insane objects.&lt;br /&gt;
* Check the error message given about the insane object. It includes either the letters BDHP or FPHP. Scroll through the top-left list box until you find those 4 letters and the name of your VI. Left click to select that item. This will change what is displayed in the top-right section of the window.&lt;br /&gt;
* In the top-right section, find the line that begins with the number identifying the object. These are sorted numerically. Left click to select the object when you find it. &lt;br /&gt;
* In the middle region, there is a box with an F inside it. This is a button (heap peek doesn&#039;t use a lot of advanced drawing, so it doesn&#039;t really look like a button, but it is). Click on the F button to find the offending object.&lt;br /&gt;
* LabVIEW will switch to the block diagram or front panel and select some object. Whatever object it is, delete it. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Another author of the WIKI wrote this:&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Care must be taken with heap peek. It has the possibility to change states of objects and doing that without knowing EXACTLY (and I think only a few people in the LabVIEW developer team really do) what you are doing can completely mess up your VI or maybe even more.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
I do not think that heap peek has any ability to change the objects. It is display information only. There are VIs in LV that are not real VIs (for example, a pseudo VI that is created to represent a Call By Reference to another application instance on another machine), and attempting to do Find to jump to their components can cause problems because those VIs never expect to actually draw themselves. But other than that state change, I do not know of any edits. They may exist. The previous author is quite correct in saying that few developers really know the capacities of heap peek. It&#039;s a debugging tool, and it gets hacked up to display whatever anyone needs to display.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=878</id>
		<title>Insane Objects</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=878"/>
		<updated>2007-04-22T15:46:16Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Using Heap Peek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Firstly, there is no need to necessarily report generically to [[NI]] that LabVIEW has insane objects, as they do know about insane objects. Secondly they are NOT merely bugs: insane objects can be generated as part of the LabVIEW verification process. If you get such a message, it is good to check the known bugs of LV at ni.com and if the particular insanity in your dialog is not listed, only then should you report the insanity to NI technical support.&lt;br /&gt;
&lt;br /&gt;
The insane object message is what LabVIEW puts in a dialog when one of the objects on the diagram does not meet its &amp;quot;checksum&amp;quot;. In other words, this object isn&#039;t in a state we expect it to be in. Most of the time these errors are not fatal -- we simply put the object in the state we do expect. But it raises questions about how the object got into that bad state and what might have been done with that object between the last time we checked and it was good and the time it became insane.&lt;br /&gt;
&lt;br /&gt;
The insane object messages are something we work on with each version of LV. But as it is a generic error message that can apply to anything from a simple cosmetic to the front panel itself, you&#039;ll still see them in any version of LV that has a bug -- a fact of life unfortunately for the foreseeable future. &lt;br /&gt;
&lt;br /&gt;
The cryptic nature of the message can be deciphered as follows:&lt;br /&gt;
Insane object at FPHP+4C in &amp;quot;name.vi&amp;quot;: {dsitem} 0x400: Panel (FPSC)&lt;br /&gt;
* FPHP -- this will be either FP or BD for &amp;quot;front panel heap&amp;quot; or &amp;quot;block diagram heap&amp;quot;&lt;br /&gt;
* 4C -- this is a hexadecimal number indicating which object.&lt;br /&gt;
* name.vi -- which VI had the insanity&lt;br /&gt;
* {dsitem} 0x400 -- really only meaningful if you know how our internals work; I&#039;ll skip it here&lt;br /&gt;
* Panel (FPSC) -- the type of object that has problems. The four letter codes are usually descriptive (COSM for a cosmetic or simple drawn part, SGNL for a signal aka wire)&lt;br /&gt;
&lt;br /&gt;
Most of the time, deleting the offending object and recreating it from scratch is sufficient to fix your VI and allow you to continue working.&lt;br /&gt;
&lt;br /&gt;
== Using Heap Peek ==&lt;br /&gt;
&lt;br /&gt;
The number &amp;quot;4C&amp;quot; is described above as the number that tells you which object. Not exactly helpful to an end user. There is a way to find and delete an insane object. When you get an insane error, you will get a code that shows the object that is insane - write down that code and then:&lt;br /&gt;
&lt;br /&gt;
* Close LabVIEW&lt;br /&gt;
* Put the key &amp;quot;LVDebugKeys=True&amp;quot; in your [[LabVIEW configuration file]] &#039;&#039;(&#039;&#039;&#039;NOTE:&#039;&#039;&#039; On Mac and Linux, the config tokens are case sensitive. I *think* the correct capitalization is given here, but if it doesn&#039;t work, try some variations.)&#039;&#039;&lt;br /&gt;
* Open your VI&lt;br /&gt;
* In LV7.1 and earlier: press CTRL+SHIFT+D; In LV8.0 and later, press CTRL+SHIFT+D+H. On Mac, use the command key instead of CTRL.  This will open a window known to LV R&amp;amp;D as &amp;quot;heap peek&amp;quot; since it gives internal views into the front panel heap and the block diagram heap.&lt;br /&gt;
* The window is divided into 4 sections: top-left, top-right, middle, and base. The functionality of the various parts is obscure and mystical, so we&#039;re just going to focus on the bits that help with finding and deleting insane objects.&lt;br /&gt;
* Check the error message given about the insane object. It includes either the letters BDHP or FPHP. Scroll through the top-left list box until you find those 4 letters and the name of your VI. Left click to select that item. This will change what is displayed in the top-right section of the window.&lt;br /&gt;
* In the top-right section, find the line that begins with the number identifying the object. These are sorted numerically. Left click to select the object when you find it. &lt;br /&gt;
* In the middle region, there is a box with an F inside it. This is a button (heap peek doesn&#039;t use a lot of advanced drawing, so it doesn&#039;t really look like a button, but it is). Click on the F button to find the offending object.&lt;br /&gt;
* LabVIEW will switch to the block diagram or front panel and select some object. Whatever object it is, delete it. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Another author of the WIKI wrote this:&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Care must be taken with heap peek. It has the possibility to change states of objects and doing that without knowing EXACTLY (and I think only a few people in the LabVIEW developer team really do) what you are doing can completely mess up your VI or maybe even more.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
I do not think that heap peek has any ability to change the objects. It is display information only. There are VIs in LV that are not real VIs (for example, a pseudo VI that is created to represent a Call By Reference to another application instance on another machine), and attempting to do Find to jump to their components can cause problems because those VIs never expect to actually draw themselves. But other than that state change, I do not know of any edits. They may exist. The previous author is quite correct in saying that few developers really know the capacities of heap peek. It&#039;s a debugging tool, and it gets hacked up to display whatever anyone needs to display.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=877</id>
		<title>Insane Objects</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=877"/>
		<updated>2007-04-22T15:44:55Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Using Heap Peek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Firstly, there is no need to necessarily report generically to [[NI]] that LabVIEW has insane objects, as they do know about insane objects. Secondly they are NOT merely bugs: insane objects can be generated as part of the LabVIEW verification process. If you get such a message, it is good to check the known bugs of LV at ni.com and if the particular insanity in your dialog is not listed, only then should you report the insanity to NI technical support.&lt;br /&gt;
&lt;br /&gt;
The insane object message is what LabVIEW puts in a dialog when one of the objects on the diagram does not meet its &amp;quot;checksum&amp;quot;. In other words, this object isn&#039;t in a state we expect it to be in. Most of the time these errors are not fatal -- we simply put the object in the state we do expect. But it raises questions about how the object got into that bad state and what might have been done with that object between the last time we checked and it was good and the time it became insane.&lt;br /&gt;
&lt;br /&gt;
The insane object messages are something we work on with each version of LV. But as it is a generic error message that can apply to anything from a simple cosmetic to the front panel itself, you&#039;ll still see them in any version of LV that has a bug -- a fact of life unfortunately for the foreseeable future. &lt;br /&gt;
&lt;br /&gt;
The cryptic nature of the message can be deciphered as follows:&lt;br /&gt;
Insane object at FPHP+4C in &amp;quot;name.vi&amp;quot;: {dsitem} 0x400: Panel (FPSC)&lt;br /&gt;
* FPHP -- this will be either FP or BD for &amp;quot;front panel heap&amp;quot; or &amp;quot;block diagram heap&amp;quot;&lt;br /&gt;
* 4C -- this is a hexadecimal number indicating which object.&lt;br /&gt;
* name.vi -- which VI had the insanity&lt;br /&gt;
* {dsitem} 0x400 -- really only meaningful if you know how our internals work; I&#039;ll skip it here&lt;br /&gt;
* Panel (FPSC) -- the type of object that has problems. The four letter codes are usually descriptive (COSM for a cosmetic or simple drawn part, SGNL for a signal aka wire)&lt;br /&gt;
&lt;br /&gt;
Most of the time, deleting the offending object and recreating it from scratch is sufficient to fix your VI and allow you to continue working.&lt;br /&gt;
&lt;br /&gt;
== Using Heap Peek ==&lt;br /&gt;
&lt;br /&gt;
The number &amp;quot;4C&amp;quot; is described above as the number that tells you which object. Not exactly helpful to an end user. There is a way to find and delete an insane object. When you get an insane error, you will get a code that shows the object that is insane - write down that code and then:&lt;br /&gt;
&lt;br /&gt;
* Close LabVIEW&lt;br /&gt;
* Put the key &amp;quot;LVDebugKeys=True&amp;quot; in your LabVIEW configuration file &#039;&#039;(&#039;&#039;&#039;NOTE:&#039;&#039;&#039; On Mac and Linux, the config tokens are case sensitive. I *think* the correct capitalization is given here, but if it doesn&#039;t work, try some variations.)&#039;&#039;&lt;br /&gt;
* Open your VI&lt;br /&gt;
* In LV7.1 and earlier: press CTRL+SHIFT+D; In LV8.0 and later, press CTRL+SHIFT+D+H. On Mac, use the command key instead of CTRL.  This will open a window known to LV R&amp;amp;D as &amp;quot;heap peek&amp;quot; since it gives internal views into the front panel heap and the block diagram heap.&lt;br /&gt;
* The window is divided into 4 sections: top-left, top-right, middle, and base. The functionality of the various parts is obscure and mystical, so we&#039;re just going to focus on the bits that help with finding and deleting insane objects.&lt;br /&gt;
* Check the error message given about the insane object. It includes either the letters BDHP or FPHP. Scroll through the top-left list box until you find those 4 letters and the name of your VI. Left click to select that item. This will change what is displayed in the top-right section of the window.&lt;br /&gt;
* In the top-right section, find the line that begins with the number identifying the object. These are sorted numerically. Left click to select the object when you find it. &lt;br /&gt;
* In the middle region, there is a box with an F inside it. This is a button (heap peek doesn&#039;t use a lot of advanced drawing, so it doesn&#039;t really look like a button, but it is). Click on the F button to find the offending object.&lt;br /&gt;
* LabVIEW will switch to the block diagram or front panel and select some object. Whatever object it is, delete it. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Another author of the WIKI wrote this:&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Care must be taken with heap peek. It has the possibility to change states of objects and doing that without knowing EXACTLY (and I think only a few people in the LabVIEW developer team really do) what you are doing can completely mess up your VI or maybe even more.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
I do not think that heap peek has any ability to change the objects. It is display information only. There are VIs in LV that are not real VIs (for example, a pseudo VI that is created to represent a Call By Reference to another application instance on another machine), and attempting to do Find to jump to their components can cause problems because those VIs never expect to actually draw themselves. But other than that state change, I do not know of any edits. They may exist. The previous author is quite correct in saying that few developers really know the capacities of heap peek. It&#039;s a debugging tool, and it gets hacked up to display whatever anyone needs to display.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=876</id>
		<title>Insane Objects</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=876"/>
		<updated>2007-04-22T15:44:45Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Firstly, there is no need to necessarily report generically to [[NI]] that LabVIEW has insane objects, as they do know about insane objects. Secondly they are NOT merely bugs: insane objects can be generated as part of the LabVIEW verification process. If you get such a message, it is good to check the known bugs of LV at ni.com and if the particular insanity in your dialog is not listed, only then should you report the insanity to NI technical support.&lt;br /&gt;
&lt;br /&gt;
The insane object message is what LabVIEW puts in a dialog when one of the objects on the diagram does not meet its &amp;quot;checksum&amp;quot;. In other words, this object isn&#039;t in a state we expect it to be in. Most of the time these errors are not fatal -- we simply put the object in the state we do expect. But it raises questions about how the object got into that bad state and what might have been done with that object between the last time we checked and it was good and the time it became insane.&lt;br /&gt;
&lt;br /&gt;
The insane object messages are something we work on with each version of LV. But as it is a generic error message that can apply to anything from a simple cosmetic to the front panel itself, you&#039;ll still see them in any version of LV that has a bug -- a fact of life unfortunately for the foreseeable future. &lt;br /&gt;
&lt;br /&gt;
The cryptic nature of the message can be deciphered as follows:&lt;br /&gt;
Insane object at FPHP+4C in &amp;quot;name.vi&amp;quot;: {dsitem} 0x400: Panel (FPSC)&lt;br /&gt;
* FPHP -- this will be either FP or BD for &amp;quot;front panel heap&amp;quot; or &amp;quot;block diagram heap&amp;quot;&lt;br /&gt;
* 4C -- this is a hexadecimal number indicating which object.&lt;br /&gt;
* name.vi -- which VI had the insanity&lt;br /&gt;
* {dsitem} 0x400 -- really only meaningful if you know how our internals work; I&#039;ll skip it here&lt;br /&gt;
* Panel (FPSC) -- the type of object that has problems. The four letter codes are usually descriptive (COSM for a cosmetic or simple drawn part, SGNL for a signal aka wire)&lt;br /&gt;
&lt;br /&gt;
Most of the time, deleting the offending object and recreating it from scratch is sufficient to fix your VI and allow you to continue working.&lt;br /&gt;
&lt;br /&gt;
== Using Heap Peek ==&lt;br /&gt;
&lt;br /&gt;
The number &amp;quot;44&amp;quot; is described above as the number that tells you which object. Not exactly helpful to an end user. There is a way to find and delete an insane object. When you get an insane error, you will get a code that shows the object that is insane - write down that code and then:&lt;br /&gt;
&lt;br /&gt;
* Close LabVIEW&lt;br /&gt;
* Put the key &amp;quot;LVDebugKeys=True&amp;quot; in your LabVIEW configuration file &#039;&#039;(&#039;&#039;&#039;NOTE:&#039;&#039;&#039; On Mac and Linux, the config tokens are case sensitive. I *think* the correct capitalization is given here, but if it doesn&#039;t work, try some variations.)&#039;&#039;&lt;br /&gt;
* Open your VI&lt;br /&gt;
* In LV7.1 and earlier: press CTRL+SHIFT+D; In LV8.0 and later, press CTRL+SHIFT+D+H. On Mac, use the command key instead of CTRL.  This will open a window known to LV R&amp;amp;D as &amp;quot;heap peek&amp;quot; since it gives internal views into the front panel heap and the block diagram heap.&lt;br /&gt;
* The window is divided into 4 sections: top-left, top-right, middle, and base. The functionality of the various parts is obscure and mystical, so we&#039;re just going to focus on the bits that help with finding and deleting insane objects.&lt;br /&gt;
* Check the error message given about the insane object. It includes either the letters BDHP or FPHP. Scroll through the top-left list box until you find those 4 letters and the name of your VI. Left click to select that item. This will change what is displayed in the top-right section of the window.&lt;br /&gt;
* In the top-right section, find the line that begins with the number identifying the object. These are sorted numerically. Left click to select the object when you find it. &lt;br /&gt;
* In the middle region, there is a box with an F inside it. This is a button (heap peek doesn&#039;t use a lot of advanced drawing, so it doesn&#039;t really look like a button, but it is). Click on the F button to find the offending object.&lt;br /&gt;
* LabVIEW will switch to the block diagram or front panel and select some object. Whatever object it is, delete it. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Another author of the WIKI wrote this:&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Care must be taken with heap peek. It has the possibility to change states of objects and doing that without knowing EXACTLY (and I think only a few people in the LabVIEW developer team really do) what you are doing can completely mess up your VI or maybe even more.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
I do not think that heap peek has any ability to change the objects. It is display information only. There are VIs in LV that are not real VIs (for example, a pseudo VI that is created to represent a Call By Reference to another application instance on another machine), and attempting to do Find to jump to their components can cause problems because those VIs never expect to actually draw themselves. But other than that state change, I do not know of any edits. They may exist. The previous author is quite correct in saying that few developers really know the capacities of heap peek. It&#039;s a debugging tool, and it gets hacked up to display whatever anyone needs to display.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=875</id>
		<title>Insane Objects</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Insane_Objects&amp;diff=875"/>
		<updated>2007-04-22T15:38:07Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Using Heap Peek */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Firstly, there is no need to necessarily report this to [[NI]], as they do know about insane objects. Secondly they are NOT just bugs, insane objects can be generated as part of the LabVIEW verification process.&lt;br /&gt;
&lt;br /&gt;
The insane object message is what LabVIEW puts in a dialog when one of the objects on the diagram does not meet its &amp;quot;checksum&amp;quot;. In other words, this object isn&#039;t in a state we expect it to be in. Most of the time these errors are not fatal -- we simply put the object in the state we do expect. But it raises questions about how the object got into that bad state and what might have been done with that object between the last time we checked and it was good and the time it became insane.&lt;br /&gt;
&lt;br /&gt;
The insane object messages are something we work on with each version of LV. But as it is a generic error message that can apply to anything from a simple cosmetic to the front panel itself, you&#039;ll still see them in any version of LV that has a bug -- a fact of life unfortunately for the foreseeable future. If you get such a message, it is good to check the known bugs of LV at ni.com and if the particular insanity in your dialog is not listed, report the insanity to NI technical support.&lt;br /&gt;
&lt;br /&gt;
The cryptic nature of the message can be deciphered as follows:&lt;br /&gt;
Insane object at FPHP+44 in &amp;quot;name.vi&amp;quot;: {dsitem} 0x400: Panel (FPSC)&lt;br /&gt;
* FPHP -- this will be either FP or BD for &amp;quot;front panel heap&amp;quot; or &amp;quot;block diagram heap&amp;quot;&lt;br /&gt;
* 44 -- this is a number indicating which object&lt;br /&gt;
* name.vi -- which VI had the insanity&lt;br /&gt;
* {dsitem} 0x400 -- really only meaningful if you know how our internals work; I&#039;ll skip it here&lt;br /&gt;
* Panel (FPSC) -- the type of object that has problems. The four letter codes are usually descriptive (COSM for a cosmetic or simple drawn part, SGNL for a signal aka wire)&lt;br /&gt;
&lt;br /&gt;
Most of the time, deleting the offending object and recreating it from scratch is sufficient to fix your VI and allow you to continue working.&lt;br /&gt;
&lt;br /&gt;
== Using Heap Peek ==&lt;br /&gt;
&lt;br /&gt;
The number &amp;quot;44&amp;quot; is described above as the number that tells you which object. Not exactly helpful to an end user. There is a way to find and delete an insane object. When you get an insane error, you will get a code that shows the object that is insane - write down that code and then:&lt;br /&gt;
&lt;br /&gt;
* Close LabVIEW&lt;br /&gt;
* Put the key &amp;quot;LVDebugKeys=True&amp;quot; in your LabVIEW configuration file &#039;&#039;(&#039;&#039;&#039;NOTE:&#039;&#039;&#039; On Mac and Linux, the config tokens are case sensitive. I *think* the correct capitalization is given here, but if it doesn&#039;t work, try some variations.)&#039;&#039;&lt;br /&gt;
* Open your VI&lt;br /&gt;
* In LV7.1 and earlier: press CTRL+SHIFT+D; In LV8.0 and later, press CTRL+SHIFT+D+H. On Mac, use the command key instead of CTRL.  This will open a window known to LV R&amp;amp;D as &amp;quot;heap peek&amp;quot; since it gives internal views into the front panel heap and the block diagram heap.&lt;br /&gt;
* The window is divided into 4 sections: top-left, top-right, middle, and base. The functionality of the various parts is obscure and mystical, so we&#039;re just going to focus on the bits that help with finding and deleting insane objects.&lt;br /&gt;
* Check the error message given about the insane object. It includes either the letters BDHP or FPHP. Scroll through the top-left list box until you find those 4 letters and the name of your VI. Left click to select that item. This will change what is displayed in the top-right section of the window.&lt;br /&gt;
* In the top-right section, find the line that begins with the number identifying the object. These are sorted numerically. Left click to select the object when you find it. &lt;br /&gt;
* In the middle region, there is a box with an F inside it. This is a button (heap peek doesn&#039;t use a lot of advanced drawing, so it doesn&#039;t really look like a button, but it is). Click on the F button to find the offending object.&lt;br /&gt;
* LabVIEW will switch to the block diagram or front panel and select some object. Whatever object it is, delete it. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Another author of the WIKI wrote this:&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Care must be taken with heap peek. It has the possibility to change states of objects and doing that without knowing EXACTLY (and I think only a few people in the LabVIEW developer team really do) what you are doing can completely mess up your VI or maybe even more.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
I do not think that heap peek has any ability to change the objects. It is display information only. There are VIs in LV that are not real VIs (for example, a pseudo VI that is created to represent a Call By Reference to another application instance on another machine), and attempting to do Find to jump to their components can cause problems because those VIs never expect to actually draw themselves. But other than that state change, I do not know of any edits. They may exist. The previous author is quite correct in saying that few developers really know the capacities of heap peek. It&#039;s a debugging tool, and it gets hacked up to display whatever anyone needs to display.&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=837</id>
		<title>Graphical Object-Oriented Programming</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=837"/>
		<updated>2007-04-13T13:25:27Z</updated>

		<summary type="html">&lt;p&gt;Smercer: /* Pages Here: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Portal for GOOP and LabVOOP. &lt;br /&gt;
&lt;br /&gt;
GOOP stands for &amp;quot;Graphical Object-Oriented Programming.&amp;quot;&lt;br /&gt;
LabVOOP stands for &amp;quot;LabVIEW Object-Oriented Programming.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GOOP is a term used to refer to the various GOOP toolkits from Endevo/NI, SciWare and OpenG. These toolkits were written in G.&lt;br /&gt;
&lt;br /&gt;
LabVOOP refers to the native LabVIEW classes that first appeared in LV8.2. &lt;br /&gt;
&lt;br /&gt;
The toolkits were not obsoleted by the native implementation. All of the toolkits use a reference model for passing objects on the block diagram, similar to File refnums or Queue refnums in LabVIEW. The native classes pass by value, similar to clusters and arrays. The two mechanisms are complementary, not exclusionary, and there may be times when both approaches are used in the same LV program. &lt;br /&gt;
&lt;br /&gt;
====Pages Here:====&lt;br /&gt;
*[[GOOP - Graphical Object Oriented Programming]]&lt;br /&gt;
*[[History of GOOP]]&lt;br /&gt;
*[[LVOOP|LabVOOP - LabVIEW Object-Oriented Programming (aka LVOOP)]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=836</id>
		<title>Graphical Object-Oriented Programming</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=836"/>
		<updated>2007-04-13T13:25:10Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Portal for GOOP and LabVOOP. &lt;br /&gt;
&lt;br /&gt;
GOOP stands for &amp;quot;Graphical Object-Oriented Programming.&amp;quot;&lt;br /&gt;
LabVOOP stands for &amp;quot;LabVIEW Object-Oriented Programming.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GOOP is a term used to refer to the various GOOP toolkits from Endevo/NI, SciWare and OpenG. These toolkits were written in G.&lt;br /&gt;
&lt;br /&gt;
LabVOOP refers to the native LabVIEW classes that first appeared in LV8.2. &lt;br /&gt;
&lt;br /&gt;
The toolkits were not obsoleted by the native implementation. All of the toolkits use a reference model for passing objects on the block diagram, similar to File refnums or Queue refnums in LabVIEW. The native classes pass by value, similar to clusters and arrays. The two mechanisms are complementary, not exclusionary, and there may be times when both approaches are used in the same LV program. &lt;br /&gt;
&lt;br /&gt;
====Pages Here:====&lt;br /&gt;
*[[GOOP - Graphical Object Oriented Programming]]&lt;br /&gt;
*[[History of GOOP]]&lt;br /&gt;
*[[LVOOP|[LabVOOP - LabVIEW Object-Oriented Programming (aka LVOOP)]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=835</id>
		<title>Graphical Object-Oriented Programming</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=835"/>
		<updated>2007-04-13T13:22:17Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Portal for GOOP and LabVOOP. &lt;br /&gt;
&lt;br /&gt;
GOOP stands for &amp;quot;Graphical Object-Oriented Programming.&amp;quot;&lt;br /&gt;
LabVOOP stands for &amp;quot;LabVIEW Object-Oriented Programming.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GOOP is a term used to refer to the various GOOP toolkits from Endevo/NI, SciWare and OpenG. These toolkits were written in G.&lt;br /&gt;
&lt;br /&gt;
LabVOOP refers to the native LabVIEW classes that first appeared in LV8.2. &lt;br /&gt;
&lt;br /&gt;
The toolkits were not obsoleted by the native implementation. All of the toolkits use a reference model for passing objects on the block diagram, similar to File refnums or Queue refnums in LabVIEW. The native classes pass by value, similar to clusters and arrays. The two mechanisms are complementary, not exclusionary, and there may be times when both approaches are used in the same LV program. &lt;br /&gt;
&lt;br /&gt;
====Pages Here:====&lt;br /&gt;
*[[GOOP - Graphical Object Oriented Programming]]&lt;br /&gt;
*[[History of GOOP]]&lt;br /&gt;
*[[LVOOP]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=834</id>
		<title>Graphical Object-Oriented Programming</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=834"/>
		<updated>2007-04-13T13:22:00Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Portal for GOOP and LabVOOP. &lt;br /&gt;
&lt;br /&gt;
GOOP stands for &amp;quot;Graphical Object-Oriented Programming.&amp;quot;&lt;br /&gt;
LabVOOP stands for &amp;quot;LabVIEW Object-Oriented Programming.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GOOP is a term used to refer to the various GOOP toolkits from Endevo/NI, SciWare and OpenG. These toolkits were written in G.&lt;br /&gt;
&lt;br /&gt;
LabVOOP refers to the native LabVIEW classes that first appeared in LV8.2. &lt;br /&gt;
&lt;br /&gt;
The toolkits were not obsoleted by the native implementation. All of the toolkits use a reference model for passing objects on the block diagram, similar to File refnums or Queue refnums in LabVIEW. The native classes pass by value, similar to clusters and arrays. The two mechanisms are complementary, not exclusionary, and there may be times when both approaches are used in the same LV program. &lt;br /&gt;
&lt;br /&gt;
====Pages Here:====&lt;br /&gt;
*[[GOOP - Graphical Object Oriented Programming]]&lt;br /&gt;
*[[History of GOOP]]&lt;br /&gt;
*[LVOOP]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=833</id>
		<title>Graphical Object-Oriented Programming</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=833"/>
		<updated>2007-04-13T13:19:18Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Add summary of GOOP vs LabVOOP&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Portal for GOOP and LabVOOP. &lt;br /&gt;
&lt;br /&gt;
GOOP stands for &amp;quot;Graphical Object-Oriented Programming.&amp;quot;&lt;br /&gt;
LabVOOP stands for &amp;quot;LabVIEW Object-Oriented Programming.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
GOOP is a term used to refer to the various GOOP toolkits from Endevo/NI, SciWare and OpenG. These toolkits were written in G.&lt;br /&gt;
&lt;br /&gt;
LabVOOP refers to the native LabVIEW classes that first appeared in LV8.2. &lt;br /&gt;
&lt;br /&gt;
The toolkits were not obsoleted by the native implementation. All of the toolkits use a reference model for passing objects on the block diagram, similar to File refnums or Queue refnums in LabVIEW. The native classes pass by value, similar to clusters and arrays. The two mechanisms are complementary, not exclusionary, and there may be times when both approaches are used in the same LV program. &lt;br /&gt;
&lt;br /&gt;
====Pages Here:====&lt;br /&gt;
*[[GOOP - Graphical Object Oriented Programming]]&lt;br /&gt;
*[[History of GOOP]]&lt;br /&gt;
*[[LabVOOP - LabVIEW Object-Oriented Programming (aka LVOOP)]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=832</id>
		<title>Graphical Object-Oriented Programming</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Graphical_Object-Oriented_Programming&amp;diff=832"/>
		<updated>2007-04-13T13:14:21Z</updated>

		<summary type="html">&lt;p&gt;Smercer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is the Portal for GOOP. GOOP stands for Graphical Object Oriented Programming.&lt;br /&gt;
&lt;br /&gt;
====Pages Here:====&lt;br /&gt;
*[[GOOP - Graphical Object Oriented Programming]]&lt;br /&gt;
*[[History of GOOP]]&lt;br /&gt;
*[[LVOOP - LabVIEW Object-Oriented Programming (aka LabVOOP)]]&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Home&amp;diff=831</id>
		<title>Home</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Home&amp;diff=831"/>
		<updated>2007-04-13T13:13:36Z</updated>

		<summary type="html">&lt;p&gt;Smercer: Change title &amp;quot;GOOP&amp;quot; to &amp;quot;GOOP and LabVOOP&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;text-align:center;font-size:200%;border:none;margin: 0;padding:.5em;color:#000&amp;quot;&amp;gt;Welcome to the LabVIEW&amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;&amp;lt;small&amp;gt;&amp;lt;small&amp;gt;TM&amp;lt;/small&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; Wiki&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;font-size: 95%&amp;quot;&amp;gt;The free [[LabVIEW]] information resource that anyone can edit.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;font-size: 95%&amp;quot;&amp;gt;Hosted by [[LAVA]] (LabVIEW Advanced Virtual Architects).&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div id=&amp;quot;articlecount&amp;quot; style=&amp;quot;width:100%;text-align:center;font-size:85%;&amp;quot;&amp;gt;We have [[Special:Statistics|{{NUMBEROFARTICLES}}]] articles&amp;lt;/div&amp;gt;&lt;br /&gt;
{|&amp;lt;!-- Portals Follow --&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
*[[Portal:XNodes|XNodes]]&lt;br /&gt;
*[[Portal:LabVIEW FAQ|LabVIEW FAQ]]&lt;br /&gt;
*[[Portal:Development Environment|Development Environment]]&lt;br /&gt;
*[[Portal:Code Distribution|Code Distribution]]&lt;br /&gt;
*[[Portal:GOOP|GOOP and LabVOOP]]&lt;br /&gt;
||&lt;br /&gt;
*[[Portal:Application Design &amp;amp; Architecture|Application Design &amp;amp; Architecture]]&lt;br /&gt;
*[[Portal:External Code|External Code]]&lt;br /&gt;
*[[Portal:Database|Database]]&lt;br /&gt;
*[[Portal:User Interface|User Interface]]&lt;br /&gt;
||&lt;br /&gt;
*[[Portal:Internet|Internet]]&lt;br /&gt;
*[[Portal:Getting Started|Getting Started]]&lt;br /&gt;
*[[Portal:Hardware|Hardware]]&lt;br /&gt;
*[[Other Pages]]&lt;br /&gt;
|}&amp;lt;!-- End Portals --&amp;gt;&lt;br /&gt;
{|style=&amp;quot;border-spacing:8px;width:100%;padding-left: 0px&amp;quot;&lt;br /&gt;
|class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;width:30%;border:1px solid #cef2e0;background-color:#f5fffa;vertical-align:top;color:#000&amp;quot;|&lt;br /&gt;
{|width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; style=&amp;quot;vertical-align:top;background-color:#f5fffa&amp;quot;&lt;br /&gt;
! &amp;lt;h2 style=&amp;quot;margin:0;background-color:#cef2e0;font-size:120%;font-weight:bold;border:1px solid #a3bfb1;text-align:left;color:#000;padding:0.2em 0.4em;&amp;quot;&amp;gt;Navigation&amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;color:#000&amp;quot;|{{Main Page/Navigation Box}}&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;h2 style=&amp;quot;margin:0;background:#cef2e0;font-size:120%;font-weight:bold;border:1px solid #a3bfb1;text-align:left;color:#000;padding:0.2em 0.4em;&amp;quot;&amp;gt;Wiki Editing&amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;color:#000&amp;quot;|{{Main Page/Wiki Editing}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;!-- Start of right-column --&amp;gt;&lt;br /&gt;
|class=&amp;quot;MainPageBG&amp;quot; style=&amp;quot;width:100%;border:1px solid #cedff2;background-color:#f5faff;vertical-align:top&amp;quot;|&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; style=&amp;quot;vertical-align:top;background-color:#f5faff&amp;quot;&lt;br /&gt;
! &amp;lt;h2 style=&amp;quot;margin:0;background-color:#cedff2;font-size:120%;font-weight:bold;border:1px solid #a3b0bf;text-align:left;color:#000;padding:0.2em 0.4em;&amp;quot;&amp;gt;Featured Articles&amp;lt;/h2&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;color:#000&amp;quot;|{{Main Page/Featured Articles}}&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;h2 style=&amp;quot;margin:0;background:#cedff2;font-size:120%;font-weight:bold;border:1px solid #a3b0bf;text-align:left;color:#000;padding:0.2em 0.4em;&amp;quot;&amp;gt;News &amp;amp; Work in Progress&amp;lt;/h2&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;color:#000&amp;quot;|{{Main Page/Work in Progress}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== LabVIEW Wiki Sister Sites ==&lt;br /&gt;
*&#039;&#039;&#039;[http://forums.lavag.org LAVA Forums]&#039;&#039;&#039;: Independent, community forums where veteran LabVIEW users and NI employees congregate and discuss medium to advanced LabVIEW programming techniques.&lt;br /&gt;
*&#039;&#039;&#039;[http://forums.lavag.org/downloads.html LAVA Code Repository]&#039;&#039;&#039;: A collection of peer reviewed LabVIEW code submitted by the LAVA members and organized by category.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__  __NOEDITSECTION__&lt;/div&gt;</summary>
		<author><name>Smercer</name></author>
	</entry>
</feed>