Analoge shared variable read Problem

Can any body help me in reading analogue shared variable read in LabVIEW 2009 dynamic event structure. I have tried to read the above tag through Tag Reader VI but i have experienced too much delay in first read for real data i.e. Plant data from PLC. when this particular VI executes it take minutes to display the data. if some needs its code i can provide it. Thanks in advance

This seems to be a LabVIEW problem, so please post it over in the LabVIEW forum.
(the feedback forum is for problems with the website itself)
LabVIEW Champion . Do more with less code and in less time .

Similar Messages

  • Shared Variable Read Access Denied from Fieldpoint

    I've posted this in the Fieldpoint forum, but I think I may get more responses here:
    I've created a shared variable bound to a single analog input (AI) channel on my fieldpoint 2120.  When I attempt to read from this variable in my VI, I get the error:  "Read access is denied to the shared variable." 
    BUT, when I view the variable in the shared variable manager, the analog signal is updating correctly and continuously.
    Anyone know what I may be doing wrong?
    Thanks!

    Link to post in Fieldpoint forum.

  • Network-Shared Variable - read string with CVI

    I need to read an NSV string with CVI.  I have been digging into accessing and writing NSV with CVI, but they are all scalar value.  What should I do with strings, clusters and arrays?

    'm an employee at National Instruments and I wanted to make sure you didn't miss the Network Variable API that is provided with LabWindows/CVI, the National Instruments C development environment. The the Network Variable API will allow you to easily communicate with the LabVIEW program over Shared Variables (http://zone.ni.com/devzone/cda/tut/p/id/4679). While reading these links, note that a Network Variable and a Shared Variable are the same thing - the different names are unfortunate...
    The nice thing about the Network Variable API is that it allows easy interoperability with LabVIEW, it provides a strongly typed communication mechanism, and it provides a callback model for notification when the Network/Shared variable's properties (such as value) change.
    You can obtain this API by installing LabWindows/CVI, but it is not necessary to use the LabWindows/CVI environment. The header file is available at C:\Program Files\National Instruments\CVI2010\include\cvinetv.h, and the .lib file located at C:\Program Files\National Instruments\CVI2010\extlib\msvc\cvinetv.lib can be linked in with whatever C development tools you are using.
    Thomas N.
    Applications Engineer
    National Instruments

  • Why should you explicitly open and close shared variable connections?

    I'm looking into switching over from the old Datasocket API to the new Shared Variable API for programmatic access to shared variables, and I noticed that LV doesn't seem to have any problems executing Shared Variable Reads & Writes without first opening the connection explicitly. That is, I can just drop in a shared varaible Read VI, wire a constant to the refnum input, and it will work. I'm wondering, then, what benefits are offered by explicitly opening the conenction ahead of time...?
    I guess I could see some cases where you want to open all necessary connections in an initialization state of a top-level state machine, particularly if you want to use the "Open & Verify Connection"---so you could jump straight to an error case if any connections fail. But other than that, why else might one want to explicitly open the connections.
    And, along those lines, are there any problems with implicitly opening the connections? One reason why I am hesitant to open them explicitly is because for one of our applications, we need to be able to dynamically switch from one variable to another at runtime. It would be nice to just switch the variable refnum (wired to the input of the Read function), without having to manually close out the old connection and open a new one. A quick prototype of this seems to work. But am I shooting myself in the foot by doing so?
    Thanks in advance.

    I'd expect there's a very small number of people at NI that would know the answer to the detail you're asking for.  But, let's try to extrapolate from this rather old post to see if we can understand what they're forming their impression on.
    The shared variable has to have some sort of reference going on in the background.  It looks like they're calling this a connection.  It's how LabVIEW knows where to find this variable on the network.  We can also see this reference certainly exists if we're opening/closing the reference in the explicit method.  You see the connection as just a string referencing the variable by URL.  This "reference" has to be stored somewhere.  No matter how we're looking at this, we're aware there's a reference of some sort stored. 
    Now, we'd want to look at what would cause this reference to go away.  If you open/close explicitly, it's easy to see it goes away at the close.  If it's implicit, when would it make sense to close it out?  The VI can't be expected to guess where it's done being referenced and close it out.  This puts us into a situation where the soonest it could close is when the VI ends.  From my experience, references tend to be wiped when you close out LabVIEW.  It's this kind of idea that makes the FGV possible.  I wouldn't be surprised by Morgan's claim here.
    If we look at scalability, you're talking about two different topics.  You're talking about adding an extra open, close, read, etc rather than just a few wires.  That certainly would look a mess.  In terms of the dynamic swap that was being discussed, we wouldn't be adding all of those.  The concern would be if enough connections were opened it'd start to behave similar to a memory leak.  This could be something that works with a smaller number of variables.  If you continue to scale, it becomes problematic.  This is why they suggest it's not scalable. 
    To your questions:
    Does LV allocate some kind of session in memory using that string as a lookup?
    It would HAVE to allocate some memory to hold that string.  Otherwise, it'd be pointless to even have the reference. 
    Does it reuse that session if other parts of the application reference the same variable, or does it create a unique session for each referencing call to "Read Variable.vi"?
    I would expect this to be "it depends."  With the implicit method, I would expect it to open a new reference in each point it isn't wired.  This is similar to int x,y = 5;  x and y share the same value but are their own unique memory location.  If you wire the reference to the other points, it should use the same reference.  This would make more sense to me than the program seeking out any other potential usage of the variable in the application to see if there's already a reference open.  I could be wrong, though.
    And what resources does this "connection" actually represent?
    At best, this is just the string.  At worst, it's the string and the TCP socket.  I'd lean towards the first.  Opening and closing sockets should be relatively easy in most applications.  But, it also wouldn't surprise me if it holds the socket.
    I'm sure others have a better understanding than I do.  But, that's what I'd expect for anything you've asked.

  • Deploy Shared Variable Engine in localhost

    I need to talk to multiple RTs using single computer. It seems
    obvious to deploy shared variable engine (libraries) in localhost instead of
    RT. However, the problem is the shared variables (read) used in localhost VIs
    are not being updated from RTs. But when I am using another local VI to update
    the shared variable, it is working just fine. The variable path of the RT looks
    like "\\My Computer\Local NPSVlvlib\Test
    Data". I think this is the problem why the values are not being updated
    because RT cannot resolve the network path ("\\My
    Computer\Local NPSVlvlib\Test Data"). Also, I tried to change the shared
    variable path in RT but I could not do it. Help Needed!!!!
    Solved!
    Go to Solution.

    Thanks for your reply. I found in this link http://zone.ni.com/devzone/cda/tut/p/id/9900#toc2 that host computer can host the shared variable library and RT does not need the shared variable engine. See below
    If your application includes a single host computer and a single or multiple RT targets it is recommended to host the library on the host computer. This will save memory and processor time on the RT targets. Also, by hosting the library on the host computer instead of the RT target, you can reduce the software install footprint on the RT target. The RT target will not need the Network Variable Engine, but will still require Variable Client Support. The Network Variable Engine allows hosting, the Client allows communicating with libraries on other machines. You can see a RIO target with these installed in Figure 4.
    That exactly what I am trying to do. Any comments? 

  • Shared variable clusters not working as intended

    Hi All,
    I've been using shared variables to communicate between a host computer and a crio real time target.  This works well as simple variables.  I configured a cluster of shared variables to try and clean up the code a bit.
    I have a couple of problems.  If I write to a single element, using bundle, the other elements in the cluster that I do not want to write to are overwritten with some unknown default value.   Second, when the host computer program is stopped, the cluster on the RT host writes what appears to be default values to all the variables in the cluster on the RT.  The idea is to keep the RT program running in it's current state until the host computer recovers.  Of course this is impossible, if it resets all the data to default.
    It appears that I can only write to a cluster on one side and read on the other side.  I cannot read/write to the same cluster at different points on the host and target machines.  With a single shared variable, I can read/write to my hearts content on any process.  I haven't been able to find a way to solve this.
    I will post the code, but you will need a cRIO to run it.  If anyone is using clusters in shared variables, I'd be curious to see how you are doing it.
    Thanks,
    John
    Solved!
    Go to Solution.
    Attachments:
    host cluster test.vi ‏25 KB
    rt target cluster test.vi ‏25 KB
    Params 1.ctl ‏6 KB

    That makes some sense, what I can think of is you are writing to the same cluster in two different places. Each place updates both values so if the host writes B1=False and B2=True then the Rio Writes B1=False and B2=False then the variable will have the latest value of both being false.It's a loop condition.
    Even though you are only setting one value in the bundle by name the other value is coming from the cluster input to the bundle by name.
    To handle this you will need remove the input cluster to the bundle by name and replace with the shared variable read. This is where you may need a delay to ensure the variable has the most recent updated value.
    Also you still have the coercion dots. For the shared variable try linking it to the custom control instead of a undefined cluster (Next choice below in the SV setup)
    Robert Fogg
    Certified LabVIEW Architect
    Attachments:
    host cluster test.vi ‏27 KB

  • VI cannot find shared variable in engine despite successful deployment

    I am unable to use Shared Variables to communicate between VIs located on my PC and the VIs located on my cRIO-9014.  This is a new development as I have been running the same VIs for over a year without this problem.  The only recent development is that the IT department at my company installed new virus protection software and changed some windows firewall settings on the PC that I am using.  This problem first began as soon as I got the PC back from IT.  I have since unblocked LabView in Windows Firewall but that has not fixed the problem.  The error I get every time I try to read a shared variable on the real time target is:
    Error -1950679035 occurred at Shared Variable Read in RT Interface.vi
    Possible reason(s):
    LabVIEW:  (Hex 0x8BBB0005) Unable to locate variable in the Shared Variable Engine.  Deployment of this variable may have failed.
    I have redeployed all of my shared variables and according to LabView the deployment was successful, yet I still get this error every time.  Is it likely that something the IT department did with the Antivirus/Firewall software has blocked communication between the cRIO-9014 and my PC?  I have used Measurement & Automation Explorer to check communication with the device and as far as I can tell everything seems fine.

    After adding LabVIEW to the exceptions list of Windows Firewall, my issue seemed to be cleared up.  I am now getting the same error message once again, but now I get it every time I run a VI with shared variables and it actually pops up an error message asking me to continue or stop.  Again, according to LabVIEW the shared variables deployed successfully.  I looked at the two KB articles that were posted and it seemed like this error has three causes:
    1-Unsuccessful deployment - everything seems to have deployed
    2-Firewall Issues - were taken care of to fix my original problem
    3-Shared Variable Engine not running
    I've looked around and I found a reference to 'repairing' the shared variable engine but not a guide for how to do that.  I have opened variable manager (I am using LabVIEW 8.5) and have stopped and started the shared variable engine with no effect.
    What are steps I can take to ensure the Shared Variable engine is running properly?

  • Network Shared Variable: Aliasing not working

    Hello!
    I am running a cRIO 9075, which is publishing network shared variables.
    I can see and modify them within Distributed System Manager.
    Unfortunately I am not able to read/write the variables through labview.
    What I have done so far:
    Tools -> Shared Variable -> Register Computer, using the IP of the cRIO
    Adding a Variable to the project. Type = Network-Published, Enable Aliasing, choosing "Browse" to select the variable (all published variables from cRIO are shown there), Access Type = read/write. The PSP-URL is: \\192.168.10.70\WaveformManager\Op
    Trying to read the variable results code -1950679034 and the result is always the default value for that data type.
    BUT this works: using the VIs Data Communication / Shared Variable / Read/Write Variable  and typing in the same URL the Distributed System Manager is showing is showing (in my case: \\192.168.10.70\WaveformManager\Op)
    So, what am I doing wrong? Did I forget something or misunderstand how "Aliasing" works?
    Thanks!

    hi,
    in which way to you read your shared variable? If you read it before you write  a value "into" the variable it may couse this waring.
    Have you tried this?
    http://digital.ni.com/public.nsf/allkb/7DBC2C3E95AFD85C86257442005CF74C?OpenDocument

  • Datasocket and Shared Variables

    I am curious if there is any advantage to using Datasocket to read/write shared variables (as opposed to a direct read/write).  I'm specifically talking networked shared variables here.
    Is there any speed advantage to accessing shared variables thru the Datasocket functions?  Since both a direct read/write and a Datasocket PSP read/write talk to the same variable engine I assume they are equally efficient but I'm looking for confirmation here.  I've seen benchmarks for shared variable performance but none of them use DS/PSP to access the variables.
    Normally I would not even think of using Datasocket to access shared var's but where I currently work we have a large app that does this and it works great.  I suspect that this functionality only exists in LV8.x for backward compatibility and non-Windows OS compatibility and is not really meant to be used for new, Windows-based apps?   Am I off base on this?
    I am working in LV 8.5, BTW.....

    Hello Jared,
    Thank you for the reply with clarification. 
    Based on your comment, I changed the buffer parameters and also tried the programs with two different data types, previously StringArray and now String.
    In the attached LV8.6 project, you have all the programs, and shared variable library to review my tests. 
    There are two sets of two files - each set has a Write Shared Variable and Read Shared Variable file. One set is for StringArray type Shared Variable (named StrArr in the library), and the other set is for String type Shared Variable (named Str in the library).
    String Array example:
    MultipleDS-Write-SharedV-StrArr.vi / MultipleDS-Read-SharedV-StrArr.vi
    In my String Array shared variable, I use only 4 element array, each having 4 character strings - meaning 16 bytes per String Array data. I have two loops in the write file, writing to the same variable, an array of 4 strings, each loop continues until the loop index is >0. This means, sometimes, depending on the processor speed, the variable will be written 3 times or 4 times (the variable could have a new value before the loop condition is checked).
    So this means, if I have buffer of 100 bytes (16*4=64<100), it's enough for 4 such arrays (of 4 elements, each element with 4 characters) could be buffered to have sufficient time at the client (Read) program to read them. 
    I am putting 2048 bytes in buffer, which is much more than sufficient in my case. 
    The writer loops run with 200 ms to wait for each iteration. The reader loop runs with 100 ms in DS timeout and 100 ms in wait timer. This gives results without any loss. However, if I run the reader loop with 1000 ms to wait for each iteration, the data is lost. The buffer is not maintained for 2048 bytes.
    In the read program, just to make sure if all data is read or not, I am showing data in two different string indicators, showing data of each loop.
    String example:
    MultipleDS-Write-SharedV-Str.vi / MultipleDS-Read-SharedV-Str.vi 
    The String Array shared variable didn't show values in the Distributed System Manager. Hence, I created another simple variable with String datatype.
    The writer program writes strings of 4 characters, one-by-one, in two loops. Meaning, total 8 strings of 4 characters each are written in the "Str" Shared variable. 
    The reader program, however, doesn't always display all the 8 strings. Although the wait timer is not high (slow) it still misses some data usually. Data is overwritten even before the buffer is filled (in buffer, I have defined 50 strings with 4 elements in each).
    In both of the Read programs, I read using datasocket. I think thought datasocket has more ability to buffer. Earlier I had "BufferedRead" in DataSocket, which I have changed to just Read, because BufferedRead didn't give any special buffer advantage in the Shared Variable reading.
    ---- This is an update on the issue. 
    Ok, just while typing the last paragraph above, regarding datasocket, something clicked in my mind, and I changed the DataSocket functions to simple Shared variables (completely eliminating datasocket functions) in the read programs as well. And bingo, the buffer works as expected, even if I have reading loops very very slow, there is no data loss in any of the program sets. 
    The two changed Read programs are also included in the attached project - MultipleSV-Read-SharedV-Str.vi and MultipleSV-Read-SharedV-StrArr.vi
    So this means, I can completely eliminate DataSockets (not even using PSP URLs in DataSocket Open/Read functions) from my programs. 
    One question here, what will be an advantage of this (or any side effects that I should be keeping in mind)?
    Vaibhav
    Attachments:
    DataSocket.zip ‏71 KB

  • Labview shared variable

    Can any body help me in reading analogue shared variable read in LabVIEW 2009 dynamic event structure. I have tried to read the above tag through Tag Reader VI but i have experienced too much delay in first read for real data i.e. Plant data from PLC. when this particular VI executes it take minutes to display the data. if some needs its code i can provide it. Thanks in advance

    First one is On value Change Event Structure
    and Second one is Through Read Tag
    Attachments:
    On value change event.vi ‏24 KB
    Read Tag.vi ‏20 KB
    On value change event2.vi ‏22 KB

  • Shared variables + timed loops + naming conventions + how to find all

    Being almost halloween, thought I'd share some more eerie behavior I've noticed with shared variables.
    1st strangeness with timed loops already mentioned here:  http://forums.ni.com/ni/board/message?board.id=170&message.id=209475
    2nd strangeness:  If you have a shared variable that is network-enabled, it is OK to use a "?" in the name (eg, "RT_Simulate?"). 
    However, should you decide to change that variable to single-process, or if you create it that way in the first place, you will get this dandy message from the broken arrow you now have:
    "LabVIEW could not generate code for the shared variable. You must open the VI in the project that contains the library where the shared variable resides."
    ..............whaaa?????      Loosely translated, this seems to mean "Don't use a "?" in your single-process variable names."
    3rd strangeness:  I don't know if this has been mentioned before....
    If you have an application that references a network shared variable, and the library has NOT been deployed, the app will hang for some time (approx. 7 seconds! on my machine) before returning with an error.  This seems to be the case whether or not the error ins/outs of the variable are wired.  This looks bad to me, and I'm not sure what is causing it (some sort of timeout when attempting communication with the SVE I assume).  Has anyone else noticed this?  It should be easy to reproduce.  Any ideas?
    I haven't done any bug notifications yet, but will do if there are no positive solutions by next week some time.
    -Have a Great Halloween Weekend

    WHAVEman,
    Currently (as of LabVIEW 8.20) there isn't a way to programmatically interact with the shared variable engine outside of using DSC. If you had DSC you could "hack" a way to determine if a shared variable was deployed.
    I think the best way to get around your program hanging is to have an initialize state where you write a dummy value to each variable. If the variable isn't deployed, then you should get an error out of the shared variable. Problem is that there's probably going to be a timeout associated with determining if the shared variable is deployed. But at least you can use the information from your initialize state throughout the rest of your deployed application.
    Chris C
    Chris Cilino
    National Instruments
    LabVIEW Product Marketing Manager
    Certified LabVIEW Architect

  • Problems reading from bound shared variable

    I have a shared variable that is bound to another shared variable.  When I go to read it's value in a VI by wiring the variable to the "value" property of a digital numeric object it displays zero.  When i look at the two shared variable in the variable manager they show the correct values.  Does anyone have a clue what's going on?

    Welcome to the forums!
    Let's narrow down the possibilities here.  Try wiring the shared
    variable directly to a front panel indicator rather than using a
    property node.  Second, the shared variable object includes an
    error out terminal - this is where the variable engine can report any
    errors in obtaining a value from the bound item.  Wire the error
    out to an error handler VI and re-run - you may find that the Shared
    Variable Engine is reporting an error, which would be most helpful in
    determining the problem. 
    If you could let me know the results of the above suggestions, I'll be glad to help further!
    Cheers,
    Matt Pollock
    National Instruments

  • Problema di polimorfismo con Read/Write delle Shared variable

    Salve,
    Cercando di modificare l'esempio di progetto "Shared Variable Client/Server" in un progetto dove sono i diversi client a mandare dati al Server ( ovvero l'esatto contrario di quello che fa )
    mi sono inbattuto nel problema illustrato nelle due figure che seguono.
    Ovvero, sostituendo "Writable PSP Variable" ad "Readable" nella scheda "Connect"(FIGURA 1) mi da un errore nella scheda "Read/Write" (FIGURA 2), ovviamente anche qui ho sostituito a "Read Variable" un "Write Variable".
    Mentre utilizzando il Data Socket funziona, ma non mi sono chiari i vantaggi e gli svantaggi nell'utilizzare quest'approccio.
    Qual'è la strada migliore tra Shared Variable e Data Socket per creare un sistema Client/Server così costituito, ovvero con un cospicuo numero di client da servire ( destinato a crescere  )che mandano simultaneamente un discreto quantitativo di dati ( circa quelli di una seriale a 115200bps ) ad un server
    FIGURA 1 
    IMMAGINE 2

    Translation 
    Hi,
    Trying
    to modify the sample project "Shared Variable Client / Server" in a
    project where different clients to send data to the server (ie the
    exact opposite of what it does)
    I untapped in the problem illustrated in the two figures that follow.
    That
    is, replacing "Writable PSP Variable" to "readable" in "Connect"
    (Figure 1) gives me an error in "Read / Write" (FIGURE 2), and of
    course here I replaced "Read Variable" a "Write Variable.
    While using the Data Socket works, but I have clear advantages and disadvantages of using this approach.
    What
    is the best route between Shared Variable and Data Socket to create a
    client / server system so constituted, or with a large number of
    customers to serve (to grow) that simultaneously sends a fair amount of
    data (approximately those of a serial to 115200bps) to a server
    The images points to a gmail location. It is not properly attached.

  • Problems writing to network published shared variable hosted on rt (set as modbus slave for crio)

    Hello Ni Forums
    This is my first post on this forum and I have been using labview for about 8 months now
    I have a problem regarding writing data to modbus registers through an i/o server set as a modbus slave for my 9074 hardware.After I have completed building project and deploying the variables and following instructions from here , it yields no result but a line zeros. I have the Ni DSM open and modbus master setup to see whether the data is actually being read/written from the respective sides which both yield the same line of zeros as well.  What I am actually trying to write to is an array of single precision floating data. The registers are structured from ranges F40000-F46534 for 10 elements or have them for range AF40001L1-AF46534L1 of item AF40001L10 where it is an array of length 10. (Referenced ranges here)
    I know 1 thing for sure, the modbus connection works and is ready for data requests, I tested this through NI DSM and manually set data for and my master received them . 
    System and Project specifications
    Windows 7 OS
    Labview Full Development System 2011
    No Labview DSC module but I am using the real time module as referenced by one of the documents
    This project is a real time application with fpga mode (not scan interface mode)
    The master and slave are the same subnet and network
    Modbus Connection Type: TCP
    9074 compact rio 8 slots
    9234 module x3 
    9221 module x1
    9472 module x1
    Shared Variable Engine service running on windows os and rtos system 
    Used this  guide to learn about the modbus protocol as I searched all over the internet to learn about modbus 
    I already having Modbus IO Server software installed on the crio through ni max version 1.8 for NI RIO 4.0
    attached file(s)
    Image of Crio software specifications
    Image of the Data being written into variable in rt block diagram
    Short Version of the problem: Why is the io variable not being written into with properly converted data?

    The data can have zeros but not all of them will be zeros and I have another program (on local computer for database storage)that is recieving the same data through TCP and they are not zeros. 
    If a machine is running and is active then the data that will be collected should not be zero , it should infact  be some analog value > 0.
    I will look into the function you described
    How do you view the errors in the IO server subfolders ?
    Is it the modbus register called error status that returns an error code if so that value is currently 0 
    Regards mzamstl
     

  • Problem with dsc shared shared variables and error 1950679023

    I'm having trouble using shared variables on my laptop PC (with Windows XP) using Labview 8.2 and DSC.   I've set up a simple project with one VI and one shared variable library.  In the VI, I have  a while loop that writes a number from a front panel control to the shared variable.  Another loop running in parallel reads the shared variable and displays to an indicator on the front panel.   The VI resides on my PC (no remote targets). This program executes just fine on my desk top PC; however I get the following error codes out of the shared variable nodes when I run the project and VI on my laptop for the write and read, respectively: ni_tagger_lv_Write 180121604 ni_tagger_lv_Read -1950679023 I've tried to manually deploy the shared variable library without success. The NI knowledge base  and other entries on this forum suggested that the Windows firewall should be disabled for a quick fix, however, the firewall was already disabled on my lap top. I didn't see any entries regarding the 180121604 error code.
    Any suggestions would be appreciated.

    The problem has mysteriously gone away.  For about the 10th time, I manually deployed the share variable library, and it started to work properly.

Maybe you are looking for

  • Any solution for incomplete Web pages without installing SP8?

              Well i have the same problem with incomplete web pages on WLCS 3.2 SP6 and Weblogic           5.1.0 ... Is there any solution without installing SP8 ?? Thanks by advance           "newsgroups.bea.com" <[email protected]> wrote:           >W

  • Printing of cheque under company code instead of business area

    hai sap gurus pls help us in this issue At the time of running automatic payment program separate cheques were printing to a single vendor as per business area, now the client is asking that single cheques is to be issue to the vendor under company c

  • How can I get credit for movie that I am unable to watch on AppleTV

    I ordered to rent "The Hobbit" over a week ago to watch on my AppleTV, but every time I tried to start movie, keep getting error message and to try again later. I have tried more than 5 different times since, still unable to watch movie.

  • How convert pdf,xls file format into swf

    Hi friends                i am making a tool for wducation site and there i need to convert doc xls and pdf file in swf in runtime and show that in container with cropping and panning functionality.so i do it for doc file format but having no idea ho

  • Add multiple gradients.

    I've found this tutorial on adding multiple gradients to form a glassy text http://wegraphics.net/blog/tutorials/illustrator/how-to-create-a-glassy-text-effect-in-ill ustrator/ and I never knew you could create multiple gradients on one object. I can