• COSPLAY 3D 建模
  • #maker+t=market
  • 3D列印服務
  • 1
  • 2
  • 3

DIY CNC Machine.Taipei 造訪社團 » 演算

原文網址 石小川
2020-02-14 08:56:23

好久沒在這裡發表文章了,容我在此分享一下Python TCP/IP遠程監控機台程式實作。

網路發達後要做到機器設備遠端監控已非遙不可及了,網路通信在無人工廠的監控設備上會越來越重要。 圖中展示的系統是TCP/IP通訊協定的主從(Server-Client)式架構,TServer伺服端程式負責現場機器設備運作及回傳Sensor數據和即時影像給TClient用戶端處理。
為了方便教學緣故,已將網路封包加密演算法及帳號管理拿掉,通信程式精簡許多,比較容易理解,伺服端是以C#實作,用戶端會以C#及Python各實作一個版本。建議伺服端以C++或C#為主,而用戶端可用Python設計遠端控制APP,將來回傳的遙測大數據可很容易的用Python模組分析。

熟悉遠端操控軟硬體對將來有志設計無人工廠機器設備的朋友幫助很大,習得一技之長絕對增加競爭力。2月分我將開此TCP/IP主從式通信實作課程,因為現在病毒肆虐,採遠距教學方式較適合,沒有機器設備的同學我會提供兩台三軸機台做遠距連線操控練習,可在家寫Python程式做遠端連線操控,詳細辦法及日期我再擇期公布,歡迎有興趣的朋友來報名上課。

林志強
2020-02-14 09:16:55


原文網址 石小川
2019-10-03 19:28:13

使用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
2019-10-03 19:48:42

Nice..

便宜十塊錢
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抓封包技術, 有機會再請教您^^


原文網址 石小川
2019-08-17 16:45:50

G-Code雷射切割成果

趁假日趕快補上回未完的下集!

在設計CNC刀路軟體時, 如果能掌握多軸聯動及圓弧直線插補演算法技巧, 那差不多成功一半了, 有心要走設計機器手定位的人一定要熟悉。DWG/DXF轉CNC程式內部採用Double雙倍浮點運算,至少抓小數點第四位,如果機器校準正確的話精度應沒問題。

此次臨時組裝一個雷射機台做軟體測試,使用一顆5.5W藍光半導體雷射頭做工件雕刻, 圖中皆是用上回介紹的圓弧插補演算法用雷射刻出直徑50mm的全圓, 刀路頭尾都準確接合, 真圓度也高,已符合一般業界需求了。

圖一是製作飛機用的巴沙木。(表面雕刻, 雷射頭停留久時可切斷、貫穿)

圖二是厚皮革。(表面雕刻, 雷射頭停留久時可切斷、貫穿)

圖三是一般影印紙。(切斷)

p.s. 如果要切斷材料功能,可用程式設定進給將G-Code Fxxxx調慢些, 或換功率更大的雷射頭。


原文網址 石小川
2019-06-25 17:45:49

已將 iMC3xx2E 及 iMC4xxE/A系列所有開發工具、驅動軟體及文件都一次分享到Dropbox上,有興趣的朋友可瀏覽下載,將來我有試用版的軟體也會放在此網站提供免費試用。

我Dropbox網址如下:

只要下載壓縮檔即可 (rar, zip)

https://www.dropbox.com/…/2xu861…/AADz5dAuvRhq2Y9_M61Gp8PLa…

玩過PLC 及PC base控制後, 我現在重心主要是集中在PC base控制這一塊了, 吸引我的地方是PC base軟硬體可塑性太高了, 尤其人工智慧演算法很容易就可結合CNC機器, 這對我來說簡直是致命的吸引力, 想要做甚麼幾乎都可以, 當然不可否認的PLC還是有它的優點。

客戶通常認為PC設備便宜但還要加軟體費用很貴, 那是以前觀念, 更何況如果軟體是我們自已寫的那就另當別論了, 有這方面的技術問題歡迎互相技術交流!

謝謝囉^^

Don Si
2019-06-25 18:37:14

感謝分享

Eric Lin
2019-06-25 21:40:05

分享出去了

曾豪仁
2019-06-25 23:29:18

石兄有开班授课嗎?

陳必凱
2019-06-26 07:07:29

陳必凱
2019-06-26 07:07:52

