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

DIY CNC Machine.Taipei 造訪社團 » g code

原文網址 石小川
2019-08-14 13:40:17

淺談 G-Code 產生器

窮忙一陣子後今天終於可偷閒寫一下文章跟大家分享一下上回談的G-Code產生器了. 我用最簡單的CNC圓形切割來圖文解釋一下, 相信應該可以很快了解其中運作原理.

先解釋一下Entity名詞, Entity在CAD工程上是實體的意思, AutoCAD出圖後的元件我們稱為Entity, 如圓弧, 直線, 雲行線等皆是實體. 上回提過由DWG/DXF檔案 經過程式剖析分解後產生一連串Entity的資料, 如圖一, 是圓的Entity, 將它送入GCodeCircle(Entity) 函式就可很快地產生切圓的G-Code, 下面是GCodeCircle(Entity)程式範例:

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

public string GCodeCircle(EntityRecord entityrecord)

{

string gCode = "";

Point3D center = new Point3D(entityrecord.Circle.Center.X, entityrecord.Circle.Center.Y, entityrecord.Circle.Center.Z);

double radius = entityrecord.Circle.Radius;

Point3D point = new Point3D(0, 0, 0);

point.X = center.X + radius;

point.Y = center.Y;

gCode += "G00 X" + (point.X - center.X).ToString("#0.0000") + " " + "Y"+ (point.Y - center.Y).ToString("#0.0000") + " " + "Z5.0000"+ "\n";

//此段是為了說明已經簡化許多參數

gCode += "G01" + " " + "Z-1.0000"+ " " + "F200"+ "\n";

gCode += "G02" + " " + "I-"+ radius.ToString("#0.0000");

return gCode;

}

圖二是產生的G-Code, 可直接送去機器做切割一個100mm的正圓.

另外之前有位朋友問我5軸聯動切向跟隨實作問題, 我列出部分程式碼給您參考一下, 基本上我大部分實作都是圓弧直線插補ArcLine()就可完成.

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

//圓弧直線跟隨插補

//pos : Z軸直線運動位置

//axisNum = 3, 圓弧+直線運動軸數 X Y Z

public boolArcLine(int startx, int starty, int endx, int endy, int cx, intcy, int[] pos, int[] axis, int dir = 0, int axisNum = 3, double acc = 10, doubletgvel = 100, double endvel = 0, double feedRate = 1.0, int wait = 1, intfifo = (int)FIFO_SEL.SEL_PFIFO1, boolbAbs = true)

{

int st;

if(axisNum < 2 || axisNum > MAX_NAXIS)

return false;

//清空PFIFO

st = IMC_Pkg.PKG_IMC_PFIFOclear(gHandle, fifo);

if(st == 0)

return false;

//設置加速度和進給率

if(SetPFIFO(acc, feedRate, fifo) == false)

return false;

//映射軸

st = IMC_Pkg.PKG_IMC_AxisMap(gHandle, axis, axisNum, fifo);

if(st == 0)

return false;

double dx,dy;

dx = startx - cx;

dy = starty - cy;

double r1 = Math.Sqrt(dx * dx + dy * dy);

dx = endx - cx;

dy = endy - cy;

double r2 = Math.Sqrt(dx * dx + dy * dy);

//判斷, 如果起點到圓心距離r1 != 終點到圓心距離r2 表示圓弧軌跡不正確, 跳出不執行

if(r1 != r2)

return false;

//由當前位置移動到指定位置

if(bAbs) //絕對位置

st = IMC_Pkg.PKG_IMC_ArcLine_Pos(gHandle, endx, endy, cx, cy, dir, pos, axisNum - 2, tgvel, endvel, wait, fifo); //絕對位置

else

st = IMC_Pkg.PKG_IMC_ArcLine_Dist(gHandle, endx, endy, cx, cy, dir, pos, axisNum - 2, tgvel, endvel, wait, fifo); //相對位置

if(st == 0)

return false;

return true;

}

圖三是我執行雷射切割的機台, 雷射頭是5.5W藍光雷射, 下回再分享此G-Code雷射切割成果.

p.s. 在我的APP程式直接畫圖我是直接呼叫運動卡驅動CNC, 沒有經過G-Code產生器這道手續, 加快CNC處理速度, 除非是匯入DWG/DXF檔案才會呼叫G-Code 產生器。

黃小法
2019-08-14 14:25:41

這個有開源?

Jade Yang
2019-08-14 15:07:20

無私 , 給你讚。字串相加可改用 $”{}”你以後看才不會累


原文網址 石小川
2019-06-24 17:21:27

iMCxxxx系列運動卡GCode解析函數

最近接到不少好友詢問此卡是否可直接支援GCode解析命令(類似Mach3 Input code or Load G-Code), 我跟原廠要了GCode解析函數使用說明及直接下GCode Demo c++ 程式碼: GTest, 我會放在檔案區給好友研究看看,了解後要執行GCode/MCode應沒問題。

p.s. G代码例子.rar 無法上傳(rar檔), 有需要的好友通知我一下, 我用Email傳!


原文網址 石小川
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-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-05-26 17:40:53

