MotionController::NetworkStart() returns error 1000000022, yet RapidSetup later reports the EtherCAT network as OPERATIONAL. That combination points to two separate completion boundaries: the C++ caller stopped waiting, while the EtherCAT master continued processing and ultimately started the network. Missing Axis objects are a second issue caused by configuration-file resolution or a stale host object created before discovery completed.
Where does the start request stop?
Follow the packet and the control request. The application creates its host-side motion-controller object with MotionController::CreateFromSoftware(char*), starts RMP.RTA, and calls MotionController::NetworkStart(). The real-time component then discovers and starts the EtherCAT network. Drives respond as nodes, and RapidCode uses the discovered topology plus its XML configuration to construct Axis and I/O objects.
| Stage | Expected result | Observed result | Diagnostic meaning |
|---|---|---|---|
| C++ API |
NetworkStart() returns successfully |
Timeout at RSI::RapidCode::Impl::MotionController::NetworkStart, object 0, line 2992
|
The host-side wait expired; it does not by itself prove that the real-time start process stopped |
| Real-time network task | Discover nodes and reach the running state | RapidSetup later reports OPERATIONAL
|
The master may have completed after the API raised the timeout |
| Host object model | Nodes contain Axis and I/O children | Nodes sometimes appear without Axis objects | The current client may hold a pre-discovery view, or the required node-information file was not resolved |
The first checkpoint is temporal: record when the API throws, then continue observing the master state without immediately issuing another start. If the state later becomes OPERATIONAL, the request passed into the real-time subsystem and the timeout occurred at the caller’s completion boundary.
Is layer one actually failing?
Layer one first. A network that operates reliably when started entirely from RapidSetup makes a persistent cable or drive fault less likely, but it does not clear the physical path under machine load. Observe link state, drive indicators, node presence, and the network log while reproducing the application start. Do not treat the text EtherCAT communication broken during system operation as proof that the start failed before correlating its timestamp with the exact attempt.
On this system, the Windows and INtime event logs contained no unusual event. INtime takes a processor core for its work; high Windows-side load primarily affects cache and resource access and can appear as jitter. The Graphical Jitter Tool provides the deciding measurement under normal and peak machine load. Poor jitter would normally present as network errors rather than only a host timeout, while network-start duration also varies with PC processing power and node count.
| Symptom | Most useful discriminator | Likely branch |
|---|---|---|
| Link or nodes disappear during the attempt | Drive indicators and repeated node loss at the same point | Physical path, device power, or communications |
| Jitter degrades under peak Windows load | Graphical Jitter Tool captured during the failure | Host resource contention affecting real-time access |
API times out, but state later becomes OPERATIONAL
|
State and timestamps after the exception | Start duration exceeded the host wait |
| Nodes exist but have no children | Refresh or recreate the client object, then check configuration-file resolution | Stale object model or missing node-description data |
The physical-layer checkpoint passes when the same nodes remain present, no repeatable link loss occurs, and jitter stays acceptable during the attempted start. Only then move to file and API behavior.
Can the application resolve the RapidCode files?
The no-argument NetworkStart() call assumes the important RapidCode files, including EtherCATNodeInfo.xml, are available through the working-directory arrangement used by the application. RapidSetup commonly operates with those files together in a directory such as C:\RSI\X.X.XX\. A correct environment variable does not prove that the application has the same working directory or resolves the same file set.
EtherCATNodeInfo.xml supplies Axis-count and I/O-count information. Without it, a discovered drive can appear by node name with no Axis or I/O subitems. That presentation must not be confused with a failed EtherCAT discovery: the node exists, but RapidCode lacks the description needed to construct its children.
- Capture the application’s actual working directory at runtime.
- Confirm that
EtherCATNodeInfo.xmland the other RapidCode files used by the working RapidSetup installation are present at the location expected by the no-argument call. - If the files live elsewhere, use the
NetworkStartoverload that identifies the location of the required RapidCode files. - Search the normal Windows loading locations for duplicate RapidCode installations or stray
RSIQVC.dllcopies. Compare the failing machine with a working machine rather than relying only on environment variables. - If the layout is correct but file integrity remains suspect, refresh the RSI directory from the controlled installation set.
The file-resolution checkpoint passes when the application and RapidSetup resolve one controlled RapidCode installation and a newly created client displays the expected Axis and I/O children.
Does NetworkStart time out before the master finishes?
NetworkStart() performs discovery before completing the network start. Its duration changes with processing power, current system load, and EtherCAT node count. In version 8.0.7, the application uses the timeout behavior built into that release. Configurable NetworkStart(...) timeouts were added in 8.1.4 for slower PCs and systems with higher node counts.
The reported sequence fits late completion: the C++ call raises 1000000022, the application sees a timeout, and another client subsequently sees OPERATIONAL. The correct response is not an immediate second start based solely on the exception. Poll the network state for a bounded application-defined observation period, record every transition, and distinguish “API wait expired” from “master entered an error state.” Select that observation period from measured start times on the production machine; no fixed duration is supplied for this installation.
An upgrade is a controlled engineering option, not the first commissioning change. Moving from 8.0.7 to a release with configurable timeouts requires rebuilding the application against the new software and testing the production behavior. The rsiconfig utility offers a separate way to validate configuration and start the network without compiling application code; as of 8.1.6, it can also generate an ENI file when one is missing.
The timing checkpoint passes when repeated measurements show whether the master reaches OPERATIONAL after the exception and quantify the interval from request to final state.
Why can the network be operational while axes are missing?
Network state and host-object population are different views. The master can be operational while RapidSetup or the C++ application still displays the object collection captured before discovery finished. RapidSetup does not automatically refresh its list when another process performs Discover/Start.
RapidSetup handles its own start workflow by refreshing itself: it deletes and recreates its MotionController object after starting the network. That recreation is required for the client to detect and configure newly discovered Axis objects. The same behavior explains why closing the application—which calls MotionController::Delete()—and restarting it makes the already operational network appear with all axes.
- After the C++ timeout, wait for the network state to settle.
- If RapidSetup is open, select
View->Refreshbefore judging the discovered object list. - In the application, stop using references obtained from the old
MotionControllerobject. - Call
MotionController::Delete(), recreate the controller withMotionController::CreateFromSoftware(char*), and reacquire node, Axis, and I/O objects. - Read the network state again from the recreated object. If it is already operational, do not start the network again merely because the earlier object timed out.
The object-model checkpoint passes when refresh or delete/recreate exposes the expected axes without another physical network start.
What do the timeout log messages prove?
Clear the network log immediately before each attempt, preserve the timestamps, and read the sequence as a state machine. The captured run began with Network State: (262): SHUTDOWN and Starting EtherCAT network. It later reported that the main network loop finished, listed nodes #(0) through #(3) with AL Status (0x0), Code (0x0), exited the service-channel thread, and stopped the EtherCAT driver.
| Log entry | Use in diagnosis |
|---|---|
Last cyclic frame was 1093 us |
Preserve as a timing observation from the run; it is not a complete jitter diagnosis by itself |
Main Network Loop finished |
Shows the real-time loop reached its termination path |
AL Status (0x0), Code (0x0) |
Does not identify a slave AL error in the listed entries |
EtherCAT communication broken during system operation |
Correlate with the transition into stopping; check whether it followed client shutdown or preceded the timeout |
UserInfo : Error : E30 |
Retain the exact code and obtain its definition from the documentation matching 8.0.7 for 04.04.02.RMP
|
State changed from Running to StoppingOnError |
Confirms the logged driver instance entered an error-stop path |
Timeout waiting for motion engines to stop |
Describes a shutdown timeout, not the original host-side network-start wait |
Close driver followed by SHUTDOWN
|
Marks the end of that driver shutdown sequence |
The log checkpoint passes when one cleared capture ties the API call, state polling, refresh or recreation, and driver messages to the same clock and attempt.
How do you verify the complete commissioning path?
- Start from
SHUTDOWNand record CPU load, jitter, working directory, resolved RapidCode file set, and visible EtherCAT nodes. - Clear the network log, timestamp the call, and invoke
NetworkStart()once. - If
1000000022occurs, record it and continue polling state without issuing an immediate second start. - If the state becomes
OPERATIONAL, refresh RapidSetup or delete and recreate the application’sMotionControllerobject. - Verify that nodes
#(0)through#(3)appear as expected for this installation and that every configured drive node now exposes its Axis and I/O children. - Repeat under normal and peak machine load. Compare start duration, jitter, final state, object counts, and log transitions across runs.
- Test shutdown through
MotionController::Delete(), recreate the object, and confirm that the application reads the current network and object state without depending on stale references.
The end-to-end test passes only when one start request reaches OPERATIONAL, the recreated client contains all expected objects, no repeatable physical-layer loss appears, and the same sequence succeeds under peak production load.
FAQ
Can error 1000000022 occur even if EtherCAT starts?
Yes. With the reported 8.0.7 behavior, the API can stop waiting while the master continues and later reaches OPERATIONAL. Poll the final state and correlate timestamps before issuing another start.
Does an operational network automatically populate Axis objects?
No. Refresh RapidSetup with View->Refresh, or call MotionController::Delete() and recreate the host object. Also verify that EtherCATNodeInfo.xml is resolved, because it supplies Axis and I/O counts.
Can I prove the fix without changing RSI versions?
Yes. Clear the log, call NetworkStart() once, wait for the final state, refresh or recreate the controller, and repeat under peak load. Final verification is OPERATIONAL with every expected node, Axis, and I/O object present.