-
Posts
3,392 -
Joined
-
Last visited
-
Days Won
284
Content Type
Profiles
Forums
Downloads
Gallery
Everything posted by hooovahh
-
Wow very neat stuff. So I tried various things to get this to work in VMWare, which is my virtual machine of choice, but didn't have any luck. The two sticky points for me was the network adapter options, and the booting the USB drive. VMWare supports EFI booting so I thought that might work for the USB, but it didn't. I also tried converting the USB drive into a ISO with ImgBurn, and other tools but that didn't work either. But even if you had RT LabVIEW booting, if you don't have a compatible network adapter, it won't run anyway. And in the free version of VMWare I don't think there is a way to change the network adapter type that the guest OS sees. But yes your instructions on using VirtualBox worked great. I was able to make the VM with a SATA, and IDE, have the IDE be my USB drive, and have the network device be an Intel Pro/1000 which is supported. After this I was able to install the OS, and connect with MAX and install other various software, very cool stuff. I haven't played around with it much, but the prospect of being able to develop some code without the actual hardware is fantastic. Things like web services, console output, and the whole RT deployment process can be done in simulation. As for performing actual work I'm not so sure yet what it will be capable of. I know that in some enterprise VM software you can dedicate cores of a CPU in the host to a guest, which would make real-time applications a bit closer to the real thing. But not being an expert I can't say for sure, but having a deterministic OS, as a VM inside a non-deterministic OS makes me think that the guest OS wouldn't be 100% deterministic anymore. Then there is also the licensing side of things. I suspect NI would consider a VM installation of their RT software just as real as any other install, and would require a deployment license of RT.
-
Reaction to an highly suspect Open G License breach
hooovahh replied to Thoric's topic in OpenG General Discussions
I'm still not quite sure why someone would do this. I mean if I found a golden goose, or if someone gave me a golden goose, the point still remains that I now have a golden goose, why lie about it? If you are trying to impress your boss, they either are a developer and know of OpenG and know you are lying, or they are the management type, and don't really care about those types of details and just wants your work to be done. For other toolkits which aren't free, or don't have as open license as OpenG, I can see a desire to do this. Knee-jerk reaction would be to scold them for taking advantage of an open source consortium, but the sensible thing is to take Shaun's advice and probe into the situation a bit first. -
Sorry if my mannerisms seem strange, replace my opening sentence with "What you are trying to do is not clear to me, could you explain it in another way that is clearer, or post simple demo code that exhibits the behavior". Yes I see you are resetting the timer, but couldn't tell from the picture if you have True wired to the Auto Reset, or the Reset, posting code instead of pictures in these cases makes it clearer. Attached is a quick example of what I was talking about. Where there is a loop that runs, and when you click a button two waits are done, one for 2 seconds one for 3 using the elapsed timer, resetting it between each call. This also resets when you first come into the wait so the timer should work as expected where it always counts up to 2, then 3. Notice that the reset only happens when the inner while loop has an iteration of 0, and then isn't reset until the next timer starts. Without this you will get strange behavior because multiple seconds will have gone between pressing the button a second time, so the first wait (the 2 second one) will be completed immediately. I suspect this is what you are seeing. I also don't intend on being rude.
-
Uh...what? The elapsed timer is intended to count up to a certain value, then it gets reset, and then it counts back up again and again. There is some optional inputs that can change this behavior but normally this is how it works. So if you are using the elapsed timer for a set of things, then stop, and you want to start the timer again, you should give it a True on the Reset input, the first time you are coming back into your loop. I've usually done this by using the Equal to Zero function, and wire it to the iteration counter of a for or while loop. Then it will be True the first time that loop starts which will reset the timer.
-
It seems the opened VI couldn't find the dependencies where it thought they should be. This is probably because the dependencies, or the main VI have been moved on disk in explorer, since they were last saved. The paths to the dependencies are relative and moving them in reference to each other can cause that to happen. If you are new to LabVIEW there is some free training here. 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 Introduction Self Paced training for students Self Paced training beginner to advanced, SSP Required LabVIEW Wiki on Training
-
You selected a function not a terminal. What kind of control would you suggest it make? Right click a terminal (one of the inputs or outputs of a subVI) and then create the control/indicator/constant from that and it will make it for that data type. Same with a selected wire.
-
Okay fine, let me try this again. Those that I've spoken to on the subject find my implementation cleaner and easier to follow. If your opinion does not align with that statement then you are dumb. That being said my implementation could benefit from some classes for sure, and I looked into once but never finished the re-write. Oh and there are some CLNs that could simplify my code too, rather than parsing blocks manually.
-
Don't expect anything too mind blowing, it's basically all stuff you can research on your own, with a few added breakdowns, and experiences.
-
I would not consider VI Explorer well written. It is written by someone who is clearly an expert at other programming languages, but not LabVIEW. That isn't to say I don't appreciate their work just that I found my implementation cleaner and easier to follow. Of course my implementation doesn't show how to replace passwords, posting that publicly would cross a line in my mind. Looking at the VI file structure as an exercise in pulling data out without involving VI Server is a useful tool. Glad to hear you were able to independently reverse the VI file structure. I always assumed that the original writer had some internal knowledge at NI to accomplish what he did, but now I realize how that doesn't necessarily have to be the case.
-
Sorry I misread your opening paragraph to say it worked with a Strict type, but not a normal type def. There is a private method for a VI class type, for Synchronize In All Contexts, not sure if this can be applied to the control VI and have it work or not. Synchronize Private Method.vi
-
Unless I'm misunderstanding something, the type def is doing just what it should and not updating unless the data type of the control changes. If you are only replacing the pictures in a boolean, but not the actual data type, then an update won't be forced on the instances of the control. Only a Strict Type Def will apply changes to all instances of the control, even if a cosmetic change is made.
-
All I can say is you're not crazy, and there probably isn't anything we can do about this. I modified your OnDoubleClick2 in the hopes that adding a cancel output, which would then not add any states (like get terminals and redraw), but as you stated the dirty dot appears even if you don't add those states. Next I looked at the VI property Modifications >> Block Diagram Mods Bitset, this tells you what on the block diagram is unsaved. If the value is 0 then there are no unsaved changes. This value is still 0 when the OnDoubleClick2 VI is ran, so the bit is being set after the OnDoubleClick is done running, which to me means there isn't really anything we can do about it. The second time I double click the XNodes it does have a non zero value, meaning it is reading the bit sets on the calling VI. But even if we were able to clear those bits indicating a modification was made, those bits aren't set until after the VI runs. Oh and another thing I checked was maybe in newer versions of LabVIEW there was an OnDoubleClick3 which fixes this, but in 2015 there isn't.
-
Welcome. Yeah feel free to post your projects. I too would encourage you to post them in the actual Code Repository if they are in a decent state instead of In Development. Bother are fine places but I've found posting in the In Development does get messy, with attachments and updates from users and the original poster. Posting in the Code Repository will have a discussion where this can still take place, but the first post will always take you to the main page where you can download the newest official release, and any previous official releases. Rather than having someone read multiple pages of a discussion trying to find the newest version.
-
Asking questions isn't the problem, there is tons of stuff I don't know about LabVIEW and I've been doing it for some time now, I still ask questions. The problem is some times we ask questions in the wrong way, and that will either bring out the wrong answer, or the wrong attitude from other members. I'm sure Jordan didn't mean to mock you, but sending someone a private message for something that is better discussed publicly is something to be avoided. I'm glad to hear you are passionate about LabVIEW, many of us here are. This document lives on another LabVIEW forum, but I think many of the points are valid here, feel free to read up on what most communities consider good etiquette https://decibel.ni.com/content/docs/DOC-40451
-
I'm going to try to summarize what your code is doing. On value change it will read the number of items in your listbox then run a for loop that many times. In that for loop you are setting the symbols each time, but the value doesn't change, and you are only setting one symbol, so you are turning off all the other symbols. This is because the array size is always going to be 1. If you want to set a symbol for every item, then you need to set the Symbols, with an array, whos size is the same as the number of items, right now the size of the array going into the Item Symbols property is always 1, so you are always going to only set one item to have a symbol. Attached is a new version where on value change it creates an array of the same size as the number of items, and then sets the symbols for all items using that array. Are you interested in any free training for LabVIEW? Here are a few links that I think might help you. 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 Introduction Self Paced training for students Self Paced training beginner to advanced, SSP Required LabVIEW Wiki on Training These links come from another document that I just linked to in a different thread. Automatic symbol for items Hooovahh Edit.vi
-
I've used DIAdem in the past, and it is quite flexible with data formats. It supports several kinds, and then plugins can be made to support more, but with no additional plugins it works well with some Excel formats, and TDMS. I know ATML works with a plugin, which is great for TestStand outputs. That being said I have rolled my own (sorta) using the DataFinder toolkit and TDMS files. You just point DataFinder to a folder of files to index, then you can perform queries with the LabVIEW API. I made a neat interface and put it on a server so people could login and perform a search based on criteria they wanted. Like the test completed after this date, ran by this user, on this tester, in this nest location, and passed. Then my program could perform a basis Gage R&R showing how values changed between reports that met that criteria.
-
Have you never used a forum on the internet before? Go to lavag.org, click on the subforum most applicable, then click Start New Topic.
-
This post is 7 years old, and has nothing to do with the original question. The answer is to just use a property node and read the Item Names, then use the Array Size, but in the future make a new thread for your new question.
-
Please don't double post, I've removed the other thread. What you are looking for is the System Exec.vi. Search the palette for it. http://zone.ni.com/reference/en-XX/help/371361K-01/glang/system_exec/
-
So I got confirmation today that those who need to know about this issue, are aware of it. At this moment it sounds like efforts will be made (eventually) to bring it back.
-
Here is an article I read a while ago describing the ghost patterns, before reading it I always though the 4 ghosts just chased you randomly. http://gameinternals.com/post/2072558330/understanding-pac-man-ghost-behavior
-
I'd like to think us at LAVA are better than Apple, Google, and Microsoft...okay maybe not better but something.
-
Hey sorry if I came across a bit strong. The only time we generally get things posted here that are compiled binaries, its usually spam with some DLL to perform stuff on barcode scanners, and OCR for some reason. I haven't looked through the source much yet, but I saw a few cool things. Like embedding the audio in the VI, sure it makes it a bit larger but the sound effects were small enough, and I like using a 2D picture control that gets redrawn. I love using the picture control in ways that maybe aren't intuitive but make for a neat UI. An alternative might be involving showing and hiding objects, or even moving objects like a button that looks like a pac man around the front panel. Oh and I noticed you Exit LabVIEW when the VI stops running. A better solution might be to see if the VI is in an EXE and then exit if it is, or do nothing if it isn't. This way if you run from source when the VI stops running LabVIEW is still open. Also I do hope that no one abuses your source and posts a high score of 2^32 or something. And as for the FTP credentials, LabVIEW VIs can have password protected block diagrams, but according to NI R&D it is far less secure than you probably know. I believe the quote had something to the effect that the amount of protection the block diagram password gives you, is similar to the amount of protection you get from tissue paper. There are multiple ways to defeat this password protection, and it would give your online credentials to your FTP, to anyone who can defeat this tissue paper. Not sure if there would be a good way around this, since if you just posted a VI with no block diagram, we would be back to square one where you would have a binary blob that is doing unknown things on our system.
-
Run and download a random EXE from a random site, which reportedly uploads data to a central location? No thanks. But if you are willing to post the source you should, either here or possibly in the code repository.
-
I've seen others try to add more features to an error handing system, and embed the NI error cluster into a class, or another cluster, which can have more information like history, and more debug information. There is a lot of information on the topic. https://lavag.org/topic/10741-updating-the-labview-error-handling-core/ You can go too far one way, or the other. I mean even NI's error handling cluster could be reduced to just a boolean, Error or No Error. I think doing that goes too far and the cluster and all that goes with it, is justified by the added functionality. But I'm guessing that when the error cluster was made standard (LabVIEW 5? 3?) some thought it was more complicated than necessary, and a single boolean, or single integer would be enough. Or you could add tons of functionality and add lot of overhead, to the point that it wouldn't be worth the effort. In larger applications I generally wrap more functionality into the NI implementation by using a central error handler that keeps track of the errors, severity (which is hardly ever used), time of the error, module that it originated from, and the last 4 states the state machine went to leading up to the error. This is also logged to a temp location. So while I do use the simple error handler in smaller programs, the ones involving actors running in parallel get their own error actor.