-
Posts
3,448 -
Joined
-
Last visited
-
Days Won
293
Content Type
Profiles
Forums
Downloads
Gallery
Everything posted by hooovahh
-
I'm sure there is. And looking at the Hand-RIO videos I'd say it too does some similar tricks with the Xilinx compiler.
-
Resource usage for inactive tabs on a Tab control
hooovahh replied to Christian Butcher's topic in User Interface
I've absolutely done the list box approach. Similar UI as you where the listbox is on the left and populated at run time, then the subpanel can be loaded in the main UI. Each of these subpanels VIs can be poped out and pinned too, but that's only done during debugging so you can look at two manual panels at the same time and see how changing one effects another. Another good example of this type of UI is the configuration dialog, which is seen in the Tools >> Options dialog in LabVIEW. All of these are more modular approaches than a static tab control, but I don't think this answers the original question. -
A text file can be opened in Excel if columns are separated by commas "," and then the file is named with a .csv file extension. This is by far the easiest solution, but the most simple. For more control over the look and format you can use the Report Generation Toolkit (included with 2014 and newer I think, and a paid add on before that). This uses the ActiveX API to read and write data so Excel must be installed on the machine. There are a few free wrappers for this API as well. There is also XLR8, a 3rd party company that makes a toolkit which creates the file using the documented format, not ActiveX so then you don't need Excel installed on the machine. And starting in 2014 the Write Measurement File has a .xlsx option. But don't expect a lot of control, it works similar to the XLR8 toolkit. Oh and you can make a TDMS file and then use the free NI add-on to open it in Excel. This all really depends on what type of data you have, how you want it to look, and the amount of time and money you want to invest.
-
Very interesting. Certainly parts of the work flow are different from the NI implementation, like being able to just run the FPGA from the front panel, instead of having to compile it, then create a host to control it. Also the change to using your own custom (XNodes I assume) for the interfacing. Also is it me or does the transfer of the bit file seem slow? I mean you show a very basic program but it seems to take a while to download. Beyond that I'm not aware of any precedence being set by NI on these clone hardware. Plenty of DAQ devices have been made by 3rd party vendors, most with a simple interface via a DLL wrapper, or VISA calls to the hardware. LabJack is one that comes to mind. Then there is the more advanced clones like the mentioned Hand-RIO. I've not heard of a time when NI has come down and not allowed a company to make a product, but then again some of these advanced ones that clearly use the NI tool chain in ways that NI didn't intend, are out of countries that NI is not headquartered in. I'm not a lawyer, but I would not make a business out of these types of products, due to concerns that NI would sue the pants off of me.
-
Why do you want it removed? Do you not work for NI? I don't think changing the email will change your status. That is a thing manually set on the profile by an administrator. It doesn't look like I have access to change that part of a users profile so I'll contact Michael and see if he can change it.
-
It probably would be possible. But as mentioned earlier a limitation of the API at the moment is all users share the same front panel displays. So having multiple users connected wouldn't work well, unless you can modify it to serve different pages to each user connected to the host.
- 137 replies
-
Resource usage for inactive tabs on a Tab control
hooovahh replied to Christian Butcher's topic in User Interface
In regards to tabs, there is an idea exchange item to have them fit to pane which I think would be very helpful. https://forums.ni.com/t5/LabVIEW-Idea-Exchange/Fit-to-pane-Fit-to-tab/idi-p/932452 Aside from that I have come up with a solution, where there ware two tabs, in two panes. The bottom tab has no control, and is just changed when the top tab value changes. Then I hide everything on the top tab, other than the tab controls, and the bottom tab I had the tab controls but leave the tab content. This allows for the objects in the tab to fit to pane, and resize as you would expect. In this tab you can still have a subpanel that fits to the pane, or graph, chart table, or whatever. It is just another example of UI work arounds in LabVIEW to make a good UX. -
So I haven't looked into it completely, but it would probably be possible to install VLC, which has an ActiveX control. So you maybe able to insert that on the front panel of a VI, then tell VLC to open a stream.
-
For PDF generation I've been using this toolkit for several years and love it. https://decibel.ni.com/content/docs/DOC-10952 It has the ability to paste in front panels, and individual controls, but it also can just add a table, or text, as normal PDF tables and texts, that can be selected. No PDF printer needed.
-
I think what rolfk is trying to say, is if you have an error when i=2, then that error will be passed back when iteration is equal to 3, and passing an error into 99% of the functions that use the error in, will not perform the operation. So if you have an error when i=2, you will still go to i=3 and i=4, but that same error will be passed around each loop iteration, and those other runs of the loop will likely do nothing (or very little). You can code around this with clearing or ignoring errors but if that is what you wanted to happen, then you probably wouldn't use a shift register to remember the previous error anyway. The other thing that can cause a loop to stop is the conditional terminal, and in some cases the developer will wire the error to the stop, which will stop running the loop if an error is seen. So if an error occurred with i=2, then the loop will not execute i=3, doing effectively the same thing but better, since it will not run the other iterations at all. EDIT: Oh and I don't know of any restriction on new user file uploading.
-
No worries, we were all beginners at some point.
-
That is an odd one. A repair of the LabVIEW install would probably fix it if you want to go through that process. You can still edit an Enum just from right clicking it. You can remove items, and add items before or after. Also to add several things at once you can type Shift+Enter to add after. Still this is a temporary solution and something is probably messed up in your IDE.
-
Yup you could do that. Properties are only scalar values, so keep that in mind too. So maybe I have a property that is total number of failed and total number of passed tests in the file. If I run more tests I can write those two properties again, overwriting the previous values those properties had. You can of course flatten any data type to a string and write that so the scalar limitation is only applicable for the native data types, and anything else won't be human readable in normal viewer.
-
Actually TDMS is quite robust. I'm not saying you can't break it, but I had a few tests where multiple references were opened and closed in parallel, and reading and writing took place in an uncontrolled way, and there wasn't any data lost on the writes. This suggests to me that there is a central driver that all API calls go into which handles the reading and writing. This isn't to say data loss can't happen in odd cases of multiple reads/writes in parallel. These cases should be avoided. I just wanted to mention that in my experience it is quite robust. The TDMS read has an offset and range for performing a read. So you can graph a subset of the data without having to read all of it. But for something like decimate you will likely need to read all values of the range you want, and then decimate it in LabVIEW, which is likely less memory efficient than a database call that has that built into the select statement. Also getting something like a Min or Max in TDMS can be less efficient than a database call, if you have open ended queries. By that I mean if you know you want to have the min and max of all channels, then when you are performing the writing of those channels, you can also write properties of the channel that is the min and max. Then when you are reading the file these properties are already written in the file and can be read without having to read every data point. These are sorta like queries where the result is written in the file, knowing that you may want to look for them later. For queries you know you'll want to do this is great, but if you don't know what you are going to want to look for in a post-processing way, then you will need to read all values, and calculate the result. For me each channel, and each sample has a Pass or Fail associated with it, and I want to know if a test passed in every cycle, meaning that every sample of the channel was a pass. Instead of reading every sample, I just write a single Pass or Fail property on the entire channel. If that is Pass then I know every sample of that test passed. I can also combine this and look at if every test has this passed property, and if it does then write a Pass property on the entire file. Then I just need to read this one property to know if the entire file passed. I knew I would want this query like information available, so I wrote it into the program that writes the TDMS files. If I now wanted to know every time a sample was above 0.5, I would have to write custom code to read every sample and get the results, because that isn't a property I wrote into the application.
-
Topic moved, feel free to use the report to moderator feature in the future.
-
The following file in the report generation toolkit performs the Save As function: <vi.lib>\Utility\NIReport.llb\Excel\Save Report to File.vi It has a case constant that uses the following values, I'm unsure if these same values can be used for the document save function. xls -4143 xlt 17 htm, html 44 xlsx 51 xltx 54 xlsm 52 pdf 57 csv 6
-
This is quite basic stuff, and can be done several ways, with an event structure, and an event for each button, or polling the buttons and going to individual case structures, or building an array and searching for the True which would be the first button that was pressed, and then going to a case in a case structure. Why don't you post what you've tried so far. And feel free to checkout some of this free training material. Oh and in the future use a more descriptive title. LabVIEW VI means nothing but, "Sending a string based on a button press" is much more helpful. NI Learning Center NI Getting Started -Hardware Basics -MyRIO Project Essentials Guide (lots of good simple circuits with links to youtube demonstrations) -LabVEW Basics -DAQ Application Tutorials -cRIO Developer's Guide Learn NI Training Resource Videos 3 Hour LabVIEW Introduction 6 Hour LabVIEW IntroductionSelf Paced training for studentsSelf Paced training beginner to advanced, SSP Required
-
Open Source SW and mailicious intent
hooovahh replied to Matthew Rowley's topic in OpenG General Discussions
"Do you mean we aren't doing 100% inspection already! I'm going to shake up this place up to make this company better (or so other people will hear me talk and think I'm even more important than I already am)", or "You're the test engineering, isn't this your job!" or "I don't mind making the hard decisions if it means less warranty returns!" or "Our customers demand perfection!" Too many blanket statements without knowing or thinking about how things actually work. Not saying improvements can't be made, but I tend to roll my eyes when people talk a big game but clearly don't know enough to be making decisions like these. Give me a manager with test and engineering experience over one with an MBA any day. (BTW sorry about off topic) -
Post what you've tried so far. Normally I'd suggest using the report generation toolkit with the template path, being the path to the original file, and then use the Save Report with the new path, but I'm guessing you mean you want to save a table which is in the HTML file, but without an attached file it is hard to say. Post what you have, post what you've done, and post what you want the output to be. This will likely involve ActiveX and/or the report generation toolkit, but there just isn't enough information to answer your question.
-
You attached 12MB of PDF files, did you expect us to read the 500+ pages of documentation you posted? If your question is how to parse and understand an STL or GCode file maybe you should post example files on that, or read documentation or examples on what the file structure is for these file types. Posting NI documentation already available on the web, and pictures of your setup isn't very useful if your question is in regards to file parsing.
-
Can we see a screenshot? That seems odd and I've never heard of it. Is it a Type Def? or Strict Type Def? Can you post the enum? What versions of your OS and LabVIEW are you using?
-
Open Source SW and mailicious intent
hooovahh replied to Matthew Rowley's topic in OpenG General Discussions
Better yet did you smelt the metal? If not there could be imperfections in it that could cause a catastrophic accident going down the road. It's hard to have these types of conversations because at some point someone will say "Well that's just ridiculous, I should be able to trust the QA of the screw manufacturers." Just like how I've had some managers not trust the precision of resistors, and wanted each tested before, and after placement in the DUT (Dispite ICT likely finding these issues bringing up another FMEA). But what is ridiculous to some isn't for others. And at the end of the day my job can be made much more difficult than it needs to be depending on how ridiculous important people want to be. Oh and the operating system, and drivers we are using are closed source as well. Is it ridiculous to make a new operating system, kernel, drivers, file system, etc from scratch? Yes. Would some managers think they are doing the company a favor by calling into question the integrity of the operating system? Yes. -
Open Source SW and mailicious intent
hooovahh replied to Matthew Rowley's topic in OpenG General Discussions
Are we really talking about FMEAs on the risk of open source bugs and/or malicious code, versus source code developed in house? An interesting concept but in my experience most management would rather just have a blanket statement like "No open source code" then to have to go through a process of qualifying it. Michael is probably right, if it is a firm requirement then you're probably hosed. -
I know the question is about references, but all of the shown examples is less than ideal for errors unless it is intentional to only look at the last iterations error, and to clear the error if the loop runs 0 times. In cases like this I will either turn the error wire into a shift register (this will cause an error in iteration 0 to not allow iteration 1 to run, sometimes this is desired sometimes it is not) Or I will enable indexing on the error of the for loop, and use a merge error to turn it back into a scalar. This way each iteration will still run without error, but my output will indicate if an error occurred on any iteration. As for references, if the for loop runs 0 times the reference will be invalid if no shift registers are used. In this case it isn't all that bad because to cause the for loop to run 0 times the second subVI needs to return a 0 which will most often happen if an error was pass into that subVI, in which case the reference won't be made, and won't be used anyway. But in many other cases the number of iterations is defined by an indexing array, and if the array size is 0 you have the same issue of turning references invalid, and not being able to use or close them later. Many developers don't think about the ways that the array could be of size 0 and assume that will never happen but it does. Remember that if two arrays are being indexed, it is the minimum size between the two that defines how many times the for loop will run. So if one is empty and one has 10 elements, the for loop runs 0 times, and references are lost again. This 0 running for loop can clear errors in some cases too. In your #3 if the Error In is true, then the for loop will run 0 times, but the error also will be cleared which is also likely undesired. Basically #2 or #3 are fine for references, but have slightly different behavior, which probably won't matter.
-
Open Source SW and mailicious intent
hooovahh replied to Matthew Rowley's topic in OpenG General Discussions
It's literally in the only link provided in this thread. https://decibel.ni.com/content/docs/DOC-8981 Although if I'm going to apply a bit more scrutiny, I guess NI is just saying these are the guidelines to be followed, not necessarily the things that NI verifies is true.
