LabVIEW Idea Exchange

Community Browser
Top Authors
cancel
Showing results for 
Search instead for 
Did you mean: 
Post an idea

It's all in the title, we use Vision Builder a lot and we have a lot of feedback to give and I'm sure many other people can bring ideas as well.

According to this document only 14 ideas from the idea exchange were implemented in LabView 2010.This is a fantastic start.

 

There are at least 100 more great ideas on the Idea Exchange that should be implemented in the next version of LabView. Keep listening to the users. Keep improving LabView in every way.

 

Smiley Happy

Will be good when running an application in debug, keep other LabView project enable and editable, so I can continuous to work under other project waiting the debug stop at break point

Hi,

 

I would like a native LabView VI that can read comma delimited data (.csv) with double quotes into LabView. It needs to follow all the rules for csv files. A list can be seen here.. http://en.wikipedia.org/wiki/Comma-separated_values

 

And, NO the spreadsheet string to array function doesn't work.. There can be commas that are not separators, and line feed is not always equal to a new rows in the output array. (There can be line feeds inside cells..)

 

I tried to implement by using regular expressions and it seemed to work fine, BUT it was way too slow, making it useless. The implementation for regular expressions in LabView seems very slow, or maybe I used it the wrong way.

 

Thanks,

mrsound

I don't know if this idea belongs in the "LabVIEW" Ideas Exchange necessarily, but this idea is something that would really make a big difference to my LabVIEW development, so I offer it anyway: "Parallelise the FPGA Compiler to take advantage of modern multi-core computing power".

 

The FPGA compiler takes approximately four hours to compile my large FPGA VIs, which makes for long and tiresome debugging processes. It's clear that the compiler uses only one core of my CPU when compiling. If the compiler could be written to take advantage of the many cores of today's multi-core computers, it could potentially reduce my compilation times to an eighth! (Where I work we have an eight-core number crunching server ideal for just this task, and I'm sure we'll get even greater core counts in the near future - thinking GPU here).

 

I know the compiler is probably the intellectual property and responsibility of Xilinx Corp, and not National Instruments, but I expect NI can give them a big push if we all asked nicely for it!

 

Thoric

Its better to disable the functionality of the function keys while a code is running.

 

One incident i came accross is:

     I assigned ESC key for a control and while running the code i wrongly pressed F1 (Which is not assigned to any control) suddenly the Help file started opening and my whole code got hangged. I dont think that some one will need open the help file during code running So its better to disable the original functionality of the function keys just during the code is running.

 

Smiley Wink

After deciding to post an idea for a "parallel" structure, a search revealed the idea for a Parallel Execution Structure has already been proposed by gvholland here

I gave my kudos to this idea because I believe it would be very useful.  In order to make a parallel structure even more useful, I propose adding some features that would make it more convenient for those of us who might use it in code that must execute in parallel for performance and functional reasons.  It has been commented on the other thread that parallel code should be placed in subVI's, and I concur with this view.  However, there are instances where this is either inconvenient or impracticable.  Consider the following example:

 

An application needing to perform simultaneous PID control on 32 channels must execute in parallel (only 8 channels shown for clarity):

 

23998iF3A3D6145B22A221

 

Now quadruple the number channels in this scheme, and you can have a pretty big diagram with lots of wires.  Also consider the routine task of initializing that “clustosaurus”  or “classosaurus” as in this example:

 

24000iDFC8181255144D80

 

We've all probably tried the scheme wherein we put a case structure inside a FOR loop and wired the iteration terminal to the case selector, as in these examples:

 

24002i0E33EE6CA3D6316A

 

24004iB398DF500188AD49

 

That's clean and easy, and allows the user to create instances of the reentrant VI by duplicating cases.  But that architecture forces the vi's or code to execute sequentially.  The new parallel FOR loop can boost performance of these techniques, and create parallelism.  But I would like a basic parallel structure that cleanly handles some routine tasks by adding some useful I/O nodes, ala the InPlace Element Structure.

 

I propose the following structure, or something similar:

 

24006iEFA2DE50585DBE3A

 

This structure is drawn here with some proposed I/O nodes and tunnels.  This is by no means the complete set of I/O that might exist, but rather a starting point.

 

