MC_MoveVelocity Smallest Speed Step in S7-1500 Motion Control
The MC_MoveVelocity function block drives a single axis to a continuous velocity setpoint. Re-triggering the block with a new velocity overwrites the live setpoint at the rising edge of Execute. The smallest speed increment the controller can physically realise is not an explicit MC_MoveVelocity parameter — it is a derived quantity set by the underlying pulse train, the position control cycle, and the encoder or load gearing. This reference quantifies that limit for S7-1500 / S7-1500T motion control, compares it with related PLC platforms, and gives a field procedure for verification.
1. Function Block Architecture
MC_MoveVelocity is defined in the PLCopen motion control specification and is implemented by every major controller vendor with the same I/O surface. The block transitions the axis to ContinuousMotion and accepts a new target while running.
| Input | Type | Description |
|---|---|---|
Execute |
BOOL | Rising edge starts or re-issues the velocity command |
Velocity |
LREAL | Target velocity in user units (typically mm/s, °/s, or pulses/s) |
Acceleration / Deceleration
|
LREAL | Ramp limits. 0 uses axis default |
Jerk |
LREAL | Optional S-curve limit (V8 / S7-1500T) |
Direction |
MC_DIRECTION | positive / negative / shortest / current |
Per the Siemens S7-1500 Motion Control V8 documentation for S7-1500 / S7-1500T, "An MC_MoveVelocity job with Velocity = 0.0 stops the axis with the configured deceleration. When the velocity setpoint / speed setpoint zero is reached, the axis transitions to Standstill." The setpoint is overwritten on the rising edge of Execute — there is no in-cycle blending between consecutive setpoints; the controller ramps from the actual velocity to the new target under the active acceleration limit. Source: Siemens TIA Portal V20 — MC_MoveVelocity V8 (S7-1500, S7-1500T).
2. Where the Resolution Limit Comes From
Three independent boundaries determine the minimum speed step the drive will actually follow:
- Pulse-train quantisation — pulse-train output (PTO) hardware can only change output frequency in integer pulse counts per cycle.
- Position control cycle (IPO / servo cycle) — the setpoint is updated once per cycle, so a velocity change that does not produce at least one pulse per cycle has no physical effect on the output stage.
- Mechanical resolution — at very low speeds, stiction and the encoder's own quantisation can hide velocity steps that are otherwise electrically real.
For an S7-1500 PTO axis the dominant constraint is (2): the velocity command must be large enough to emit at least one full pulse per IPO cycle. This is the exact phenomenon the source thread calls out when it states "if your cycle time is 10 ms you must have at least 100 pulses/sec velocity changing (at least 1 pulse per cycle)."
3. Pulse-to-Velocity Conversion
For a PTO or pulse-direction output, velocity in user units is:
v_user = (f_pulse / ppr) × gear
where:
-
f_pulse= output pulse frequency (pulses/s) -
ppr= pulses per motor revolution (configured in the technology object) -
gear= mechanical ratio (load units per motor revolution)
Inverting gives the pulse frequency needed for a target velocity, and the smallest increment is simply:
Δf_pulse_min = 1 / T_IPO
which is one full pulse per position-control cycle. Anything below this is sub-LSB and is dropped by the pulse generator.
4. Worked Numerical Examples
Assume the 2000 pulses-per-revolution motor and 10 ms IPO cycle discussed in the source thread.
| IPO cycle T_IPO | Min. resolvable Δf | Δv at 2000 ppr | Δv at 4096 ppr | Δv at 10000 ppr |
|---|---|---|---|---|
| 1 ms | 1000 pulses/s | 0.500 rev/s (30 RPM) | 0.244 rev/s (14.6 RPM) | 0.100 rev/s (6 RPM) |
| 2 ms | 500 pulses/s | 0.250 rev/s (15 RPM) | 0.122 rev/s (7.3 RPM) | 0.050 rev/s (3 RPM) |
| 4 ms | 250 pulses/s | 0.125 rev/s (7.5 RPM) | 0.061 rev/s (3.66 RPM) | 0.025 rev/s (1.5 RPM) |
| 10 ms | 100 pulses/s | 0.050 rev/s (3 RPM) | 0.024 rev/s (1.46 RPM) | 0.010 rev/s (0.6 RPM) |
| 20 ms | 50 pulses/s | 0.025 rev/s (1.5 RPM) | 0.012 rev/s (0.73 RPM) | 0.005 rev/s (0.3 RPM) |
The 100 pulses/s figure (1 pulse per 10 ms cycle) matches the engineering rule from the field report. The 20 pulses/s "just audible" observation in the source thread is below the quantisation limit at 10 ms IPO; what was heard was the controller's ramp saturating at the next available pulse boundary, not a 20 pulses/s delta.
5. S7-1500 vs. S7-200 PTOx_MAN Comparison
The source thread references the S7-200 PTOx_MAN block, which carried an explicit relative-change limit on the SPEED input variable. The S7-200 PTO is a slower, microcontroller-class pulse generator with a documented minimum increment (typically a few Hz) before the hardware cannot generate a valid frequency change. Modern S7-1500 motion control does not expose a discrete "minimum speed step" tag; the equivalent is the implicit 1 / T_IPO bound plus the dynamic limits of the drive amplifier's torque loop.
| Parameter | S7-200 PTOx_MAN | S7-1500 MC_MoveVelocity (V8) |
|---|---|---|
| Pulse source | CPU PTO hardware | Technology object TO_Speedsetpoint / TO_PositioningAxis |
| Min. documented Δf | Yes (per SPEED input spec) | Derived: 1 / T_IPO pulses per cycle |
| IPO cycle | Fixed by PTO channel | Configurable 1 ms … 8 ms (S7-1500) / down to 250 µs (S7-1500T) |
| Re-trigger behaviour | Discrete mode change | Rising edge of Execute overwrites setpoint |
| Encoder feedback | None on PTO mode | PROFIdrive, PROFINET, incremental |
6. S7-1500T Considerations
On S7-1500T controllers, MC_MoveVelocity also supports the optional Jerk input. S-curve profiling has no effect on resolution; it only changes the path between two resolvable setpoints. The smallest step that the axis will follow remains bounded by IPO quantisation. For a 1 ms servo cycle, the bound is 1000 pulses/s, or 30 RPM on a 2000 ppr motor — but the tighter 250 µs cycle available on S7-1500T brings that down to 250 pulses/s, or 7.5 RPM, an effective 4× improvement in speed-setpoint resolution.
7. Cross-Vendor Behaviour
MC_MoveVelocity is PLCopen-standard, but each vendor's re-trigger semantics and resolution behaviour differ slightly.
| Vendor | Library / platform | Re-trigger behaviour | Notes |
|---|---|---|---|
| Siemens | S7-1500 Motion Control V8 | Rising edge of Execute overwrites setpoint; in-flight job keeps its Busy/Active outputs |
Velocity = 0.0 → controlled stop, transition to Standstill
|
| Schneider Electric | Machine Expert V1.1, Modicon M340 / M580 | Can be restarted while executed; target values overwritten at the rising edge | Same PLCopen semantics; cycle time of task determines pulse resolution |
| Beckhoff | TcPlcLib TC2_MC2 (TwinCAT 2) | Starts an endless travel; stopped by MC_Stop or new command |
CNC / NC task cycle sets effective resolution, typically 1 ms or faster |
| AutomationDirect | LS-XMC / Do-More (LM512 help) | Transitions axis to ContinuousMotion state |
Per AutomationDirect — Using MC_MoveVelocity |
Sources: Schneider Electric — MC_MoveVelocity; Beckhoff Information System — MC_MoveVelocity (TC2_MC2); AutomationDirect — Using MC_MoveVelocity (XMC).
8. Designing a Trajectory Generator
When building a custom trajectory on top of MC_MoveVelocity, follow this design pattern:
-
Compute the desired velocity in user units (mm/s, °/s) at the trajectory's update period
T_traj. - Convert to pulse frequency using the load-gear / ppr ratio defined in the technology object.
-
Quantise to the integer pulse grid:
f_q = round(f_pulse × T_IPO) / T_IPO. This step is automatic inside the S7-1500 motion control firmware but must be modelled in any PC-side preview path. -
Only re-trigger
MC_MoveVelocitywhen|f_q_new − f_q_last| ≥ 1 / T_IPO. Re-triggering on a smaller delta is a no-op at the pulse generator and wastes CPU on the PLCopen state machine. -
Clamp the step with the axis' configured
Accelerationso a single setpoint jump does not command an unachievable Δv/Δt.
Structured Text skeleton for a velocity-setpoint smoother:
// Trajectory cycle, e.g. 10 ms
IF cycle_tick THEN
v_target_user := trajectory(t); // user units / s
f_pulse := v_target_user * ppr / gear; // Hz
f_quantised := REAL_TO_LREAL(REAL_TO_DINT(f_pulse * T_IPO)) / T_IPO;
IF ABS(f_quantised - f_last) >= (1.0 / T_IPO) THEN
MC_MoveVelocity_0(Execute := FALSE); // reset edge
MC_MoveVelocity_0(Velocity := f_quantised / ppr * gear);
MC_MoveVelocity_0(Execute := TRUE); // rising edge overwrites
f_last := f_quantised;
END_IF;
END_IF;
9. Verification Procedure
Use this bench procedure to determine the effective resolution on your specific axis.
- Wire the
<Axis>.StatusVelocitytag (S7-1500) or equivalent to an HMI trend. This tag returns the actual filtered velocity, not the command, and is the right signal for resolution checks. - Configure the axis with the same
pprand IPO cycle you will use in production. - From a standstill, command a series of velocities in 1 / T_IPO Hz increments and record
StatusVelocityfor each. - Identify the smallest Δcommand that produces a measurable change in
StatusVelocity. This is your effective resolution. - Repeat at higher base velocities (e.g. 10 %, 50 %, 90 % of max) — many drives show degraded Δv resolution at high speed because of speed-loop gain scheduling.
- Cross-check with a trace on the drive's actual speed feedback (e.g. via PROFIdrive telegram, parameter
r0061on SINAMICS) to confirm the controller is not silently dropping sub-LSB steps.
10. Diagnostic Tags
| Tag | Type | Use |
|---|---|---|
<Axis>.StatusVelocity |
LREAL | Current filtered actual velocity (user units/s) |
<Axis>.ActualVelocity |
LREAL | Unfiltered / raw actual velocity |
<Axis>.MotionStatusWord |
DWORD | Bit 4 = ContinuousMotion, Bit 5 = Accelerating, Bit 6 = ConstantVelocity
|
MC_MoveVelocity.InVelocity |
BOOL | TRUE once the axis is within the configured tolerance of the new setpoint |
MC_MoveVelocity.Busy |
BOOL | TRUE from first Execute edge until the block can accept a new command |
InVelocity uses the axis' PositionTolerance and VelocityTolerance settings. For ultra-fine setpoint work, lower the velocity tolerance but expect longer settle times.
11. Troubleshooting Matrix
| Symptom | Likely cause | Remediation |
|---|---|---|
| Velocity never settles to commanded value | Command Δv < 1 / T_IPO; pulse grid quantisation | Increase setpoint step, lower IPO, or use a profiler FB that issues the smallest quantised step |
| No audible / visible response to small Δv | Sub-LSB step dropped by PTO | Round to nearest integer pulse per cycle |
| Overshoot on re-trigger | Acceleration too low for the Δv requested | Increase Acceleration parameter on the FB or in the technology object |
InVelocity never goes TRUE |
VelocityTolerance < pulse-quantisation noise | Widen VelocityTolerance on the axis |
Setpoint ignored after Busy falls |
Re-trigger occurred after Done; Busy must be active to overwrite |
Issue the new Execute edge before Busy falls, or chain through MC_Reset
|
Velocity reads as 0 even though ContinuousMotion active |
Status filter time constant too long | Reduce StatusFilter on the technology object |
12. Safety and Process Limits
MC_MoveVelocity with a tiny Δv on a moving axis is harmless to the motion output, but in safety-relevant applications the velocity-tolerance band of the safety function (e.g. SLS on SINAMICS) must be larger than the minimum resolvable step. A safety monitor that triggers on a 5 RPM band, against an axis whose minimum step is 3 RPM, will false-trip on a benign re-trigger.For PROFIsafe / PROFIdrive Safety Integrated applications, set the SLS limit at least 2× the smallest resolvable step observed in section 9, and verify under worst-case load.
13. Summary
The "smallest speed difference MC_MoveVelocity can handle" is not a fixed property of the FB. It is:
Δv_min = (1 / T_IPO) × (gear / ppr)
For a 2000 ppr motor on a 4 ms S7-1500 axis with a 1:1 gear, that is 7.5 RPM. Use <Axis>.StatusVelocity to confirm the bound empirically, and design the trajectory layer to emit only quantised setpoints. On S7-1500T, dropping the servo cycle to 250 µs gives 4× finer resolution at the cost of CPU.
What is the minimum speed step MC_MoveVelocity can follow on S7-1500?
The minimum setpoint change is one full pulse per IPO cycle: Δf_min = 1 / T_IPO. For a 4 ms cycle that is 250 pulses/s, or 7.5 RPM on a 2000 ppr motor with 1:1 gearing. Smaller deltas are dropped by the pulse generator.
Does MC_MoveVelocity blend setpoints, or jump?
It does not blend. Each rising edge of Execute overwrites the active setpoint. The axis ramps from the actual velocity to the new target under the active acceleration / jerk limits. The PLCopen state machine keeps the same instance in ContinuousMotion.
How do I verify the effective velocity resolution on my axis?
Trend <Axis>.StatusVelocity on an HMI, command velocities in 1/T_IPO Hz increments, and find the smallest step that produces a measurable change. Cross-check with a SINAMICS trace on parameter r0061 to confirm the drive is not silently dropping the sub-LSB command.
Can MC_MoveVelocity stop the axis?
Yes. Setting Velocity = 0.0 initiates a controlled stop with the configured deceleration. Once actual velocity reaches zero, the axis transitions to Standstill. This is documented in the Siemens V8 motion control reference for S7-1500 / S7-1500T.
How does the S7-1500T servo cycle change the smallest step?
The 250 µs NC cycle on S7-1500T lowers the pulse-quantisation bound to 4000 pulses/s per cycle-step, or 4000/(ppr×gear) RPM. A 2000 ppr axis at 1:1 gear moves in 0.2 RPM increments, a 4× improvement over a 1 ms servo cycle. The trade-off is higher CPU load on the technology object.