Pass REFERENCES to the front panel controls thru sub1 --> sub2 -->
sub3
In sub3, use an unattached property node - pass it the reference to a
specific control, and set its VALUE property to the new value.
Unattached property nodes are on the VI SERVER palette.
Congratulations and a big THANK YOU from all of us out here in
user-land.
If you have ONE client and ONE server machine then you don't want to
have FIVE TCP connections.
1... Design a data structure. It should hold your five values, plus a
timestamp, or whatever else you want. Make it a TypeDef, for ease of
changes, if you want.
On the server (where the data comes fro
Then I don't understand why you asked about files.
The TCP/IP examples show how to transmit data blocks.
The easiest way is to open (create) the file once at the beginning of
the acquisition, and leave it open. You should use DENY WRITE
permissions, at least, to prevent other apps from writing the file.
Start with an empty array of data in a shift reg.
Repeat
Get new value
Use BUILD ARRAY t
If I understand you correctly, the act of writing the file is
disturbing your timing on the data-collection part.
You need to have an average of the latest 9000 samples (15 * 60 * 10),
and write the new average every 100 mSec.
Are you opening/writing/closing the file each time? While that's the
AI GROUP CONFIG is called by the higher-level AI CONFIG.
You'll have to tell us what the error message is.
Probably something to do with bad channel numbers.
What specifically is your question?
It's commonly done, but there's no built-in function for it.
Here's one way:
On the server side, you
1... Wait for connection
2... Open the file
3... Remainder = determine file size (in bytes)
4... Repeat
5...N = remainder
6...If N > 1024, N = 1024 (lim
What sort of "objects" are you counting?
There is no specific limit.
It depends on what kind of objects, and how much RAM your computer
has.
In 15 years of LabVIEW programming, I have never encountered a problem
concerning too many objects.
I have run out of memory when slinging 50 MByte arrays around, but not
in the code itself.
If it's that critical, then test for the INI file yourself, and create
it if it's not there.
I would suggest looking at your computer's DST settings - perhaps you
have set the clock ahead but not turned on DST. If so, the conversion
to GMT and back will not be correct.
You don't say what the data represents. Is it 3-channel RGB? Is it
intensity?
You can use the intensity graph to show an X vs. Y vs. Intensity
image. If you have a monochrome camera, that makes a fine image - just
set your min and max colors to be black and white.
If you mean RGB, one way is to sc
Use the AI CONFIG to set up your acquisition.
Use AI CLOCK config to set up your timing.
Use AI TRIGGER CONFIG to set up your trigger.
Use AI CONTROL to start the DAQ (use TOTAL SCANS TO ACQUIRE = 0 for
unlimited scanning.
repeat (While loop)
Use AI READ with a NUMBER of SCANS TO READ = 0. Thi
So what happens when you put WAIT functions in the loops?
I would suggest using a WAIT function for 100 mSec or so in the main
loop. If you don't have that, the main loop will poll your button at
a million times per second or more. There's no need to poll the thing
that fast - it will starve any other loops.
It means that you will respond to the QUIT bu
I browsed for the unix folder using safari.=A0
If you tried what I suggested, you might have better luck.
--3643137.1082680681924.JavaMail.quiq.tekken
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
I'm not sure if it will help or not, but I have attached the detailed
instructions I wrote up when wrestling with this last year.
I needed C++ in a DLL (not CIN), and detailed th
you will need to change both the Strings and Value property node.
Drat - that's the part that breaks my code. Well, it doesn't "break" ,
but it's now uglier than it used to be.
Thanks for the info.
OK - that occurred to me that there could be 4 values of V, but I
wasn't sure. (It's good in my case).
I had always thought about it in terms of callers - there is one V for
each caller instance. But if the caller is reentrant itself, then S
has FOUR callers, EVEN THOUGH there are only two instanc
OK, thanks.
The confusing thing for me is that S would have FOUR callers (and thus
FOUR values of V), even though there are only TWO instances of it in
the code.
I understand some things about reentrancy:
Say my SubVI "S" has an uninitialized shift register that is supposed
to remember some value "V" from one call to the next.
If S is normal (not re-entrant), and S is called from two or more
places, then there is only one V - each caller would interact wi
I have a ring control.
While the program is running:
1... I set its strings array to { "A", "B", "C" } via property node.
2... I set its value to 1 or 2 (by selecting "B" or "C") via mouse.
3... I set its strings array to empty.
4... The control now shows a "<1>" or "<2>" in LV7, where it show
Not enough information - you don't say how long the angled line is to
be.
Suppose your baseline goes from {X0,Y0} to {X1,Y1}.
Your Angle point is {X2,Y2}
Your angle is A (in radians)
The cosine C = cos(A), the sine S = sin(A).
You have to pick a length L.
Then your end point {X3,Y3} would be {
"Framing Error" in an RS-232 context means a very specific thing -
when the receiver was expecting a stop bit, the line was not in SPACE
condition. This can be the result of:
1... Baud rate mismatch (although other problems would likely crop up
first).
2... Data Length problem, If I send 8 data bi
Three ideas:
1... Use CTR GROUP CONFIG to set up two counters.
Use CTR MODE CONFIG to set up MODE 3 (Count Continuously), using
an internal clock timebase.
Use CTR Control to start the counters.
Periodically:
Call CTR BUFFER READ to check the backlog of readings waiting
It seems your solution would be to either move the controls to
allow enough space for the enlarged fonts?
My solution, such as it is, is to space things so that labels with
either large or small fonts work without overlapping, and while
maintaining alignment with the numeric (or other) field they a
All right, well, your statement that "to change the monitor's settings
for dpi from something above 100 to something below." is what strikes
me as wrong. I don't think you can tell the MONITOR to change DPI for
text, but not for graphics.
IN ANY CASE:
IT IS A FACT that on my system, if I set a la
Well, we know that the VOLTAGE resolution is 20 V divided by 2^11
steps = 0.009766 Volts per step.
Suppose your LVDT produces 0-5 V for a displacement of 0-10 inches.
That's a factor of 10 inches divided by 5 Volts = 2 inches per volt.
Multiply 2 inches per Volt times 0.009766 Volts per step, and
ignoring the font choice and sticking to the small fonts would e.g.
be better."
Well, what I don't like about that is that it doesn't respond to the
user's settings.
Presumably, he switched from SMALL to LARGE fonts so he could maybe
see larger fonts. If the text on MY program doesn't get bigger w
the way
small and large fonts work is primarily to change the monitor's
settings
for dpi from something above 100 to something below.=A0 This affects all
graphics using text measuring system, mostly text, and decides how
many
pixels they use to get one mm or one inch of screen.
Sorry, but that's
how am i wasting 2 bits.
By using only one fourth of the input range, you are in effect
throwing away two bits (2^2 = 4)
since the full scale voltage reading is 0 to 5 volts then should it
not be 5/2048 resolution.
But you said the resolution of the CARD was +/- 10 Volts. The card
doesn't know th
For years, I fought with LabVIEW, trying to keep things looking decent
in both Windows LARGE and SMALL font sizes.
By this, I mean Settings - Control Panels - Display - Settings -
Advanced - General - Font Size
I love to use large fonts - I run my display at 1600x1200 and it just
looks better.
11 bits resolution (an unusual number, by the way) is equal to 2^11 =
2048 discrete values that a single reading can take.
If your card has a range of +/- 10 V, then that's a 20-volt spread,
divided into 2048 steps (I'll assume -1024 to +1023).
That means you have a resolution of 0.009766 Volts. (2
You're probably tired of hearing me say this, but the global function
idea is the best.
A global variable makes a COPY of the data each time you read it. That
takes time, and memory. If each of 3 window reads the global, and
picks out a channel, then you've made 3 copies of the original data.
Depe
The "problem" I mentioned won't be from the code itself. It will work
just fine, insofar as it won't crash or puke or anything.
But I don't know your requirements.
The (potential) problem comes from this:
Suppose the DAQ posts new data every 1000 mSec.
Suppose each window replots every 1000 mSec.
No. Do NOT make it re-entrant.
Your read and write operations should be quick.
Assuming you don't have any issues about exact synchronicity between
the windows, you're good to go.
this global function it will simply be a VI
Correct.
that is not reentrant
Correct.
that I will stick on every plot
Correct.
and the main form.
Correct.
So I would have the main form contiously aquiring this data and
writing to the global function?=A0
Correct.
I am writing a proposal to add an e-mail notification feature to a DAQ
app. In looking at the examples, sending the message seems simple
enough
EXCEPT
I know my own e-mail provider requires authentication to send any
e-mail ([EMAIL PROTECTED] spammers!). There is a separate password that is
se
OK, the WAIT ON OCCURRENCE will solve that for you.
They have a TIMEOUT input.
Set it to 500 mSec or something, and that thread will not occupy the
CPU until A) triggered, or B) timed out. You can tell the difference
from the output and respond accordingly.
My guess is you have missed something.
If the graph windows are waiting on occurrences, they should be
waiting most of the time, I would think.
If you have no signal generation, then I presume you have no updates,
which means the graph windows never do anything except whatever your
timeout functio
It was nothing.
FYI:
I just measured the SIMULATE SIGNAL express VI at 628 uSec to generate
the default signal (100 samples, 1000 Hz)
I just measured the SINE PATTERN vi (old standby for me) at 18 uSec
(100 samples)
That's 35x speed improvement.
Maybe express IS your problem...
I have never used Waveform type. It does nothing for me. You are not
forced to use that type - the EXPRESS VIs are for speed of CODING, not
speed of execution.
In the manuals for the RT (real-time) module (a project I am
currently working on), it says something to the effect that you should
nev
Occurrences have been around since LabVIEW 3, I think. Notifiers have
not.
I don't know who recommended Notifiers over occurrences IN GENERAL.
All you're interested in is the fact that an update OCCURRED. When
that happens, you will call the Data Source VI and ask for some
channel's new data.
A
Great, thanks.
I'm not an expert on the low-level stuff. So I'll have to parse the
RFCs and emulate what a regular mail client can do.
As long as that's possible, I'm OK...
Thanks for the pointer. It didn't work out of the box, but I'm still
trying.
If LOOP A has the graphing VIs and Loop B has the UI stuff, then Loop
A ought to run and run and run, whatever happens in loop B.
You can prove (or disprove) this by putting an indicator on the [i]
variable of your graphing loop. If it stops when you adjust the
combobox, then you have some sort o
I fixed the focus problem by changed the window property to
floating.=A0
That's not a good fix - although the focus quits flashing, the windows
don't - you can't control the Z-order (who's in front). Overlap the
windows and see.
The occurrences simply controlled the launching of the windows, not
If you have a re-entrant VI in each plot window, then they are NOT
showing the same data. The re-entrant attribute means that each copy
of the VI has its own data space. In your sine-wave example, the
results might be the same, but it's really two (or 3, or 4...) copies
of the same data - not mult
I don't think you can do that. A LabVIEW enum includes the string
names as part of the data type. You cannot change the data type of a
control or indicator programatically.
If you use a TEXT RING or a MENU RING, then you can get approximately
the same behavior - you can set the STRINGS property of
I don't have time to figure out xeactly what you're doing, but here's
some ideas from a previous project I did - maybe they'll fit:
The project had one main window, and six sub-windows.
The main window had a button for each sub-window, to call it up.
Each sub window ran on its own, offering a di
A global function is a VI whose principal job is to store some data
(typically in the shift registers of a WHILE loop with LOOP set to
false).
At one time (LabView 2 and earlier) there were no global variables.
The way you stored something for use by two or more independent VIs
was to have a VI wi
Occurrence refnum controls are on the REFNUM palette - you can pass
them thru connectors, or make globals out of them. Or you can pop up
on the GENERATE OCCURRENCE terminal and choose CREATE INDICATOR or
CREATE CONTROL.
The Shift Reg. is just a place to store them. You could probably use
global va
why do you put them in a shift register?"
Also, at the time, I didn't realize that Occurrences were special, in
that a given instance of the GENERATE OCCURRENCE function will always
refer to the same occurrence, even if it's been called before. In
otherwords, the function that generated them didn'
The way I have wrote it causes the windows to lose and gain focus
as expected.=A0 Does anyone know how to stop the focus from constantly
changing?=A0
The focus is changing because the execution is changing (in the same
thread). You have the VI with the graph execute, and then quit. This
will lose
You have a rather hairy state machine going on (I looked at your code
again).
The difference I see is that you have ONE button which spawns window
#1 or window #2 or window #3, depending on who's up already. But the
logic to support that is part of the polling process of every loop.
My app had one
thats really similar to what I am doing its just that my main form
sends data which is causing the flashing.=A0
--- I would suggest putting the data into a separate global function
(better than global variable for non-trivial amounts of data), and
letting the "slaves" pull it out. At least that's
Are you using the standard SAVE dialog? Or are you using a custom VI
as a dialog?
If you're using the standard box, you can't change its location. You
could move the window that calls it (the one with the info you want to
see). Make it bigger, move the buttons to the outside edge, whatever.
You
made sure that I used=A0 backslashes in the path for the write jpeg
vi for the unix server.
Backslashes are a Windows separator - it's not universal. Mac uses
":" as the separator (for historical reasons - even though it's "/" in
the Mac command line. You need to compose your path using colons,
Ruido.
Your XY Chart only shows the most recent capture.
If you want to have an array of them, you have to build an array.
Put a shift register on the WHILE loop.
Initialize it with an EMPTY array of X-Y pairs.
Inside the CASE TRUE, append the new X-Y pair (you just captured) to
the shift register left
It's not clear to me - are you reading the data from the A/D, or are
you reading the data from files?
If you're reading from files, then you have to know the file format.
I would GUESS that the files would be an array of I16s - signed 16-bit
integers, with four bits wasted on each sample. It's PO
I don't know about the database end of it, but you have to get the
dates into an array of strings (one date per string).
Once you have that, use a TEXT RING or MENU RING (your choice). Create
a property node for it, and put your array of date strings into the
STRINGS [ ] property of the control.
T
Your use of the terms "Waveforms" and "amplitude" implies a
measurement of many samples into one number (for each channel).
For example, if your signal was pure 100 Hz, 1.000 Volts peak, and you
captured a 0.1 second block of that signal, then you would have 10
cycles in the capture buffer, varying
making my real set of data complex by adding an imaginary part
equal to zero.
Not sure why you're doing that instead of usinig REAL FFT and INVERSE
REAL FFT.
Are you sure you're generating the imaginary array the same length as
the real array?
I just ran your problem waveform through REAL FFT and INVERSE REAL
FFT, subtracted the difference and got an error of 7 e-11 on the DC
term, and all other errors are on the order of e-14.
LabVIEW 7 Mac OS X
BE AWARE OF WHAT YOU'RE MEASURING.
I just took my own advice.
I re-measured the ADD operation by putting 10 ADDS into the frame 4
loop instead of 1
I get a loop time of 39.4 nanoseconds,meaning an add time of 3.94
nSec.
I guess the original estimate (discarding the output) was better.
My guess i
Not sure if this will help, but here's a trick I just used.
The main loop handles UI stuff - changing which channel gets plotted,
such things as that. It's a WHILE loop with an EVENT structure in it.
A separate WHILE loop needs to run every 1000 mSec. It reads DAQ data,
calculates averages, and s
< slaps head >
Well, duhhh.. I should have seen that.
If it's 999 mSec into the timeout when the "wait" event occurs, then
it will add 200 mSec to the 999, and start another timeout counter at
1199. If that one times out, then I'm sitting at 2199 mSec between
events.
Sometimes I can't see the fore
< dials into the WAYBACK machine >
If I remember correctly, that's a 68k-only version. I belive it
required 7.0 as a minimum.
So my answer would be system 7.0 - 9.1 ( I think 9.1 is 68k also).
Before you make ANY decisions about alternate platforms, the first
question you should ask (and answer) is "Where is the time being
spent?"
The PROFILE tool can help with that.
Are you initializing a new DAQ operation every time? You shouldn't.
20 RPM = 0.333 Hz = 3 Sec per rev. At 4000 clicks
I have a window that pops up, containing X-Y graphs, that are say, 600
pixels wide.
Under some circumstances, I want to reduce this to say, 400 pixels,
and uncover a cluster of numeric displays occupying the other space.
I would like to set the BOUNDS.WIDTH of the graph so that it extends
right u
The logic behind this is that the difference between the total
bounds, and the plot area is constant.
I don't think that's true, given the fact that the window may be
resized, and the graphs will scale with it.
I *-THINK-* I have it working using a dummy button, rather than a
decoration. If the
OK, that's farther up the CompSci tree than -I- can follow, but as
long as it's a known behavior, I can deal with it.
=A0 By the way, this doesn't happen at compile time as the VI doesn't
need to be recompiled for this to happen, but it does happen on load.
That makes sense, because in my real ob
When you have a shared nonreentrant subVI, and
one caller is high priority and one is lower, then the subVI's
priority
is boosted to match the higher of the callers.
--- Notice that my later tests prove that you don't need TWO callers.
The same effect is apparent with only ONE caller.
To recap: h
When you have a shared nonreentrant subVI, and
one caller is high priority and one is lower, then the subVI's
priority
is boosted to match the higher of the callers.
--- You suggested this before and all tests seem to bear this out.
but the
lower priority VI will need to go through thread context
Thanks for the link, though I'm not sure it applies.
1... I'm not using RT things - there's not an RT board present.
2... These shared resources include global variables,
non-reentrant subVIs,... -- So a non-reentrant subVI is a
"shared resource".
3... Priority inheritance allows the lower priorit
The problem with this idea is that in the case where I don't load the
dummy caller, the resource is not "shared" - there's only one call to
it! Apparently the fact that the subVI is higher priority is enough
to get it to be declared "shared", even though there's no competition
for it.
Do you ag
I am leaning toward this being the OS related.
For what it's worth, I DID verify that setting the priority of the
tester to match the dummy caller restores the normal execution time.
Also for what it's worth, I ran the same tests on Mac OS X. The same
behavior results, except that the difference
Regular VIs are greatly affected by whether the panel is in memory
and whether the panel is open.=A0 I suspect that you have eliminated
these effects, but it is always worth restating.=A0 After any of these
changes
to priorities, perform a Save All before taking any timings.
--- I understand that,
If I set the "wasteTime.VI" as sub-routine, the undesirable effect
goes away!
Hmmm - that works for me too. In the real case, the "Object" has a
subVI which has a subVI. I have to set those to subroutine as well,
because a subroutine cannot call a non-subroutine priority VI. But I
think that's O
If the OBJECT is set to: the time is :
RE-ENTRANT - NORMAL - SAME AS CALLER 11.2 mSec
NORMAL - SAME AS CALLER 28.9 mSec
RE-ENTRANT - NORMAL - OTHER1 33.8 mSec
NORMAL - OTHER1 29.2 mSec
All of that with the phony caller (that's not running) set to
How about if everything is set for the same thread? This would rule
out the thread swapping theory.
--- That's where we came in. I just double checked, and everything is
set to NORMAL - SAME ExeSys AS CALLER (Non re-entrant).
The times are about 11.4 mSec.
If I set the DUMMY priority anywhere abo
Is the "object" configured to run in the "Same thread as
caller"?
Yes.
But that doesn't explain (to me) the connection - given that one
execution path is not even running, why is the other penalized?
MORE INFORMATION:
If I make the object RE-ENTRANT, the execution time is back to
"normal", regard
MORE INFORMATION:
If I put the "Object" VI (normal priority) in a brand-new VI, the
tester shows the faster execution time.
If this new VI is set to ABOVE NORMAL priority, the execution time
balloons upward again.
If I raise the TESTER's priority to match (or exceed) the new VI's
priority, it's
It fails because there is no text in the indicator the first time.
You are setting the attributes BEFORE you set the text into the
indicator.
With no text present, you can't set SEL START or SEL END to anything
but 0.
I'm chasing a weird timing problem. LabVIEW 7.0 + Windows 2000
I have a VI (called "the Object"), whose purpose is to store and
retrieve numerical values by name.
The name is hashed, converted to an array index and the values are
read / written to an array slot.
That all works fine.
I have a
No, I program for a living.
Everything you need is in my previous answer.
For something this small, use a single VI to manage it in memory:
It has a FUNCTION input, an enum with values of (INIT, READ FILE,
WRITE FILE, ADD ITEM, FIND ITEM).
It has a CLUSTER input, which is your record type {Item number, serial
number, time stamp, description}
It has a CLUSTER output, o
90 matches
Mail list logo