開課+1

林志強
2019-06-27 21:39:36


原文網址 石小川
2019-06-01 14:32:26

雙眼攝影機測距 I – 設備實體製作

其實這個就是光學雷達(Lidar)的一種。在機器人視覺中模擬人眼雙目測距是最基本功夫,而且設備簡單只要兩個攝像頭加上演算法即可實現測距,沒有雷射輔助的話10公尺的誤差在1公分以內, 算是可接受範圍,精準度要看個人調校技巧了,加上雷射光或其他結構光輔助更可進一步將RGB影像加上深度資訊,換句話說就是上回談到的點雲圖了,這對機器人視覺來說太有用了。

在研讀聚合物(Polymer)時,對於壓克力的物理化學特性就深受其吸引,所以做產品或實驗時常拿壓克力練功。 因為壓克力有易碎特性,此次用CNC銑時參數調慢些, 壓克力厚: 30mm,Tool: D6*6*50,轉速: S6000, 進給: F300, 每層下切: 0.5mm,成果還不錯只是慢了些花了兩個鐘頭,下次實驗再調快否則有點大材小用,對不起這台專門銑不銹鋼模具的機器。

圖示是實作的設備,兩個攝像頭(Camera x 2) + 一個雷射頭(Laser x 1),外加演算法,就這麼簡單! 至於雙眼測距原理就是上童軍課的三角測距法,下回 “雙眼攝影機測距 I I – 原理解析” 再來聊聊了^^

p.s. 此次銑完壓克力邊緣沒後製熱處理,相信社團有很多人銑壓克力的經驗比我豐富,可來分享一下參數讓大家學習一下經驗, 感謝了^^

蔡文泰
2019-06-03 11:50:37

用雷割比較快哦


原文網址 石小川
2019-05-17 19:40:20

應用攝影機對CNC自動對刀程式的設計

對於非侵入性的偵測來說,我首推影像辨識技術,因為攝像頭價格越來越便宜,如果善用一些數位演算法的話,其實在CNC機台上可以做很多事,活用的話甚至可媲美幾百萬的進口機器。 我寫的這套VT軟體是結合了C++/C#/Qt + Mach3 + OpenCV和一些演算法來完成Z軸影像自動對刀功能,我是利用雷射來定位工件,其中攝像頭畸變須要校準才能量測準確,精密度我抓小數點第三位(單位mm)。 其它像工件尺寸量測、3D工件掃描建模直接出圖、或是機台要做手機拆解機器…等原理皆一樣,如果要做到物件直間掃描再CNC複製, 應該可挑戰一下,這就留給有興趣的人想想實作了, 先寫到這裡,祝各位好友假日愉快^^

林志強
2019-05-17 19:56:00

宜震陳
2019-05-17 20:00:39

已跪

辛育全
2019-05-17 22:20:29

哥 鏡頭可以考慮換焦段大一點的變異比較小,當然鏡頭品牌品質有差,且焦段大也不用看太多其他地方,可以增加你的解析,規格選一下可以不用校正就不要校正,然後改成背光,因為用環境光你需要限制客戶背景!


原文網址 石小川
2019-04-30 12:34:34

C#程式控制Mach3運動卡的方法(二)

上回寫的程式版本是透過USB HID介面直接控制Mach3, 這次版本是透過Mach3橋接, 用它提供的API做控制, 好處是幾乎所有Mach3功能皆可實作, 壞處是Mach3必須先執行, 這樣做有甚麼好處呢? 主要是二次開發用, 會自已寫程式的人(C# , C++, VB)可加入演算法提升CNC的功能, 例如可在CNC加入OpenCV做影像辨識或做3D工件掃描建模功能, 或者加入類神經網路做深度學習….等等, 下次有機會我們再詳細討論這部份. 本章重點是簡單介紹開發步驟, 以C#程式語言為例(其實任何語言皆可, 只是呼叫方式略有不同而已)如下:

(1)正常機碼必須有下列註冊檔, 否則程式無法呼叫API(有個補救方法, 下載Mach3Registry.reg, 執行可產生).

xxxxxxxxxx : 每套機碼不一樣. [HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxxxx}] @="Mach4.Document"

[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx] @="ole32.dll"

[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx }\LocalServer32] @="C:\\Mach3\\Mach3.exe"

