Jump to content


Photo

DAQFactory with PICO Technology logger

pico .dll

  • Please log in to reply
1 reply to this topic

#1 sbertman

sbertman

    Newbie

  • Members
  • Pip
  • 2 posts

Posted 07 August 2012 - 06:40 AM

Can I read analog channels from a PICO ADC-24 datalogger via USB with daqfactory?

The driver dll and documentation are available for download at the website

http://www.picotech.com/software.html

by selecting the ADC-24 at Step 1 and the Software Development Kit at Step 2.

Attached Files



#2 AzeoTech

AzeoTech

    Guru

  • Administrators
  • PipPipPipPipPip
  • 4604 posts

Posted 07 August 2012 - 11:14 AM

The manual has most of the info I'd need. You'll need the SDK and in particular the file PicoHRDL.dll. In the manual, to read analog channels, check out section 5.6.2.1, single reading, blocking. You can see it requires only three steps, two of which only need to be done once at startup, open and setMains, and my guess is that setMains isn't even required, but probably a good idea.

To get access to the needed functions, use the extern() function in DAQFactory. For example:

extern("c:\daqfactory\picohrdl.dll", "short HRDLOpenUnit()", "HRDLOpenUnit", "stdcall")
extern("c:\daqfactory\picohrdl.dll", "short HRDLSetMains(short, short)", "HRDLSetMains", "stdcall")
extern("c:\daqfactory\picohrdl.dll", "short HRDLGetSingleValue(short, short, short, short, short, short[1], long[1])", "HRDLGetSingleValue", "stdcall")

That will load those three functions. Notice how I used short[1] and long[1] for the short * and long * of the function prototype (5.4.5 in their manual). Then, probably right after the extern() lines, you'd do:

global hrdlHandle = HRDLOpenUnit()
if (hrdlHandle <= 0)
   system.messageBox("unable to open")
   return
endif
HRDLSetMains(hrdlHandle, 1)

That will open the unit and set the noise rejection. Now you can read values. For example, if you had a Test channel with Timing = 0 called "Pico1", and you wanted to read analog 1 (it appears they number from 1??) off the pico unit with range +/- 625mV, with a 100ms conversion time, single ended, once a second you'd do something like:

private overflow = 0
private datain = 0
private status
while(1)
   status = HRDLGetSingleValue(hrdlHandle, 1, 2, 1, 1, @overflow, @datain) 
   if (status == 1)
      datain.time = systime()
      pico1.addValue(datain)
   else
      ? "HRDLGetSingleValue failed"
   endif
   delay(1)
endwhile

That's about it for the basics. You can take advantage of the other functions too. It appears that their driver does not use callbacks, so its likely you could actually stream these units through extern(), though that's a little more advanced. Two things:

1) I did this code off the cuff and do not have a unit to test on, so you might have to do some debugging of my code. Please post working code when you get it so others can see.
2) you probably should replace those constants in the HRDLGetValues with variables to make it more readable. You can try using the include() function to actually bring in the constants from their header file even, but I didn't download the SDK so didn't have access to the header.
3) start simple and just see if you can get the open function to load and work. You can just type the extern() command in the command/alert window, then try calling the function. Note that repetitive calling of open might use up internal resources in their DLL. They have a close function as well you may need to call. Its not clear if quiting DAQFactory will clean up those resources or not. You'll be able to tell its not working when you do open() and it fails when it was just working a minute ago.