管理員
統計數據
原文網址 石小川 2020-02-14 08:43:41
使用Python語言做自動控制的方法 - I I I通信篇 網路發達後要做到機器設備遠端監控已非遙不可及了,網路通信在無人工廠的監控設備上會越來越重要。 圖中展示的系統是TCP/IP通訊協定的主從(Server-Client)式架構,TServer伺服端程式負責現場機器設備運作及回傳Sensor數據和即時影像給TClient用戶端處理。 為了方便教學緣故,已將網路封包加密演算法及帳號管理拿掉,通信程式精簡許多,比較容易理解,伺服端是以C#實作,用戶端會以C#及Python各實作一個版本。建議伺服端以C++或C#為主,而用戶端可用Python設計遠端控制APP,將來回傳的遙測大數據可很容易的用Python模組分析。 熟悉遠端操控軟硬體對將來有志設計無人工廠機器設備的朋友幫助很大,習得一技之長絕對增加競爭力。2月分我將開此TCP/IP主從式通信實作課程,因為現在病毒肆虐,採遠距教學方式較適合,沒有機器設備的同學我會提供兩台三軸機台做遠距連線操控練習,可在家寫Python程式做遠端連線操控,詳細辦法及日期我再擇期公布,歡迎有興趣的朋友來報名上課。 第五章 實作C#、Python軸控遠端機台 Python很適合做數據擷取及分析,有幾萬個套件模組讓你發揮,全世界的網路根本就是一個取之不竭,用之不盡的海量資料庫。Python 只要引入模組,要寫個爬蟲程式沒幾行代碼,就可抓你關注的網頁資料做數據分析,真的只是小菜一碟而已,這是筆者會喜歡它的原因之一 。 Python既然在人工智慧、深度學習領域都有它的蹤跡,那麼自動控制的機台也必定不會缺席的,自動化工廠的機器設備和感測器交握信號彙整起來可能有上萬種數據需要及時處理並回傳,此時Python會是一個不錯的選擇。 本章通訊系統中的伺服端仍然採用第四章的C#版本 : TServer,用戶端則是Python版本 : PyClient,理由無他,伺服端需要具備同時快速處理許多用戶及機器設備,負擔較重,建議伺服端實作還是以C++或C#為主,處理速度會快很多。 Python標準庫支援的TCP/IP稍微陽春些,筆者這裡是採用PyQt5 QtNetwork通訊模組,函式庫支援豐富,因已封裝底層API,通訊程式也比較好寫,故推薦用此方式,學習道路可少走一些遠路。 伺服端程式命名為 :TServer(C#),用戶端程式命名 : PyClient(Python)。 TServer 第四章已介紹過,在此略過, 請讀者再複習一下內文。 下列程式碼是Python版本用戶端TCP/IP通訊模組部分原始碼,有興趣的朋友歡迎報名參加遠距指導教學課程(開課日期 : 2020/02/19, 下星期三)。 # -*- coding: utf-8 -*- ''' 石小川 / Michael Shih 光騰高科技工作室 / Quantum Tek. ''' import time #OpenCV模組 import cv2 from PyQt5.QtNetwork import QTcpSocket, QHostAddress, QAbstractSocket, QNetworkInterface,\ QNetworkAddressEntry, QHostInfo,QNetworkConfiguration,\ QNetworkConfigurationManager from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtCore import Qt, QByteArray, QDataStream, QIODevice from TStream import TStream #------------------------------------------------------------------------------ #Client通信處裡類別 #------------------------------------------------------------------------------ class TcpClient(QTcpSocket): #signal define def __init__(self, parent=None): super(TcpClient, self).__init__(parent) self.__serverIP = QHostAddress() self.__serverPort = 8000 #int self.__userName = "" self.__clientSocket = None self.__pImage = None self.__chunkMode = False #切換接收mode是 command 或 chunkBytes self.__chunkCount = 0 self.__chunkLength = 0 self.__chunkBytes = QByteArray() self.__Dro = [] #------------------------------------------------------------------------ def Open(self, ip, port, userName): if not self.__serverIP.setAddress(ip): return False self.__serverPort = port self.__userName = userName if(self.__userName == ''): return False self.__clientSocket = QTcpSocket(self) self.__clientSocket.abort(); self.__clientSocket.connected.connect(self.Connected) self.__clientSocket.disconnected.connect(self.Disconnected) self.__clientSocket.readyRead.connect(self.dataReceived) self.__clientSocket.connectToHost(self.__serverIP, self.__serverPort) self.SendCommand_Connect(self.__userName) #------------------------------------------------------------------------ def Close(self): try: self.SendCommand_Disconnect(self.__userName) self.__clientSocket.disconnectFromHost() except Exception as e: print(e) #------------------------------------------------------------------------ def ListenServer(self, byteArray): stream = TStream() #byteArray Data structure : command(4) + datalength(4) + data(dataLength) if(self.__chunkMode == False): command = stream.GetPackCommand(byteArray) bData = stream.GetPackBytes(byteArray) #bData是純資料存 , 扣掉command(4)和扣掉datalength(4) length = len(bData) #接收到資料的長度 if(command == 9999): #新用戶者上線通知 data = stream.BytesToString(bData) #not used self.SendCommand_JogMode(0) elif(command == 1): #user要求對所有 Client廣播 data = stream.BytesToString(bData) #not used elif(command == 2): #//user 私密Client data = stream.BytesToString(bData) #not used elif(command == 3): #//image 需分多次接收 self.__chunkMode = True #接下來開始接收大塊資料 (>65536 都是大塊資料) self.__chunkCount = 0 self.__chunkBytes.clear() self.__isImage = False; nCols, nRows, nChannels = stream.ImageSize(bData) #一張影像大小 4(nCols) + 4(nRows) + 4(nChannels) + 320x 240 x3 = 230412 #減去已接收到的資料 (65536-4 = 65528) self.__chunkLength = nCols*nRows*nChannels + 12 self.__chunkCount = length self.__chunkBytes.append(bData) elif(command == 4): #//接收Server送來三軸位置資料 data = stream.BytesToString(bData) codes = data.split('|') #print (codes) self.__Dro.clear() for code in codes: #字串轉浮點 self.__Dro.append(float(code)) else: #chunkMode length = len(byteArray) self.__chunkCount += length self.__chunkBytes.append(byteArray) if(self.__chunkCount >= self.__chunkLength): self.__pImage = stream.ByteArrayToMat(self.__chunkBytes) self.SendCommand_Position(self.__userName) self.__chunkMode = False #切換回command模式
王登程 2020-02-14 20:16:43
如果待加工料可以自动化输送到加工台,那技术上真的可以远程加工了。
原文網址 石小川 2020-02-02 09:39:49
今年主推iMC4xxA系列,適合做遠距機器設備監控、數據採集等專案開發,另外亦有開課教導如何用C# 、Python程式語言做二次開發設計。 A. iMC406A六軸運動控制卡 (定價 NT$ 10000) 主要功能如下 : (1)運動卡與PC主控台通信是採用100MHz乙太網路。 (2)軸控制 : 6軸。 (3)輸出控制接點 : 32。 (4)輸入控制接點 : 26。 (5)類比轉數位(AD) : 8路。 (6)數位轉類比(DA) : 4路。 (7)PWM : 4路 B. iMC408A八軸運動控制卡(定價 NT$ 12000) 主要功能如下 : (1)運動卡與PC主控台通信是採用100MHz乙太網路。 (2)軸控制 : 8軸。 (3)輸出控制接點 : 32個。 (4)輸入控制接點 : 32個。 (5)類比轉數位(AD) : 8路。 (6)數位轉類比(DA) : 4路。 (7)PWM : 4路 p.s. 尚有4軸 ~ 14軸運動控制卡販售,詳細的iMC xx 規格可留言向我索取或解答,謝謝了。 可參考我的賣場: [21世紀電鋪] 乙太網 六轴運動控制卡 iMC3062E https://goods.ruten.com.tw/item/show?21925786070681 產品介绍 (一)運動控制硬體資源: ( 1) 實時以太網接口,用於與計算機高速通信; (2) 4~16個軸接口(詳見下表),用於連接伺服/步進驅動器; (3) 每軸均有編碼器輸入接口、伺服使能、伺服復位、伺服到位、伺服報警、正/負限位開關、原點開關等接口; (4) 1個輔編碼器接口,可用於連接電子手輪等; (5) 1個停止開關輸入,可用於連接停止/急停開關。 (6) 開關量輸入和輸出的數量見下表。 (7) 8路0~10V模擬量電壓輸入;(僅iMC4xxA系列) (8) 4路﹢10V~-10V模擬電壓輸出;(僅iMC4xxA系列) (9) 4路高精度PWM輸出。(僅iMC4xxA系列) (10) 支持4~100字符用戶自定義加密,保護系統集成商的知識產權。 (二) 主要指標 (1) 點到點運動,運動過程中可任意改變目標位置和速度; (2) 連續速度運動; (3) 電子齒輪運動; (4) 電子手輪運動; (5) 插補運動:任意兩軸圓弧插補、多軸直線插補、螺旋線(圓弧+直線)插補,支持微小線段連續插補,支持兩個插補空間同時插補; (6) 輪廓運動模式(上位機粗插補,控制卡樣條擬合及精插補); (7) 比例跟隨功能:某參數的值按線性比例地跟隨另一參數值的變化而變化; (8) 龍門驅動(雙電機驅動/主從跟隨運動); (9) 位置捕獲鎖存:探測到探針開關信號將當期位置鎖存入FIFO; (10) 位置/位移比較輸出功能; (11) 進給倍率控制、暫停等; (12) 反向間隙補償和線性補償; (13) DA的輸出電壓可跟隨插補速度等參數的值按線性比例地輸出;(僅iMC4xxA系列) (14) PWM輸出的占空比或頻率可跟隨插補速度等參數的值按線性比例地輸出;(僅iMC4xxA系列) (三) 主要控制功能 (1) 全集成運動控制引擎,高達48位計算,高精、高速、高可靠; (2) 100M實時以太網與計算機通信,純硬件協議機,通信響應小至50uS,四級校驗,確保可靠;計算機最多可連64塊控制卡(通過交換機); (3) 運動控制周期:1mS; (4) 單卡最高16軸獨立/插補運動控制; (5) 脈沖輸出最高頻率:6Mhz; (6) 編碼器最高輸入頻率6MHz; (7) 32位指令和反饋位置:-2147483648~2147483647,即[-2^31,2^31-1); (8) 位置誤差:≦ 1 PULSE; (9) 指令速度分辨率(誤差):<0.002%; (10) 模擬量輸入電壓范圍:0~10V,精度12位。每通道的釆樣頻率:5120Hz/n,(n為啟用的通道數)。 (11) 模擬量輸出電壓范圍:-10V~+10V,等效精度為12位,0~500Hz; (12) 高精度PWM輸出; (四) 操作環境 操作溫度:0 ~ 60 ℃ 儲存溫度:-20 ~ 80 ℃ 溼度:5% ~ 90% 無凝結. (五)關於驅動器連接 釆用RJ45座作為驅動器連接口是該控制卡的特色之一,可釆用5類(CAT5)或六類(CAT6)以太網線,一端壓制水晶頭,另一端的線焊接到伺服驅動器的插頭(常見的為SCSI-50P插頭),如圖所示 若連接步進驅動器,一般情況下只需連接脈沖指令和方向等信號,因此一般只需連接其中的一個RJ45插座(即AXn_A座),如圖所示:
原文網址 石小川 2019-12-16 09:18:25
分享給想要了解Mach3及USB控制卡如何通訊的朋友參考,可進一步修改成Python版本。
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一下, 有興趣的朋友可參考一下囉!
原文網址 石小川 2019-12-15 17:44:44
對於Linux工程師來說內嵌系統交叉編譯環境的建立較複雜, 手動編譯起來時常是一個噩夢, 其實只要資料完備不會很困難, 下面我把一些講義分享出來給有需要的好友參考一下, 期望可以少走一些冤枉路! 我PC的Linux作業系統版本是Fedora 20-i386, Embedded system 是ARM11板子的內嵌系統, 我在PC開發的程式是Qt5.4.1, opencv是3.1.0, PC開發環境下寫好的程式再移植到ARM11板子上, 可正常運作, 沒圖沒真相, 如圖程式是usb camera程式, 可顯示JPG照片及動態顯示攝影機視訊! 由於QT 及 OpenCV arm-linux交叉編譯比較冗長, 我再另闢專欄解說, 這之前我先列出交叉編譯需要用到的一些程式庫的編譯詳細步驟, 有不清楚的地方也可跟我討論一下! //------------------------------------------------------------------------------- Linux交叉編譯環境建立 講義 交叉編譯(Cross compiler)是在一種處理器架構平台上(如PC-x86架構,此稱PC平台)編譯連結成另一個處理器架構平台(如ARM架構,此稱Target平台)所能執行程式的工具軟體。 A. PC-x86平台環境建立步驟 (1)Install Fedora 20 Download Linux OS,版本為Fedora20-i386-DVD.iso,燒寫 至光碟片,然後安裝作業系統到PC。 先更新作業系統。 yum update -y (2)Install Fedora 20相關工具軟體 yum install –y filezilla putty cmake cmake-gui gcc gcc-c++ yum install –y automake libtool tslib (3)Install arm-linux-gcc (3-1)解壓縮arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz 執行Fedora 20>>終端機程式,輸入: tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz –C /opt/,解壓縮將arm-linux-gcc-4.5.1安裝到/opt/FriendlyARM/toolschain/4.5.1。 p.s. 路徑一定要放在此(/opt/),不能更改,否則會錯誤。 (3-2)將arm-linux-gcc的路徑加到系統環境變數中 method 1. 修改檔案.bashrc(個人環境) 用vi 編輯 /root/.bashrc 最後一行加上: export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin 儲存後OS重新登錄User即可作用。 method 2. 修改檔案 /etc/profile(全域環境) 最後一行加上: export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin 儲存後須重新開機始可作用。 (3-3)在終端機輸入arm-linux-gcc –v,如果有gcc相關資訊顯示出來表示設定成功。 (4)交叉編譯相關程式庫 如果沒用到可選擇跳過不安裝,詳細交叉編譯方法請看附錄A。 (4-1)交叉編譯tslib 觸控面板驅動函式庫。 (4-2)交叉編譯ffmpeg 影片播放與轉檔函式庫。 (4-3)交叉編譯gtk 圖形介面開發套件。 (4-4)交叉編譯jpeg Jpeg功能函式庫。 (4-5)交叉編譯png Png功能函式庫。 (4-6)交叉編譯x264 X264編碼器函式庫。 (4-7)交叉編譯yasm 編譯ffmpeg時可指定用yasm指令編譯,提高編譯速度。 (4-8)交叉編譯zlib 資料壓縮函式庫。 (4-9)交叉編譯qt5.4.1 跨平台的c++應用程式開發工具。 (5)Install Qt Creator 到Qt官方網站: https://www.qt.io/download-open-source/#section-2 選擇下載Qt Online Installer for Linux 32-bit 線上安裝Qt Creator相關程式。安裝程式會自動安裝PC平台的Qt,至於Target平台的Qt必須手動交叉編譯來安裝。 (為求系統穩定,盡量以Qt 5.4.1為開發版本。) (6)Install Opecv 到Opencv官方網站: http://opencv.org/downloads.html 選擇下載Opencv-3.1.0.zip 附錄A A-1. 交叉編譯tslib 功能: 觸控面板驅動函式庫。 在終端機按照步驟輸入指令如下: (1)git clone https://github.com/kergoth/tslib //download tslib source code (2) cp /root/tslib /opt/ -r //copy /root/tslib to /opt (3)cd /opt/tslib //change dir to /tslib (4)./autogen.sh //執行安裝腳本 (5) ./configure CC=arm-linux-gcc CXX=CC=arm-linux-g++ --prefix=/opt/tslib-arm --host=arm-linux ac_cv_func_malloc_0_nonnull=yes //配置tslib (5) make //產生makefile (6) make install //編譯完成後函示庫自動安裝到 /opt/tslib-arm A-2. 交叉編譯zlib 功能: 提共資料壓縮之用的函式庫。 在終端機按照步驟輸入指令如下: (1) download and copy zlib-1.2.8 to /opt (2) cd /opt/ zlib-1.2.8 (3) CC=arm-linux-gcc ./configure --prefix=/opt/zlib-arm (4) make (5) make install A-3. 交叉編譯jpeg 功能: jpeg函式庫。 在終端機按照步驟輸入指令如下: (1) download and copy jpeg-9 to /opt (2) cd /opt/ jpeg-9 (3) CC=arm-linux-gcc ./configure --prefix=/opt/jpeg9-arm -- host=arm-linux (4) make (5) make install A-3. 交叉編譯png 功能: png函式庫。 在終端機按照步驟輸入指令如下: (1) download and copy libpng-1.6.23 to /opt (2) cd /opt/ libpng-1.6.23 (3) ./configure CC=arm-linux-gcc --prefix=/opt/png-arm -- host=arm-linux (4) make (5) make install A-4. 交叉編譯yasm 功能: yasm指令可提高編譯ffmpeg速度。 在終端機按照步驟輸入指令如下: (1)download and copy yasm-1.3.0 to /opt (2)cd /opt/ yasm-1.3.0 (3)./configure CC=arm-linux-gcc --prefix=/opt/yasm-arm --host=arm-linux (4)make (5)make install A-5. 交叉編譯x264 功能: x264編碼器函式庫。 在終端機按照步驟輸入指令如下: (1)download and copy x264-snapshot-20160220-2245-stable to /opt (2)cd /opt/x264-snapshot-20160220-2245-stable (3)./configure CC=arm-linux-gcc --enable-shared --host=arm-linux --disable-asm --prefix=/opt/x264-arm (4)make (5)make install A-6. 交叉編譯ffmpeg 功能: 影片播放與轉檔函式庫。 在終端機按照步驟輸入指令如下: (1) download and copy ffmpeg-3.1.1 to /opt (或直接下載: git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg) (2)cd /opt/ ffmpeg-3.1.1 (3)./configure --enable-cross-compile --cc=arm-linux-gcc --arch=arm --target-os=linux --enable-shared --enable-gpl --disable-stripping --enable-pthreads --enable-small --disable-parsers --disable-optimizations --disable-yasm --disable-armv6 --disable-static --disable-amd3dnow --prefix=/opt/ffmpeg-arm (4)make (5)make install
Jade Yang 2019-12-15 18:43:39
林永仁 2019-12-16 09:09:29
原文網址 石小川 2019-12-06 13:12:42
今天看到其他社團在討論陀螺儀磁性干擾的問題,本來已經入定在寫程式了,終究手癢還是撩下去談談雷射陀螺儀。現代太空梭、戰鬥機甚至飛彈都早已經用這種裝置在輔助飛行,我嘗試用淺顯易懂的方式解說這個用途廣泛的光電裝置。 雷射陀螺儀是一種光的干涉原理製成的裝置,如圖所示。 簡要解釋一下原理: 雷射陀螺儀在轉一個角度時, 相同雷射光沿著順時針、逆時針的光行程差會產生干涉條紋( 建設性干涉、破壞性干涉與波長有關), 由辨識到的干涉條紋影像用單晶片電腦(MCU) 或數位信號處理器(DSP)套用公式就可計算出方位角(azimuth)、仰角(elevation)等有用的飛行姿態。 公式推導可參考一下。由干涉條紋的位移可反推目前飛機角速度和速度而且極其精準,邁克生干涉儀(Michelson interferometer)也是應用相同的原理製成。目前雷射頭和Sensor都很便宜了, 雷射陀螺儀完全沒有動的元件,對於光電有興趣的朋友也可自已研究一下,至於干涉條紋的辨識也是機器視覺的一部分,技術好壞牽涉到精準度。 符號說明: c : 光速 λ: 光的波長 v : 陀螺儀移動線速度 ω: 陀螺儀移動角速度 Δt: 光繞著ABCD所花費的總時間 ΔN: 干涉條紋位移 公式推導: @光沿著AB路徑行走所花費的時間是: tAB = √2R /(v/√2 + c) ------------(1) 因為v = Rω, 所以上式整理一下 tAB = 2R/(ωR+√2c) ------------(2) @光沿著AD路徑行走所花費的時間是: tAD = 2R/(√2c – ωR) ------------(3) @光沿著ABCD順時針、逆時針所花費的時間分別是: t逆時針 = 8R/(√2c -ωR) ------------(4) t順時針 = 8R/(√2c+ωR) ------------(5) @因此光繞著ABCD所花費的總時間Δt Δt = t順時針 – t逆時針 ------------(6) @使用二項式級數展開可得: Δt = 8R²ω/c² ------------(7) @因為正方形面積a = 2R², 所以可表示為: Δt = 4aω/c² ------------(8) @假設雷射光的週期 τ = λ/c, 則干涉條紋位移ΔN ΔN = Δt/τ ------------(9) ΔN = 4aω/c λ ------------(10)
原文網址 石小川 2019-11-27 11:09:22
窮忙一陣子後今天終於可偷閒寫一下文章跟大家分享一下上回談的G-Code產生器了. 我用最簡單的CNC圓形切割來圖文解釋一下, 相信應該可以很快了解其中運作原理.
先解釋一下Entity名詞, Entity在CAD工程上是實體的意思, AutoCAD出圖後的元件我們稱為Entity, 如圓弧, 直線, 雲行線等皆是實體. 上回提過由DWG/DXF檔案 經過程式剖析分解後產生一連串Entity的資料, 如圖一, 是圓的Entity, 將它送入GCodeCircle(Entity) 函式就可很快地產生切圓的G-Code, 下面是GCodeCircle(Entity) C#版程式範例:
//------------------------------------------------------------------------- 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, intstarty, int endx, intendy, int cx, intcy, int[] pos, int[] axis, int dir = 0, intaxisNum = 3, double acc = 10, doubletgvel = 100, double endvel = 0, doublefeedRate = 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-11-27 12:24:32
小聲問,那套App有試用版嗎?
原文網址 石小川 2019-11-25 15:35:25
前幾期上課同學請注意, 為了簡化教學, 老師不小心將下列粗黑體字程式刪除導致雷射無法正常開關, 請自行補上, 謝謝了^^ #------------------------------------------------------------------------ # In/out Process (輸入/輸出函數) #------------------------------------------------------------------------ #對輸出端口進行控制 #port :1-48 #data :1 ON, 0 OFF def Output(self, port, data): #訂正 ,前面版本沒有加上 #清空PFIFO st = IMC_Pkg.PFIFOclear(self.gHandle, self.FIFO) if(st == 0): return False #失敗回傳False #設置加速度和進給率 st = self.SetPFIFO(self.Acceleration, self.FeedRate, self.FIFO) if(st == False): return False st = IMC_Pkg.SetOut(self.gHandle, port, data, self.FIFO) if(st == 0): return False #失敗回傳False return True; #成功回傳True #------------------------------------------------------------------------ #開 /關雷射頭, bEnable: True ON, False OFF def Laser0(self, bEnable): port = 5 if(bEnable == True): #st = self.Output(5, 1) st = self.Output(port, 1) else: #st = self.Output(5, 0) st = self.Output(port, 0) return st #回傳狀態 翻譯年糕
全不選 發文排行