CANopen and EtherNet/IP Assembly Mapping

We are having issues writing assembly mappings that work with both the CANopen and EtherNet/IP protocols. In our EtherNet/IP implementation, we have a single assembly write map containing 3 ADIs (32 bits each). This works well, but when utilizing the same code for CANopen, the third ADI’s process data is truncated and is never sent over the bus. We believe this is due to the maximum payload size of a CAN frame being 64 bits. Removing one ADI from the original write map and adding it to a new one solves the issue, and we get two CAN frames with different identifiers being transmitted on the bus (first frame contains the first two assembly mapped TPDOs and the second one contains the third).

This updated code with two write maps does not work on our EtherNet/IP module as our LED status indicators signal that the network status LED is off (indicating no power or no IP address), and the module status LED is solid red (indicating a major fault). Is there a way to have the same code display the process data on both EtherNet/IP and CANopen? We also have a Profinet board that we have not yet tested with the assembly map changes yet and would like to find a solution to allow us to reuse our code for all protocols if possible.

Hello Pdesai,

It is possible to have an ADI map work for multiple networks. The speed example we provide should show up the same. 3 32 bit ADI’s should show up as 3 separate PDO’s in CANopen. I’m not sure why the data would be getting truncated. EIP should map them all to the Assembly instances. What errors are you getting with the updated config, with the red LED’s.

Can you share the ADI’s and mapping you are using?

Hi Deryck,

Apologies for the late response. We have been having issues with our firmware that we wanted to address before responding. We are still working on it but wanted to post an update. We were able to get EtherNet/IP working without any faults (we needed to add a second instance value and increase the instance array size in abcc_obj_cfg.h since we were trying to add a second assembly write map at the time), but our issue is now with CANopen.

When you say that 3 ADIs should appear as 3 separate CANopen PDOs, does this require placing each ADI in a separate writemap? For reference, I have attached a screenshot of our original assembly mappings that only utilized a single write map. In EtherNet/IP, this functions fine and we get a cyclical message containing ADIs 13, 257, and 258. With CANopen, we only see ADI 13 being transmitted as a PDO with CAN ID 1F0 (PDO transmit 1). I would also like to make a correction to my previous post: ADI 13 is 64 bits long (2xUINT32), ADI 257 and 258 are each 32 bits.

0 original maps