Zugang zu USB über Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Toni83 hat geschrieben:Sorry, wusste nicht, dass dies zu Python gehört.
Gibts hier.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Habe jetzt die Numeric Bibliothek für Python installiert.
Nachdem ich sämtliche Bibliotheken von National Instruments eingefügt habe, die setup.py benötigt, kamen Probleme beim linken:

D:\Python23>python setup.py build
running build
running build_py
copying nidaq.py -> build\lib.win32-2.3
running build_ext
building '_nidaq' extension
swigging nidaq.i to nidaq_wrap.c
D:\Programme\swigwin-1.3.29\swig.exe -python -o nidaq_wrap.c nidaq.i
nidaq.i(37): Warning(118): %typemap(except) is deprecated. Use the %exception di
rective.
D:\Programme\Microsoft Visual Studio\VC98\BIN\cl.exe /c /nologo /Ox /MD /W3 /GX
/DNDEBUG -I. "-ID:/Programme/National Instruments/NI-DAQ/DAQmx ANSI C Dev/includ
e" -ID:\Python23\include -ID:\Python23\PC /Tcnidaq_wrap.c /Fobuild\temp.win32-2.
3\Release\nidaq_wrap.obj
nidaq_wrap.c
nidaq_wrap.c(2865) : warning C4013: 'AI_Check' undefined; assuming extern return
ing int
nidaq_wrap.c(2907) : warning C4013: 'AI_Clear' undefined; assuming extern return
ing int
nidaq_wrap.c(2982) : warning C4013: 'AI_Configure' undefined; assuming extern re
turning int
nidaq_wrap.c(3034) : warning C4013: 'AI_Read' undefined; assuming extern returni
ng int
nidaq_wrap.c(3085) : warning C4013: 'AI_Read_Scan' undefined; assuming extern re
turning int
nidaq_wrap.c(3133) : warning C4013: 'AI_Setup' undefined; assuming extern return
ing int
nidaq_wrap.c(3185) : warning C4013: 'AI_VRead' undefined; assuming extern return
ing int
nidaq_wrap.c(3236) : warning C4013: 'AI_VRead_Scan' undefined; assuming extern r
eturning int
nidaq_wrap.c(3315) : warning C4013: 'AI_VScale' undefined; assuming extern retur
ning int
nidaq_wrap.c(3396) : warning C4013: 'AO_Configure' undefined; assuming extern re
turning int
nidaq_wrap.c(3426) : warning C4013: 'AO_Update' undefined; assuming extern retur
ning int
nidaq_wrap.c(3478) : warning C4013: 'AO_VScale' undefined; assuming extern retur
ning int
nidaq_wrap.c(3532) : warning C4013: 'AO_VWrite' undefined; assuming extern retur
ning int
nidaq_wrap.c(3580) : warning C4013: 'AO_Write' undefined; assuming extern return
ing int
nidaq_wrap.c(3618) : warning C4013: 'DAQ_Check' undefined; assuming extern retur
ning int
nidaq_wrap.c(3660) : warning C4013: 'DAQ_Clear' undefined; assuming extern retur
ning int
nidaq_wrap.c(3702) : warning C4013: 'DAQ_Config' undefined; assuming extern retu
rning int
nidaq_wrap.c(3741) : warning C4013: 'DAQ_DB_Config' undefined; assuming extern r
eturning int
nidaq_wrap.c(3779) : warning C4013: 'DAQ_DB_HalfReady' undefined; assuming exter
n returning int
nidaq_wrap.c(3846) : warning C4013: 'DAQ_DB_Transfer' undefined; assuming extern
returning int
nidaq_wrap.c(3942) : warning C4013: 'DAQ_Monitor' undefined; assuming extern ret
urning int
nidaq_wrap.c(4033) : warning C4013: 'DAQ_Op' undefined; assuming extern returnin
g int
nidaq_wrap.c(4081) : warning C4013: 'DAQ_Rate' undefined; assuming extern return
ing int
nidaq_wrap.c(4169) : warning C4013: 'DAQ_Start' undefined; assuming extern retur
ning int
nidaq_wrap.c(4217) : warning C4013: 'DAQ_StopTrigger_Config' undefined; assuming
extern returning int
nidaq_wrap.c(4304) : warning C4013: 'DAQ_to_Disk' undefined; assuming extern ret
urning int
nidaq_wrap.c(4351) : warning C4013: 'Get_DAQ_Device_Info' undefined; assuming ex
tern returning int
nidaq_wrap.c(4382) : warning C4013: 'Get_NI_DAQ_Version' undefined; assuming ext
ern returning int
nidaq_wrap.c(4422) : warning C4013: 'Init_DA_Brds' undefined; assuming extern re
turning int
nidaq_wrap.c(4535) : warning C4013: 'SCAN_Op' undefined; assuming extern returni
ng int
nidaq_wrap.c(4618) : warning C4013: 'SCAN_Setup' undefined; assuming extern retu
rning int
nidaq_wrap.c(4714) : warning C4013: 'SCAN_Start' undefined; assuming extern retu
rning int
nidaq_wrap.c(4831) : warning C4013: 'SCAN_to_Disk' undefined; assuming extern re
turning int
nidaq_wrap.c(4886) : warning C4013: 'Timeout_Config' undefined; assuming extern
returning int
nidaq_wrap.c(4934) : warning C4013: 'WFM_Chan_Control' undefined; assuming exter
n returning int
nidaq_wrap.c(4985) : warning C4013: 'WFM_Check' undefined; assuming extern retur
ning int
nidaq_wrap.c(5078) : warning C4013: 'WFM_ClockRate' undefined; assuming extern r
eturning int
nidaq_wrap.c(5159) : warning C4013: 'WFM_DB_Config' undefined; assuming extern r
eturning int
nidaq_wrap.c(5223) : warning C4013: 'WFM_DB_HalfReady' undefined; assuming exter
n returning int
nidaq_wrap.c(5309) : warning C4013: 'WFM_DB_Transfer' undefined; assuming extern
returning int
nidaq_wrap.c(5419) : warning C4013: 'WFM_from_Disk' undefined; assuming extern r
eturning int
nidaq_wrap.c(5477) : warning C4013: 'WFM_Group_Control' undefined; assuming exte
rn returning int
nidaq_wrap.c(5540) : warning C4013: 'WFM_Group_Setup' undefined; assuming extern
returning int
nidaq_wrap.c(5636) : warning C4013: 'WFM_Load' undefined; assuming extern return
ing int
nidaq_wrap.c(5734) : warning C4013: 'WFM_Op' undefined; assuming extern returnin
g int
nidaq_wrap.c(5789) : warning C4013: 'WFM_Rate' undefined; assuming extern return
ing int
nidaq_wrap.c(5871) : warning C4013: 'WFM_Set_Clock' undefined; assuming extern r
eturning int
nidaq_wrap.c(6050) : warning C4013: 'Config_DAQ_Event_Message' undefined; assumi
ng extern returning int
D:\Programme\Microsoft Visual Studio\VC98\BIN\link.exe /DLL /nologo /INCREMENTAL
:NO "/LIBPATH:D:\Programme\National Instruments\NI-DAQ\DAQmx ANSI C Dev\lib" /LI
BPATH:D:\Python23\libs /LIBPATH:D:\Python23\PCBuild nidaq32.lib nidex32.lib /EXP
ORT:init_nidaq build\temp.win32-2.3\Release\nidaq_wrap.obj /OUT:build\lib.win32-
2.3\_nidaq.pyd /IMPLIB:build\temp.win32-2.3\Release\_nidaq.lib
Creating library build\temp.win32-2.3\Release\_nidaq.lib and object build\tem
p.win32-2.3\Release\_nidaq.exp
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_Check
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_Clear
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_Configure
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_Read
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_Read_Scan
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_Setup
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_VRead
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_VRead_Scan
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AI_VScale
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AO_Configure
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AO_Update
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AO_VScale
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AO_VWrite
nidaq_wrap.obj : error LNK2001: unresolved external symbol _AO_Write
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_Check
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_Clear
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_Config
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_DB_Config
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_DB_HalfReady
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_DB_Transfer
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_Monitor
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_Op
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_Rate
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_Start
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_StopTrigger_Conf
ig
nidaq_wrap.obj : error LNK2001: unresolved external symbol _DAQ_to_Disk
nidaq_wrap.obj : error LNK2001: unresolved external symbol _Get_DAQ_Device_Info
nidaq_wrap.obj : error LNK2001: unresolved external symbol _Get_NI_DAQ_Version
nidaq_wrap.obj : error LNK2001: unresolved external symbol _Init_DA_Brds
nidaq_wrap.obj : error LNK2001: unresolved external symbol _SCAN_Op
nidaq_wrap.obj : error LNK2001: unresolved external symbol _SCAN_Setup
nidaq_wrap.obj : error LNK2001: unresolved external symbol _SCAN_Start
nidaq_wrap.obj : error LNK2001: unresolved external symbol _SCAN_to_Disk
nidaq_wrap.obj : error LNK2001: unresolved external symbol _Timeout_Config
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Chan_Control
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Check
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_ClockRate
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_DB_Config
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_DB_HalfReady
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_DB_Transfer
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_from_Disk
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Group_Control
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Group_Setup
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Load
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Op
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Rate
nidaq_wrap.obj : error LNK2001: unresolved external symbol _WFM_Set_Clock
nidaq_wrap.obj : error LNK2001: unresolved external symbol _Config_DAQ_Event_Mes
sage
build\lib.win32-2.3\_nidaq.pyd : fatal error LNK1120: 48 unresolved externals
error: command '"D:\Programme\Microsoft Visual Studio\VC98\BIN\link.exe"' failed
with exit status 1120