目前大致碰了一下Fusion 360,果然是好入手,但在後制部分我有些疑問.我機台控制軟體使用的是mach 3的G code,但在Fusion 360目前不知道要如何產生這個控制碼,他的預設副檔名都是.nc?

陳建仲
2018-05-26 17:52:44

這是小弟還在大學就讀時,被任命為新進機台的學習學生,因為要畢業了,所以有紀錄一下要如何使用fusion360轉G-code

陳建仲
2018-05-26 17:53:35

小小拙作,學生等級的教學,請笑納。

張峻銘
2018-05-26 18:14:37

以找到答案,謝謝各位


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

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


原文網址 Devon Hsin
2017-08-14 16:14:28

請問有沒有CAM
能將2D路徑輸出成
主動旋轉刀頭的G code呢?
(刀頭邊行進邊轉向)
謝謝大家!

Devon Hsin
2017-08-14 21:35:13

看來host帶自動轉向功能才是王道......

曾豪仁
2017-09-19 01:11:54

用Mach3可以設置切割轴做切线跟踪!

曾豪仁
2017-09-19 01:16:23

玩振动刀切割,资料難找,刀头難找,cad難学,cam難搞,后处理&控制器難上加難……


原文網址 David Chuang
2017-05-13 15:44:43

哪個支援五軸???

CNC

bCNC - Open-Source CNC host with great preview and other operations. Set machine type to smoothie, and add grbl_mode true to your smoothie config (Note: You must update to the latest version of Smoothieware to ensure compatibility with bCNC).
OpenSCAM.org - Open-Source Simulation & Computer Aided Machining (Free 3-axis CNC Simulator which understands G-Code)
CNC.js - Open-Source CNC host with lots of features, running in your browser.
OpenSCAD.org - Open-Source CAD software.
GCode plug-in for InkScape - CAM, Output GCode from SVG files in Inkscape.
PyCAM - Open-Source CAM software.
jscut - Open-Source in-browser CAM software.
CamBam - Closed-Source, but cheap and feature-full CAM software. Widely used by hobbyists.
Fusion360 - Closed-source CAM with very advanced features, free for hobby/fablab/small business.
Universal Gcode Sender Host program
Fabrica - Easy to use web control interface ( Host )
Kiri:Moto by Grid.Space - Free web based toolpath generator with support for FDM, Laser Cutting and CNC Milling.
More links at ShapeOko.com.

翻譯年糕

David Chuang
2017-05-13 15:45:33

Fushino 360 有 @@

李派克
2017-05-13 21:55:09

看你要的是什麼。。 cam還是cnc router不太一樣


原文網址 Star Lin
2015-12-12 20:59:32

請問有大大使用免費的轉G code的軟體嗎?

邱文生
2015-12-13 11:14:02

您可以試試看 Inkscape;阿簡老師的網頁給您參考
http://a-chien.blogspot.tw/2014/11/cnc.html

耶髏爾
2015-12-26 00:51:14

我最近有找到一款軟體 免費不鎖功能 只有轉gcode幾次會出現麻煩您贊助美金50 也可無視等待6秒即可 支援2.5d雕刻

耶髏爾
2015-12-26 00:54:42

www.estlcam.com
供您參考


原文網址 Jesse Tsai
2015-08-15 10:16:12

不好意思請教先進:
我用3DP架構做一個CNC 雕刻機,目前上電測試已經可以動。
https://fbcdn-video-n-a.akamaihd.net/…/11819044_87746081233…
現在冏了,沒用過CAM,有什麼軟體可以像Repetier-Host一樣,輸入STL就可以產生CNC的GCODE?

Jesse Tsai
2015-08-15 13:19:15

謝謝,我研究看看會不會用。好像有提到可以用stl匯入。

Jesse Tsai
2015-08-15 18:40:52

到目前為止,自製的機器都應該還是玩具。目前我是這麼看,所以要便宜要好玩。

廖元佑
2015-08-15 20:24:28

樓上都是魔王,打完BOSS就能學會了。

Mach Chuang
2015-08-15 20:31:34

錢坑+毅力+時間=DIY CNC

Jesse Tsai
2015-08-15 21:16:44

自己玩就是有時間<

Jesse Tsai
2015-08-15 21:18:15

不要急慢慢玩一定會越來越好玩

Jesse Tsai
2015-08-15 22:15:19

Mach Chuang
2015-08-15 23:04:02

不要急慢慢玩!!.....坑一定會越挖越大,越挖越深!!

廖元佑
2015-08-15 23:07:16

一群魔王在挖坑阿,這坑很深

Mach Chuang
2015-08-15 23:19:21

ProE Solidwork UG MasterCAM Cimatron 這類軟體才能轉三軸同動的NC code

施秉宏
2015-08-16 18:10:44

==恩 我記得skeinforge有內建洗床的程序但要挖坑看整麼調

謝宗勳
2015-08-17 22:22:31

我已解決了!你用一套免費軟體 http://www.hsmworks.com/hsmxpress/

Mach Chuang
2015-08-17 22:28:53

等高加工...2D的,無法作曲面3軸同動加工