Motion command: synchronous and asynchronous source audit

This document records static inspection of the supplied DobotCtrl and DobotTcp source, not an MG400 hardware test.

Public contract

DobotCtrl.move(target, *, motion_mode=None, coord_type=None, path_blend=None, offset=None, pose=None, speed=None, accel=None, decel=None, is_async=True) delegates to DobotTcp.move() with the same arguments. is_async does not denote a Python async def or asynchronous HTTP request. It selects whether the call returns after command acceptance or waits for queued motion via Sync().

Dispatch

Condition

Command

Note

coord_type="J", motion_mode="PTP"

JointMovJ

Public six-component joints mapped to four MG400 joints

coord_type="P", motion_mode="PTP"

MovJ

Public six-component pose mapped to four MG400 components

coord_type="P", motion_mode="LINE"

MovL

Linear motion

motion_mode="CIRCLE"

Unsupported (False)

A single target cannot define an arc

motion_mode="SPLINE"

Unsupported (False)

Not implemented

Joint coordinates with non-PTP mode

Unsupported (False)

Joint semantics cannot be preserved

pose is unsupported. offset is accepted only for P coordinates. Non-None path_blend depends on unsupported blending configuration. Speed is mapped to set_jspeed() for PTP/joint motion and set_speed() for LINE. Acceleration and deceleration settings are applied before dispatch; previously applied settings are not rolled back if a later step fails.

Return values and error handling

  1. _handle_command_reply() checks command acceptance. A zero response code is not proof of completed physical motion.

  2. is_async=True invokes _wait_motion_start_or_error() with default 0.25 s observation and 0.01 s interval. A True result does not prove success over the entire motion.

  3. is_async=False invokes wait_for_complete() using Sync() and then _motion_error_active(query_error_id=True). Existing error-handling paths may fail to distinguish communications failure from absence of alarm. A True result must not serve as a safety completion guarantee.

  4. get_motion_complete() returns False when busy_status is unavailable, otherwise not bool(busy_status). It does not track success per command.

drive() and limits

drive() accepts axis/value pairs, builds a joint target from current joint positions, then calls move(..., motion_mode="PTP", coord_type="J"). Axis numbering is 1-based, nominally 1–6, but nonzero motion on nonexistent MG400 axes J5/J6 fails. relative=True adds the requested value to the current angle. Failure to obtain current angles returns False. rotate() is unimplemented.

Scope

This audit covers static branches and delegation only. It does not test live TCP behavior, competing commands, timeouts, emergency stop, or safety interlocks.