TNC WORKSHOP / API V1

นำเข้า NC · Simulation · เชื่อมต่อ Desktop

ส่งไฟล์จากเครื่องอื่นมาแก้ทางเดิน และใช้ Tkinter บน Windows XP รับ–ส่งไฟล์กับเซิร์ฟเวอร์

กลับหน้าแก้ไข · Haas / Stock Manual · คู่มือ Operations งานรู · ดาวน์โหลด Python / Tkinter client

Desktop client · LinuxCNC / Windows

คู่มือภาษาไทย / English setup guide · ดาวน์โหลด gcode_client.py รุ่นใหม่มี Config ครั้งแรก เปลี่ยนบัญชีและ API key ได้ และเมนูภาษาอังกฤษ สำหรับ cloud ใช้ Desktop API key จากหน้าบัญชีสมาชิก ตัวอย่างตั้งเซิร์ฟเวอร์ LAN ด้านล่างใช้เฉพาะโหมด local

GET /api/v1/exports/ แสดงไฟล์ NC / ZIP / PDF ที่สมาชิกส่งออกไว้ รองรับ limit และ offset; GET /api/v1/exports/<id>/download/ ดาวน์โหลดไบต์ต้นฉบับพร้อม SHA-256 โปรเจกต์ที่บันทึกไว้แสดงผ่าน GET /api/v1/projects/ และดาวน์โหลด NC ได้ที่ /api/v1/projects/<id>/download/?reviewed=true โดยไม่ต้องกด Export บนเว็บก่อน Client เลือก All account jobs เป็นค่าเริ่มต้นเพื่อแสดงงานทั้งหมดของบัญชี ต้องอัปเดตเว็บและ Client พร้อมกัน

นำเข้าและแก้ไขงานจากไฟล์

  1. บันทึกงานที่เปิดค้างไว้ แล้วกด ↑ นำเข้า NC ที่แถบด้านบน
  2. เลือกไฟล์ .hnc, .H, .nc, .ngc, .gcode, .tap, .cnc, .txt, .iso, .mpf หรือ .min ขนาดไม่เกิน 1 MiB
  3. เลือกคอนโทรลเลอร์ต้นทาง หากใช้ตรวจอัตโนมัติ ระบบจะแยก Klartext ออกจาก ISO และใช้ Fanuc เป็นค่าเริ่มต้นของ ISO การเปลี่ยนนามสกุลไม่ได้เปลี่ยนภาษาของเนื้อหาไฟล์
  4. กำหนดทูลตั้งต้น, Feed/RPM เมื่อไฟล์ไม่ระบุ และตำแหน่ง XYZ ก่อนบล็อกแรก ค่าเริ่มต้นคือ X0 Y0 Z50 mm
  5. กด อัปโหลดและเปิด Simulation ระบบสร้างงานที่บันทึกไว้และเปิดตัวจำลองทันทีเมื่ออ่านคำสั่งได้ครบ
  6. เลือก ทางเดินจาก NC ในรายการ Operations เพื่อแก้ Ø/รูปทรงทูล, RPM, Feed %, Offset XYZ หรือเปิด “แก้จุดทางเดิน” เพื่อแก้จุดแต่ละบรรทัด
  7. ทำสำเนา ปิดงาน สลับลำดับ หรือเพิ่ม operation ปกติต่อท้ายได้ จากนั้นกดบันทึกเพื่อให้ Desktop ดาวน์โหลดเวอร์ชันล่าสุด

NC เก็บคำสั่งการเคลื่อนที่ แต่ไม่จำเป็นต้องเก็บขนาด Stock หรือรูปทรงทูล ระบบจึงกู้กลับเป็นทางเดินศูนย์ทูล ไม่เดาว่าเป็น Pocket แบบพาราเมตริก ต้องตรวจ Stock และทูลก่อนใช้ภาพเนื้อวัสดุเป็นข้อมูลอ้างอิง

ต้นฉบับเก็บแยกทุกไบต์พร้อม SHA-256 เปิด “ไฟล์ที่เคยอัปโหลด → โหลดรายการ” เพื่อเปิดงานหรือดาวน์โหลดต้นฉบับ การส่งออกที่แก้ไขแล้วจะสร้างหัวโปรแกรมและทางเชื่อมใหม่ตามคอนโทรลเลอร์ปลายทาง

เพิ่มโปรไฟล์ส่งออก Fanuc System 3M (Legacy) ใช้ controller=fanuc3m ดู รูปแบบจุดทศนิยมและข้อจำกัด G-code โปรไฟล์นี้ยังไม่ใช่ตัวอ่านไฟล์ 3M แบบ implied-decimal

ขอบเขตตัวอ่าน NC รุ่นนี้

