Object cannot be mapped to the PDO

I’m testing a M40 Powerlink brick module (AB6711-C). In my host application I have added some ADI’s to populate the manufacturer specific objects of the dictionary.

I’m testing everything with a B&R PLC. Something is wrong during PDO mapping. The PLC is trying to map object 0x5051:01 as follow (Wireshark log):

Ethernet POWERLINK
.000 0110 = MessageType: Asynchronous Send (ASnd) (6)
Destination: 1 (0x01) (Controlled Node)
Source: 240 (0xf0) (Managing Node)
Requested Service ID: SDO (0x05)
Sequence Layer
Command Layer
SDO Transaction ID: 0
0… … = SDO Response: Request (0)
.0… … = SDO Abort: Transfer OK (0)
…00 … = SDO Segmentation: Expedited Transfer (0)
SDO Command ID: Write by Index (1)
SDO Segment size: 12
OD Index: 0x1a00 (PDO_TxMappParam_00h_AU64)
OD SubIndex: 0x01 (ObjectMapping)
Mapping
Index: 0x5051
SubIndex: 0x01
Offset: 0x0000
Length: 32 bits

The module is rejecting the configuration request:

Ethernet POWERLINK
.000 0110 = MessageType: Asynchronous Send (ASnd) (6)
Destination: 240 (0xf0) (Managing Node)
Source: 1 (0x01) (Controlled Node)
Requested Service ID: SDO (0x05)
Sequence Layer
Command Layer
SDO Transaction ID: 0
1… … = SDO Response: Response (1)
.1… … = SDO Abort: Abort Transfer (1)
…00 … = SDO Segmentation: Expedited Transfer (0)
SDO Command ID: Write by Index (1)
SDO Segment size: 4
SDO Transfer Abort: Object cannot be mapped to the PDO. (0x6040041)

here’s the way I have defined ADI 0x5051 (ADI instance 12369)

typedef struct APPL_Adi_LibPDO
{
UINT8 numEntries;
UINT32 Lib_PDO_1;
UINT32 Lib_PDO_2;
UINT32 Lib_PDO_3;
UINT32 Lib_PDO_4;
UINT32 Lib_PDO_5;
UINT32 Lib_PDO_6;
UINT32 Lib_PDO_7;
UINT32 Lib_PDO_8;
UINT32 Lib_PDO_9;
}
APPL_Adi_LibPDOType;

APPL_Adi_LibPDOType APPL_LibPDO_rx = {9,0,0,0,0,0,0,0,0,0};
APPL_Adi_LibPDOType APPL_LibPDO_tx = {9,0,0,0,0,0,0,0,0,0};

static const AD_StructDataType appl_AdiLibPdoRxStruct[] =
{
/* Index: 0 / { “numEntries”, ABP_UINT8, 1, APPL_NOT_MAP_READ_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.numEntries, NULL } } },
/
Index: 1 / { “Lib pdo rx 1”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_1, NULL } } },
/
Index: 2 / { “Lib pdo rx 2”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_2, NULL } } },
/
Index: 3 / { “Lib pdo rx 3”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_3, NULL } } },
/
Index: 4 / { “Lib pdo rx 4”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_4, NULL } } },
/
Index: 5 / { “Lib pdo rx 5”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_5, NULL } } },
/
Index: 6 / { “Lib pdo rx 6”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_6, NULL } } },
/
Index: 7 / { “Lib pdo rx 7”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_7, NULL } } },
/
Index: 8 / { “Lib pdo rx 8”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_8, NULL } } },
/
Index: 9 */ { “Lib pdo rx 9”, ABP_UINT32, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_rx.Lib_PDO_9, NULL } } }
};

static const AD_StructDataType appl_AdiLibPdoTxStruct[] =
{
/* Index: 0 / { “numEntries”, ABP_UINT8, 1, APPL_NOT_MAP_READ_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.numEntries, NULL } } },
/
Index: 1 / { “Lib pdo tx 1”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_1, NULL } } },
/
Index: 2 / { “Lib pdo tx 2”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_2, NULL } } },
/
Index: 3 / { “Lib pdo tx 3”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_3, NULL } } },
/
Index: 4 / { “Lib pdo tx 4”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_4, NULL } } },
/
Index: 5 / { “Lib pdo tx 5”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_5, NULL } } },
/
Index: 6 / { “Lib pdo tx 6”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_6, NULL } } },
/
Index: 7 / { “Lib pdo tx 7”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_7, NULL } } },
/
Index: 8 / { “Lib pdo tx 8”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_8, NULL } } },
/
Index: 9 */ { “Lib pdo tx 9”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_9, NULL } } }
};

