[etherlab-users] "PDO entry registration failed!" Problem

Roland Kohser roland.kohser at etu.unistra.fr
Wed Jan 20 19:18:49 CET 2010


Hi, I am new in the ethercat community and am trying to configure my  
devices. My
configuration :

$ ethercat slaves
0  1:0  PREOP  +  EK1100 EtherCAT-Koppler (2A E-Bus)
1  1:1  PREOP  +  EL2008 8Ch. Dig. Output 24V, 0.5A
2  1:2  PREOP  E  EL3102 2K. Ana. Eingang +/-10V, DIFF

I am testing the devices using the example code available in  
/example/user/main.c in the main package.

When I launch it without modifying it, I get this :

Configuring PDOs...
Activating master...
pd: 0
Starting timer...
Started.
3 slave(s).
AL states: 0x02.
Link is up.
AL states: 0x0A.

After the modification of position of my modules according to their  
physical position (especially for the EL3102 AnaInSlavePos ):

#define BusCouplerPos  0, 0
#define DigOutSlavePos 0, 1
#define AnaInSlavePos  0, 2
#define AnaOutSlavePos 0, 4

, I get this, which is a pretty good result :

Configuring PDOs...
Activating master...
pd: 0
Starting timer...
Started.
3 slave(s).
AL states: 0x03.
Link is up.
AnaIn: State 0x01.
AnaIn: online.
Domain1: WC 1.
Domain1: State 1.
AL states: 0x0A.
AnaIn: State 0x08.
AnaIn: operational.

So the EL3102 module is detected and operationnal.

Now my aim is to get the same result with my EL2008 module. The  
example code is using a EL2004 module, which is the same only with 8  
outputs. To do this, I generate the module configuration using

$ ethercat -p1 cstruct
/* Slave 1, "EL2008"
  * Vendor ID:       0x00000002
  * Product code:    0x07d83052
  * Revision number: 0x00100000
  */

ec_pdo_entry_info_t slave_1_pdo_entries[] = {
    {0x7000, 0x01, 1}, /* Output */
    {0x7010, 0x01, 1}, /* Output */
    {0x7020, 0x01, 1}, /* Output */
    {0x7030, 0x01, 1}, /* Output */
    {0x7040, 0x01, 1}, /* Output */
    {0x7050, 0x01, 1}, /* Output */
    {0x7060, 0x01, 1}, /* Output */
    {0x7070, 0x01, 1}, /* Output */
};

ec_pdo_info_t slave_1_pdos[] = {
    {0x1600, 1, slave_1_pdo_entries + 0}, /* Channel 1 */
    {0x1601, 1, slave_1_pdo_entries + 1}, /* Channel 2 */
    {0x1602, 1, slave_1_pdo_entries + 2}, /* Channel 3 */
    {0x1603, 1, slave_1_pdo_entries + 3}, /* Channel 4 */
    {0x1604, 1, slave_1_pdo_entries + 4}, /* Channel 5 */
    {0x1605, 1, slave_1_pdo_entries + 5}, /* Channel 6 */
    {0x1606, 1, slave_1_pdo_entries + 6}, /* Channel 7 */
    {0x1607, 1, slave_1_pdo_entries + 7}, /* Channel 8 */
};

ec_sync_info_t slave_1_syncs[] = {
    {0, EC_DIR_OUTPUT, 8, slave_1_pdos + 0, EC_WD_ENABLE},
};

So now I replace the product code ID in my code, and the configuration  
part of the EL2004 by this one, to get the following configuration (I  
keep the el2004 names):

#if CONFIGURE_PDOS

// Analog in --------------------------

static ec_pdo_entry_info_t el3102_pdo_entries[] = {
     {0x3101, 1,  8}, // channel 1 status
     {0x3101, 2, 16}, // channel 1 value
     {0x3102, 1,  8}, // channel 2 status
     {0x3102, 2, 16}, // channel 2 value
     {0x6401, 1, 16}, // channel 1 value (alt.)
     {0x6401, 2, 16}  // channel 2 value (alt.)
};

static ec_pdo_info_t el3102_pdos[] = {
     {0x1A00, 2, el3102_pdo_entries},
     {0x1A01, 2, el3102_pdo_entries + 2}
};

static ec_sync_info_t el3102_syncs[] = {
     {2, EC_DIR_OUTPUT},
     {3, EC_DIR_INPUT, 2, el3102_pdos},
     {0xff}
};

// Analog out -------------------------

static ec_pdo_entry_info_t el4102_pdo_entries[] = {
     {0x3001, 1, 16}, // channel 1 value
     {0x3002, 1, 16}, // channel 2 value
};

static ec_pdo_info_t el4102_pdos[] = {
     {0x1600, 1, el4102_pdo_entries},
     {0x1601, 1, el4102_pdo_entries + 1}
};

static ec_sync_info_t el4102_syncs[] = {
     {2, EC_DIR_OUTPUT, 2, el4102_pdos},
     {3, EC_DIR_INPUT},
     {0xff}
};

// Digital out ------------------------

static ec_pdo_entry_info_t el2004_channels[] = {
     {0x7000, 0x01, 1},
    {0x7010, 0x01, 1},
    {0x7020, 0x01, 1},
    {0x7030, 0x01, 1},
    {0x7040, 0x01, 1},
    {0x7050, 0x01, 1},
    {0x7060, 0x01, 1},
    {0x7070, 0x01, 1}
};

static ec_pdo_info_t el2004_pdos[] = {
     {0x1600, 1, &el2004_channels[0]},
    {0x1601, 1, &el2004_channels[1]},
    {0x1602, 1, &el2004_channels[2]},
    {0x1603, 1, &el2004_channels[3]},
    {0x1604, 1, &el2004_channels[4]},
    {0x1605, 1, &el2004_channels[5]},
    {0x1606, 1, &el2004_channels[6]},
    {0x1607, 1, &el2004_channels[7]}
};

static ec_sync_info_t el2004_syncs[] = {
     {0, EC_DIR_OUTPUT, 8, el2004_pdos, EC_WD_ENABLE},
     {0xff}
};
//*************************************

#endif

But now I get the following error :

Configuring PDOs...
Failed to register PDO entry: No such file or directory
PDO entry registration failed!

I don't understand this error. Indeed, when using the configuration of  
the device I do not have, there is no problem, and when I replace it  
by the code directly generated by my device, I meet this problem...

What do you think about it ? Did i forgot something ?

Thank you in advance !

Roland





More information about the Etherlab-users mailing list