Weiß jemand von euch was "unresolved external symbol" heißt? Das benötigte "_nidaq.pyd" wurde deshalb nicht erstellt, was ein sehr großes Problem bedeutet.

Gruss,
Toni
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

unresolved external symbol ...
"Nicht auflösbares externes Symbol" wäre wohl eine ordentliche Deutsche übersetzung. Im Endeffekt heißt das soviel wie dass das Programm was Du probierst zu kompilieren eine Funktion oder ein Datenelement des entsprechenden Namens aus einer Bibliothek braucht, allerdings der linker, der die einzelnen Teile eines Programms zusammenfügt (daher der Name für diesen Schritt) diese Namen über die er meckert nirgendwo im Programm (in diesem Fall in der Python-Erweiterung) finden kann.

Im Endeffekt bedeutet das, daß Du gegen eine .lib-Datei linken mußt, in der diese Namen beschrieben sind, aber das nicht tust.

Unabhängig davon: der Compiler meldet auch schon eine ganze Menge Fehler, und zwar sind in der Quelldatei auch keine Beschreibungen für die Symbole die gesucht werden vorhanden (deswegen diese Warnung), und damit wird ein Standardrückgabewert für die Funktion des entsprechenden Namens angenommen. Das ist unschön, drückt aber im Endeffekt denk ich zusammen aus, dass Du einfach gegen die Bibliothek die Du einbinden willst nicht linkst (und der entsprechende Header-File nicht im Verzeichnis ist). Ich würd davon ausgehen dass das setup.py kaputt ist.
--- Heiko.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Das gibt es doch nicht. Ich werde noch hier verrückt.
Ich werde augenblicklich mit dem Ersteller in Kontakt treten und das nachfragen. Wenn nichts mehr geht werde ich wahrscheinlich ganz auf Python 2.2 umsteigen (Müsste dann alle Extensions für 2.2 downloaden und installieren. Fraglich ob alle auch in 2.2 vorhanden sind :? ).
Danke für die Hilfe. Werde mich melden, falls ich was neues in Erfahrung gebracht habe.