const AD_AdiEntryType APPL_asAdiEntryList[] =
{
{ 3, “DC link voltage”, ABP_SINT16, 1, APPL_WRITE_MAP_READ_ACCESS_DESC, { { &appl_iDClinkVolt, NULL } }, NULL, NULL, NULL },
{ 97, “Guide value option code”, ABP_UINT16, 1, APPL_NOT_MAP_WRITE_ACCESS_DESC, { { &appl_iGuideValOpCode, NULL } }, NULL, NULL, SetAdi97Value },
{ 12352, “PDO RX ID”, ABP_UINT8, 1, APPL_READ_MAP_WRITE_ACCESS_DESC, { { &appl_iPdoRxID, NULL } }, NULL, NULL, NULL },
{ 12353, “PDO TX ID”, ABP_UINT8, 1, APPL_WRITE_MAP_READ_ACCESS_DESC, { { &appl_iPdoRxID, NULL } }, NULL, NULL, NULL },
{ 12368, “Lib pdo rx”, ABP_UINT8, 10, APPL_READ_MAP_WRITE_ACCESS_DESC, { { NULL, NULL } }, appl_AdiLibPdoRxStruct, NULL, NULL },
{ 12369, “Lib pdo tx”, ABP_UINT8, 10, APPL_WRITE_MAP_WRITE_ACCESS_DESC,{ { NULL, NULL } }, appl_AdiLibPdoTxStruct, NULL, NULL }
};

const AD_DefaultMapType APPL_asAdObjDefaultMap[] =
{
{ AD_DEFAULT_MAP_END_ENTRY }
};

I left default map empty since the PLC will remap PDO’s.

Please, can you help me to understand why “Object cannot be mapped to the PDO” is returned?

Thanks in advance

Carlo

By the way, abort code 0x6040041is not documented in the translation table:

Apparently only mapping of structure subindex 1 fails. That is, mapping of index 0x5051, subindexes from 2 to 9 works perfectly.

But subindexes 1-9 are defined all the same way in the structure:

static const AD_StructDataType appl_AdiLibPdoTxStruct[] =
{
/* subindex: 0 / { “numEntries”, ABP_UINT8, 1, APPL_NOT_MAP_READ_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.numEntries, NULL } } },
/
subindex: 1 / { “Lib pdo tx 1”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_1, NULL } } },
/
subindex: 2 / { “Lib pdo tx 2”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_2, NULL } } },
/
subindex: 3 / { “Lib pdo tx 3”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_3, NULL } } },
/
subindex: 4 / { “Lib pdo tx 4”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_4, NULL } } },
/
subindex: 5 / { “Lib pdo tx 5”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_5, NULL } } },
/
subindex: 6 / { “Lib pdo tx 6”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_6, NULL } } },
/
subindex: 7 / { “Lib pdo tx 7”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_7, NULL } } },
/
subindex: 8 / { “Lib pdo tx 8”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_8, NULL } } },
/
subindex: 9 */ { “Lib pdo tx 9”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_9, NULL } } }
};

The only thing is that subindex 1 is preceded by subindex 0, that is UINT8 type instead of UINT32. Could this be the issue?

My last finding: if I set all subindexes in the structure with the same data type and the same mapping type, then all subindexes 1-9 can be mapped successfully by the PLC:

so I had to change from this:

static const AD_StructDataType appl_AdiLibPdoTxStruct[] =
{
/* subindex: 0 / { “numEntries”, ABP_UINT8, 1, APPL_NOT_MAP_READ_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.numEntries, NULL } } },
/* subindex: 1 */ { “Lib pdo tx 1”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_1, NULL } } },

to this:

static const AD_StructDataType appl_AdiLibPdoTxStruct[] =
{
/* subindex: 0 / { “numEntries”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.numEntries, NULL } } },
/* subindex: 1 */ { “Lib pdo tx 1”, ABP_UINT32, 1, APPL_WRITE_MAP_WRITE_ACCESS_DESC, 0, { { &APPL_LibPDO_tx.Lib_PDO_1, NULL } } },

But this is not what I need.

Hello @CaNe,

You will need to submit this request on mysupport.hms.se. This will allow us to better assist you with this type of question.

Deryck

done right now :slight_smile:

thanks!

Great! Thanks, This will get you to your local support staff for quicker answers and allow us to reach internal experts on this protocol and hardware.

Deryck