รูปแบบอ่านและแปลงได้
ISO: Fanuc / Mach3 / GRBL / LinuxCNCG0/G1, G2/G3 ระนาบ G17 XY รวม Arc ที่ Z เปลี่ยน ใช้ I/J หรือ R, G90/G91, G90.1/G91.1, G20/G21, G54–G59 หนึ่ง offset ต่อไฟล์, G81/G82/G83 แบบ G90, G98/G99, G80, F/S, T/M6, M3/M4/M5, M8/M9, M2/M30, G43 H และ G49 ก่อนเริ่มทางเดิน
Heidenhain KlartextBEGIN/END PGM, BLK FORM สี่เหลี่ยม, TOOL DEF / TOOL CALL, L XYZ / IX IY IZ, R0, F/FMAX, CC X/Y และ C พร้อม DR+/DR−
ยังไม่รองรับG41/G42, RL/RR, G53/G28/G92, macro/Q expressions, subprogram/loop, หลาย work offsets, G18/G19, tapping, 4/5 แกน, Heidenhain machining cycles, M0/M1/STOP ที่ต้องมีผู้ควบคุมทำงาน และคำสั่งนอก allowlist

Arc แปลงเป็นเส้นสั้นที่ chord error ไม่เกิน 0.01 mm ก่อนปัดพิกัด 0.001 mm วงจรเจาะแปลงเป็น motion ชัดเจน การคำนวณเวลาไม่รวม acceleration และเวลาของการเปลี่ยนทูล

G4/G82 ใช้ P เป็นมิลลิวินาทีสำหรับ Fanuc โดยค่าเริ่มต้น ส่วน ISO อื่นใช้วินาที เลือกหน่วยตอนนำเข้าให้ตรงเครื่อง Mach3 มีตัวเลือกหน่วยที่ขึ้นกับการตั้งเครื่อง การส่งออกไป Mach3 ที่มี Dwell จะถูกบล็อกให้ตรวจและแก้ไขก่อน

ถ้าพบคำสั่งที่ยังไม่รองรับ ระบบเก็บต้นฉบับเป็นสถานะ unsupported และแจ้งเลขบรรทัด ไม่แสดง simulation ที่ข้ามคำสั่งนั้น ต้องแก้/แยกโปรแกรมแล้วนำเข้าใหม่

ตั้งเซิร์ฟเวอร์บน Windows รุ่นใหม่

Windows XP ใช้เฉพาะ Tkinter client เว็บ Django และตัวจำลองรันบนเครื่อง Windows 10/11 ที่ติดตั้ง Python ตามคู่มือโปรเจกต์ ตัวอย่าง IP เซิร์ฟเวอร์คือ 192.168.1.10 เปลี่ยนให้ตรงเครื่องจริง

cd "C:\Uncle Labs CNC"
.\.venv\Scripts\python.exe -m pip install -r requirements-api.txt
.\.venv\Scripts\python.exe manage.py migrate

$env:WORKSHOP_API_TOKEN = [guid]::NewGuid().ToString('N') + [guid]::NewGuid().ToString('N')
$env:WORKSHOP_ALLOWED_HOSTS = '192.168.1.10'
.\.venv\Scripts\python.exe -m workshop.api_server --host 192.168.1.10 --port 8080

หากยังไม่มี .venv ให้รัน python -m venv .venv ก่อนติดตั้ง dependencies ใช้ค่า WORKSHOP_API_TOKEN เดียวกันใน Desktop และเก็บไว้ในที่ปลอดภัย ค่า environment ตัวอย่างอยู่เฉพาะ PowerShell ครั้งนั้น เมื่อรีสตาร์ตต้องตั้งค่าเดิมอีกครั้งหรืออัปเดต Desktop ให้ตรงกับ key ใหม่

เปิดหน้าแก้ไขจากเครื่องเซิร์ฟเวอร์ที่ http://127.0.0.1:8080/ เครื่อง XP เรียก API ที่ http://192.168.1.10:8080/api/v1/ และคู่มือนี้ที่ http://192.168.1.10:8080/docs/api/

อนุญาตพอร์ตที่เลือกใน Windows Firewall เฉพาะ IP ของเครื่อง Desktop ที่ใช้งาน HTTP ส่ง key แบบไม่เข้ารหัส จึงใช้เฉพาะ LAN งานเครื่องจักรที่แยกและเชื่อถือได้ หากข้ามเครือข่ายให้ใช้ HTTPS gateway ที่เข้ากันได้กับ client ห้ามปิดการตรวจ certificate เพื่อแก้ปัญหา TLS บน XP

โปรแกรมเซิร์ฟเวอร์ใช้ Waitress และจำกัดหน้าแก้ไขแบบ cookie/CSRF ให้อยู่ในเครื่องเซิร์ฟเวอร์ การเข้าจากเครื่องอื่นอนุญาตเฉพาะ API ที่ใช้ key และคู่มือ ไม่เปิดเครื่องหรือแก้ firewall ให้อัตโนมัติ