Gruss,
Toni
lula
User
Beiträge: 3
Registriert: Samstag 8. April 2006, 13:15
Wohnort: Leipzig

Hallo Toni83,

ich greife auf die Datei nidaq32.dll über ctypes zu.
Damit kann man problemlos die Karten von NI ansteuern.

Tschüß Lutz

PS. hier noch ein paar Programmzeilen, vielleicht hilft es Dir

Code: Alles auswählen

from ctypes import *

pydll=windll.nidaq32            # DLL geladen
AI_Read=pydll.AI_Read           # Funktion aus dll geladen
AO_Write=pydll.AO_Write
dig_out=pydll.DIG_Out_Line      # Funktion aus dll geladen
port_config=pydll.DIG_Prt_Config
dig_input=pydll.DIG_In_Line

# Analogwert einlesen
kanal=0
deviceNumber=c_int(1)       # i16 assigned by MAX 
chan=c_int(kanal)
gain=c_int(-1)
h_ret=c_int(999)
status=AI_Read(deviceNumber,chan,gain,byref(h_ret))

# dig Input
deviceNumber=c_int(1)       # i16 assigned by MAX 
port=c_int(0)
mode=c_int(0)
dir_=c_int(0)
line=c_int(1)
status=port_config(deviceNumber, port, line, dir_)
status =dig_input (deviceNumber, port, line,byref(h_ret))
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Hört sich ja ganz gut an, das ganze mit ctypes zu lösen. Habe aber ein Problem mit windll:

Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Toni Adam Krol\Desktop\ctypes.py", line 1
, in ?
from ctypes import *
File "C:\Dokumente und Einstellungen\Toni Adam Krol\Desktop\ctypes.py", line 4
, in ?
pydll=windll.nidaq32 # DLL geladen
NameError: name 'windll' is not defined
Drücken Sie eine beliebige Taste . . .

