<div dir="ltr"><div><br></div><div style>Occasionally, I find that if my application is killed without deactivating and releasing the master nicely, the slave data is corrupted (slave names aren&#39;t shown, states are wrong, vendor id and product id are zero, incorrect alias etc.). An example is shown here:</div>
<div style><br></div><div style>4  100:4  PREOP  E  0x00000000:0x00000000<br></div><div style><br></div><div style>Executing a rescan from the ethercat command line tool fixes the problem:</div><div style><br></div><div style>
4  101:0  PREOP  +  EL5001 1K. SSI Encoder<br></div><div style><br></div><div style>Therefore, I have added an ecrt_master_rescan function to the user library and I call this in my application immediately after acquiring the master. This ensures that the slaves are updated when my application starts.</div>
<div style><br></div><div style>It might be an idea to initiate a rescan whenever the master switches back to idle mode (whether gracefully or not) then this would not be necessary.</div><div style><br></div><div style>Patch file for this change below (and also attached).</div>
<div style>Apply with &#39;patch -u -p0 &lt; rescan.patch&#39;</div><div style><br></div><div style><div>--- ethercat-1.5.2/include/ecrt.h.orig  2013-02-21 03:58:50.000000000 -0500</div><div>+++ ethercat-1.5.2/include/ecrt.h       2013-02-21 03:46:12.000000000 -0500</div>
<div>@@ -1010,6 +1010,14 @@</div><div>                                        */</div><div>         );</div><div><br></div><div>+/* Initiates a full slave rescan.</div><div>+ *</div><div>+ * \return Zero on success, otherwise negative error code.</div>
<div>+ */</div><div>+int ecrt_master_rescan(</div><div>+        const ec_master_t *master</div><div>+        );</div><div>+</div><div> /** Sets the application time.</div><div>  *</div><div>  * The master has to know the application&#39;s time when operating slaves with</div>
<div>--- ethercat-1.5.2/lib/master.c.orig    2013-02-21 03:58:37.000000000 -0500</div><div>+++ ethercat-1.5.2/lib/master.c 2013-02-21 03:44:36.000000000 -0500</div><div>@@ -666,6 +666,22 @@</div><div><br></div><div> /****************************************************************************/</div>
<div><br></div><div>+int ecrt_master_rescan(const ec_master_t *master)</div><div>+{</div><div>+    int ret;</div><div>+</div><div>+    ret = ioctl(master-&gt;fd, EC_IOCTL_MASTER_RESCAN, 0);</div><div>+    if (EC_IOCTL_IS_ERROR(ret)) {</div>
<div>+        fprintf(stderr, &quot;Failed to initiate rescan: %s\n&quot;,</div><div>+                strerror(EC_IOCTL_ERRNO(ret)));</div><div>+        return -EC_IOCTL_ERRNO(ret);</div><div>+    }</div><div>+</div><div>
+    return 0;</div><div>+}</div><div>+</div><div>+/****************************************************************************/</div><div>+</div><div> void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)</div>
<div> {</div><div>     ec_ioctl_app_time_t data;</div><div><br></div><div><br></div></div></div>