UFACTORY Gcode

UFACTORY Gcode is compatible with LinuxCNC gcode: http://linuxcnc.org/, and refers to the RS-274 standard.

Updated: 2024-07-24

Firmware version: v2.5.0 or later

UFACTORY Studio version: V2.5.0 or later

TCP port: 504

1. G command

  • G0 X Y Z A B C // The speed is 240mm/s by default

  • G1 X Y Z A B C F // XYZ(mm), ABC(RPY,degree), F(speed,mm/min)

  • G2 //Arc move, clockwise arc (G2 X Y Z R P F ) (G2 X Y Z I J K P F), R-radius, I- X offset, J- Y offset, K- Z offset, P-number of turns, default is 1

  • G3 //Arc move, counterclockwise arc (G3 X Y Z R P F) (G3 X Y Z I J K P F)

  • G4 P // Dwell, Unit: s

  • G17 //Z-axis, XY-plane

  • G18 //Y-axis, YZ-plane

  • G19 //X-axis, YZ-plane

  • G20 // use inches for length units

  • G21 // use millimeters for length units

  • G90 //absolute distance mode

  • G90.1 //absolute distance mode for I, J & K offsets

  • G91 //incremental distance mode

  • G91.1 //incremental distance mode for I, J & K offsets

//Code Example
G0 X300 Y100 Z200 A180 B0 C0        ;move to [300,100,200,180,0,0]
G4 P5                               ;sleep 5s
G1 X300 Y100 Z350 A180 B0 C0 F30000 ;move to [300,100,200,180,0,0], speed=500mm/s
G21                                 ;set the unit as mm
G0 X300                             ;move to X=300mm
G20                                 ;set the unit as inches
G0 X10                              ;move to X=10inches(254mm)
G21                                 ;set the unit as mm
G90                                 ;use absolute coordinate
G0 X300                             ;move to X=300mm
G91                                 ;use relative coordinate
G0 X10                              ;move forward 10mm
G90                                 ;use absolute coordinate

You can debug and check more examples via 'UFACTORY Studio-Gcode' page.

2. M command

  • M2/M30 //end program

  • M62 P //turn on digital output synchronized with motion(wait=True).

  • M63 P //turn off digital output synchronized with motion(wait=True).

  • M64 P //turn on digital output immediately(wait=False).

  • M65 P //turn off digital output immediately(wait=False).

  • E67 E Q //set controller analog output synchronized with motion(wait=True).

  • E68 E Q //set controller analog output immediately(wait=False). P: IONUM(0-15, 0-7: CO0-CO7, 8-15: DO0-DO7)

    E: IONUM(0-1), Q: value(0-10)

  • M100 P{} Q{} //enable or disable the robot. P1-enable, P0-disable, Q-joint ID(8 by default, stands for all joints).

  • M101 //clear error

  • M102 //clear warning

  • M103 P{} //set mode

  • M104 P{} //set state

  • M115 P{} Q{} //set TGPIO

P: IONUM 0/1/2/3/4

Q: 0/ 1/ 10/ 11

Q0:turn off(low level) tool digital output synchronized with motion(wait=True).

Q1:turn on(high level) tool digital output synchronized with motion(wait=True).

Q10: turn off tool digital output immediately(wait=False).

Q11: turn on tool digital output immediately(wait=False).

  • M116 P{} Q{} //control the end effector

P1: xArm Gripper, Q-position

P2: xArm Vacuum Gripper

Q0:open(wait=True), Q1:close(wait=True),

Q10:open(wait=False), Q11:close(wait=False)

P3: xArm BIO Gripper

Q0: close, Q1: open

P4/P5: Robotiq-2F-85 Gripper, Robotiq-2F-140 Gripper, Q:position(0~255)

P11: Lite6 Gripper

Q0:close(wait=True), Q1:open(wait=True),

Q10:close(wait=False), Q11:open(wait=False)

P12: Lite6 Vacuum Gripper

Q0:close(wait=True), Q1:open(wait=True),

Q10:close(wait=False), Q11:open(wait=False)

//Code Example
M62 P1            ;set CO1 to high level, wait=True
M64 P15           ;set DO7 to high level, wait=False
M67 E0 Q10        ;set AO0 to 10V, wait=True
M68 E1 Q2         ;set AO1 to 2V, wait=False


M116 P2 Q10       ;open xArm Vacuum Gripper, wait=False
M116 P2 Q11       ;close xArm Vacuum Gripper, wait=False

3. Python Example

Python Example
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setblocking(True)
sock.connect(('192.168.1.67', 504))

def send_and_recv(data):
    for line in data.split('\n'):
        line = line.strip()
        if not line:
            continue
        sock.send(line.encode('utf-8', 'replace') + b'\n')
        ret = sock.recv(5)
        code, mode_state, err = ret[0:3]
        state, mode = mode_state & 0x0F, mode_state >> 4
        cmdnum = ret[3] << 8 | ret[4]
        if code != 0 or state >= 4 or err > 0:
            print('code: {}, mode: {}, state: {}, err: {}, cmdnum: {}, cmd: {}'.format(code, mode, state, err, cmdnum, line))

# move x to x=500mm, speed= 10000 mm/min
send_and_recv('G1 X500 F10000')

Note:

1. Response:

  • byte0: return value. 0 is success

  • byte1: mode and state

  • byte2: error code

  • byte3 & byte4: buffer

2. Recommend to send 1 non-empty data at a time(with line breaks)

sock.send(b'G0 X300\n')

3. Need to receive the response, otherwise the buffer will be full.

 sock.recv(5)

Last updated