Remote start succeeds after the RAPID task has a valid program pointer. A controller handle, automatic operating mode, mastership, and a task reference are not enough by themselves: the controller must also have motor power available and an executable location selected when Task[0].Start() is evaluated.
Start-permission state
The number that matters is the count of missing start conditions: it must be zero. A remote start request crosses several independent permission gates. Passing one gate does not compensate for another that is false.
Motor power is the physical gate. Without it, the controller cannot command robot motion. Automatic mode is the operating-authority gate. Mastership controls whether the PC SDK client may perform protected controller operations. The program pointer is the execution gate: it identifies where the RAPID task will begin or resume.
StartResult.error is therefore a result, not a diagnosis. It says the requested transition to running did not complete. In the reported sequence, adding Task.ResetProgramPointer() before the start call restored operation, identifying the absent or unusable program pointer as the blocking condition.
| Condition | Required state | Where to read or test it | Failure effect |
|---|---|---|---|
| Operating mode | Automatic | Controller operating-mode property | Remote execution remains inhibited |
| Mastership | Held by the application for the required operation | Mastership acquisition result and exception handling | The write or start operation is rejected |
| Motor power | On | Controller state exposed by the SDK or operator interface | Motion-capable execution cannot start |
| Program pointer | Valid executable location | Task state, followed by a controlled reset test |
Task[0].Start() can return StartResult.error
|
| Selected task | The intended RAPID task | Inspect the task collection rather than relying only on array position | The application may act on a different task |
Control approaches
Two approaches fit this control problem: start the task directly through the PC SDK, or expose controller system inputs and outputs for supervisory control. They solve different architectural needs.
| Criterion | Direct PC SDK start | System inputs and outputs |
|---|---|---|
| Command path | The Windows application invokes the task API | A PLC or supervisory application drives configured controller signals |
| State handling | The application checks mode, mastership, motor state, task state, and pointer readiness | The controller maps external signals into configured control actions |
| Best fit | PC-owned sequencing, engineering utilities, and applications that already manage controller sessions | Cell-level start/stop handshakes and PLC-centered machine control |
| Primary diagnostic point | SDK call results and controller/task state immediately before the call | Signal state, mapping, permissives, and handshake feedback |
| Recurring pitfall | Calling Start() without a valid program pointer |
Treating a signal transition as sufficient while a controller permissive remains false |
For the immediate PC SDK fault, keep the direct approach and establish the program pointer before calling Start(). Choose system inputs and outputs when a PLC already owns the cell sequence or when start commands need an explicit signal handshake visible to the rest of the machine. Changing architectures is unnecessary merely to correct a missing pointer.
Diagnostic decision path
- Confirm automatic mode. Read the controller operating mode immediately before the requested start. A value sampled earlier can become stale if an operator changes mode.
- Confirm motor power. Read the current controller state rather than inferring it from a successful connection. Communication with the controller does not prove that motor power is on.
- Confirm mastership. Treat successful acquisition as a separate checkpoint. Keep acquisition, the protected operation, and release within a controlled scope so another client cannot invalidate assumptions between unrelated operations.
-
Confirm the task reference.
Task[0]means the first element returned by the task collection; the expression does not document which task that is. Inspect the selected task before issuing a production start. - Test pointer readiness. If the other gates are valid, reset the selected task's program pointer and retry the start. A successful retry isolates pointer state as the immediate cause.
-
Record the result at each step. Capture the operating mode, motor state, mastership outcome, selected task, reset outcome, and value returned by
Start(). This separates a start rejection from a connection or task-selection error.
Evaluate these states in the same command transaction or as close to the start call as the application design permits. This is a timing problem at the state boundary: the values that matter are the values present when the controller processes the start request.
Program-pointer recovery procedure
Resetting the program pointer changes the task's execution position. Apply it only when restarting from the task's reset position matches the machine sequence and physical state. A reset can cause initialization or motion logic to run again, so coordinate the software action with the cell's established restart policy.
- Obtain the controller handle and verify that the connection is usable.
- Read the operating mode and proceed only in automatic mode.
- Verify that motor power is on.
- Acquire the mastership required for the controller operation.
- Select and validate the intended task from the controller's task collection.
- Invoke
Task.ResetProgramPointer()for that task. - Call
Task[0].Start(), or callStart()on the validated task reference retained by the application. - Inspect the returned
StartResultinstead of treating completion of the method call as proof that RAPID started. - Release mastership through the application's normal cleanup path, including exception paths.
// The task reference must first be validated as the intended task.
Task.ResetProgramPointer();
StartResult result = Task[0].Start();
// Evaluate result; StartResult.error means the start did not complete.
The reset belongs immediately before the start only when every requested start is intended to begin from the reset position. If the application must resume paused execution, unconditional pointer reset changes the required behavior; preserve the existing pointer and diagnose the remaining permissives instead.
Run-state verification
A non-error return is the first verification point, not the last. Read the task state after the command and confirm that it entered the expected execution state. Then confirm the RAPID sequence reached an application-defined checkpoint, such as a controller signal or task variable already designed for supervision.
| Verification | Pass condition | Meaning of failure |
|---|---|---|
| Start result | The return is not StartResult.error
|
The controller rejected or failed the requested transition |
| Task state | The selected task reports the expected running state | The call result alone did not produce sustained execution |
| Application checkpoint | The expected RAPID-side state changes | The task may have started at an unintended location or stopped inside program logic |
| Repeat test | Start behavior remains deterministic after the defined stop/reset cycle | The application has an unresolved state or sequencing dependency |
Log the state snapshot before and after every remote start. Avoid logging only a generic exception string; the operating mode, motor state, task identity, pointer action, and returned result are the fields that distinguish recurring causes.
Recurring implementation pitfalls
Connection state and execution readiness are separate. A PC SDK application can communicate with the controller while automatic mode, motor power, or the program pointer still blocks execution. Likewise, mastership authorizes an operation but does not create an executable pointer.
Array indexing is another weak boundary. If task enumeration changes, hard-coded Task[0] selection can target the wrong task. Resolve the intended task explicitly from the collection and retain that validated reference for both pointer reset and start, so the two operations cannot address different tasks.
Finally, distinguish reset-and-start from resume. Resetting the pointer solved this failure because a valid starting location was missing. Making that reset unconditional can restart process logic that was meant to continue, so define the required restart semantics before placing ResetProgramPointer() in a reusable start routine.
FAQ
How do I fix StartResult.error when starting RAPID remotely?
Verify automatic mode, motor power, mastership, and the selected task. If those conditions pass, invoke Task.ResetProgramPointer() on the intended task and retry Start(); that sequence corrected the missing-pointer failure described here.
How do I decide between PC SDK start and system inputs?
Use the PC SDK when the Windows application owns sequencing and can manage controller state. Use system inputs and outputs when a PLC owns the cell sequence and start/stop actions need a signal-based handshake.
When should I stop troubleshooting and contact ABB support?
Stop after confirming automatic mode, motor power, mastership, the intended task, a successful pointer reset, and a repeatable StartResult.error. Preserve the before-and-after controller state, task identity, SDK call results, application exception details, and controller diagnostic entries, then escalate through an official ABB support channel.