Найти - Пользователи
Полная версия: DLL возвращает int, а не то что должна
Начало » Python для экспертов » DLL возвращает int, а не то что должна
1
sinopteek
Есть проект в котором используется плата АЦП. Под неё есть драйвера windows.
Инициализация и получение версии, адресного пространства происходит нормально, но когда доходим до получения информации с платы - всегда возвращается 128(int) или редко 65535(int)
Функции должны возвращать float или hex, а приходит int
Код не будет работать без платы и драйверов, которые не встанут без платы =)
но всё же может кто подскажет в чём может быть проблема?
 # -*- coding: utf-8 -*-
'''
Created on 15.10.2009

@author: Sinopteek
'''
from ctypes import *
from array import *

class PISO(object):
u'''
класс определяющий плату АЦП PISO-813
'''

debug =0

def __init__(self):
u'''
инициализируем драйвер
и ищем платы
'''
self.PISO_dll = windll.Piso813

#u'ID'
self.PISO813id = 0x800A00
#u"инициализируем драйвер"
if (self.PISO_dll.PISO813_DriverInit()):
print u"Driver init"
else:
print u"Can not initial Driver!!! PISO813 Card Error"

self.wBoard = c_int(0) #u"всего плат найдено"
self.wBoardNo = c_int(0) #u"используемая плата"

#u'ищем платы'
if self.PISO_dll.PISO813_SearchCard(byref(self.wBoard),self.PISO813id):
print u"Search Card Error!!! PIODIO card Error"
else:
print u"Searched"

print u"Всего плат найдено :", str(self.wBoard)[7:-1]

AddrBase = c_int(0)
IrqNo = c_int(0)
SubVendor = c_int(0)
SubDevice = c_int(0)
SubAux = c_int(0)
SlotBus = c_int(0)
SlotDevice = c_int(0)

def get_Address_Space(self, BoardNo):
#u'получаем адрессное пространство платы c номером BoardNo'
Return_Code = {
0 : 'No Error',
1 : 'Driver Open Error',
2 : 'Driver No Open',
3 : 'Get Driver Vesion Error',
4 : 'Call Driver Error',
5 : 'Find Board Error',
6 : 'Exceed Board Number',
0xFFFF : 'Time Out Error',
-100.0 : 'Ad Error 2'
}

answer = self.PISO_dll.PISO813_GetConfigAddressSpace(BoardNo,byref(self.AddrBase),
byref(self.IrqNo),byref(self.SubVendor),byref(self.SubDevice),
byref(self.SubAux),byref(self.SlotBus),byref(self.SlotDevice))
if answer == 0:
#u'выводим адресное полученное пространство'
if self.debug:
print "AddrBase = ",self.AddrBase
print "IrqNo = ",self.IrqNo
print "SubVendor = ",self.SubVendor
print "SubDevice = ",self.SubDevice
print "SubAux = ",self.SubAux
print "SlotBus = ",self.SlotBus
print "SlotDevice = ",self.SlotDevice
else:
print Return_Code[answer]

self.Jmp20v = c_int(1) #u"размах 20 В(1) 10В(0)"
self.BiUni = c_int(1) #u"Одно(0) и Двуполярное(1) напряжение"

#ADChNo = 0 #u'номер канала /0-31/'
#CfgCode = 0 #u'степень усиления 2**wCfgCode /0-4/'

def Set_Ch_Gain(self,ch=0,gain=1):
u"устанавливаем для канала ch усиление gain"

u"определяем степень двойки"
for i in range(5):
if 2**i == gain:
CfgCode = i
break

if self.debug:
if self.PISO_dll.PISO813_SetChGain(self.AddrBase, ch, CfgCode) == 0:
print u"Gain for channel",ch,"set to",2**CfgCode
else:
print u"Set Gain for channel",ch," Error"

def get_hex(self):
u"возвращаем в формате HEX 12 бит"
answer = self.PISO_dll.PISO813_AD_Hex(self.AddrBase)
if self.debug:
print "HEX =", hex(answer)
return answer

#def get_bin(self):
# print "bin =", bin(self.PISO_dll.PISO813_AD_Hex(self.wAddrBase))

def get_float(self):
u"преобразуем в формат float 12 бит"

answer = (self.PISO_dll.PISO813_AD_Float(self.AddrBase, self.Jmp20v, self.BiUni)-2047.)*10/2048
if self.debug:
print "Float = ", answer
return answer

def close(self):
u"закрываем драйвер"
if self.PISO_dll.PISO813_DriverClose():
print u"driver closed"
else:
print u"Can not access Driver!!! PISO813 Card Error"



u'just 4 debug'
a = PISO()
a.get_Address_Space(0)

a.Set_Ch_Gain(ch=0,gain=1)
a.get_hex()
a.get_float()
a.close()
что-то мне подсказывает, что через ctypes dll может возвращать только int
p.s. тут подумал, что может понадобится ещё инструкция по библиотеке - http://narod.ru/disk/20507397000/PISO-813_DLL_Software_Manual.pdf.html
Андрей Светлов
посмотрите http://docs.python.org/library/ctypes.html#return-types
sinopteek
Андрей Светлов
посмотрите http://docs.python.org/library/ctypes.html#return-types
спасибо, теперь можно c_float вернуть
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB