LabVIEW Idea Exchange

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

3 states.PNG

There are lot of posts in the forum regarding the design of a boolean control with 3 states "On", "Off", "Default". This is very useful when during some tests the LED should initially be in one color say "black", if test passes, it should display "green" color and if test fails, it should display "red" color. If this comes as a special LED in the front panel, this will prevent extra coding.

 

 

Currently there is a method for setting the control value of another VI via the Control Value Set Method. But there is no set with signaling method which allows control of VI's which react to changes on front panel controls. This makes it hard to automate VI's that are using front panel control events. There is a tedious work around to get references to control on the front panel and then use value signaling method . It would be very useful to just have one additonal method that does the signaling in additon to setting the value of the control.

 

 

When using strict typedefs, the automatic inclusion of the typedef in teh actual datatype of a control (and the asociated data passing down the wire) leads to some annoying corner cases.

 

Imagine a FP with several different strict typedef Booleans (we re-designed and standardised our entire UI recently).  If you try to group value change events for these in a single event structure pane then the datatype changes to Variant.... Huh?  Because the typedef is a part of the datatype (allowing downstream wires to "create Indicator" or "create Control" with teh correct representation) the IDE realises different wire datatypes and moves to a more generic type (variant).

 

 

Separation of Control and Data.png

 

In this example I don't care that the boolean wire originated from a strict typedef, it's purely for cosmetic reasons.  I would ideally like to be able to have a strict representation of the control (which will auto-update if the typedef is modified) with a standard datatype (non-strict wire).

When working on a front panel you can drop a typeless array and add or remove data types from it.  If the array isn't typed, the vi won't compile.  (Broken run arrow.)

 

I'd like to see this behavior extended to other constructs that contain type information:  queues, notifiers, user events, and DVRs come to mind immediately but there may be others.  For me the lack of this ability is most noticable when I'm creating new classes.  I'll be trying to set up the class definition (.ctl) but if it contains any of those data types I have to open a block diagram, drop the create prim, and create a control on the output terminal.  It's inconvenient to have to do this with any vi, but moreso with ctl files since they don't have a block diagram associated with them.

 

The property node will be executed in top to bottom sequence. Changing the sequence of the property node is difficult now. In the example shown, reordering from Available sequence to expected sequence will more steps.
Proposed Idea: There should be an option of reordering the sequence on the right click menu of property node as we have in case structure (rearrange cases) 

 

The property node will be executed in top to bottom sequence. Changing the sequence of the property node is difficult now. In the example shown, reordering from Available sequence to expected sequence will more steps.

 

24278i34BF0287468F2376

 

 

 


Proposed Idea: There should be an option of reordering the sequence on the right click menu of property node as we have in case structure (rearrange cases) 

 

Attached the images also.

Currently, LabVIEW uses standard Windows "last path" mechanism to create the default persistent path when loading or saving files.

 

I would like to have this be made more user friendly, by having file specific persistent paths remembered by LabVIEW.  For example, individual persistent paths for Projects, VI's, Controls, etc.  This saves time navigating the file hiearchy when the file type has changed. 

 

Yes Windows has a Recent Documents folder in the file dialog, but it often is sluggish loading.  In one application that we write, we have six different persistent paths to make life easier for the end user.

 

Carsten Thomsen

Working with XML is fairly common and an addition to the palette to replace a specific node value would be helpful. Besides, there's lots of space there yet.

 

This link saved time. Thank you to juliodia

for posting this.

 

https://forums.ni.com/t5/LabVIEW/XML-Update-Element-Text/td-p/1239026?profile.language=en&lang=en

Since I got the proverbial hook on the pervious progress terminal for a FOR loop, I thought I would take another stab at it.  Should the N Terminal be sliding along the front border of the structure?  And even though it fell flat, I still like my progress terminal, albeit with a more appropriate symbol.

 

23162iD83AF4B6706A414B

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.

VI snippets are useful but often hard to deal with. Sometimes you can drag one directly from a website into LabVIEW and have it just work. Other times you have to download it, open File Explorer to it and drag the file into LabVIEW.

 

