使用Python語言做自動控制的方法 - I 軟體篇
 
 
  [語法簡單明瞭]
 
 
  Python語法簡單易學,最重要的是還有大量功能強大的免費模組可下載,其強大的應用層面已經發展到令人不可忽視的重要地位,甚至NASA也拿來當作航太人機介面的控制語言。早期接的專案我都是用Assembly、C、C++、C#等設計自動控制系統,這幾年我很多是改用Python來撰寫,好處是取得系統傳回的資料後,可很容易且快速的結合各種海量模組演算法發展出很專業的人工智慧機器。
 
 
  [Python是跨平台語言]
 
 
  Python本身沒有支援特定硬體控制的功能,也正因為如此它才能夠跨平台,但這不是原罪,相反的卻是它的優點,換句話說,在x86、Arm、Arduino、PC、手機或平板等不同的作業系統環境下,相同的程式皆可以很容易互相移植過去正常執行,這 print('免費資源 + 免費的模組 + 簡單易學') 根本是一場世界革命,能不紅嗎!
 
 
  綜合以上講了一大堆,無非就是要說服工程師們是該改變自已接受世界脈動的時候了,我也不例外,以此共勉之!
 
 
  [軟體開發]
 
 
  接下來進入主題談論如何用Python開發一個多軸的CNC平台,會舉這個CNC專題當作例子是因為在我眼裡,CNC其實就是一個機器人,我的經驗是~只要搞懂CNC軟硬體知識後,無論是自駕車、四軸無人機或是工具機皆是囊中物,至於想要用它做些甚麼,端看你無限的想像力而定!
 
 
  因為Python沒有直接存取硬體的介面,我的方法是用Python當作主程式,將底層存取硬體的API程式(動態連結程式庫 DLL)封裝成Python可調用的格式即可,如此一來多年使用C++/C#寫的程式庫都可引用了。因為程式很長, 為免洗板我簡略敘說過程如下:
 
 
  (A). 封裝DLL程式庫成PyCNC.py 模組,其中 class __IMC_Pkg()就是封裝成類別的名稱, 將來Python與機器溝通的介面就是依靠這項。
 
 
  #---------------------------------------------------------------------------
 
 
  
   
    
     #
    
    
     這是被呼叫的模組
    
   
  
  : PyCNC.py
 
 
  #---------------------------------------------------------------------------
 
 
  
   
    
     #
    
    
     需引用ctypes
    
   
  
 
 
  import ctypes
 
 
  import ctypes.wintypes
 
 
  #------------------------------------------------------------------------------
 
 
  class __IMC_Pkg():
 
 
  def __init__(self):
 
 
  self.ptr = ctypes.WinDLL('IMC_Pkg.dll')
  
   
    
     #
    
    
     _stdcall
    
   
  
 
 
  #---------------------------------------------------------------------------
 
 
  def Open(self, netcardId, imcId):
 
 
  self.ptr.PKG_IMC_Open.argtypes = (ctypes.c_int, ctypes.c_int)
 
 
  self.ptr.PKG_IMC_Open.restype = ctypes.POINTER(ctypes.c_voidp)
 
 
  return self.ptr.PKG_IMC_Open(netcardId, imcId)    #---------------------------------------------------------------------------
 
 
  def Close(self, handle):
 
 
  self.ptr.PKG_IMC_Close.argtypes = (ctypes.POINTER(ctypes.c_voidp), )
 
 
  self.ptr.PKG_IMC_Close.restype = ctypes.c_int
 
 
  return self.ptr.PKG_IMC_Close(handle)
 
 
  #---------------------------------------------------------------------------
 
 
  def MoveAbs(self, handle, pos, startvel, tgvel, wait, axis):
 
 
  self.ptr.PKG_IMC_MoveAbs.argtypes = (ctypes.POINTER(ctypes.c_voidp), ctypes.c_int, ctypes.c_double, ctypes.c_double, ctypes.c_int, ctypes.c_int)         self.ptr.PKG_IMC_MoveAbs.restype = ctypes.c_int
 
 
  return self.ptr.PKG_IMC_MoveAbs(handle, pos, startvel, tgvel, wait, axis)
 
 
  #---------------------------------------------------------------------------
 
 
  def MoveAbs_P(self, handle, pos, startvel, tgvel, wait, axis):
  
   
    
     #
    
    
     P
    
   
  
  輔助座標
 
 
  self.ptr.PKG_IMC_MoveAbs_P.argtypes = (ctypes.POINTER(ctypes.c_voidp), ctypes.c_int, ctypes.c_double, ctypes.c_double, ctypes.c_int, ctypes.c_int)         self.ptr.PKG_IMC_MoveAbs_P.restype = ctypes.c_int
 
 
  return self.ptr.PKG_IMC_MoveAbs_P(handle, pos, startvel, tgvel, wait, axis)
 
 
  .
 
 
  .
 
 
  (B). 主程式motion.py 要引用也很簡單, 只要加上PyCNC.py模組,就可以調用IMC_Pkg所有的功能
 
 
  #---------------------------------------------------------------------------
 
 
  
   
    
     #
    
    
     這是主程式
    
   
  
  : motion.py
 
 
  #---------------------------------------------------------------------------
 
 
  from CNC import PyCNC
 
 
  IMC_Pkg = PyCNC.__IMC_Pkg()
 
 
  #---------------------------------------------------------------------------
 
 
  if(self.gHandle != None):
 
 
  IMC_Pkg.Close(self.gHandle)
 
 
  self.gHandle = IMC_Pkg.Open(netcardId, imcId)
 
 
  if(self.gHandle != None):  #//if(IsOpen())
 
 
  if(IMC_Pkg.InitCfg(self.gHandle) != 0):
 
 
  self.nAxis = IMC_Pkg.GetNaxis(self.gHandle)
  
   
    
     #
    
    
     取得設備支援軸數
    
   
  
 
 
  p, self.Position = self.GetPosition(3)
 
 
  (C). 建議開發環境安裝Anaconda開發包, 在設計Python程式時可少走很多冤枉路,為了相容以前DLL程式庫,我是下載Anaconda3 - 32bit - Python3.7.3版本。
 
 
  p.s. (1). IMC3xx/IMC4xx系列運動控制卡所有函數(IMC_Pkg.dll)我都有封裝成PyCNC.py以方便Python呼叫,有興趣的朋友可加入我臉書討論。
 
 
  ((2). 圖-1. 八軸運動+I/O+AD/DA控制卡應用圖例
 
 
  圖-2. motion.py 主程式的視窗介面
 
 
  影片-1. 使用motion.py 展示CNC軸控,也順便Demo飛行搖桿控制3軸及發射雷射
 
 
  影片-2. 電腦執行motion.py情形
 
 
  影片-3. 使用motion.py 執行G-Code,用雷射雕刻一個正圓
 
 
  (3). 下回有機會再補上 :  "使用Python語言做自動控制的方法 - I I 硬體篇"及 "使用Python語言做自動控制的方法 - I I I 通信篇" (UART、USB、TCP/IP)兩篇才算完整,並且教導大家如何組裝一台三軸運動控制平台的知識(機械結構及控制電路的接法),對於想創業設計自已機器的朋友不要錯過了。在臉書不適合長篇大論所以只能簡單敘述,總感覺見樹不見林,當然我也有開相關的指導課程,有興趣的朋友可上我臉書或私訊我。
 
														 
								 
								 
								 
								 
										
					
						 Wei-Hsiung Huang
						Wei-Hsiung Huang
						2019-10-03 19:48:42
					
					
				 
				
					
						 便宜十塊錢
						便宜十塊錢
						2019-10-03 19:49:49
					
					
						
 
  
   Python好用+1
  
  
  
   我幫公司做一個簡易Web資訊看板
  
  
  
   用一台PLC+乙太模組做收集各產線資訊
  
 
 
  
   
   
    (我很懶得拓樸一大堆通訊線,跑RS485 To Zigbee)
   
   
   
    由乙太模組把資訊先推到ModbusTCP層
   
   
   
    再由Python讀ModbusTCP把讀到的值推到前端Web上
   
   
   
    簡易的產能看板
   
   
   
    跨平台真的好用
   
  
 
						
					 
				 
				
					
						 吳小東
						吳小東
						2019-10-03 22:16:58
					
					
				 
				
					
						 石小川
						石小川
						2019-10-03 23:30:37
					
					
						
 
  good job! 這是很好的應用, 以前接工廠資料收集器專案, 通信用RS232, 十台一大捆線, 現在看太不可思議了, 哈哈^^
 
						
					 
				 
				
					
						 便宜十塊錢
						便宜十塊錢
						2019-10-03 23:57:01
					
					
						
 
  石小川 我收集的PLC有做類心跳封包,只對有開機的機台通訊,不然Timeout會拖慢速度,越多台沒開越慢,所有的數值都在各機台PLC處理好,再收集
 
 
 
  另外還有外加自動紀錄(5天)+控制各站自動歸零(各站開機時規零)
 
						
					 
				 
				
					
						 便宜十塊錢
						便宜十塊錢
						2019-10-04 00:08:16
					
					
						
 
  這個是第一個有線通訊(4台)
 
 
 
  現在在做的無線(9台)快好了
 
 
 
  規劃排點位跟處理問題較麻煩
  
   
    ?
   
  
 
															 
					 
				 
				
					
						 石小川
						石小川
						2019-10-04 12:12:53
					
					
						
 
  感謝分享, 在關燈無人工廠掘起後, 機台間的通信越來越重要了,  大大的技術應該很有潛力, 我還停留在十幾年前TCP/IP抓封包技術, 有機會再請教您^^