我的這篇文章是結合工作實際碰到一個問題,在這里記錄下:
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 作為一個膠水語言,在某些方面用起來還是方便的(這依賴於強大的第三方庫),做一些功能測試是,或者做一些后台服務。
注:功能強大源於第三方庫,但第三方庫的好壞程度不一,所以有些時候還是要多寫代碼和長時間驗證。