• 010-82665467 / 13810824283
  • ztic@ztic.cn (销售)
  • 北京市海淀区知春路111号理想大厦1603室
搜索
手机版
扫码访问手机版
关注微信
扫码关注官方微信
  • 客服电话
    点击联系客服

    周一至周五 9:00-12:00 13:00-17:00

    客服电话

    010-82665467

    13810824283

    电子邮件

    ztic@ztic.cn
  • 手机版

    扫描进手机版

    随时随地掌握行业动态

  • 官方微信

    扫描二维码

    关注中泰联创微信公众号

Python使用动态链接库操作数据采集卡

时间:2019-09-12 11:35 来源:中泰联创 作者:中泰联创 阅读:

如何通过Python编程来操作数据采集卡

        数据采集卡是一个非常传统的产品,它虽然已经出现了几十年,但是现在仍然有着顽强的生命力,无论是在工业生产中,还是科学研究中,处处都有着它的身影,因为它是计算机和传感器之间的桥梁,如果没有它,计算机和传感器将会对面不相识。正因为有了采集卡这个媒介,计算机才有了对真实世界的感知力,从而让人类可以借助计算机强大的计算能力,去更好的认识世界,控制世界。不管这个世界如何变化,编程语言如何更新,到目前为止,数据采集卡都是计算机感知世界的主要手段之一。而计算机要想使用采集卡来感知世界,则离不开动态链接库(DLL)——一个传统的软件工具。

        动态链接库,英文是Dynamic Link Library,一般就拿DLL作为简称。它的历史也要以数十年记,在计算机出现不到百年的历史中,它也可谓是老资格了,不论是硬件产品,还是软件产品,只要提供了DLL,便等于面向使用者敞开了大门。无论是几赫兹的低端采集卡,还是几G赫兹的高端采集卡,都会提供完整的动态链接库,而几乎所有的语言,都可以调用DLL,这其中也包括编程界的新宠:Python(派森)。

        在20年前,Python(派森)还默默无闻,但是由于它的易用性与算法库的强大支持,使用它的人越来越多,甚至在幼儿编程课中也慢慢成为主流。在工业控制领域,科学分析领域中Python使用率越来越高,而使用Python操作数据采集卡,也成为了很多人的需求。由于Python在网络操作方面有着得天独厚的优势,因此在基于网络的物联网应用领域,Python是一门主要的编程语言。为了顺应时代发展,让传统的采集卡在物联网世界发挥出它的力量,北京中泰联创科技有限公司提供了易于操作的动态链接库,让用户可以方便的使用Python从采集卡中读取各种数据,中泰联创提供了多种型号的网络数据采集卡,可以简单的应用在各种物联网场合。

        Python虽然容易使用,DLL函数接口也清晰明确,但是要想把二者结合正确使用,仍然需要避开一些陷阱,本文主要就是中泰联创工程师根据在实际使用过程中遇到的问题写成的,希望对于使用数据采集卡的网友们有所帮助。

        动态链接库一般都是C或者C++语言编写的,因此要在Python中正确调用它,需要先了解C语言数据类型和Python数据类型的对应关系,Python数据类型都定义在ctypes包中,对应关系网上有较丰富资源,这里不多加赘述。
        Python默认的数据类型是32位整形,如果不对DLL内的函数进行说明,则返回值和参数全部都默认为32位整形。在使用32位Python对数据采集卡进行编程时,一般不会出现问题,因为32位程序下,指针数据同样为32位,但是在如果想使用64位Python对采集卡进行编程,则会经常会出项一些古怪的现象,比如明明建立设备函数正确返回了,在使用返回值的时候,会出现内存访问异常的错误。有的时候调用传递指针的函数,会报告溢出错误,这一切,都是由于Python默认32位整形惹的祸。Python以为函数需要的是32位数据,可是传递的确实64位数据,着就会报告溢出错误。有的时候DLL以为返回的是64位指针,而Python默认是32位数据,直接就把指针截取成了32位,这时候就会报告内存访问错误。因此,为了程序稳定,增加采集卡的稳定性,对于动态链接库中的函数进行说明是非常有必要的。为了说明函数的返回值和参数类型,一般要新建立一个说明文件,假设动态链接库名称为EM9108.dll,则我们可以起名为EM9108.py。

由于Python语言中的类型都定义在ctypes包中,因此要在文件的开始:
import ctypes
然后加载库文件:
dll = ctypes.windll.LoadLibrary('EM9108.dll')
接下来就是正式的描述语句了,先说明几个C语言与Python语言的对应关系。
C语言中
void*对应ctypes.c_void_p,在C或者C++语言中,void*有可能被描述成HANDLE,所以HANDLE也对应相同的类型。实际上,对于任何指针,都可以使用ctypes.c_void_p来对应。
8位整形对应ctypes.c_int8
16位整形对应ctypes.c_int16
32位整形对应ctypes.c_int32
        注意在微软编程环境的C语言中,int这个类型是和应用程序位数有关系的,32位应用程序,对应的就是32位,64位应用程序,对应的就是64位,所以如果函数返回值或者参数类型是int的,要特别小心,64位和32位要分别描述。

返回类型描述:
dll.函数名称.restype = 返回类型;
参数描述:
dll.函数名称.argtypes = [参数1类型,参数2类型……];
或者
dll.函数名称.argtypes = (参数1类型,参数2类型……);
注意方括号[]在Python中代表列表(list)
圆括号()在Python中代表元组(tuple)
他们都可以描述参数表,当只有一个参数的时候,方括号语法是:
[参数类型]
圆括号语法是:
(参数类型,)

在需要操作采集卡的文件中,直接包含描述文件即可:
import 描述文件名
再调用函数的时候,要使用“描述文件名.dll.函数名称”的语法格式

        综上,便是使用Python调用动态链接库操作中泰联创数据采集卡所需要注意的问题,希望对大家有所帮助。

微信二维码

扫一扫Get更多资讯

Copyright © 北京中泰联创科技有限公司 版权所有 京ICP备18049974号-1 京公网安备:11010802021254号 技术支持:聚辉网络