API key และข้อตกลงของ API

X-API-Key: YOUR_SERVER_TOKEN
Content-Type: application/json

Cloud: สร้าง Desktop API key จากหน้าบัญชีสมาชิก แต่ละ key เข้าถึงเฉพาะไฟล์ของเจ้าของและต้องมีสิทธิ์ Desktop API อยู่ Key ที่เพิกถอนจะใช้ไม่ได้ทันที ไม่ใช้ cookie หรือ CSRF และไม่รับ key ใน query string

Local / LAN: เมื่อกำหนด WORKSHOP_MODE=local ใช้ key อย่างน้อย 32 ตัวที่ตรงกับ WORKSHOP_API_TOKEN สำหรับงาน local ที่ไม่มีเจ้าของ ไม่สามารถเข้าถึงคลังไฟล์สมาชิก cloud ได้

ส่ง JSON เป็น UTF-8 คำตอบ error รูปแบบ {"error":"ข้อความ","code":"validation_error","line":12} ข้อมูล filename เป็นชื่อไฟล์ ไม่ใช้เป็น path บนเซิร์ฟเวอร์

Endpoints v1

Method / URLผลลัพธ์
GET /api/v1/capabilities/ทดสอบการเชื่อมต่อ รุ่น API นามสกุลและขนาดสูงสุด
GET /api/v1/files/?offset=0&limit=50รายการไฟล์ใหม่ก่อน limit 1–100 พร้อม total
POST /api/v1/files/อัปโหลด JSON หรือ multipart ได้รับ HTTP 201 พร้อม id, status, diagnostics และ job/preview เมื่ออ่านครบ
GET /api/v1/files/{id}/ชื่อไฟล์ ขนาด SHA-256 สถานะ project_id และ URL ที่เกี่ยวข้อง
GET /api/v1/files/{id}/job/งานที่แก้ไขล่าสุด รวม Stock, machine และ operations
PUT /api/v1/files/{id}/job/ส่ง job object ทั้งชุดเพื่อตรวจและบันทึก เป็นการแทนที่งานเดิม ควรอ่านล่าสุดและใช้ผู้แก้ไขทีละคน
GET /api/v1/files/{id}/preview/moves, cutter geometry, NC ที่สร้างใหม่, warnings และสถิติ
GET /api/v1/files/{id}/download/?mode=originalต้นฉบับทุกไบต์ ใช้ X-Content-SHA256 ตรวจไฟล์
GET /api/v1/files/{id}/download/?mode=generated&reviewed=true&controller=fanucสร้างจากงานที่บันทึกล่าสุด เปลี่ยน controller ได้เป็น heidenhain/fanuc/fanuc3m/mach3/grbl/linuxcnc หรือไม่ระบุเพื่อใช้ค่าในงาน GRBL หลาย operations ได้ ZIP

ใช้ Content-Disposition เป็นชื่อไฟล์ดาวน์โหลด และ Content-Type แยก NC ออกจาก ZIP การดาวน์โหลด generated ต้องตรวจ setup ก่อนส่ง reviewed=true ต้นฉบับยังดาวน์โหลดได้แม้สถานะ unsupported

ไฟล์ db.sqlite3 เก็บทั้งงานและไฟล์ต้นฉบับที่อัปโหลด สำรองฐานข้อมูลเมื่อย้ายเครื่องหรืออัปเดตระบบ

ตัวอย่างอัปโหลด

POST /api/v1/files/
X-API-Key: YOUR_SERVER_TOKEN
Content-Type: application/json

{
  "filename": "PART_01.nc",
  "content": "G21 G90 G17\nT1 M6\nS2000 M3\nG0 X-20 Y20 Z10\nG1 Z-2 F100\nG1 X140 F500\nG0 Z50\nM5\nM30\n",
  "options": {
    "controller": "fanuc",
    "diameter": 10,
    "cutter_kind": "mill",
    "start_x": 0, "start_y": 0, "start_z": 50,
    "stock": {"width": 120, "length": 80, "height": 25, "origin": "corner"}
  }
}

ส่ง content_base64 แทน content เพื่อรักษา bytes จากไฟล์เครื่องเก่า กำหนด options.encoding เป็น utf-8-sig (ค่าเริ่มต้น), utf-8, ascii, cp1252 หรือ cp874 ได้ multipart ใช้ field file และ field options ที่เป็น JSON string

{
  "id": "UUID-OF-UPLOADED-FILE",
  "filename": "PART_01.nc",
  "status": "ready",
  "sha256": "...",
  "project_id": 12,
  "diagnostics": [],
  "job": {"name": "PART_01", "stock": {}, "machine": {}, "operations": []},
  "preview": {"moves": [], "files": [], "warnings": []}
}

