Dear Etherlab users,

I use a Beckhoff module EL5102 (2 channels encoder interface) and two 
servodrives to control motors.

I develop a homing sequence as below :

1- Enable counter reset on channel 1 when index encoder is encountered
2- Move axis 1 until index is encoutered
3- Unable counter reset on channel 1
4- Enable counter reset on channel 2 when index encoder is encountered
5- Move axis 2 until index is encoutered
6- Unable counter reset on channel 2

Unabling and disabling counter reset is done using SDOs 0x80n0:01 where n is 
the channel number.

In my program, I create 2 SDO requests with « 
ecrt_slave_config_create_sdo_request » before changing master state in OP with 
« ecrt_master_activate ».
Then, before entering in cyclic task, I write SDOs for the first time and I get 
« EC_REQUEST_UNUSED » SDO request state (trigger first write), it seems to be 
OK.

void enableIndexResetCh_n(state)
{
        switch (ecrt_sdo_request_state(mReqIndexResetCh_n)) {
                case EC_REQUEST_UNUSED:
                    ecrt_sdo_request_write(mReqIndexResetCh_n);
                    break;

                case EC_REQUEST_BUSY:
                    break;

                case EC_REQUEST_SUCCESS:
                    EC_WRITE_U8(ecrt_sdo_request_data(mReqIndexResetCh1), 
static_cast<uint8_t>(state));
                    ecrt_sdo_request_write(mReqIndexResetCh_n);
                    break;

                default:
                    ecrt_sdo_request_write(mReqIndexResetCh_n);
                    break;
                }
                break;
}

Then, I realize homing sequence in the cyclic task as described before.
For the fisrt channel, I write « 1 » into SDO 0x8000:01, request state is « 
EC_REQUEST_SUCCES » but for the second channel 0x8010:02 I get « 
EC_REQUEST_ERROR » and SDO value remains at false state.
I don’t understand why I get this error.

Moreover I want to let you know that I don’t call « ecrt_sdo_request_write » at 
each loop of cyclic task but only when I need to change sdo state. Perhaps this 
is not the right way to call this function. Do I have to call this function at 
each iteration ?
How can I be sure that sdo state corresponds to the right state ? Do I have to 
read sdo state (if sdo is R/W) also at each iteration ?

Regards
-- 
Etherlab-users mailing list
[email protected]
https://lists.etherlab.org/mailman/listinfo/etherlab-users

Reply via email to