我的这篇文章是结合工作实际碰到一个问题,在这里记录下:
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 作为一个胶水语言,在某些方面用起来还是方便的(这依赖于强大的第三方库),做一些功能测试是,或者做一些后台服务。
注:功能强大源于第三方库,但第三方库的好坏程度不一,所以有些时候还是要多写代码和长时间验证。