Was ist der Grund dafür? Gibt es für win32dll etwa auch eine Python-Extension oder liegt das an einer Einstellung?

Gruss,
Toni
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Das liegt am Dateinamen. ;-) Du hast die Datei ctypes genannt, und damit importiert sie sich selbst... Was natürlich nicht klappen kann. Benenn die Datei irgendwie anders, und er wird das ctypes importieren was Du haben willst.
--- Heiko.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Vielen Dank für den Hinweis!!! Natürlich oberbehämmert von mir... :?
Vielleicht noch eine Frage für heute:
Ich kriege morgen das Gerät von National Instruments und möchte heute schon das Programm dafür schreiben.
Ist diese Meldung:

Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Toni Adam Krol\Eigene Dateien\versuch.py"
, line 3, in ?
pydll=windll.nidaq32 # DLL geladen
File "D:\Python23\Lib\site-packages\ctypes\_loader.py", line 200, in __getattr
__
dll = self.load_version(name)
File "D:\Python23\Lib\site-packages\ctypes\_loader.py", line 170, in load_vers
ion
return self._plat_load_version(name, version, mode)
File "D:\Python23\Lib\site-packages\ctypes\_loader.py", line 121, in _plat_loa
d_version
return self.load(name, mode)
File "D:\Python23\Lib\site-packages\ctypes\_loader.py", line 112, in load
return self._load(libname, mode)
File "D:\Python23\Lib\site-packages\ctypes\_loader.py", line 124, in _load
return self._dlltype(libname, mode)
File "D:\Python23\Lib\site-packages\ctypes\__init__.py", line 300, in __init__

self._handle = _dlopen(self._name, mode)
WindowsError: [Errno 126] Das angegebene Modul wurde nicht gefunden
Drücken Sie eine beliebige Taste . . .

richtig, falls das Gerät an das USB Interface nicht angehängt wurde? Eigentlich steht es ja da, aber ich hege immer noch etwas misstrauen...

Ich bedanke mich schon mal bei allen die mir bis dahin geholfen haben.