[HKEY_CLASSES_ROOT\CLSID\{ xxxxxxxxxxx }\ProgID] @="Mach4.Document"

[HKEY_CLASSES_ROOT\Mach4.Document] @="Mach4.Document"

[HKEY_CLASSES_ROOT\Mach4.Document\CLSID] @="{ xxxxxxxxxxx }"

(2)在C# /專案/加入參考/ 將Mach3.exe 加入參考,

並在程式前面加入

using System.Runtime.InteropServices;

using Mach4;

(3)主要操作就是這項, 一旦取得Mach3的handle(mInst), 就可長驅直入使用其提供的所有功能(功能可參考Mach3 Version3.x Macro Programmers Reference Manual.pdf) .

IMyScriptObject mInst = null;

try

{

Mach4 mach = (Mach4.IMach4)

Marshal.GetActiveObject("Mach4.Document");

mInst = (Mach4.IMyScriptObject)

mach.GetScriptDispatch();

}

catch

{

}

(4)程式有點長, 為避免洗版, 只好摘錄部分程式如下(有疑問或有興趣找我研發的也歡迎私訊我!):

//---------------------------------------------------------------------

//Mach3 Control Process

//---------------------------------------------------------------------

private IMyScriptObject GetMachInstance()

{

IMyScriptObject mInst = null;

try

{

IMach4 mach = (Mach4.IMach4)

Marshal.GetActiveObject("Mach4.Document");

mInst = (Mach4.IMyScriptObject)

mach.GetScriptDispatch();

}

catch

{

}

return mInst;

}

//---------------------------------------------------------------------

private bool DoEmButton(short number)

{

if(_mInst != null)

{

_mInst . DoOEMButton(number);

return true;

}

return false;

}

//---------------------------------------------------------------------

private void DoGCode(string code)

{

if(_mInst != null)

_mInst.Code(code);

}

//---------------------------------------------------------------------

private void sendMDI()

{

if(textBoxMDI.Text.Trim() != null)

{

DoGCode(textBoxMDI.Text.Trim());

}

}

//---------------------------------------------------------------------

private double[] UpdateDRO()

{

double[] dro = new double[3];

if(_mInst != null)

{

dro[0] = _mInst.GetOEMDRO(800);

dro[1] = _mInst.GetOEMDRO(801);

dro[2] = _mInst.GetOEMDRO(802);

}

return dro;

}

//---------------------------------------------------------------------

//dir = 0 to + direction, dir = 1 to - direction

private void xJogStart(DirectionType dir)

{

if(_mInst != null)

_mInst.JogOn((short)AxisType.X, (short)dir);

}

//---------------------------------------------------------------------

private void xJogStop()

{

if(_mInst != null)

_mInst.JogOff((short)AxisType.X);

}

//---------------------------------------------------------------------

private void yJogStart(DirectionType dir)

{

if(_mInst != null)

_mInst.JogOn((short)AxisType.Y, (short)dir);

}

//---------------------------------------------------------------------

private void yJogStop()

{

if(_mInst != null)

_mInst.JogOff((short)AxisType.Y);

}

//---------------------------------------------------------------------

private void zJogStart(DirectionType dir)

{

if(_mInst != null)

_mInst.JogOn((short)AxisType.Z, (short)dir);

}

//---------------------------------------------------------------------

private void zJogStop()

{

if(_mInst != null)

_mInst.JogOff((short)AxisType.Z);

}

//---------------------------------------------------------------------

private void buttonStart_Click(object sender, EventArgs e)

{

DoEmButton(1000); //start

}

//---------------------------------------------------------------------

private void buttonFeedhold_Click(object sender, EventArgs e)

{

DoEmButton(1001); //Feedhold

}

//---------------------------------------------------------------------

private void buttonStop_Click(object sender, EventArgs e)

{

DoEmButton(1003); //Stop

}

//---------------------------------------------------------------------

private void buttonMDI_Click(object sender, EventArgs e)

{

if(_mInst != null && textBoxMDI.Text.Trim() != null)

_mInst.Code(textBoxMDI.Text.Trim()); //senMDI

}

//---------------------------------------------------------------------

private void timerUpdateDRO_Tick(object sender, EventArgs e)

