Motion cycles¶
A MOTION block is a station whose service is a cycle of motions. Use it when a robot arm, a cobot, a person or a mechanism does the work and you want the cycle time to follow from distances, speeds and payloads instead of a single distribution. It seizes, sets up, fails, is preempted and releases exactly like PROCESS.
Motion profiles¶
Declare how something moves in the model's motion_profiles:
| Field | Meaning |
|---|---|
name |
unique name, picked by the block's profile |
kind |
robot, human or mechanism (descriptive only) |
speed |
m/s, > 0 |
accel |
m/s^2, > 0 |
payload_max |
kg, optional |
payload_derate |
speed fraction at payload_max, linear from 1.0 at 0 kg; default 1.0 |
collaborative_speed |
m/s, needed when the block's hrc is not none |
The cycle¶
Segments run in order and the service time is their sum:
move:distance_m, optionalpayload_kg. Timed/v + v/awhend >= v^2/a, else2*sqrt(d/a), wherevis the profile speed times the payload derating.pick,place,tool_change,dwell,process:time, a number or an expression such asTRIA(0.8,1.0,1.4), in the block'stime_unit(default seconds).
The properties panel shows the nominal cycle (means, moves at nominal speed) as you edit.
Time units: moves are seconds, segment times follow time_unit¶
A move segment's time always comes out of the trapezoid/triangle formula in SI
seconds, whatever the model's base time unit is: speed is m/s and accel is
m/s^2 by definition, so a move's duration is physically seconds regardless of how
the rest of the model counts time. Every OTHER segment (pick, place,
tool_change, dwell, process) is timed by its own time expression in the
block's time_unit -- seconds by default, or "base" to follow the model's own
unit. Both kinds of segment then convert into the model's base unit for the run,
so the cycle is the same physical duration whether the model runs in seconds or in
minutes.
For example, take a cycle of one 0.8 m move (profile speed=1.0 m/s,
accel=2.0 m/s^2, so the move takes 0.8/1.0 + 1.0/2.0 = 1.3 s) followed by a
pick segment with "time": "1.0" and the block's default time_unit of
seconds:
- In a model whose base unit is seconds: the move contributes
1.3(already seconds) and the pick contributes1.0(seconds,time_unit= seconds) -- a 2.3 s cycle. - In a model whose base unit is minutes: the move still takes 1.3 PHYSICAL
seconds, converted to
1.3 / 60minutes; the pick's"time": "1.0"is still seconds (the block'stime_unitdid not change), converted to1.0 / 60minutes -- the same 2.3 s cycle, now reported as2.3 / 60minutes. - Setting the block's
time_unitto"base"makes the pick's1.0mean 1.0 OF THE MODEL'S OWN UNIT instead -- 1.0 minute in a minutes model -- so the cycle is no longer the same physical duration;"base"is for when the segment really is meant to scale with the model's unit, not seconds.
Human-robot collaboration¶
hrc is none, collaborative (every move at collaborative_speed) or
separation: a move starts at collaborative_speed when a unit of a worker fleet
is within zone.radius_m of zone.node, measured along the path network. A move
already under way keeps its speed.
Results¶
The motion_summary frame gives, per block and
segment kind, the mean time, the share of the cycle, and for moves the share run
at collaborative speed. Scenario and optimizer keys read
motion/<block>/<kind>/Mean Time. Library assets: Manufacturing > "Manual
assembly (motion)", Logistics > "Person-to-goods picking (motion)".
Known gap: planning¶
The CP-SAT scheduler (nagasim/cpsat.py) ignores MOTION blocks: it plans around
PROCESS/SEIZE/RELEASE stations, so a MOTION station's cycle time is invisible to
the planner. A model that mixes planned stations with a MOTION cell should treat
the MOTION cell's throughput as a fixed input to the plan, not something the
scheduler optimizes around.