Gruss,
Toni
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Klingt eher als würde die Datei nidaq32.dll nicht gefunden. Versuch mal, sie in %WINDIR%\system32 zu kopieren und dann zu importieren, was dann passiert.

Wie ich darauf komme? So:

Code: Alles auswählen

>>> import ctypes
>>> ctypes.windll.kernel32
<WinDLL 'kernel32', handle 7c800000 at 9ef468>
>>> ctypes.windll.nosuchdll
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "C:\Programme\Python\Lib\site-packages\ctypes\__init__.py", line 346, in __getattr__
    dll = self._dlltype(name)
  File "C:\Programme\Python\Lib\site-packages\ctypes\__init__.py", line 383, in __init__
    self._handle = _LoadLibrary(self._name)
WindowsError: [Errno 126] Das angegebene Modul wurde nicht gefunden
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Nun ja habe jetzt noch erfahren, dass die nidaq32.dll die ich erhalten habe eigentlich die nidex32.dll ist, nur umbenannt wurde. Außerdem war Sie nicht im Python Ordner und auch nicht im system32, weshalb es schon gar nicht hätte funktionieren können. Ich habe allerdings erst morgen die CD mit den dll´s zur Hand, weshalb ich mich morgen noch mal melden werde ob es geklappt hat.
Danke für die Hilfe!

Gruss,
Toni
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Servus,

habe endlich die CD und die Steuerung gekriegt. Habe jetzt feststellen müssen, dass das Gerät einen anderen Treiber braucht. Es wurde nicht der NI-DAQ sondern der NI-DAQmx Treiber mitgeliefert. Ich habe jetzt auch noch von NI erfahren müssen, dass der mx Treiber eine andere dll enthält als der traditionelle (statt nidaq32.dll enthält es nicaiu.dll). Nicht nur das, auch die vom User lula in seinem Beitrag beschriebenen Funktionsaufrufe sind jetzt bei der anderen dll andere.
Ich habe mir mal erlaubt die Source von lula etwas zu modifizieren:

Code: Alles auswählen

from ctypes import * 

pydll=windll.nicaiu            		# DLL geladen 
AI_Read=pydll.DAQmxReadBinaryI16       	# Funktion aus dll geladen 
AO_Write=pydll.DAQmxWriteBinaryI16 


# Analogwert einlesen 
kanal=0 
deviceNumber=c_int(1)       		# i16 assigned by MAX 
chan=c_int(kanal) 
gain=c_int(-1) 
h_ret=c_int(999) 
status=AI_Read(deviceNumber,chan,gain,byref(h_ret)) 

# dig Input 
deviceNumber=c_int(1)       		# i16 assigned by MAX 
port=c_int(0) 
mode=c_int(0) 
dir_=c_int(0) 
line=c_int(1) 
status=port_config(deviceNumber, port, line, dir_) 
status =dig_input (deviceNumber, port, line,byref(h_ret)) 
Ich weiss aber nicht ob dies stimmt. Falls sich hier einer mit der nicaiu.dll auskennt, wäre ich außerordentlich dankbar, wenn er sich hier dazu äußern könnte.

Gruss,
Toni

Edit (Leonidas): Code in Python-Tags gesetzt.
lula
User
Beiträge: 3
Registriert: Samstag 8. April 2006, 13:15
Wohnort: Leipzig

Hallo Toni83,

Ich habe bisher nur mit dem traditionellen NI-DAC gearbeitet, kenne mich also in der nicaiu.dll nicht aus.
NI liefert meist Beispiele in VB oder C/C++ mit. Vielleicht kannst Du dort die Aufrufkonventionen ableiten.

Tschüß Lutz
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Ich glaube ich muss da selber durch...
Danke für die Antwort lula!
Werde mal schauen ob ich etwas in Erfahrung bringe. Werde dann auf jeden Fall wenn ich Erfolg habe, den Source hier für die Nachwelt ins Forum stellen.
Danke erstmal allen für die Hilfe.

Gruss,
Toni
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Habe da nocmal ein Problem. Habe jetzt möglichen Source gefunden:

