Python 利用python net库 调用C#写的dll


我的这篇文章是结合工作实际碰到一个问题,在这里记录下:

1、原本思路:

    研华工控机UNO1372 自带8个GPIO(其中4个DI和4个DO),研华官网提供这些GPIO驱动和C#写的DLL,我能就准备用Python来控制GPIO的输入输出。

2、查资料:

    首先网上查资料,看这个Python net库是怎么使用,然后看博客园的博主是怎么写的代码,主要包括三个步骤,首先pip 按照这个模块,其次是 import clr  引入

这个模块,最后利用clr.AddReference("GPIODLL")        from GPIODLL import *      加载dll,创建对象和调用方法了。

3、我碰到的问题是,一个理解上的问题。

(1)这个dll是研华提供的dll,我原本以为只要调用这个dll就能控制GPIO了,但发现用Python引入这个dll后,

 

   找不到我要用的GPIO对象。一度怀疑是自己前面代码写的有问题。

(2)翻看源码,发现源码的结构是这样的

 

   其中1 是应用的前面说的dll,2是研华自己写的类库,这个类库引用了dll中的CommFunction类,3是真正操作GPIO的程序,所以整个机构是dll--》GPIO.CS--》Program.cs。真正

操作GPIO的类在GPIO.cs文件。这样问题就明确了。我们要自己通过Advantech.Win32.Driver.Device.dll和GPIO.cs 文件 重新生成dll,然后我们的程序调用自己生产的dll才行。

(3)自己制作dll的过程这里就不介绍了,都是基本的操作。

(4)这里把Python代码记录在这里

 1 import  clr
 2 # clr.FindAssembly('Advantech.Win32.Driver.Device.dll')
 3 clr.AddReference("GPIODLL")
 4 from GPIODLL import *
 5 
 6 def DirGIO(Dir):# 将返回的数字翻译成文字
 7     if Dir:
 8         return "输入"
 9     else:
10         return "输出"
11 def IOGIO(IO):
12     if IO:
13         return  "Low"
14     else:
15         return "High"
16 if __name__ == '__main__':
17     mGPIO=GPIO()
18     mGPIO.OpenDevice("\\\\.\\AdvGPIODev")
19     mGPIO.handle
20     GPIOCount=mGPIO.GetGPIOCount() #获取设备一共有几个IO点
21     # 1(True):Input, 0(False):Output
22     # True:High, False:Low
23     for i in  range(0,GPIOCount):
24         print(f'一共有{GPIOCount}个通道,第{i}个通道的方向是 {DirGIO(mGPIO.GetDirInOut(i)) }')
25         print(f'一共有{GPIOCount}个通道,第{i}个通道的状态是 {IOGIO(mGPIO.GetIOStatus(i)) }')
26     a=mGPIO.GetAllDirInOut()#获取所有IO的方向
27     b=mGPIO.GetIOAllStatus()#获取所有IO的状态
28     print(a)
29     print(b)

4、运行截图

 

 5、Python 作为一个胶水语言,在某些方面用起来还是方便的(这依赖于强大的第三方库),做一些功能测试是,或者做一些后台服务。

注:功能强大源于第三方库,但第三方库的好坏程度不一,所以有些时候还是要多写代码和长时间验证。

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM