Jump to content

MarkCG

Members
  • Content Count

    145
  • Joined

  • Last visited

  • Days Won

    16

Everything posted by MarkCG

  1. Get ready to have some "fun". IME building EXEs for MACOSx was very frustrating, with many build failures and even exes with broken run arrows! I did not know that that was even possible.
  2. What bothers me about this is that it seems to defeat parallelism somewhat. Two loops that really ought to just be sharing data via a the queue are now have to depend on a non-rentrant VI to get the queue. Say we have non-empty queue, and A is the producer loop and B is the consumer. If loop A is calling the LV2 global to get the queue to in order to enqueue data, B has to wait until the LV2 global is finished executing in order to dequeue data that is already available. I'm sure the performance hit is negligible, but it's the principle of the thing that bugs me. I like to pass queues in
  3. One of a TC's advantages is that they are cheap and have very low time constant, meaning you can measure rapid temperature variations. The bare TC tip is small and is easy to get into good thermal contact with the thing to be measured. RTDs are more expensive and physically bigger. In the HVAC industry they'd twist TC bare wires together, and solder it to copper tubing of the air conditioners. When test is over, you just cut the wire off near the tip.
  4. James, I am glad someone else shares my hunch on performance. I have given that a lot of thought to race consitions. I really hate and abhor "signaling globals" but have done the best I can to mitigate. All NSVs are in either a "control" library or an "Indicator" library. NSVs in the indicator library are only written to in one place in the target/cRIO code, and all elements at once. Control NSVs will be written in only one place in the HMI /host code. "Signaling" NSVs that need to set a setpoint consist of a cluster with a "set?" boolean and the numeric quantity that is the setpoint, to
  5. Hi all, I am working on a typical HMI+cRIO 9074 control system... porting over / lightly refactoring some code that was written to run on a PC. There are going to be quite a few variables to keep track of, but many of them are logically related and I would internally keep them in type -defed clusters. Instead of creating individual shared variables for every single boolean, floating point and string, I am thinking that grouping the variables into typedefed shared variables will be good for managing the information, and also improve performance (reduce CPU load on cRIO) by reducing the
  6. Thank you for the advice! I didn't want to call, and go through the process of explaining the whole thing/ waiting on phone. I'll definitely use the online service request, thank you for that pointer Antoine. I will post CAR # when I get it Mr Mike. And to Darin and AQ, it's not so much a proprietary thing as that I was advised that I should try to disclose in a responsible way given nature of bug.
  7. I discovered, by accident, a way to render a library or class corrupt, by doing a certain operation on it from within LabVIEW. Breaking the lvlib also breaks its member VIs, until they are unlinked. No, it does not involve munging the XML or raw text of the lvlib. I have demo VI but am a bit loathe to just put it out there for the world. What should I do? What's a good place to report it?
  8. Thank you Ned for the very nice Visitor pattern example! The data object of a given type has a do method, that takes in a visitor of whatever type , and executes a that visitor "Visit" method specific to that data type. (visitIntegerDataType eg) . I can see now how setting things up this way could be very useful. You have visitors that do all kind of different things, but you have to only write the iteration code once-- in this case it's just a for loop in DataItemCollection.lvclass, but I can see that if you had oh, binary trees or oct trees or graphs doing it that way would be awfully
  9. I have looked at that example before as well, and I don't get it either. In my admittedly poor understanding, it involves a "visitor" class iterating through a collection of objects and performing some operation on each one. The collections could be something as simple as an array or something like a tree or graph of objects. The visitor "knows" how to get to (well, visit I suppose) every object in that collection, and then do whatever it's supposed to do to that object. So in your case, the "thing" to iterate over, is maybe an array of channel classes, each with an array of check classes.
  10. I recently did something pretty similar-- each channel represented by a class, with a variable number of different condition check objects stored in an array in each channel class, all configured via a spreadsheet file. I went the route of create a manager class that would iterate through all the channel object condition checks and at the end decide what action to take. My approach would have the condition checks classes send messages to "DO output" actor / loop. The DO output loop holds on to the actual DAQmx task, and it can decide when and how to set the digital outs. You could cause
  11. It does look like the OSX version of LV2012 doesn't have anything equivalent to "vi.libplatformfileVersionInfo.llbFileVersionInfo.vi" . Still though, I can see my app's version number under when I "Get Info" on it with Finder. There has got to be a way to get to it-- anyone any ideas?
  12. Why not make the CAN reference an input to whichever zone class methods will use it?
  13. Invariably, in most large projects I do, I end up needing to do one thing which I have not found a clean way to do yet. And that is handle messages between components differently based on state of the component / actor. Simple example of what I mean-- a machine that can be in an idle or running state. If machine is off/idle, a shutdown message to the actor or component representing the machine does nothing- the message is read but nothing happens, it is already off. If running, it goes through shutdown sequence, actually controlling physical hardware. Likewise, if running, a "Run message" has
  14. So jet velocity call it "u(x,y)", is in Z direction, is function of x and y, and you want to take the derivative uxx , uyy ,and uxy ? You might try to smooth the data with "2D interpolation scattered.vi" (look for example), found in math palette then take the derivative of the interpolating data/function. There are higher order stencils you can use to compute the derivatives and Laplacian as well--- they can be derivatived by Taylor series expansion. This will help in smoothing the derivative function also.
  15. Hi Darin, one little trick to get get around the typedef explosion is to wrap that constant in a subVI- new VI, drop the constant on the block diagram, create and wire it to an output. Make the VI icon look like a cluster constant or whatever you want. The typedef constant can remain in its exploded state and you can drop that subVI wherever you want.
  16. Right, can't do pop ups with remote panels. But why do you need to know if the remote panel has taken control?
  17. If its rs485, they probably use Modbus protocol. Read up on this. Get the NI modbus library. This will allow you to read modbus registers. Read the controller manual, find out where what the registers are. Read registers you need with modbus library vis. You will need to typecast those registers to the data type you need. For example, feedback temperature will probably be represented as 32-bit float. For example, a modbus 32-bit floating point is contained inside two registers. You need to read both those registers and typecast them to a single precision float.
  18. I am all signed up for the June 7 software engineering course in Austin Texas. Hopefully at least one more person will sign up for the class So it can take place .I'll let you guys know how it is.
  19. Ironically it's only in the United States that British thermal units are used in practical engineering.
  20. I just right now was making a serial comms VI library to talk to an instrument and for some reason the VISA line feed auto-append (termination character) didn't do it for me, although Hyperterminal will do the same thing and it worked. I just concatenated the "line feed constant" from the string palette with each of my commands when writing, then it worked fine.
  21. I feel your pain Alex. I need to sit down and DO as well. I'll probably never get time to implement anything OO on my current project, but hopefully my next gig will involve making a nice desktop VI from scratch and I can do it in an OO fashion right from the start. Meanwhile I'll do a CLD exercise or two using an OO framework, to give me something to do.
  22. Hi all, I've been putting remote panels to use recently as user interfaces for control applications running on real-time targets. Some here have said that remote panels should not really be used for anything other than diagnostic type programs, and that large panels with many controls and indicators is asking for trouble. Rather the better way is to run a GUI executable on your laptop /desktop and control the remote application via shared variables/ tcp-messaging schemes / network streams. You need the LV runtime engine to use remote panels. Does host / remote unit send a copy of the front
  23. I have wondered about this too. I use compact fieldpoints (mostly 2120s) and am rather uneasy about using LVOOP on them. I've encountered a number of problems working with LV2011 and cFPs.... i.e. extremely slow deploy times, confirmed by NI, LV crashing when importing cFP .iak files through project explorer, etc. . This makes me that the cFPs are not getting the love they need from NI. I have a particular component that I've implemented using traditional techniques, but would be well suited for refactoring to OO style. I'll use it to test out how LVOOP works with compact fieldpoints
  24. *cue "Thus spake Zarathustra"* .... Floating in the void of cyberspace, I am reborn is the OOPChild !!
×
×
  • Create New...

Important Information

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