{

double[] dro = UpdateDRO();

textBoxX.Text = dro[0].ToString("#0.0000");

textBoxY.Text = dro[1].ToString("#0.0000");

textBoxZ.Text = dro[2].ToString("#0.0000");

}

//---------------------------------------------------------------------

private void buttonPX_MouseDown(object sender, MouseEventArgs e)

{

xJogStart(DirectionType.Positive);

}

//---------------------------------------------------------------------

private void buttonPX_MouseUp(object sender, MouseEventArgs e)

{

xJogStop();

}

//---------------------------------------------------------------------

private void buttonNX_MouseDown(object sender,

MouseEventArgs e)

{

xJogStart(DirectionType.Negtive);

}

//---------------------------------------------------------------------

private void buttonNX_MouseUp(object sender,

MouseEventArgs e)

{

xJogStop();

}

//---------------------------------------------------------------------

p.s. 一手操作一手攝影, 非專業攝影, 影片有些抖動請見諒!

辛育全
2019-04-30 12:37:03

Steve Wu
2019-04-30 13:01:22

張益晟
2019-04-30 18:27:16

?

Chihfu Huang
2019-04-30 19:13:38

沈宗麟
2019-04-30 21:32:50

厲害

徐豪宏
2019-05-01 00:33:13

Yu Tseng
2019-05-01 10:28:23

林志強
2019-05-01 17:14:23

好強

吳治彥
2019-05-04 22:53:05

石小川
2019-05-05 16:23:49

謝謝! 感謝以上兄弟們熱烈回應!
我是有些野人獻曝, 班門弄斧之感, 所幸大家善良. 在本社團內臥虎藏龍, 有經驗的CNC實務高手很多, 不結合一起做出好產品實在可惜, 畢竟要會玩也要會養家糊口, 哈哈哈! 想借此版拋磚引玉一下, 是否可腦力激盪, 集思廣益一下, 大家提出CNC專案或其他智慧機器由有興趣有能力的成員加入一起完成, 至於專案成立, 負責出資, 材料, 利潤分紅等細節我再想想, 會尊重此版規定, 跟管理員商討是公開或私訊方式. 以上是我初步構想, 看是否有正反意見皆可提出!


原文網址 石小川
2018-11-27 16:28:55

機器視覺應用在CNC介紹

機器視覺在工業4.0的應用非常廣泛,例如樣本比對、良率偵測、工件大小量測、微生物標定…..等,如果結合人工智慧資料分析就是一套很完整的專家系統了。

圖中軟體是我將紅血球/白血球辨識及標定的核心程式改寫成簡單的CNC自動對刀及工件偵測系統,理論上量測精度可控制在1um(10^-6m)以內,不過我的CNC機台螺桿可沒這麼精密,所以我把它控制在浮點數第3位即可,整體而言精密度與攝像頭、機台、都有關係,端看應用者的要求而調整軟硬體。

自動對刀是用演算法找出工件中心點,而自動對焦是採用Z軸移動加上演算法達成,另外比例尺可配合3軸移動及像素自動求得,一旦中心點座標找出來就很容易結合Mach3或PLC將主軸定位在工件上。值得一提的是打光技術在影像辨識也非常重要,打光打得好辨識率就很好,演算法就可精簡些,其餘利用影像偵測工作臺大小及影像多軸限位開關技巧和Z軸單鏡頭工件深度偵測技巧,這些功能我就留在下回再演示了(因為前陣子瘋選舉我還沒寫好Demo程式, 哈哈… 抱歉了 ^^”)。

黃小法
2018-11-27 17:19:17

比例是手動拿尺先抓出比例嗎?立體的東西高度不同如何量測?這是不是中心點跟滑鼠之間針對每個像素點分析抓出分際點?

李派克
2018-11-28 15:41:40

其實我也是是用CCD來對刀吔,只是因為CCD不防水所以常拆,每次都要改變OFFSET就沒做圖形偵測了⋯⋯不過你的CCD也太威了,我還只用WEBCAM而已,我是掛在raspberry pi上,就直接可以做成自己機子的HMI了

Allen Chang
2018-12-02 12:32:06

之前在工業手臂組裝工件做過類似功能,
治具安裝+-10mm即可完成治具架設
https://www.youtube.com/watch?v=Drkw6hwD-iE

Allen Chang
2018-12-02 12:34:19


原文網址 石小川
2018-10-13 12:53:47

