08-11-2014 03:44 PM
08-11-2014 03:49 PM
@Yakav wrote:
Either help contribute, or don't reply. I'm not looking for passive-agressive answers - this goes to nyc
You are the person who chose to go down this path of using Open Source software.
You are the person who needs to do the work.
It seems you want the answers handed to you on a platter.
Do some WORK!
08-11-2014 03:54 PM - edited 08-11-2014 03:54 PM
Nyc,
Please leave - you are obviously a troll and unwilling to promote meaningful dialogue. Others have actually guided me towards a direction, while you on the other hand have been inconsiderate and ill-mannered. Take your unnecessary banter elsewhere.
08-11-2014 03:56 PM - edited 08-11-2014 03:57 PM
@Yakav wrote:
Nyc,
Please leave - you are obviously a troll and unwilling to promote meaningful dialogue. Others have actually guided me towards a direction, while you on the other hand have been inconsiderate and ill-mannered. Take your unnecessary banter elsewhere.
You were guided to the PyDAQmx website eons ago, and yet you choose to ignore it.
And kept coming back here for goodness know what reason?
Engineering is hard. If it was easy, people could just keep asking questions on message boards.
08-11-2014 04:00 PM - edited 08-11-2014 04:02 PM
If you attempted to read my comment earlier, you would have seen that I did read the PyDAQmx documentation and source code. This dead-end in information led me to asking if others have attempted a similar path (which obviously you haven't). I'm not interested in your lecturing, I could care less.
Here's a question, what are the message boards for? I've browsed around the forums looking for a similar question but no luck. So, am I suppose to go off leads with no lead?
08-11-2014 04:05 PM
@Yakav wrote:
If you attempted to read my comment earlier, you would have seen that I did read the PyDAQmx documentation and source code. This dead-end in information led me to asking if others have attempted a similar path (which obviously you haven't). I'm not interested in your lecturing, I could care less.
Here's a question, what are the message boards for? I've browsed around the forums looking for a similar question but no luck. So, am I suppose to go off leads with no lead?
How exactly is it "dead end"????
And, again, you chose to use PyDAQmx. No one forced you to use it.
No documentation is due to *your* decision to use the software.
08-11-2014 04:08 PM
I am forced to use PyDAQmx due to the circumstances of my company - please, take the time to read my previous comments (this is already explained). You obviously have trouble understanding my goals. Are you mentally handicapped? Please go entertain others that might be interested in a clown
08-11-2014 04:10 PM
@Yakav wrote:
I am forced to use PyDAQmx due to the circumstances of my company - please, take the time to read my previous comments (this is already explained). You obviously have trouble understanding my goals. Are you mentally handicapped? Please go entertain others that might be interested in a clown
And again, your company gets what it "paid" for.
The documentation is there on the PyDAQmx webpage.
And again, what makes it "dead end"?
05-04-2016 09:27 AM - edited 05-04-2016 09:45 AM
I stumbled upon this thread after having the same task to do like you, which is reading out a NI USB TC01 via Python. It's probably a bit late, i know, but who knows, maybe this will help someone else.
I realized that what PyDAQmx does is basically talk to the NIDAQmx driver's C-API via Python's ctypes. Most of the wrapping functionality it brings isn't really needed for such a simple task, or at all helpful regarding the actual problem there, which is: how do you use this C-API, i.e., which functions to call?
Neither looking through the documentation for NI USB TC01, nor the example codes for C-API posted earlier, nor anything else I was able to come up with from NI websites helped me here, so this was a rather frustrating experience. Again, this is a problem of bad documentation on the side of NI, not one of "open source" or "not enough effort put in it" (or anything else of the troll bs posted here).
I finally managed to make it work, using the example code from Scipy cookbook and tinkering around with the exported functions from the dll, using the header file (NIDAQmx.h).
Here's the code.
Requires: Python 3, ctypes, numpy, nicaiu.dll (obtained from NIDAQmx 15 runtime, in my case).
import ctypes
import numpy as np
import os
class NiUsbTC01:
# type mappings
int32 = ctypes.c_long
uInt32 = ctypes.c_ulong
float64 = ctypes.c_double
# constants mappings
tc_types = {
"J" : 10072, # DAQmx_Val_J_Type_TC
"K" : 10073, # DAQmx_Val_K_Type_TC
"N" : 10077, # DAQmx_Val_N_Type_TC
"R" : 10082, # DAQmx_Val_R_Type_TC
"S" : 10085, # DAQmx_Val_S_Type_TC
"T" : 10086, # DAQmx_Val_T_Type_TC
"B" : 10047 , # DAQmx_Val_B_Type_TC
"E" : 10055, # DAQmx_Val_E_Type_TC
}
temp_units = {
"C" : 10143, # DAQmx_Val_DegC
"F" : 10144, # DAQmx_Val_DegF
"K" : 10325, # DAQmx_Val_Kelvins
}
def __init__(self, device_id="Dev1", channel_id="ai0", tc_type="K", temp_unit="C", temp_min=-50, temp_max=100):
# load the DLL
nidaq_dll_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "bin/nicaiu.dll")
self.nidaq = ctypes.WinDLL(nidaq_dll_path)
# alternatively, if runtime is installed & registered:
# self.nidaq = ctypes.windll.nicaiu
self.task_handle = self.uInt32(0)
physical_channel = "{}/{}".format(device_id, channel_id)
# reset device
self.nidaq.DAQmxResetDevice(device_id.encode("ASCII"))
# create task
self._nidaq_assert(self.nidaq.DAQmxCreateTask(b"", ctypes.byref(self.task_handle)))
# create channel
self._nidaq_assert(self.nidaq.DAQmxCreateAIThrmcplChan(
self.task_handle,
physical_channel.encode("ASCII"),
b"",
self.float64(temp_min),
self.float64(temp_max),
self.temp_units[temp_unit],
self.tc_types[tc_type],
10200, # DAQmx_Val_BuiltIn // CJC Source "Built-In"
self.float64(0),
b""
))
# start task
self._nidaq_assert(self.nidaq.DAQmxStartTask(self.task_handle))
def __del__(self):
try:
self._close_task()
except:
pass # worth a try
def _close_task(self):
if self.task_handle.value != 0:
self.nidaq.DAQmxStopTask(self.task_handle)
self.nidaq.DAQmxClearTask(self.task_handle)
def _nidaq_assert(self, err):
"""Raise Exception if return code 'err' is not 0."""
if not err == 0:
buf_size = 300
buf = ctypes.create_string_buffer(b'\0' * buf_size)
self.nidaq.DAQmxGetErrorString(err, ctypes.byref(buf), buf_size)
raise Exception('nidaq call failed with error {}: {}'.format(err, repr(buf.value)))
def get_temperature(self):
read = self.int32()
data = np.zeros(1, dtype=np.float64) # size 1 array, passed by ref to be filled
self._nidaq_assert(self.nidaq.DAQmxReadAnalogF64(
self.task_handle,
1, # number samples per channel
self.float64(1.0), # timeout in sec
0, # DAQmx_Val_GroupByChannel // Group by Channel
data.ctypes.data, # the array byref
1, # array size in samples
ctypes.byref(read), # samples per channel read (return value)
None # reserved
))
return data[0]
if __name__ == "__main__":
sensor = NiUsbTC01()
print(sensor.get_temperature())
08-25-2016 01:40 PM
Thanks a lot! I need to do it right now!:)