ตัวอย่าง response ย่อแสดงเฉพาะโครงสร้าง เมื่ออ่านไม่ได้จะมี status=unsupported และ diagnostics พร้อมเลขบรรทัด โดยไม่มี job/preview ห้ามตีความ HTTP 201 เพียงอย่างเดียวว่าไฟล์พร้อมกัด

เชื่อมต่อ Tkinter บน Windows XP

ดาวน์โหลด workshop_client.py ไปไว้ข้างโปรแกรม Desktop ใช้ standard library และรูปแบบโค้ด Python 2.7 / 3.4 ที่เหมาะกับ runtime เดิมบน XP ไม่มี requests หรือแพ็กเกจเสริม Python 3.5 ขึ้นไปไม่รองรับ XP ตาม CPython และ Django ของโปรเจกต์ต้องอยู่บนเครื่องเซิร์ฟเวอร์รุ่นใหม่

python workshop_client.py

หน้าต่างมี Server URL, API key, คอนโทรลเลอร์, Refresh, Upload NC, Download original และ Download generated งานเครือข่ายทำใน background thread เพื่อให้หน้าต่างตอบสนอง รายการแสดง 100 ไฟล์ล่าสุด

ใช้ในโปรแกรมเดิม

from workshop_client import WorkshopClient

api = WorkshopClient('http://192.168.1.10:8080', 'YOUR_SERVER_TOKEN')
uploaded = api.upload_file(r'C:\NC\PART_01.nc', {'controller': 'fanuc'})
file_id = uploaded['id']

# Keep the original bytes even if status is unsupported.
api.download_file(file_id, r'C:\NC\PART_01_original.nc')

if uploaded['status'] == 'ready':
    job = api.get_job(file_id)
    job['operations'][0]['offset_x'] = -20
    job['operations'][0]['feed_scale'] = 80
    api.update_job(file_id, job)
    preview = api.preview(file_id)
    # After the operator has reviewed the setup:
    api.download_file(file_id, r'C:\NC\PART_01_new.nc',
                      mode='generated', controller='fanuc', reviewed=True)

เส้นทางปลายทางต้องเป็นไฟล์ใหม่ client ไม่เขียนทับไฟล์ที่มีอยู่ สำหรับ Tkinter เรียก network methods ใน worker thread แล้วส่งผลกลับมาที่ main thread ผ่าน Queue และ root.after ตามตัวอย่างในไฟล์

ได้ตรวจโค้ดและรับ–ส่งผ่าน HTTP บนเครื่องพัฒนาแล้ว ยังไม่ได้ทดสอบบน Windows XP จริง ให้ตรวจ runtime, TLS และการแสดงผล Tkinter บนเครื่องปลายทางก่อนนำเข้าใช้งาน

ปัญหาที่พบบ่อย

  • 401 unauthorized: ตรวจ X-API-Key ว่าตรงเซิร์ฟเวอร์ ไม่ใส่เครื่องหมายคำพูดหรือช่องว่างเพิ่ม
  • 503 api_not_configured: ตั้ง WORKSHOP_API_TOKEN อย่างน้อย 32 ตัว แล้วเริ่มเซิร์ฟเวอร์ใหม่
  • 400 / Invalid host: ใส่ IP หรือชื่อ host ที่ Desktop ใช้ใน WORKSHOP_ALLOWED_HOSTS แล้วเริ่มใหม่
  • 403 เมื่อเปิดหน้าเว็บจาก XP: หน้าแก้ไขเปิดจากเครื่องเซิร์ฟเวอร์ที่ 127.0.0.1 โปรแกรม Desktop ใช้ /api/v1/ พร้อม key
  • 422: ตรวจ error/line, ชนิดคำสั่ง, รูปทรงทูล, ค่าตัวเลข หรือ reviewed=true สำหรับ generated download
  • status unsupported: เปิด diagnostics และตรวจเลขบรรทัด ห้ามลบคำสั่งที่ไม่เข้าใจเพียงเพื่อให้ผ่าน เปลี่ยน post จากโปรแกรมต้นทางให้ใช้เส้นทางที่รองรับ หรือแยกโปรแกรมที่มีจุดหยุด
  • ติดต่อไม่ได้: ตรวจ IP, พอร์ต, firewall และเซิร์ฟเวอร์ยังเปิดอยู่หรือไม่ 127.0.0.1 บน XP หมายถึง XP เอง
  • เนื้อวัสดุไม่ตรง: ตรวจ Stock, datum, Ø/ชนิดทูล, ตำแหน่งเริ่ม และหน่วยไฟล์ ภาพเป็นการประมาณด้วยกริด ไม่ใช่การตรวจชนเครื่อง

อ้างอิง: LinuxCNC G-code, Waitress, Python บน Windows