Many times dragging directly from a website doesn't work and results in a comment with a link to the VI snippet. Instead LabVIEW should try to go to the link, download it and insert it as a VI snippet. There are some cases when this will not work (for example the user needs to sign into the website) but LabVIEW should at least try the link. It is possible a link will be provided to LabVIEW that is not a VI snippet in which case LabVIEW should recognize that and just treat it as a normal link.

 

I'm not sure but there may be cases when a PNG image is dragged or pasted onto the block diagram. Is there a possibility for LabVIEW to check if it is a VI snippet and treat it as such?

This Idea was spawned from my quest for the über-migration experience when upconverting previous versions of enum data to the most recent version - in other words, providing backwards compatibility for data sources (networked clients/servers, databases, files...) that use a previous version of an enum. 

 


 

When you flatten an enum, the result is the only the numeric value of the name-value pair. Once flattened, an enum is indistinguishable from a vanilla numeric, containing no additional information:

 

22751iAAC1E6C59DDD7753            22747i41FF880474AA8369

(Yes, the snippet works in 2010, even with the cameo, but it's slow because the "Favorite Scrabble Word" enum has 47k+ items)

 

Looking at the flattened value, the first 4 bytes (00000001) represent the value of the I32, the next two represent the 6809th enum element (1A99), the next two represent the decimal year in hex (0797), and the final two bytes represent the birth month enum index and day of month respectively. That's all the bytes there is - 20 hex nibbles of flattened data to describe the value.

 

Storing this data structure as-is will be problematic if the type definition of the Scrabble Club Member ever changes. Fortunately, a typedef can be converted into a class, and the class definition will natively retain data structure mutation history, meaning flattened object data can be upconverted from previous versions. Cool!

 

22755i48F4D7119EE88C29

 

Above, we can see that if the data structure is converted to a class, the red-underlined represents byte-for-byte the same information as the flattened cluster, but with flattened classes there are additional goodies buried in the data, such as the version of the data underlined in blue.

 

From Preserving Class Data:

 

"LabVIEW, as a graphical programming environment, has an advantage over other programming languages. When you edit the class, LabVIEW records the edits that you make. LabVIEW is context aware as you change inheritance, rename classes, and modify private data clusters. This allows LabVIEW to create the mutation routine for you. LabVIEW records the version number of the data as part of the flattened data, so that when LabVIEW unflattens the data, LabVIEW knows how to mutate it into the current version of the class."

 

But what if you mutate one of the enums, by adding items, removing items, rearranging items, or renaming items? Now you're in a pickle, because Enums currently do not store mutation history as part of their definition.

 


 

Consider the simple enum, GreekLetters, as part of a project developed by So-So Engineering, Inc. The SSEI developers launch the code into production with version 1 of the enum: v1: { Alfa, Betta, Hero, Delta } (The So-So engineers aren't too good at Greek, but so-so engineering brings home the bacon at SSEI).

 

Throughout a long development cycle, every few months this enum is mutated to account for mistakes, new features, or obsolete features:
 
  1. v2: { Alpha, Beta, Gyro, Delta }
  2. v3: { Alpha, Beta, Gyro, Delta, Gamma }
  3. v4: { Alpha, Beta, Delta, Gamma }
  4. v5: { Alpha, Beta, Gamma, Delta }
The SSEI developers pounded out code in blissful ignorance until v4 when the app started outputting thingamabobs rather than whirleygigs. 
 
Their superstar programmer - boasting his shiny CLAD certificate he had been toiling for 3 years to obtain - realizes the previous versions from persistent data logs were being interpreted incorrectly. With the new v4 enum, v1 data with index 2 is now being interpreted as "Delta" instead of "Hero", and v2 data with index 3 is now "Gamma" instead of "Delta".
 
v5 comes around with a homebrew-upconverting-state-machine-mutater, and continually ranks higher as nastiest code the guys at SSEI have ever seen as they slowly discover Epsilon in v6, Zeta in v7, Eta in v8...
 

 
I propose that this revision history, or mutation history, be stored with the control type definition of the enum itself. Further, a flattened enum should include a four-digit version (like classes) in addition to the flattened value.
 
This Idea may be manifested as a new data construct altogether - the 'Enhanced Enum' or the 'Enum with Benefits' 😉 - or more elegantly it could be included as a new flag 'IncludeVersionHistory' in the existing enum construct.
 

 
As a final note, even if you think you're immune to this problem since you don't write enums to persistent files to be read by future versions, you're probably affected. A subVI that uses an enum BD constant will improperly upconvert to the most recent version if it is not in memory while the enum goes through multiple mutations - say a rearrange and rename - that cannot be implicitly determined without explicit mutation history.
 
If that explanation does not make sense (hey, it doesn't even make sense to me), just ask yourself this question: "Do default values of controls and BD constants sometimes get screwed up after rearranging, adding, or renaming enums?"
 
22753iC17B0E7D87CFF612
 

 
Finally, while you're excited about the Enhanced Enum, also get excited about the Enhanced Enum supporting sparseness and different datatypes. Feel free to post questions/comments/insults in the comments section below or on the original thread.

 

With how event source references are currently handled, it is not possible to add any additional event sources to an existing Even Registration Refnum. The user is required to know the number of events needed and statically configure the Register for Events block at the beginning. The Register for Events block is resizable when you have not wired an input for the Event Registration Refnum, as shown,

 
EventRegister.JPG

But this presents a problem whenever you are working with a preconfigured refnum. If you're working with an application that defines the events within a subVI and then passes out that Event refnum, there is no way to append new events to that refnum.

 

EventregistersubVI.JPG

 

The new Register for Events is not resizable and there is no way to combine the previous refnum with a new refnum you have created. This really limits the capability to expand and continue using the refnum throughout your code.

 

The only ways to work around this would be,

 

Preallocate many readdressable events that you can later overwrite,

 

  • Use a datatype that has multiple elements (cluster/array) and use the different array indices as needed

 

  • Preregister many event sources on first creation of the refnum, and then rewrite over those sources later

 

preregister.JPG

The last way to approach would be to just create another Event structure to handle the new refnum.

 

Has anyone else run into something like this and has a recommended way to approach? Any other approaches and recommendations to help make the Event refnum more flexible would be great!

 

 

 

So, due to massive lag in the project environment, borked graphics drivers on the virtual machine and the resulting random rearrengement of objects on the front panels, i've Locked all objects.

Now, trying to delete a control from the block diagram nothing happens, which is technically correct. No information or warning, however, is borderline Bug in my book. I'd expect a popup "Object is locked", not just a silent denial.

 

LV2014SP1f3 (which for some reason is 14.0.1.3 instead of 14.1.3.x, but that is another discussion)

 

/Y

Allow array controls and indicators to line-wrap 1D data into a 2D display.

 

I have, say, a 1x1000 array of square images, and I'm browsing through them, and it'd be really lovely to be able to pop them into a grid as a single display element instead of having to make several array indicators with carefully synchronized display indices, or reshaping the array.

 

That is, if I have a 1D array consisting of the alphabet, and I pull the array indicator into 3x3, then it could look like:

 

abc

def

ghi

 

or if I entered index 1 in the index box, it would show

 

bcd

efg

hij

 

etc.

 

An option to allow vertical-first would seem reasonable:

 

adg

beh

cfi

I use typdefs for almost any data type I define in a program.  Most of the time I am concerned with the data only so a standard typdef is perfect.  sometimes I want to also have the look (properties) of the cluster or control stay the same throughout the code.  A strict typdef does this, but then causes problems like I cant change the properties at runtime.

I would like the ability to change the master typedef and update all instances to PROPERTY changes (ie size or color scheme...).  The current work-around is to temporary save the typdef as strict, close the typdef (causes the propertie changes to update) and then reopen the typdef make it a non-strict typdef and then save and close again.

 

There should be a synchronize option on typdefs.  Turn it on and the look of the typdef will be synchronized, turn it off and you have a standard typdef.

 

 

We really need the LabVIEW Statechart Module to run in LabVIEW 64-bit! Many of our projects are large vision projects requiring lots of processing and hence LabVIEW 64-bit.

 

Please make Statechart Module available in LabVIEW 64-bit!

Why do i have to open the Executable builder properties to access the icon editor of my icon file that's included in the project?

Add a r-click option to Edit the icon and/or make it the default if double clicked in the project environment, it doesn't really benefit anyone to open it in Image viewer.

(You can workaround much of the issues by setting the icon editor as default program for .ico's in windows, but there should still be a r-click option.) 🙂

/Y

This Idea applies to all Libraries but my main Use Case relates to Class Libraries

 

I am not sure how everyone arranges there Classes, from trolling online it seems common that non-publically scoped methods tend to get placed in their own Virtual Folder and public methods are at the top-level. 

 For example:

 

21672i8DF9E7B8B93A8490

 

Unless my Class only has a few methods I would take a similar approach however, most of the time I like to categorize them in more detail. The reason being this is my palette from where I choose my methods, and I like to group them using the following logic so that I can get as much information visually out of the organisation / layout of the Class. I like to have the only top-level method as the constructor if there is one (so I can see that there is one or not for that Class).

I only create the Virtual Folders I need, but usually there are a mix from the follow example:

 

21674iC695C8CF5C268BEE

 

The problem I have with the current design is that I don't know whether I have scoped my public methods correctly, as I could have forgotten and they are still left not specified - which is the default when you create a new Virtual Folder

 

21676iAB6ED5F8E26BA877

 

Currently there is no way to tell the difference from the above two Virtual Folders unless you right click on them or possibly look at the contents.

This is not great as there is potential that I could have scoped things wrong which normally leads to me having to check or recheck the scope is correct.

 

21678iF61DE0BD73C6A4AD

 

As LabVIEW is graphical by nature, it would be much nicer if I could visually see a public scope glyph to differentiate it from a not specified Virtual Folder.

I selected the color green as it is a natural opposite to red (private) and has not been used yet.

For example:

 

21680iDEBCDA19ED6B9DB4

 

Therefore, my original implementation would look like the below, and I can straight away see if I have scoped the public folders correctly.

 

21682iC59F6703EC013513

 

I am sure there was a reason not to include it originally.

I am interested to why and if there is a good reason not to show this too.

When you have the Desktop Trace Execution Toolkit (DETT) set to log errors, it will indeed generate an entry any time an error is generated. However if any custom message data is part of the error it is not captured, the DETT instead displays the default text for the captured numeric code.

 

DETT Error.png

 

I propose that this data should be logged as well.

According to the LabVIEW 2013 readme file (see attached image), NI installs a so called NI Launcher to work around serious shortcoming in the Windows 8 start menu. 

 

This is an essential tool because the Windows 8 start menu is flat (non-hierarchical) and if there are many NI products installed, the "all apps" screen shows pages and pages of tiles of e.g pdf help documents and it is impossible to find anything without scrolling forever.

 

Unfortunately, the NI Launcher functionality is quite limited to what we were used to be able to do in e.g. the Windows 7 start menu. All we can do is browse and launch a NI application.

 

While the readme suggest to pin often used program to the desktop, taskbar, or start screen, we can only do this by finding the icon on the Windows 8 "all apps" start screen first, where we can easily get lost if many NI products are installed! Yes, believe me, it is very tedious!!!

 

I suggest to add several right-click options to each entry directly in the NI launcher (similar to what we see in the windows 7 start menu):

 

  • open
  • pin to task bar (very important!)
  • open file location
  • troubleshoot compatibility
  • run as administrator
  • pin to start menu
  • ...
  •  (anything that is easily possible to implement)

 Idea summary: NI Launcher should have right-click options for each entry similar to the Windows 7 start menu.