Skip to Navigation

LabJackPython (Windows UD, Mac, Linux)

LabJackPython is our cross-platform Python module for communicating with the LabJack U3/U6/UE9/U12. It works on Windows with the UD Driver and U12 Driver, and on Linux and Mac OS X with the Exodriver. For the LJM library (T7), use Python_LJM.

Download

The latest stable release of LabJackPython is from April 24, 2014: Download 4-24-2014 release of LabJackPython.

For the latest development version, archived versions and code repository, visit LabJackPython on GitHub.

Requirements

Python 2.5, 2.6, or 2.7. Python 3 is currently not supported. On Mac OS X, the built-in Python works, and it is 32- and 64-bit compatible. It also comes with Twisted, which you would need to use LJSocket. Use the built-in Python unless you have a good reason not to. Recent Linux distributions also ship with new enough versions of Python built in.

On Windows, the UD Driver for a UD device or the U12 Driver for a U12. On Linux and Mac OS X, the Exodriver.

If using Modbus, make sure your LabJack meets the minimum firmware requirement mentioned in the Modbus Support table on the UD Modbus page.

Install

Unzip the LabJackPython.zip file and open a terminal/command prompt. In the terminal, use the command line to go to the unzipped LabJackPython directory (e.g., “cd Desktop/LabJackPython” ). Then run one of the following commands to install the LabJackPython modules:

Windows

python setup.py install

Linux and Mac OS X

$ sudo python setup.py install

Note the LabJackPython zip file and unzipped directory name will vary on the download.

Documentation

For LabJackPython documentation, please refer to the docstrings in the source code or use the help function. For example, documentation on classes and functions in the u3 module can be found in the u3.py source or by using the “help(u3)” call in Python (note to “import u3” first). For specific documentation on only the U3 class use “help(u3.U3)”.

Quickstart

LabJackPython provides both a Modbus and low-level command interface for performing operations on a LabJack device. Quickstarts can be found for both in the Modbus Quickstart and Low-level Commands Quickstart sections.

File attachment: 

Comments

#1

Are there any Python 3.x support plans for the U3?  If so, what is the time-frame for doing this?

#2

