<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'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 'patch -u -p0 < rescan.patch'</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'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->fd, EC_IOCTL_MASTER_RESCAN, 0);</div><div>+    if (EC_IOCTL_IS_ERROR(ret)) {</div>
<div>+        fprintf(stderr, "Failed to initiate rescan: %s\n",</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>