用C++/C# 程式直接控制USB Mach3 CNC運動控制卡簡介

分享給想要了解Mach3及USB控制卡如何通訊的朋友參考.

Mach3 USB程式是以HID裝置類型通訊協定作為溝通管道, 因為現在Windows 作業系統都有內建支援HID裝置的驅動程式, 所以焦點只要設計PC應用程式即可, 省掉很多麻煩事情.

如果用抓封包工具程式(Wireshark 或 Bus Hound)觀察Mach3 USB封包可得知, HID報告描述元(Report)的每次輸入/輸出資料交易是以61個位元組(Byte)為單位送出或接收, 只要解析這些位元組即可直接控制USB Mach3 CNC運動控制卡, 不須Mach3介入, 這樣做的好處是可以自已設計一些人工智慧演算法(例如影像辨識)去直接控制CNC機台做自動光學檢測(AOI), 或改裝CNC成機器手等. 當然有些非Mach3 CNC控制卡廠商有推出API開發包, 應用程式直接呼叫API就更方便了, 這樣就不需要了解煩人的底層封包問題, 不過這篇是要分享給想設計類似Mach3程式或製作USB Mach3 CNC運動控制卡的人參考, 由於資料太多, 不想洗板, 我就列出部分範例提供參考.

我的CNC機器裝置配備是USB Mach3 CNC六軸連動控制卡, 螺桿Pitch=5mm, 步進驅動128細分.

解析後的封包資料如下:
基本上Reset , M code, G Code都要解碼.

(A)繼電器控制
M204/M205碼我是規劃成繼電器控制警示燈
M204 Code(Output 7 ON) :
public string[] Output = { "02 06 58 00 09 20 00 00 f0 f7 19 00 97 b1 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 00 00 00 00 1c f8 19 00 0c f8 19 00 10 80 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 1c f8 19 00 00" };

M205 Code(Output 7 OFF) :
public string[] Output = { "02 06 58 00 09 00 00 00 f0 f7 19 00 97 b1 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 00 00 00 00 1c f8 19 00 0c f8 19 00 10 80 9d 06 44 f8 19 00 00 01 00 00 9c b4 9e 06 1c f8 19 00 00" };

p.s. 標註的02 06 58 是M控制碼, 09 20/09 00 是On/Off作動參數.

(B)步進馬達控制
G0 Xn Code :
public string[][] G0X = {
//G0 X0
new string[]
{"02 0e 55 e6 ff 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 06 df 59 77 34 ef 55 77 f8 5b 38 a0 00 00 00 00 00 c0 2c 00 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00",
"02 0e 55 b4 ff 00 00 00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00 06 df 59 77 34 ef 55 77 f8 5b 38 a0 00 00 00 00 00 c0 2c 00 ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00",
.
.
};

p.s. 標註的02 0e 55 是G0控制碼, e6 ff/b4 ff 是馬達脈衝參數.

另外值得一提的是Mach3步進馬達的脈衝控制是以圖中(G0 X5)所示的方式控制, 只要遵照斜率及內插數值就可組合出想要馬達移動的距離及速度了, 如果是六軸連動當然更複雜了!

沒圖沒真相, 最後簡單的寫了一個小程式Demo一下, 有興趣的朋友可參考一下囉!

林志強
2018-10-13 13:00:25

好強啊

Brian Kuo
2018-10-13 13:23:48

您是解析USB HID 的byte array來進行驅動控制板,印象中Mach3 軟體有提供API可以直接控制。可能會更方便哦,之前有下載但一直沒時間玩。。。

感謝您的分享哦~ 謝謝您

蘇炳文
2018-10-13 13:37:38

感謝分享,以前都用wireshark抓Ethernet封包觀看Internet的protocol,現在才知道也可以抓USB封包,太好用了。

Kenny Plus
2018-10-13 15:01:18

大大好強

Suadia Wu
2018-10-13 17:53:26

大大開個手把手的課啦~

廖元佑
2018-10-14 08:55:55

好厲害

李大熊
2018-11-03 00:13:00

連G Code都出來了 哈哈哈


原文網址 李派克
2018-02-21 13:41:56

只是作一個簡單的銑圓的gcode產生器,竟然花了我兩個小時去研究他的演算。。。唉~我老了!


 

全不選 發文排行