Currently there are no plans for Python 3 support for LabJackPython. There are however LabJackPython forks on github for Python 3 (the LabJackPython github link is on this page), and you can try the 2to3 converter script (http://docs.python.org/2.7/library/2to3.html).

We do have Python 3 support for our Python interface to the new LJM library, but that is separate from LabJackPython and only supports the LabJack T7 at the moment.

#3

Error in commented-out code in example:

 

In the PWM-looping.py example in LabJackPython-10-22-2012, there are commented-out chunks of

code that are supposed to work for U3 and U6.  One of them says

#d.configIO( NumberTimersEnabled = 1 )

 

I think that should be #d.configIO( NumberOfTimersEnabled = 1 ).

 

#4

"d.configIO( NumberTimersEnabled = 1 )" is the correct call for the U6, and "d.configIO( NumberOfTimersEnabled = 1 )" should be the call for the U3. Looks like the low-level commands portion of the example were mainly for the U6. I updated the example on github with specific U3 and U6 low-level commands.

#5

What is the clean way to remove power from the labjacks, then apply power again and keep the python code running? Here is some psuedocode for example:

>>>import u6
>>>u6_1 = u6.U6(serial = 360008508)
>>>u6_2 = u6.U6(serial = 360009180)
>>>v1 = u6_1.getFeedback(u6.AIN24(PositiveChannel=12, ResolutionIndex=8, GainIndex = 0, Differential = False))    #get a voltage reading
>>>v2 = u6_2.getFeedback(u6.AIN24(PositiveChannel=12, ResolutionIndex=8, GainIndex = 0, Differential = False))
>>>
>>>GPIO.output("P9_12", GPIO.LOW)    #power to the hub cuts out here
>>>
>>>time.sleep(20)    #sleep for 20 secs
>>>
>>>GPIO.output("P9_12", GPIO.HIGH)    #power restored to hub, labjack led's light up
>>>
>>>time.sleep(5)    #buffer time to wait for hub and labjacks to be restored
>>>
>>>v1 = u6_1.getFeedback(...)    #get some more voltage readings
>>>v2 = u6_2.getFeedback(...)

I've tried u6_1.close() and u6_1.open() on each side of the sleep time, respectively, but I always get and error that says,

"LabJackPython.LabJackException: Could only write 0 of 12 bytes.
LIBUSB_ERROR_NO_DEVICE"

What am I doing wrong?

I appreciate your help.

Thank you.

#6

If your U6 disconnects or loses power the current USB device handle becomes invalid. You should both close the U6 after losing power and then open your U6 again when it is enumerated. This cleans up the old, invalid handle in libusb and gets a new, valid handle. So after your "time.sleep(5)" when the U6s are enumerated (LED is on) and before your Feedback calls try:

u6_1.close()
u6_2.close()
u6_1 = u6.U6(serial = 360008508)
u6_2 = u6.U6(serial = 360009180)

If your U6 cannot be connected to, your u6.U6(...) call will return an exception.

#7

That works perfectly. You guys are the best. Thanks.

#8

I'm trying to use Epydoc to generate html documentation for LabJackPython.

While this works in general, the output has some 'features' which I can't explain. They may be due to Epydoc bugs, but I thought I would ask here.

For example, the documentation for the u3.U3 class lists 39 methods. For some reason, they all have a link to a "Method Details" section except for 2: binaryToCalibratedAnalogTemperature & loadConfig.

What makes these 2 methods different from the others?

#9

Codewise both are public methods like the others. binaryToCalibratedAnalogTemperature doesn't have documentation or an assigned section (would be section 3), but loadConfig does have documentation and a section.

Using the built in Python help both methods show up with the documentation (if available). My guess for binaryToCalibratedAnalogTemperature not showing up in Epydoc details is that it is not documented. I don't know why loadConfig is missing though.

#10

I noticed that u3.py contains the following comment:

Section Number Mapping:

1 = Object Functions

2 = User's Guide Functions

3 = Convenience Functions

4 = Private Helper Functions

A corresponding "section" variable is assigned after each U3 method.

What are these for?

 

#11

Beyond organization reasons, I am not sure what the original intention of the "section" method attribute was as no other LabJackPython class does this or uses this attribute that I could find.

#12

How do I stop the LabJack (U6 in my case) from outputting a voltage once I call d.writeRegister(DAC0_REGISTER, 1.5)? Is it as simple as setting it to d.writeRegister(DAC0_REGISTER, 0.)?

#13

Yes, setting the DAC voltage to 0 will set the output to its lowest voltage of about 0 V. Note that the nominal minimum of a U6 DAC is 0.04 V.

#14

Hello,

I've started using LabJack U3-HV with LabJackPython. So I began reading here about LabJackPython and tried to use Low-Level Commands.

There is one thing that directed my attention: If I'am using d.getAIN(3), it results differ from the ones yielding by d.binaryToCalibratedAnalogVoltage(d.getFeedback(u3.AIN(3)) [0], isLowVoltage=False). (Besides fluctiuation from noise.)

This holds true after reaping calibration data. Using them uncalibrated they yield the same values.

 

Example:

  1. Putting a random chosen voltage on input 3.
  2. On python shell I'm typing:

>>> import u3
>>> d = u3.U3()
>>> for i in range (10): print d.binaryToCalibratedAnalogVoltage(d.getFeedback(u3.AIN(3)) [0], isLowVoltage=False), d.getAIN(3)
...
2.440864 2.440864
2.440864 2.440864
2.440864 2.440864
2.440864 2.440864
2.440864 2.440864
2.440864 2.440864
2.43584 2.43584
2.440864 2.440864
2.440864 2.43584
2.440864 2.43584

(There are some LSB-fluctuation due to noise.)

Let's continue:

>>> d.getCalibrationData()

(gives some output)

>>> for i in range (10): print d.binaryToCalibratedAnalogVoltage(d.getFeedback(u3.AIN(3)) [0],
isLowVoltage=False), d.getAIN(3)
...
2.46680050949 2.46430067183
2.46680050949 2.46430067183
2.46680050949 2.46430067183
2.46680050949 2.46430067183
2.46171616996 2.46430067183
2.46171616996 2.4592151402
2.46680050949 2.46430067183
2.46171616996 2.46430067183
2.46680050949 2.46430067183
2.46680050949 2.4592151402

There are some LSB-fluctuation, too. It can be clearly seen that both columns benefit from calibration data, but not in the same way.

Why?

Thanks for any hints – Peter

#15

In your d.binaryToCalibratedAnalogVoltage call, you will want to set the channelNumber parameter to 3. It defaults to 0, meaning currently you are using AIN0 calibration constants for AIN3. getAIN is returning the correctly calibrated reading.

I noticed the example on this page isn't demonstrating this, so I will update it.

#16

Ok, that resolves it. The missing parameter led to my conclusion that there is only one set of calbration data for all channels. And because in my example the difference is roughly half an LSB-step (albeit not observed exactly) it led me to the conclusion that there must be something like a kind of undocumented rounding feature.

Thanks – Peter

#17

Is there a way to set the mode of an analog in to the 0-3v range?  I didn't see that in the python API however, I may have missed it.

#18

If using a UE9 or U6, the Feedback command provides a BipGain (UE9) or GainIndex (U6) option that sets the range when reading analog inputs, or using Modbus starting at address 1500 you can set the range. Section 2.7.2 of the UE9 User's Guide and section 2.6.2 of the U6 User's Guide documents gain and voltage ranges.

If using a U3, use the getAIN and set negChannel to 32 (special). This sets the range to 0-3.6 V or -10/+20 (HV). See section 2.6.2 of the U3 User's Guide for voltage ranges. Look at the U3.getAIN method's source code to see how the reading is done and section 2.6.1 describes what negative channel 32 does in the UD driver and the getAIN call.

#19

Hi, 

I am trying to get the Python library work in Cygwin, running Python 2.7.3. Installation seems to work out fine, but when running one of the examples, the library tries to load the Exodriver, not the UD driver:

$ python2.7 workingWithModbus.py

<class 'LabJackPython.LabJackException'>: Could not load the Exodriver driver. Ethernet connectivity only.

Etc. Is there some way to force the setup to use UD instead?

 

#20

It looks like Cygwin's Linux-like environment makes a Python module we use report the OS as "posix" instead of "nt". You can force LabJackPython to use the UD driver by modifying its source code. The dll/library load code is in the _loadLibrary function in the LabJackPython.py file but the Python call to detect the OS, os.name, is used throughout the file. You can try to fake the os.name call by removing the the "import os" import in LabJackPython.py and adding a class and global object after the imports like this:

class OS(object):
    def __init__(self):
        self.name = "nt"

os = OS()

I did a quick test and that got the u3allio.py example running in Cygwin.

#21

Got it running with the example code you provided, with the addition that I needed to change ctypes.windll to ctypes.cdll everywhere in LabjackPython.py.

Thanks!

#22

Glad to hear you got it running. In my Cygwin tests ctypes.windll was working. I only needed code changes to force os.name to equal "nt".

#23

If you are running a 64-bit version of python and you get the following error:

<class 'LabJackPython.LabJackException'>: Could not load labjackud driver.

    The error was: [Error 126] The specified module could not be found

Please install the 64-bit driver install of the driver package located here: http://labjack.com/support/ud/ud-setup-64-bit/labjackud-dll-64-bit.

For the developers, could you please correct the python library to reference 32-bit / 64-bit dlls properly? It appears if you have a 64-bit python and try to run the examples, python errors due to missing dlls because the driver installer only installs 32-bit dlls on a 64-bit windows system. 

Thanks!

#24

This cannot be fixed in the Python library.  64-bit Python programs can only load 64-bit dlls and cannot load/reference 32-bit dlls.  So user's with 64-bit operating systems need 64-bit Python and the 64-bit UD driver, or 32-bit Python and the 32-bit UD driver.  We have however just updated our UD installer to install both 32 and 64-bit versions of the driver that should help with future cases of this.  This starts with UD installer version 3.32, which is currently (01/24/2013) is in beta:

http://labjack.com/support/windows-ud/beta-ud

#25

I have the same issue of #16:

Traceback (most recent call last):

File "C:\Python25\test.py", line 11, in <module>

d.writeRegister(DAC0_REGISTER, 1.5) # Set DAC0 to 1.5 V

File "C:\Python27\lib\site-packages\LabJackPython.py", line 434, in writeRegister

return self._parseWriteRegisterResponse(response, pkt, value)

File "C:\Python27\lib\site-packages\LabJackPython.py", line 490, in _parseWriteRegisterResponse

if request[7] != response[7]:

IndexError: list index out of range

>>>

 

When I read the content in #17:

"Modbus over both USB and ethernet support was not available until Comm firmware version 1.48. You are using version 1.40 which did not support Modbus yet, so that is the cause of the problem. Try installing the newest beta Comm firmware, and see if that help."

I am not sure what "Comm firmware" is and how to upgrade it?

Thanks,

 

#26

Firmware is code on the LabJack device, and Comm firmware is specifically for the UE9's Comm processor.  Download the UE9comm_152_12152011.bin firmware file here:

http://labjack.com/support/firmware/ue9/beta

Then use the LJSelfUpgrade program to upgrade your UE9's Comm firmware with the downloaded .bin file.  LJSelfUpgrade should already be installed on your computer since it is installed with the Windows UD driver's setup.  Take a look here for documentation on LJSelfUpgrade:

http://labjack.com/support/ue9/users-guide/1.2

#27

So, I've had luck getting the LabJack to control LEDs (on/off) when they are connected to ports FIO0 & FI01, using the following code I call "LabJack_TwinkleTest.py":

 

import u3, random

d = u3.U3()

 

d.configU3()

FIO0_STATE_REGISTER = 6000

FIO1_STATE_REGISTER = 6001

for i in range(0, 100):

   

   d.writeRegister(FIO0_STATE_REGISTER, random.choice((0,1)))

    d.writeRegister(FIO1_STATE_REGISTER, random.choice((0,1)))

    print(i)

 

But now I want to use the 15-pin digital output port to send a signal (like a TTL pulse do a different device). I've tried using the same code, and changing the register numbers, but nothing seems to work. Any suggestions on how I should modify the code to send a signal out of the digital output port? If I install the software on the CD, I can generate a signal, so I know my hardware is working. It's just a question of finding the right Python syntax. 

Any help would be greatly appreciated, thanks in advance,

Josh Salmon

#28

I tested the FIO, EIO and CIO digital lines using Modbus and they are working fine.  Writing to Modbus addresses 6000-6019 will set the digital output states, where addresses 6000-6007 correspond to FIO0-FIO7, 6008-6015 to EIO0-EIO7 and 6016-6019 to CIO0-CIO3.  So something like this in Python will set EIO1 (DB15 pin 12) to an output-high state:

EIO1_STATE_REGISTER = 6009
d.writeRegister(EIO1_STATE_REGISTER, 1)

If you are still seeing problems, try updating your U3 to the latest firmware and see if that helps:

http://labjack.com/support/firmware

#29

I think that the "try - except - finally" construct in Python is really useful for instrumentation applications. I am using it in my ue9 development activity, but I am not sure what exception codes to use in the "except:" clauses I write. There are standard Python exception classes, but I wonder - are there any LabJack specific exception codes available?  Thanks!

 

#30

There is the LabJackException class that is thrown for LabJack specific exceptions.  It contains an errorCode and errorString.  The errorCode is a UD driver error code (Windows only), the errno set by the Exodriver (Linux/Mac OS X only), -1 for Python wrapper errors, or 0 for a nonspecific (default) error code number.  The errorString describes the error.  The LabJackException class can be found in the LabJackPython.py source code.

 

#31

 

Python 2.7.3 (default, Apr 20 2012, 22:44:07) 

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import ue9

>>> d=ue9.UE9()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/usr/local/lib/python2.7/dist-packages/ue9.py", line 68, in __init__

    self.open(**kargs)

  File "/usr/local/lib/python2.7/dist-packages/ue9.py", line 87, in open

    Device.open(self, 9, Ethernet = ethernet, firstFound = firstFound, serial = serial, localId = localId, devNumber = devNumber, ipAddress = ipAddress, handleOnly = handleOnly, LJSocket = LJSocket)

  File "/usr/local/lib/python2.7/dist-packages/LabJackPython.py", line 600, in open

    d = openLabJack(devType, ct, firstFound = True, handleOnly = handleOnly, LJSocket = LJSocket)

  File "/usr/local/lib/python2.7/dist-packages/LabJackPython.py", line 1454, in openLabJack

    return _makeDeviceFromHandle(handle, deviceType)

  File "/usr/local/lib/python2.7/dist-packages/LabJackPython.py", line 1498, in _makeDeviceFromHandle

    raise e  

LabJackPython.LabJackException: Could only write 0 of 38 bytes.

Do you know what seems to be the problem? Normally I never get this kind of problem..this thing never occurred before..please help. 

 

#32

Looks like a command is not getting through when opening your device.  You can try your "d=ue9.UE9()" call a couple of more times and see if that helps to clear the issue, otherwise power cycling your UE9 usually fixes most problems.  Let us know if this does not help.

I would need more information to figure out what caused the problem.  If this occurs again, let us know of any other calls you have made previous to this error.  If you ran a previous program/Python interactive mode session please provide the calls you made there.  Also, provide your UE9's Control and Comm firmware versions.

#33

From the text above:

"First, before we perform any other operation we will get your LabJack device’s calibration data. [getCalibrationData()] only needs to be performed once after opening your device. The calibration data will be used by functions that convert binary data to voltage/temperature and vice versa."

Since calling getCalibrationData() should be done every time you first open a LabJack device before doing readings that convert binary data to temp/voltage values and because it also takes no arguments, why is it not part of the constructor?  Is there any reason you would not call this function?  I can understand that, if you were only doing digital IO, you would not need it however, having a separate call for this seems to imply that it is important to not call this function in some circumstances.  Is this true? i.e. Does calling this function change the behavior of the LabJack device if only doing digital IO?  Does it hurt to call this function every time a LabJack device is used?  If not, why have a separate call?

#34

Using getCalibrationData is only necessary when using low-level commands and temperature/voltages.  Using Modbus (the first set of "Basic I/O" examples) you do not need to read the calibration.  It doesn't hurt to call this automatically, but considering it is only used for low-level commands we let the user perform the getCalibrationData call based on if they need it or not.

#35

Hello, I got that error message after a while:

 

in _checkCommandBytes

    raise LabJackException("Got incorrect command bytes.\nExpected: %s\nGot: %s\nFull packet: %s" % (hexWithoutQuotes(commandBytes), hexWithoutQuotes(results[1:(size+1)]), hexWithoutQuotes(results)))

LabJackException: Got incorrect command bytes.

Expected: [0xf8, 0x5, 0x39]

Got: [0xf8, 0x2, 0x0]

Full packet: [0xfa, 0xf8, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x97, 0xb7, 0x4, 0x23] 

Is this my fault?thanks

 

#36

What LabJack device and operating system are you using?  Also, can you provide the chunk of your code that leads to this exception?

#37

The problem which occurred only once might be attributed to the use of an TCP/IP connected U3 via Silex 1000 SX1000U?

#38

Looking at the exception it looks like you are getting your error during a EI-1050, or some other Sensirion SHT1X sensor, reading.  Instead of the expected SHT1X low-level response you got a Feedback low-level response.  You may be getting a repeat response packet from the previous call (Feedback in this case) which over straight USB I have not encountered.  The cause may stem from the Silex 1000 SX1000U layer as you pointed out.  Check that your Silex 1000 SX1000U has the latest firmware for stability.  If this becomes a common occurrence, test your code with your U3 connected directly to your computer to see if the Silex device is causing the issue.

#39

How to communicate with multiple LabJacks connected on a system?

#40

When opening your device with the class constructor or the open call, you can specify your LabJack with the serial or localId parameter.  The serial number is located on the back of your LabJack on the sticker, or can be retrieved by a configU3/configU6/commConfig U3/U6/UE9 class call after opening the device.  The local ID is user defined and stored on the LabJack.  It can be read and set with the same config call to get the serial number.  Here's a quick example opening two different LabJacks by serial number:

d1 = u3.U3(serial=320025017)

d2 = u6.U6(serial=360006724)

#41

This is very useful, thanks a lot.

#42

 

>>> DAC0_REGISTER=5000

>>> d.writeRegister(DAC0_REGISTER, 1.5)

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "/usr/local/lib/python2.7/dist-packages/LabJackPython.py", line 435, in writeRegister

    return self._parseWriteRegisterResponse(response, pkt, value)

  File "/usr/local/lib/python2.7/dist-packages/LabJackPython.py", line 491, in _parseWriteRegisterResponse

    if request[7] != response[7]:

IndexError: list index out of range

>>>

My device is ue9-pro..CommFWVersion 1.40 and ControlFWVersion is 2.11..why still i cannot set DAC0 to 1.5V? 

 

#43

Modbus over both USB and ethernet support was not available until Comm firmware version 1.48.  You are using version 1.40 which did not support Modbus yet, so that is the cause of the problem.  Try installing the newest beta Comm firmware, and see if that help.

#44

Thanks for the previous response. I've also noticed the U6 getTemperature() method doesn't work. I have the latest package from github installed. It causes an AttributeError: 'U6' object has no attribute 'caliInfo'

#45

This is fixed now.  It was actually a bug in the U6.getCalibrationData function that slipped by me in yesterday's update.  "caliInfo" should of been "calInfo".  Thanks for informing us.

#46

>>> import u6
>>> d = u6.U6()
>>> DAC0_VALUE = d.voltageToDACBits(1.5, dacNumber = 0, is16Bits = False)
>>> d.getFeedback(u6.DAC0_8(DAC0_VALUE))

Gives the following error: AttributeError: 'U6' object has no attribute 'voltageToDACBits'

So far as I can see, neither does the U3 module (not that it'd be of use since I have a U6 but I looked since the quickstart is written for U3). Is the quickstart written for different modules to those that were actually released or am I missing something obvious (I'm fairly new to Python)?

#47

I updated the U6 class to include the voltageToDACBits function since it is useful and should of been there in the first place.  You can download the latest LabJackPython on github.  The code you posted will work with it.  For documentation look at the u6.py source code or use the help function built in Python (help(u6.U6) for U6 documentation).

As for the voltageToDACBits in the U3 class, it is there.  If you find a conflict with the quickstart and current releases let us know and we will take a look at it.

#48

#a simple script to track a couple of analog inputs.
#note that in "u3.U3()" the first u is small and second is capitalized. Easy to miss!

import u3, time
d = u3.U3()
d.configIO(FIOAnalog = 15)          #set lines 0-3 to analog input

for i in range(1,100):
        input0 = d.getAIN(0)

        input1 = d.getAIN(1)
       
        print input0, input1
       
        time.sleep(1)

#49

Thank you for posting your script.  Here's a modified version of your script using the getFeedback method instead of getAIN.  It's not as simple, but is more efficient speed wise since it performs only one low-level command/response in the loop instead of the two performed by using two getAIN calls.

 

import u3, time

d = u3.U3()
d.configIO(FIOAnalog = 15)          #set lines 0-3 to analog input
feedbackArguments = [u3.AIN(0), u3.AIN(1)]
       
for i in range(1,100):
    ain0Bits, ain1Bits = d.getFeedback(feedbackArguments)
    #if using a U3-HV, set isLowVoltage = False
    input0 = d.binaryToCalibratedAnalogVoltage(ain0Bits, isLowVoltage = True)
    input1 = d.binaryToCalibratedAnalogVoltage(ain1Bits, isLowVoltage = True)
    print input0, input1
    time.sleep(1)

#50

Thanks, that is more efficient. How would I modify this to work with the U6, which I just ordered? Is it as simple as changing each u3 or U3 to a u6 or U6?