static TaskHandle ghProcessTask=0;

// Analog Out (static) ------------------------------------------------------
DAQmxCreateTask("", &ghProcessTask);
DAQmxCreateAOVoltageChan(ghProcessTask, ProcessChannel, "", -amplitude, amplitude, DAQmx_Val_Volts, NULL);
DAQmxCfgOutputBuffer (ghProcessTask, 0);

DAQmxStartTask(ghProcessTask);
while(gRunning){
DAQmxWriteAnalogScalarF64 (ghProcessTask, 0, 10.0, data[++i%bufferSize], 0);
Delay(0.05);
}
DAQmxCleanTask(ghProcessTask);

Problem: &ghProcessTask und static TaskHandle ghProcessTask=0;
Wie löse ich das in Python? Gibt es da eine Möglichkeit mit ctypes?

Gruss,
Toni
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Habe inzwischen eine Lösung gefunden. Problem dabei:
Der Code ist in C geschrieben, da ich für den neuen Treiber NIDAQmx keine Möglichkeit sehe diesen in Python zu schreiben.
Nun weiss ich leider nicht wie ich meinen C-Code bzw. mein angelegtes Projekt (enthält 2 Programme) in Python einbinde. Im Prinzip will ich nur einen Wert aus dem C-Code in Python zurückgeben. Wie ich allerdings den Code von Python aufrufe weiss ich leider nicht und benötige da eure Hilfe...

Gruss,
Toni

P.S.: Wer gleiche oder ähnliche Probleme hat, hier der Code: (Ich hoffe es bringt euch weiter :D)

USB 6009 (Auslesen eines Spannungswerts):

Code: Alles auswählen

#include <stdio.h>
#include <NIDAQmx.h>

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(void)
{
	int32       error=0;
	TaskHandle  taskHandle=0;
	int32       read;
	float64     data[1000];
	char        errBuff[2048]={'\0'};

	/*********************************************/
	// DAQmx Configure Code
	/*********************************************/

	DAQmxErrChk (DAQmxCreateTask("",&taskHandle));

	DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
	DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));

	/*********************************************/
	// DAQmx Start Code
	/*********************************************/
	DAQmxErrChk (DAQmxStartTask(taskHandle));

	/*********************************************/
	// DAQmx Read Code
	/*********************************************/

	DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL));

	/*********************************************/
	// Read Voltage Input
	/*********************************************/

	printf("Acquired %f points\n",data[0]);
	
		

Error:
	if( DAQmxFailed(error) )
		DAQmxGetExtendedErrorInfo(errBuff,2048);
	if( taskHandle!=0 )  {
		/*********************************************/
		// DAQmx Stop Code
		/*********************************************/
		DAQmxStopTask(taskHandle);
		DAQmxClearTask(taskHandle);
	}
	if( DAQmxFailed(error) )
		printf("DAQmx Error: %s\n",errBuff);
	printf("End of program, press Enter key to quit\n");
	getchar();
	return 0;
}
Und NIDAQmx.c für das dll Handling. (Falls jemand dies benötigt dem kann ich das schicken, da der Code dazu zu lang wäre um in an dieser Stelle zu senden.)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Toni83 hat geschrieben:Wie ich allerdings den Code von Python aufrufe weiss ich leider nicht und benötige da eure Hilfe...
Dazu gibt es mehrere möglichkeiten. Du kannst versuchen, den C-Code als DLL zu kompilieren und mit ctypes zugreifen, oder du kannst es mit vergleichsweise einfach SWIG oder Pyrex wrappen. Für nährere Details wartest du auf modelnine ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Danke für die Anwort!
Aus dem Code eine dll zu erstellen habe ich noch nie gemacht. Wird also für mich sehr schwierig werden.
Da schaue ich mir doch lieber die Wrapper an. Werde mich noch selber darüber informieren, allerdings wäre ich modelnine sehr dankbar wenn er Zeit finden würde mir ein paar "Details" über die Wrapper mitzuteilen.
Danke!