Cluster unbundle/bundle node:

 

 24008iB135E86434F20934

 

This node accepts only “brown” clusters, or clusters of Booleans.  The elements are passed to each frame in corresponding index order, element 0 to frame 0, and so on.  Once added to the structure, a single unbundle/bundle terminal pair appears in each frame. Much like a bundle function that has its center terminal wired, the bundle terminals may be left unwired.  The values of unwired elements remain unchanged.  Any cluster wired to this node must have the same number of elements as the parallel structure has frames.  If not, the wire is broken.

 

Array index/replace node:

 

24010i570ABF83C7044CDA

 

This node auto indexes an incoming array and provides a replace array element node on the right.  Note there is no index value IO as with the IPE, since the parallel structure auto indexes the array and distributes/replaces the elements across the frames.  If an array has less elements than the number frames at run time, the node returns default data for the undefined elements, exactly as an index array function does, but the structure returns a warning or error (I can’t decide which).  The output array would always have the same number of elements as the structure has frames, or the same number of input (can't decide which) .  The replace element node on the right must be wired in every frame, just as a replace array element structure must have all of its exposed elements wired.

 

Cluster unbundle/bundle by name node:

 

24012i2C2666661000FEB0

 

24014i1D92D4684B152FC9

 

This node is tricky, but I decided to take a stab at it anyway.  The node is created and visible on both sides of the structure.  However, unlike the IPE, the unbundle/bundle terminals on either side can be of different sizes and element selections, and can optionally be unused on either side, or both sides, within the individual frames.  Unused terminals appear with the same symbol as the center terminal of a bundle function, as shown in the proposal drawing.  If an element is selected for bundling within a frame, then it is unavailable for bundling in all other frames.

 

Indexing and non-indexing tunnels:

 

24016i58EE71B2884A8F01

 

Non-indexing tunnels function somewhat like they do on a sequence structure.  Input tunnels provide data to all frames, non-indexing output tunnels may only be wired in one frame.  Unlike sequences, however, the data arriving at output tunnels would be free to flow out of the structure immediately, which will seem weird, and violates the "whole structure must complete" convention.  But remember, this is a parallel structure.  Like sparks shooting off the bolts in the monster's neck while it's alive, it's gonna be be weird by default.

 

Indexing tunnels are different.  Like the auto-indexing node, auto-indexing input tunnels distribute the array elements across the frames.  If the array size is smaller than the number of frames, the frames either execute with default data, or the undefined frames don’t execute, and the structure returns an error or warning (help me define this).  Auto-indexing output tunnels behave like output tunnels from case structures; either all frames must be wired, or the tunnel must be configured to use default data if unwired.  Unlike the non-indexing output tunnel, data from this tunnel is not available until all frames have completed execution.

 

Error I/O Nodes:

 

24018iB1B7660563C17E73

 

There are error inputs/outputs for the structure as a whole, and for each individual frame.  The structure error IO is situated in the lower left and right corners, naturally.  The frame input and output terminals can both be optionally hidden or exposed in each frame, and also slide independently of each other up and down the left and right sides of each frame in which they are exposed.  The structure distributes the incoming error among the exposed frame error input terminals, and merges the frame output error values to the structure output terminal, along with any messages generated by the structure itself.

 

So what do you do with this “Frankenstructure”?  Well, here are a couple of the aforementioned examples rewired using this hypothetical beast:

 

24020iFA3810D047850DB3    24024i4CB073DB117956CF

 

 

Of course there could be other cool things, like a CPU core selector for the frames, etc.  Just let your imagination, (or nightmare, depending on how you see it) run wild!

Many Windows application are automatically capturing crash report information and emailing that data back to the manufacturer once the User has given their permission. This results in alot of detailed information being captured and sent to the manufactuer with very little effort by the User. National Instruments should do the same thing. Bugs that have eisted in LV for many years need to be fixed in short order, NI needs information to do that.

The Application refnum method "All VIs In Memory" returns a list of VIs. This list includes the instance VIs created by Express VI nodes. This list includes private data controls of classes. It does not include the clones of reentrant VIs.

 

It would be nice to either add some parameters to this method or add some new methods to get some different behaviors, including:

 

"VIs In Memory That Actually Exist On Disk" -- would not include instance VIs or private data controls

"Really All VIs In Memory" -- would include the reentrant clones

 

These are the two I most commonly wish we had. There may be other commonly used variations that would be worth including.

LabVIEW continues to evolve into a more optimized programming language through many under-the-hood compile optimizations, and LabVIEW 2010 brings the compilation improvements to a new level. However, these optimizations currently happen every time the user saves a VI or perfoms an undo. In the past, this would only take <1 second, but with LabVIEW 2010 there are several scenarios where each save of the same VI now takes 7 seconds, with reports of other VIs taking 15, 30 seconds or more.

 

 

SUGGESTION: Postpone compile optimizations until the user presses RUN, performs a build, or similar operation.

 

RATIONALE: Compiler optimzations are not necessary during edit time where a programmer is just saving their wiring progress, and anyway multiple edits can change the prior optimizations. The optimization of code is only necessary when the user is ready to run the VI in some fashion (in LabVIEW, in a build, etc.). At that time, the user is certainly happy to wait for the improved run-time performance.

 

 

Many of my projects are video inspections with the captured images streamed to an .avi file.  With increase use of digital cameras with non-standard frames/sec (fps) or position-based image captures where the fps rate is determined in the field, the fps often cannot be set properly before the images stream is captured.  Unfortunately, the fps value can only be set when the original .avi file is created (IMAQ AVI Create) and cannot be changed once set.  There are utilities that can change the fps of a .avi file but so far I have not found easily callable exterior routine to perform the change

 

My simple suggestion is to either allow the fps to be set when the file is closed (IMAQ AVI Close) or better yet create a vi that would allow to change fps value for an existing .avi file

The current version of Trim Whitespace.vi uses regular expressions that are quite slow, but not needed since only simple search and a substring function is desired.

Therefore, I suggest to throw out the regex functions and replace them with G code looking for the same whitespaces (or even extend the selection to the openG variant).

I use the presented version within all my string processing functions, but many shipped VIs (especially the NI_LVConfig.lvlib) uses the trimming functions a lot. Since I do a lot of config files, this starts to be the bottleneck of the total LV code.

 

23008iC728CE59C53E9B3C

 

left-trim sub-VI:

23006iC444DD465E2506D4

 

right-trim sub-VI:

23010i7E67AC14F8028ECC

 

Performance metrics suggest speedup of about a factor of 15 for short strings and even more (>35) for longer strings.

I would to suggest that when we are making large programs, i think scrolling left,right up and down is not enough.

 

 

I suggest Acrobat Reader Handtool, so that we can move the page whereever we want, not only left,right,up and down.

Will be nice if we can edit a value if we have a breakpoint and a probe on it. Just put the probe as a control instead a indicator.

22929iC36897841F770E31

 

In case we want to test special condition

An Event Structure Current Frame Indicator would allow easy troubleshooting and/or feedback, especially useful when frames are accessed by dynamic events.

 

22885i30385A9CE7D88CEA

Currently, there is no access to the User Event references in the Dynamic Events Registry reference.  If you have a lot of user events, you either have to bundle the references together into a cluster, or have many wires through the program.  My proposal is to add a "Registered User Events" node that allows the programmer to "unbundle" the registered user events references.

 

Also, the Register for Events node should change the User Event label to the user event name when a user event is wired to it.  Finally, there should be some mechanism to access/control the event queue programmatically, perhaps an "invoke node" coupled with the ability to create a reference to an event structure.  This invoke node would allow the user to flush the event queue, or perform other operations on it, etc.

Download All

While the intrinsic Math functions all support EXT, DBL and SGL, few of the remaining Math (or Signal Processing etc) functions support anything except DBL.  For many cases, using SGLs is sufficiently accurate, while using less memory and often being faster to compute.  While some functions are implemented solely in G (and therefore it is easy to create an SGL copy, though not so easy to integrate in a "polymorphic" way into the existing menus), most functions call a DLL routine.

 

I suggest that SGL (and CSG where appropriate) be supported for all Mathematics functions, including Signal Processing, and the Advanced Signal Processing Toolkit.  Is there anyone else who would make use of these if available?

 

Note: two "addons" have been released by NI which begin to address this.

 

Single-Precision Basic Linear Algebra Subroutines (BLAS)

Currently I'm busy with GOOP and I came across the following problem. 

 

I have a validator class. The purpose of this class is to validate data. The validator class as a number of childrens...

 

Validate IP address

Validate string length

Validate inRange number

Validate Alpha

 

The main, validator, class has a function called "valid?" This function has 3 inputs and 3 outputs

 

Inputs:

- Object

- The data that must be validated

- Error

 

Output:

- Object

- Valid?

- Error

 

The children classes must inherit this function and overwrite it. Now the problem is is that each of the above validators have a different datatype which must be validated....

 

Validate IP address has a string as input

Validate string length has a string as input

Validate inRange number has a number as input

Validate Alpha has a string as input

 

Now you might see the problem. To get the children to inherit the function from the main, validator, class the connector pane must be the same as of the datatypes... This means that I have to choose in my main function to use a string or a number as input... This is something that I don't want... I want to be able to select a datatype called "yet unknown datatype" in my main "valid?" function in the main, validator, class. So that I can use any datatype input in my children that is suitable for that implementation. 

 

 

My idea is thus to create a new kind of datatype which sort of represents "any kind of datatype known to labview" which can be used in functions of a main class that are inherited by its children, which are all using a different input datatype.

 

ps. Now you could maybe suggest why not use a variant datatype? Yes this is possible but the problem is;

- I would have to cast the data back

- It isn't very neat programming, the variant solution is in my opinion more a kind of hack to make the code work.

 

pss. Yes but if you would do this... then...

- Yes there are proberbly a few more work arounds thinkable, such as creating two "Valid" VI's one inherited (Valid?), one unique of the child (_Valid?), but these are in my opinion still workarounds and do not really provide the functionality that is needed. Which is pretty common in OOP languages.

 

psss. if anyone knows a better title for this described idea let me know it! 

It would be helpful to have an array control property that fixed the number of elements in the array control to the specified size.  This would allow the developer to programmatically set the array control dimensions such that the user is unable to add new elements to the array.  This is specifically necessary when the number of elements in the array control may vary and may also be too large to display all of the elements.  If the scrollbar(s) are visible, then the user will always be able to add a new element add the bottom by editing the available empty element value.  This is undesireable if the developer wants to prevent the addition of new elements by the user.

   

Please see the discussion forum post below for the details of the issue and current workaround.

http://forums.ni.com/t5/LabVIEW/initialize-array-control-dimension/m-p/1221930#M520867

 

 

Thanks
Dan

The For Loop is one of the most widely used tools in Labview.  However, it has a drawback.  The step size and starting point is fixed and cannot be changed.  Most of the times this is OK.  But there comes a time when being able to change the starting index and/or the step size would become very useful.  Consider the following scenario:

 

You have a test results file as such:

Test1   UUT1   3.4

Test2   UUT1   4.5

Test3   UUT1   5.4

Test1   UUT2   3.0

Test2   UUT2   4.1

Test3   UUT2   5.2

Lets say you wish to extract all the info for Test2 only.

 

With a conventional For Loop, you would have to create special code to form the index.  You could do it with a While Loop:

 

21880i44C0BE7C265E7F7F  21884i11AA5440B1FB2F3A

 

 

Or you could have an option to specify the start, stop, and step parameters:

 

21886i75DF07FB2B0F1B67

 

This could be made possible as a right click option.  The default would be for the For loop to appear and function as it is now.  But if you right click on the border, you would get an option to display and use the extra terminals, as shown below.  This is similar to what is being done with the Conditional terminal.

 

21888iA08C0E5DE4D1CEFA

 

With this option, the three values would be supplied.  The i terminal value would follow the parameters.  With a start value of 1 and a step size of 2 and a stop value of 10, the i for each iteration would be 1,3,5,7,9.

This would also apply to auto indexing when this option is chosen.  In the above test result example. the code could be made even simpler by enabling indexing:

 

21890i2F764D51ADB4B1DF

 

If the start were set to 1, step to 3, and stop to 5 (or the length of the array - 1), the output would be rows 1 and 4.  No extra code needed.

 

I think this idea has great merits.  It allows use for special cases, and it allows the normal For Loop to be continued as it is today, making it backward compatible.