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