Triggered DAQ from a LabVIEW-compiled DLL

Bit of an obsure one here:
I have a DAQmx task on a NI PXI-6052E device that is started by an external hardware trigger (a rising edge on PFI0).  The task commands the acquisition of 200 or so samples at around 3 kS/s, after which it waits for the next rising edge trigger.
This works fine when run from the LabVIEW IDE (2010) itself, and also when run from a compiled Windows executable.  But when run from a compiled DLL, it doesn't - it waits until the timeout expires and returns no data.  The trigger pulse is definitely still arriving at the card, so I can only assume that I am doing something wrong, or that it's a bug with LabVIEW.  (Googling and forum searching gets me nowhere, so I'm beginning to think I might be the first person in the world to try this )
Switching out the real DAQ device for a simulated one in MAX makes it work, presumably because simulated devices don't do triggering anyway.  Removing the trigger and making it run freely also gets it to work, but the triggering is essential to my application.
Any ideas?

Hi Ian,
I will help you find a solution for this issue you are encountering. Firstly, can I ask you for a few more details regarding your application.
Can I check that you are compiling the VI through a build specification in your project explorer. Does this project contain any subVIs or does it just use the one standalone front end VI.
Are you then trying to call this DLL function back into a LabVIEW development environment? or are you calling it into a different program, TestStand? Visual basics? If you are using a program other than LabVIEW can your try calling it from the LabVIEW Development Environment where you created it.
Also, how are you calling the DLL. DLLs can be called statically and dynamically, the differences have be outlined in this KnowledgeBase article.
Could you also refer to this KnowledgeBase which outlines the method for building a DLL in LabVIEW. Check to ensure you followed all the required steps. At the bottom of the article there are useful links which provide details on how to call DLLs.
Sorry for asking so many questions but the answers to these will really help me understand your issue.
Many Thanks,
Aaron. E
Applications Engineer Team Lead
National Instruments
ni.com/support

Similar Messages

  • I get error 998 when calling a LabVIEW buildt DLL from MSVC++

    I created a DLL in LV 6.0.2. This DLL contains 39 VIs and controls. 13 of the VIs are exported, the others are subVIs, which one of them is a dynamic VI.
    I do not have all connectors used by defining the VI prototype in the build file for the application builder.
    Using this DLL I get four effects:
    From LV 6.0.2 FDS all works fine until I quit LV immediatly after the application VI stoppes. Then LV wants to save some of the VIs of the DLL.
    If I do the same but close the VI before I quit LV one want save anything.
    After Building an exe from the application VI and running the exe all works fine. The VI will only stop and if I close or quit noone wants to save something.
    Then I built an application with M
    SVC++ 6.0 using this DLL. There will be no errors or warnings during the build. If I start the application i get an error message dialog with the number 998 stating "system error loading LV Runtime engine. My application needs a Version 6.0 or compatible Runtime-engine". The path to teh Runtime-engine is given in the dialog and the lvrt.dll there has version 6.0.2.
    Does someone run on such a problem?
    Has someone a solution to this?
    Waldemar
    Using 7.1.1, 8.5.1, 8.6.1, 2009 on XP and RT
    Don't forget to give Kudos to good answers and/or questions

    Waldemar,
    I. LabVIEW wanting to save VIs
    The DLL created is just a group of VIs, not actually compiled DLL code. When the subVIs are called, they might be cached from the disk copy, not the one in the DLL. LabVIEW then loads the separate copy of that subVI. It will then ask if you want to save changes because there were value changes when it was run (this makes since) or it is in LabVIEW 6.0 version and has not been mass compiled for LabVIEW 6.0.2. When it is compiled to an exe, the search path for the subVIs goes through the executable and not the LabVIEW development environment. Also, saving VIs is not an option in an executable so the save dialog does not pop up.
    II. MSVC++ error
    This is actually a Microsoft issue. It has something to do with static and
    dynamic linking of the MFC DLL. Our R&D engineers have verified this with projects created with no LabVIEW code at all (that is why we believe it to be solely a Microsoft issue). There are three options at this time:
    1. Link with the DLL form of MFC.
    2. Do not link with the .lib from the LV DLL, instead use LoadLibrary and GetProcAddress to dynamically load the DLL and call the function.
    3. Use the VC delayload feature to make the LV DLL not get loaded until the first call is made into it. See VC help on "delayload" for information on setting this up.
    Randy Hoskin
    Applications Engineer
    National Instruments
    http://www.ni.com/ask

  • How to use matlab compiled DLL in Labview ?

    I have LV 8.5, and am unable to use a matlab compiled DLL in my LV code. I have tried the 'import'  command, but it does not list any functions. However, it does not show any errors during its execution. The existing solutions/responses to this question do not work either. I would also like to know of a way to deal with mxArray datatype. What is its equivalent in C (or any other high-level language) ? How do I retrieve an array that is returned from the matlab dll ?

    I'm assuming you have either Matlab installed or at the very least the Matlab Runtime, otherwise the DLL won't work. The "import" command relies on having a header file. Do you have one? You also need to make sure the DLL has been compiled so that it's compatible with LabVIEW. The most likely problem is name mangling, which also occurs when you try to compile a DLL written in C++. See this post, which contains links to useful posts.
    The mxArray datatype is a special datatype which is actually a structure. It's complicated. Your best bet is to create a C DLL that acts as an intermediary between the Matlab DLL and LabVIEW. If you are able to, you can, instead, simply call the Matlab code directly using the Matlab script node.

  • Is it possible to call an executable of compiled c code from within LabVIEW?

    I can compile 'genesis' (the name of the code we are planning to use) under unix: it produces an executable which can be
    linked to user-constructed c files which contain specific crossover and/or
    mutation strategies, so once a user has the executable, it is not
    neccesary to re-compile the main GA everytime a user mucks around with the
    combination rules. I think that a question is, can you call the (or any)
    executable from within LabView?
    Thanks
    Alan Homer

    You can call executables using the System Exec VI, which can be found in the Communications palette.
    Try to take over the world!

  • How pass VISA resource string from C++ as uintptr_t* to a LabVIEW generated DLL ?

    My coworker build a DLL from LabVIEW that I am trying to call from C++.
    void__cdeclMeasureDCvolts(uintptr_t*VISAResourceName, int32_tChannelNumber,LVBoolean*MonitorResult,double*MeasuredVoltage, TD1*errorOut);
    Does "extcode.h" define macros or functions for string conversions?  Or should I request my coworker rebuild the VI's to make arguments more C/C++ friendly?
    Thanks in advance for any tips or direction.  Examples are * much * appreciated.
    -Ed
    TestObjectMeasurement* testObjectMeasurement = m_measurementMap[name];
    TestObjectInstrument* testObjectInstrument = m_instrumentMap[selectedInstrumentName];
    int slot = 1;
    int bank = 1;
    int channel = 1;
    int channelNumber = 1000 * slot + channel;
    char * visaResourceName = testObjectInstrument->visaResourceName().toLatin1().data();
    LVBoolean monitorResult = LVBooleanFalse;
    double measuredVoltage = -1.0;
    TD1 errorOut = {0};
    try
    // void __cdecl MeasureDCvolts(uintptr_t *VISAResourceName,
    // int32_t ChannelNumber, LVBoolean *MonitorResult, double *MeasuredVoltage,
    // TD1 *errorOut);
    MeasureDCvolts(reinterpret_cast<uintptr_t*>(visaResourceName), channelNumber, &monitorResult, &measuredVoltage, &errorOut);
    catch(...)
    qDebug() << "Exception thrown by: MeasureDCvolts";
    QString errorSource = QString::fromUtf8(reinterpret_cast<const char*>(LHStrBuf(errorOut.source)), LHStrLen(errorOut.source));
    qDebug() << errorSource;
    LStrHandle errorTextHandle = {0};
    bool foundErrorText = NIGetOneErrorCode(errorOut.code, &errorTextHandle);
    if(foundErrorText)
    QString errorText = QString::fromUtf8(reinterpret_cast<const char*>(LHStrBuf(errorTextHandle)), LHStrLen(errorTextHandle));
    MessageHelper::messageError(errorText, errorSource);

    Why is it not a solution? It was exactly about what you wanted to do and the solution in the last post is how it can be made to work. There is NO way to ddirectly create a LabVIEW native VISA resource in C code that is not called from within LabVIEW, unless you consider hacking the LabVIEW system and using undocumented functions a solution. But that has very good chances of breaking with future LabVIEW versions.
    Your only other option is to export another function from the DLL that accepts a String and uses VISA Open to explicitedly open the VISA session in your LabVIEW DLL and returning that VISA session to your C code. This is functionally equivalent to passing a String to your current function but avoids the lookup and potential recreation of the VISA refnum on each call. Something I would only feel bothered if you intend to call this function many thousend times each second, which for VISA communication seems very unlikely.
    Rolf Kalbermatter
    CIT Engineering Netherlands
    a division of Test & Measurement Solutions

  • User events from labview build dll

    Reference to pattern
    Previous discussion
    I had this pattern in place in a LV 7.1 application using a LabVIEW
    build DLL, but when migrating to LV 8.5 I found that User Events
    created in one application instance can not be fired by another
    application instance. It seems that since LV 8.x a LabVIEW build DLL
    are a different application instance. The generate user event function generates an error inside the DLL stating that it is not working because it is a reference from another application instance.
    Is the behaviour of a LV build DLL different than a C build DLL? Is the C build DLL part of the same application instance as the LV executable?
    Is there a way the get the LV build DLL to be a part of the same application instance as the LV build executable or development environment?
    Regards,
    André
    Using whatever version of LV the customer requires. (LV5.1-LV2012) (www.carya.nl)

    Forgot to tell that I rebuild the DLL in LV 8.5, before making that conclusion.
    Message Edited by andre.buurman@carya on 09-04-2008 01:12 PM
    Regards,
    André
    Using whatever version of LV the customer requires. (LV5.1-LV2012) (www.carya.nl)

  • Does labview support dll which has sub functions that are static functions?

    Dear all,
    I wrote and compiled a C function into dll to be called by labview. The function calls a sub function. It works fine if it is a normal sub function. However I see that if I declare the sub function to be static, labview will crash. So is it that labview does not support static function in dll?
    Best,
    Miao

    A static function simply means that it is local to the C module that defines it and can't be seen from other C modules in a library. It should not change anything else about how it works.
    So in conclusion it should not make a difference in if it crashes or not but only create possible problems in linking the library. It seems extremely likely that you have another problem in your library that gets somehow triggered more easily when you compile your code with the static functions, but it should not have to do anything directly with the fact that you have static functions in itself.
    Rolf Kalbermatter
    CIT Engineering Netherlands
    a division of Test & Measurement Solutions

  • LABVIEW.LIB was not called from a LabVIEW process

    Hi All,
    I've inherited LV code that calls a CIN node to access a motor controller.  I'd like to compile this code to a .NET DLL, but receive the following error when calling it from an external source:
    I've read the knowledgebase article explaining the problem from here, as well as the following support questions:
    http://forums.ni.com/t5/LabVIEW/Labview-lib-was-not-called-from-a-labview-process/m-p/232548
    http://forums.ni.com/t5/LabVIEW/Problem-with-lsb-LABVIEW-LIB-was-not-called-from-a-LabVIEW/m-p/48809...
    http://forums.ni.com/t5/LabVIEW/Labview-lib-was-not-calld-from-a-labview-process/m-p/718427
    http://forums.ni.com/t5/LabVIEW/Building-a-LabVIEW-DLL-with-VIs-that-use-CINs/m-p/632817
    The conclusion seems to be recompiling is the answer.  I've tried recompiling the original CIN vi within LV with no success.  Do they mean to recompile the original C code against the newer labview.lib (sorry, I'm not all that familiar with how the CIN nodes work)?  Any suggestions would be awesome.  Thanks.
    -Joe

    You can't make use of LabVIEW manager functions in non-LabVIEW based processes. Basically unless the C code is for a CIN or DLL that is to be called by LabVIEW (inside the development system or a LabVIEW built application), any function pulled in from labview.lib is not available. LabVIEW.lib is an import library that does not implement any functions but simply imports them from the LabVIEW kernel, either the LabVIEW development system or the LabVIEW runtime DLL. And no you can't just link in the LabVIEW runtime DLL into your .Net application. This DLL needs to be started up and initialized in very specific ways, that only LabVIEW itself knows about when building an application.
    Basically if you want to recompile the code (yes in C/C++) for use in a non-LabVIEW application, you also have to remove all the link libraries from the LAbVIEW cintools directory, and replace any use of functions now unavailable (link error: unavailable external reference) with other similar functionality from your C runtime library. Or implement those functions yourself using C runtime library calls.
    Another possibility could be to actually create a LabVIEW executable that exports the functionality as ActiveX Server. Or in LabVIEW 2010 you could also select to create a .Net Interop Assembly from inside the LabVIEW project.
    Rolf Kalbermatter
    CIT Engineering Netherlands
    a division of Test & Measurement Solutions

  • LABVIEW.LIB was not called from a LabVIEW process when creating unit tests

    We are developing a DLL to be integrated in LabVIEW using CLFs. So far we have the system working, but we wanted to create some unit tests in C as part of our release process. The problem is that when I link labview.lib in VS C++ and then call the EXE generated I get an error saying: "LABVIEW.LIB was not called from a LabVIEW process". As mentioned in http://zone.ni.com/reference/en-XX/help/371361J-01/lvexcodeconcepts/debug_dlls_and_dll_calls/:
    "Calling the shared library from another C program is also another way to debug the shared library. By calling the shared library from another C program, you have a means of testing the shared library independent of LabVIEW, thus helping you to identify any problems, sooner."
    Some of our functions, however, use LabVIEW specific instructions and we would like to test them in a realistic environment (i.e., calling to the actual functions instead of creating stubs).
    Is there any workaround to this problem?
    Thanks!!

    Hello SaraGr,
    Welcome to the NI Discussion Forums! I have a couple of questions to better determine the issue here:
    1. What is the LabVIEW version that you are using?
    2. Does your DLL uses Serial Compatibility VIs? If so, try using your development on NI-VISA instead of Serial.
    3. Are you using a Code Interface Node (CIN)? If you do, I see that from the help file you would need to compile the code for the new platform. Also, please remember that functions specifc to CINs (such as SetCINArraySize) will not work in a DLL.
    4. Be sure to include the header files in your program, like extcode.h. Please follow this white paper to link labview.lib to your program, or follow the Alternate Method.
    Regards,
    Daniel REDS
    RF Systems Engineer
    Help us grow.
    If a post solves your question, mark it as The Solution.
    If a post helps, give Kudos to it.

  • Creating a LabVIEW Shared DLL for use with C# and Strings?

    Hi All,
    I am trying to create a prototype for a LabVIEW Shared DLL that all the VI does is take in a string and return an upper cased string. Needless to say the DLL builds fine but when I try calling the shared DLL from C# the .NET application recieves an exception about "Ansi char arrays can not be marshaled as byref or as an unmanaged-to-managed parameter". Does anyone have an example of how to pass a string to a VI and return a string or an example of a better way of accomplishing this.
    We are using labVIEW 7.1 on Windows 2000.
    I am in quite a bit of a hurry to prove that this type of a LabVIEW Shared DLL VI would work. The eventual system will be passing in a string of XML with a large amount of
    data and returning XML.
    Thanks in advance,
    Jim

    Hello jprucha,
    This occurs because LabVIEW DLLs are not considered managed code. As such, we need to define the C# function as unsafe to be able to call unmanaged DLLs.
    You can find more information about C# and managed code at Microsoft's developer website linked below.
    MSDN Home Page
    Good luck with the development,
    Matt F
    Keep up to date on the latest PXI news at twitter.com/pxi

  • Position for Programmer experience with DAQ and C++/Labview

    We are company located in the Bay Area of California and looking for
    a programmer experienced with programming (from scratch) DAQ boards for
    signal generation (sine/triangle/sawtooth) waveforms as well as DAQ
    digitizers, FFT, and data displaying.
    You should be
    able to program these cards using C++, but should have strong knowledge
    of labview as well. You may be asked to translate and migrate labview
    VI's to the C++ enviroment.
    Job applicants from
    the Bay Area, as well as abroad are welcome to apply.Those outside of
    the Bay Area can develop code at your own home office and must have
    C++/labview on a suitable computer for programming.
    Applicants should apply by sending an email to: jobs at intereasemedical dot com and indicate IE002 as the job position code.
    Do not post your resume as a reply to this forum post.
    Do include your resume in PDF or DOC format
    Do
    include your billing rate and if you are authorized to work in the U.S
    if located in the Bay Area. We do not provide H1B sponsorship. 
    Responses without the above information will not be considered.  
    Thank you! 

    Hello, I have much experience with DAQ, C++ and Labview. How to apply for this position?

  • Fatal error Labview.lib not called from a Labview process

    in teststand my vi works fine with adapter set for LV development
    when I configure the LV adapter for runtime, I get fatal error Labview.lib not called from a Labview process
    what is going on?
    how do I fix it?
    thanks.

    Howdy Stephen -
    Are you by chance calling a LabVIEW DLL within your LabVIEW VI which is being called from TestStand?  I know this error occurs when a LabVIEW DLL built in a different version of LabVIEW than the selected Run-time Engine.
    Here is a KnowledgeBase which references the issue:
    KnowledgeBase 203EA3XC: LabVIEW.LIB Error When Calling a LabVIEW DLL Built with VIs That Use Externa...
    If this is the case, you will need to open the LabVIEW DLL source VI in the LabVIEW version you are using and rebuild the DLL.
    Thanks and have a great day!
    Regards,
    Andrew W || Applications Engineer
    National Instruments

  • How to call LabVIEW ActiveX dlls into VB6

    I'm jumping in on a project written primarily in VB6. I'd much rather wirte code in LabVIEW so what I am looking for is some example code for calling LabVIEW activeX dlls into VB6. Does anyone have example code? I need to see how the LabVIEW libraries and classes are called and used in VB6.

    Hi Drewdafis,
    Refer to this link for example code on calling a LabVIEW DLL from Visual Basic.
    Hope this helps!
    Best Regards,
    Jonathan N.
    National Instruments

  • Can't launch DAQ assistant in LabVIEW

    Hi
    I cannot launch DAQ assistant from LabVIEW, but i can do that from MAX. DAQ from MAX is not that flexible because i can't customized the code or convert it.  I 've tried all the various ways to open DAQ assistant and i finally realized something, on the block diagram, i open Tools/Advance/Edit palette/Express/Input/DAQ is missing (question mark) and many more functions are missing.
    I'm using  the evaluation software of Labview 8.6 and NIDAQmx 8.7.1
    Can you please tell me what is wrong. I really need to launch NI DAQmx from LabVIEW.
    Rgds
    Paul
    Solved!
    Go to Solution.

    Hi Christ
    Thanks for the feedback.
    From Block diagram interface: Function palette/Measurement
    I/O ? (there is nothing just MAX config).
    But from Front Panel: Modern/ I/O controls, i can see DAQmx names controls
    which i don't think i need now.
    What do  mean reintalling DAQmx with LV
    support, is it different from the LabVIEW evaluation software or i just have to
    reinstall the LV
    evaluation software.
    Rgds
    Paul

  • Triggering DAQ 6527 with AQ4321 A/D

    Hi,
    I'm using a tunable laser source of ANDO called
    AQ4321 A/D with the DAQ 6527
    the AQ4321 has TTL connector which is used to trigger other instruments/devices
    this TTL connector is sending a digital signal once, when it starts an execution
    my question is:
    how can I use this trigger to start running a
    loop in a VI ?
    Thanks in advance
    Avner.

    Avner,
    Your question should be posted under "Measurement Devices >> Digital I/O" instead of "Real-Time DAQ" because the 6527 is a digital board. The category "Real-Time DAQ" is reserved for 7030 Real-Time devices.
    To answer your question, you can use DAQ Occurences in LabVIEW to 'wake up' code when certain hardware events occur, such as a change in polarity of the digital lines on the 6527. If you are using a non-LabVIEW compiler, the functions are DIG_Change_Message_Config and DIG_Change_Message_Control. For more information on these functions, please read the NI-DAQ Functions Reference Manual, which can be found at www.ni.com/manuals.

Maybe you are looking for