Hello all,

First of all thanks for the terrific stack, we've made really rapid progress integrating EtherLab into our existing software.

For reference, our kernel is 4.14 using RT-PREEMPT, EtherLab is 1.5.2 with Gavin's patches (cribbed from https://github.com/ribalda/ethercat). We are using the ecrt library in user-mode.

We do have one remaining issue to iron out however. We are using Beckhoff AX5000 servo drives (all single channel AX51xx-series) which are SoE devices. After a serious (Sercos "class 1") fault (e.g. over-current, over-temperature etc.) they require the fault to be acknowledged by writing to IDN S-0-0099. This IDN cannot be mapped into process data, so must be written with an explicit SoE write request.

S-0-0099 is listed as being changeable in PreOp, SafeOp and Op, and TwinCAT is happy to write to it while running in Op. One can also trigger the same fault-clearing functionality through the little LCD menu on the front-panel of the drives, which works seamlessly while our cyclic task continues to run and is even referred to in Beckhoff's docs as corresponding to S-0-0099. Of course we will be hiding the drives away in a cabinet so we'd like to do it through EtherLab.

The ecrt.h prototype documentation doesn't mention that a ecrt_master_write_idn() *can't* be called from within the realtime context, but testing this seems to indicate it shouldn't be called within the cyclic task; we immediately lock up our loop. In any case, given ecrt_master_write_idn() is blocking I don't think we want to call it in a sensitive (=many DC slaves) loop.

Using the command-line tool to write the IDN while our realtime application continues to run *mostly* works, although frequently the IDN either fails to write, or sometimes even blocks the command-line tool entirely from returning until our main application is terminated. Debug output from ethercat shows the following repeating ad infinitum:

        EtherCAT DEBUG 0-main-4: SSC write request:
        EtherCAT DEBUG: 03 40 63 00 00 00
        EtherCAT DEBUG 0-main-4: SSC write request:
        EtherCAT DEBUG: 03 40 63 00 00 00
        EtherCAT DEBUG 0-main-4: SSC write request:
        EtherCAT DEBUG: 03 40 63 00 00 00

We have also tried calling the same ioctl in a separate thread (outside of our cyclic task thread) to write to the IDN; this produces basically identical results as the command-line tool (works 80% of the time, with occasional lockups and need to reboot or at least restart the master).

Is there something we've missed? I feel if we could request a transition back to Idle or PreOp this might be enough, maybe even using ecrt_slave_config_idn() to write to S-0-0099 automatically. However there are no knobs I can see to request a slave state change (at least from user-mode), is this correct?

The nuclear option would be to restart all slaves by using ecrt_master_deactivate() and then starting from scratch, but this seems somewhat brutal if it's just a matter of writing an IDN.

Thanks once again,

Tom
_______________________________________________
etherlab-users mailing list
[email protected]
http://lists.etherlab.org/mailman/listinfo/etherlab-users

Reply via email to