Gruss,
Toni
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Humm... Am besten schickst Du einfach mal ein bisschen Code, oder stellst den "Wrapper" der über dem liegt den Du jetzt geschrieben hast irgendwo im Netz zum Download zur Verfügung, dann kann ich gerne mal gucken inwiefern ich dazu einen Python-Wrapper schreiben kann. Das ist im Normalfall nicht schwer. Sonst, wenn Du allgemeine Fragen zum Wrappen hast, stell sie einfach!

Auf jeden Fall sehenswert ist:

http://docs.python.org/ext/ext.html

Kapitel 1 und 2, um die Grundzüge zu verstehen wie man ein Python-Erweiterung in C schreibt, und sonst natürlich auch noch:

http://docs.python.org/api/api.html

die API-Dokumentation zu Python, die sehr hilfreich ist um eine Übersicht über die Konversionsfunktionen von C-Typen zu Python-Typen und umgekehrt zu bekommen.

Wie gesagt, poste einfach Code der gewrappt werden muß, und ich kann Dir gerne einen Beispielwrapper schreiben zum angucken.
--- Heiko.
Benutzeravatar
Toni83
User
Beiträge: 125
Registriert: Donnerstag 28. Juli 2005, 10:53

Danke für das Angebot! Wenn Du ein wenig Zeit für diese Sache entbehren könntest und es nicht großen Aufwand macht kannst Du sehr gerne einen Beispielwrapper schreiben. Wäre Dir außerordentlich dankbar dafür, da ich aus meiner Sicht denke, dass dies nicht so einfach sein wird.
Warum? Weil es zwei C-Dateien sind. Diese müssen unbedingt in einem Projekt eingebunden sein, da der Code sonst nicht funktionieren würde. In der einen Datei (NIDAQmx.c) sind Definitionen für die Ansteuerungen meines USB-Gerätes vorhanden, die die zweite Datei (USB6009.c) benötigt.

Hier der Code:

NIDAQmx.c:

Findet man unter:
http://forums.ni.com/attachments/ni/250 ... /NIDAQmx.c

und USB6009:

Code: Alles auswählen

#include <stdio.h>
#include <NIDAQmx.h>

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(void)
{
	int32       error=0;
	TaskHandle  taskHandle=0;
	int32       read;
	float64     data[1000];
	char        errBuff[2048]={'\0'};

	/*********************************************/
	// DAQmx Configure Code
	/*********************************************/

	DAQmxErrChk (DAQmxCreateTask("",&taskHandle));

	DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
	DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));

	/*********************************************/
	// DAQmx Start Code
	/*********************************************/
	DAQmxErrChk (DAQmxStartTask(taskHandle));

	/*********************************************/
	// DAQmx Read Code
	/*********************************************/


	DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL));

	printf("Acquired %f points\n",data[0]);
	
		

Error:
	if( DAQmxFailed(error) )
		DAQmxGetExtendedErrorInfo(errBuff,2048);
	if( taskHandle!=0 )  {
		/*********************************************/
		// DAQmx Stop Code
		/*********************************************/
		DAQmxStopTask(taskHandle);
		DAQmxClearTask(taskHandle);
	}
	if( DAQmxFailed(error) )
		printf("DAQmx Error: %s\n",errBuff);
	printf("End of program, press Enter key to quit\n");
	getchar();
	return 0;
}

Nochmals Danke im Voraus!!!

Gruss,
Toni

P.S.: Nur mal so am Rande: Gibt es irgendeine Möglichkeit den Code auch als z.B. zip Datei hochzuladen und einzubinden?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Toni83 hat geschrieben:P.S.: Nur mal so am Rande: Gibt es irgendeine Möglichkeit den Code auch als z.B. zip Datei hochzuladen und einzubinden?
Im Forum? Nein. Das phpBB (die Forensoftware) zu modifizieren wäre möglich aber der aufwand wäre zu groß, da dieses Feature eigentlich kaum jemand braucht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten