Jump to content

Jordan Kuehn

Members
  • Posts

    649
  • Joined

  • Last visited

  • Days Won

    17

Posts posted by Jordan Kuehn

  1. Job Details

    Description

     

    Software Engineer

    What is a Software Engineer?
    The Software Engineer is responsible for maintenance and development of software that is core to our Freedom Series Completion System. The ideal candidate will have demonstrable software programming capability (specifically in LabVIEW), control systems experience, mechanical aptitude, ability to direct others, and an ability to operate in a fast-paced environment.

    This position can be located anywhere in the United States but will require some travel to Oklahoma City at the beginning of the position, and then as needed potentially for a few days to a week each month.

     

    Job Listing Here

  2. 2 hours ago, drjdpowell said:

    Two suggestions:

    1) Consider using JSON as your config-data format, rather than clusters.  Using JSONtext to manipulate JSON will be faster than using OpenG tools to manipulate clusters.  

    2) Programmatically get an array of references to all your config-window controls and register a single Event case for Value Change of any one of them.  Then use their (hidden) labels to encode what config item they set.  For example, your control with the caption "Baud Rate" could have the hidden label "$.Serial Settings.Baud Rate" which is the JSONpath to set in your config JSON (or config clusters).

    This is brilliant. I imagine it could even become a standalone toolkit/extension of JSONtext.

  3. 1 hour ago, FixedWire said:

    Of course I get that you need an SSP, darn good thing I'm paid up until August...and I never got the media.

    Looks like somebody didn't tie their shoe laces.

    image.png

    We have gotten "media" recently. It took a few weeks and they mailed a piece of paper with a serial number on it.

  4. I think Mads method will work. I think it's frowned on, but probably the most straightforward. Alternatively you could figure out what permissions are set on the script file and required for the operations it calls, then make all of those executable by the lvuser. All of this is annoying enough in linux, but then Linux RT user permissions and file permissions are even more complicated than usual as some permissions are reset on boot.

    This pdf is a good reference and I think is still valid despite its age.

    https://www.ni.com/pdf/support/us/ni_linux_real-time_security_user_guide.pdf

  5. With packages you can include files (e.g. an installer), and put them where you want them. You can also call post-install scripts. I think if there is a way to call the installer silently from the CLI you could script this. You are starting to tread on IT's world though, but sometimes you need to get it done and for it to work so perhaps you are best off doing it yourself this way :D Seriously though if they have the systems in a domain or something they might be able to handle the environment setup independently of your NI packages.

    • Like 1
  6. 1 hour ago, Rolf Kalbermatter said:

    It almost feels like it was mostly about buying up competition than any specific long term strategy to build something out of it.

    Isn't this the case with many acquisitions by NI? Buy it up and let it languish instead of developing or integrating it?

  7. Cross posted to the dark side.

    Hello,

    I'm attempting to work with the launch remote actor function utilizing two cRIOs. I have a working AF application on one cRIO and I would like to spawn a few Actors to run on another one beneath my original top level actor, hoping that the top level actor will be able to interact with them as if they exist locally. 

     

    I have watched this presentation from JustACS and have considered using the nested endpoints, but this approach seems more "AF-ish" and doesn't require extra communication actors mid-tree, or mid -> top of tree. 

     

    My question at this point is that I don't think I have the dependency injection correct for a built exe. The example doesn't seem to address applications outside the IDE either. I believe I have gotten the VI Server settings working and can launch the actor from the Server side without errors now. I encountered some errors while working on the dependency injection. Note: these are built and deployed startup exes.

     

    I first started with something like in the webcast:

     

    jordankuehnsef_0-1650400792330.png

     

    And here is mine:

     

    jordankuehnsef_1-1650400829202.png

    However, I encountered errors on the Server side in the upper proxy vi until I added this loop:

     

    jordankuehnsef_2-1650400879050.png

    Now the Server side launches, but I don't see any activity from my remote actors. I expect at the very least to have some of the initial logging that happens at the beginning of their Actor Cores happen, even if there are other errors, but I see nothing on the Client side.

     

    Am I missing something simple here on the dependency injection? I attempted to include just a few actors at first, and then added all the actors that could possibly be linked in some way, added subvis to the always include in the build spec, etc.

     

    Any help or pointers here would be greatly appreciated.

     

    Thank you!

  8. I use this on cRIO with the system exec vi:

    timeout 0.1 ping -c1 127.0.0.1

    Replace the 0.1 with the time you want (s) and the 127.0.0.1 with whatever IP address or hostname you want. I use this to determine if I want to attempt to open a shared variable connection to an expansion chassis since the timeouts on that API do not work.

  9. I agree with ShaunR. Despite it being posted as replies to several posts all in one day, I don't think it's overly spammy and they were mostly relevant to the discussions at hand. It was enough to get me to poke around at the product page and file it away in my mind should the need arise.

  10. 1 hour ago, flarn2006 said:
    • Sometimes, often when I drag something on the block diagram, wires will suddenly move to illogical locations. One place where I've noticed this often is with tunnels on the bottom edge of a structure, where the wire will suddenly arrange itself so it connects from the left instead (while the tunnel remains on the bottom.).

    Perhaps this same issue that is a bug, per AQ's reply:

    https://forums.ni.com/t5/LabVIEW-Idea-Exchange/LV2021-Deactivate-Wire-Auto-Routing/idi-p/4183557

  11. 2 hours ago, brian said:

    I was looking at https://www.ni.com/en-us/events/niconnect.html

    where it says:

     

    Elsewhere, it hints that there could be external presentations, but my guess is they'll be industry-focused (and apparently with invited speakers only).

    Anybody heard more about it?  Any thoughts on this?

    Thanks for the link and bringing it to our attention! I focused on this part (my emphasis added):

     

    Quote

     

  12. 4 minutes ago, flarn2006 said:

    When is this necessary? FPGA I assume?

    FPGA certainly. I have use for the code I posted when say thresholding a value and wanting to ensure that it has exceeded that threshold for a period. That value could be anything. A plain signal or it’s derivatives, a float switch with a digital input, etc. At high rate in an FPGA you’d normally use it for say a mechanical switch that makes intermittent contact rapidly as the contacts first come into contact with each other. I’m sure there are more examples!

  13. That certainly fulfills the debounce nature in a more pure manner, debouncing both low and high. Mine is more of a conditional latch with optional single pulse output or latched high output. I think you got my point though about using a counter. As far as it being pretty or not, I don't know that I'd ever look at the BD again after finishing testing. The counts can be adjusted based on where you use it. Certainly sample rate will be a factor, but also expected noise/bounce vs desired responsiveness.

  14. 6 hours ago, Mads said:

    We normally just make the executable reboot the cRIO/sbRIO it runs on instead, through the system configuration function nisyscfg.lvlib:Restart.vi, but here are two discussions on killing and restarting just the rtexe on LinuxRT:

    https://forums.ni.com/t5/NI-Linux-Real-Time-Discussions/Launching-startup-rtxe-from-terminal-or-linux-window-manager/td-p/3457415

    https://forums.ni.com/t5/NI-Linux-Real-Time-Discussions/Is-it-possible-to-close-and-re-open-RTEXE-through-Embedded-UI/td-p/3707540

     

     

    Oh that’s perfect. Just like OP on that post it’s the reboot time that’s the issue for me. This line is what I was missing:

     

    /etc/init.d/nilvrt stop && /etc/init.d/nilvrt start

     

    I’ll give this a try. Thank you. 

  15. 21 hours ago, Rolf Kalbermatter said:

    No! An rtexe is not a real executable. It is more like a ZIP archive that can not be started in itself but that needs to be started by invoking the runtime engine and passing it the rtexe as parameter. And the exact mechanism is fairly obscure and not well researched and totally not documented. Unless you are a Linux kernel hacker who knows how to investigate the run level initialization and how the LabVIEW rtexe mechanisme is added in there.

    Rolf, I've been looking for this information myself. Not quite in this use case as requested, but simply to restart the application. Do you have any reference for simply restarting the runtime engine and relaunching the configured rtexe? SystemLink is capable of doing this, but I haven't managed to figure out how yet.

  16. So, I think you have pulled it apart fairly well in your summary. I believe the issue with the regular Write function is that it can fragment the data and builds the index on the file to take care of this. That combined with flushing, segmenting file writes, and defragmenting after completion will address it for many use cases. The waveform issue is that first the advanced write won’t take the data type due to the properties next to it, and that’s all it is like you said, and array of doubles, some standard components (t0, dt), and possibly some variants. Then second even if you were to write an array of doubles using the standard write vi it is not as performant. When using the advanced VI you specify the block sizes and it streams that to disk exactly as written. (I’m sure there’s a little more complexity at the c level here.) So you must write the same size every time, but it is quite fast and does not leak memory. 
     

    So, I see a space here where in general advanced tdms functions could be chosen given the condition that subsequent writes follow the same size as the first write (allowing to read that and perform the configure), and then to further that, could automatically unbundle a waveform type to package the properties up and write the array. 
     

    It’s a thought, and something I’ve encountered a few handfuls of times over the years and it’s a pain every time.  

  17. Hooovah, I appreciate this toolkit and the work you've done to make it. I have a common problem that I run into and eventually just have to bit the bullet and roll my own solution. When streaming large datasets to disk I have to use the TDMS Advanced vis to get it to avoid a memory leak. It is even worse with waveforms, though I would like to be able to write those directly you can't with the Advanced vis. So I wind up stripping the t0 and dt off and saving as waveform components, flushing the file to apply them, configuring block sizes, etc. Could this library be adapted to use the more performant vis, with some preconditions, say that all subsequent writes must be identical in size/composition, so that I can stream waveforms to disk? I attempted to use your size based file writer and ran into the same memory leaks I encountered when using the regular tdms files, described here.

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.