SOEM  v1.4.0
Data Structures | Functions
ethercatcoe.c File Reference

CAN over EtherCAT (CoE) module. More...

#include <stdio.h>
#include <string.h>
#include "osal.h"
#include "oshw.h"
#include "ethercattype.h"
#include "ethercatbase.h"
#include "ethercatmain.h"
#include "ethercatcoe.h"

Data Structures

struct  ec_SDOt
 
struct  ec_SDOservicet
 

Functions

PACKED_END void ecx_SDOerror (ecx_contextt *context, uint16 Slave, uint16 Index, uint8 SubIdx, int32 AbortCode)
 
static void ecx_SDOinfoerror (ecx_contextt *context, uint16 Slave, uint16 Index, uint8 SubIdx, int32 AbortCode)
 
int ecx_SDOread (ecx_contextt *context, uint16 slave, uint16 index, uint8 subindex, boolean CA, int *psize, void *p, int timeout)
 
int ecx_SDOwrite (ecx_contextt *context, uint16 Slave, uint16 Index, uint8 SubIndex, boolean CA, int psize, void *p, int Timeout)
 
int ecx_RxPDO (ecx_contextt *context, uint16 Slave, uint16 RxPDOnumber, int psize, void *p)
 
int ecx_TxPDO (ecx_contextt *context, uint16 slave, uint16 TxPDOnumber, int *psize, void *p, int timeout)
 
int ecx_readPDOassign (ecx_contextt *context, uint16 Slave, uint16 PDOassign)
 
int ecx_readPDOassignCA (ecx_contextt *context, uint16 Slave, int Thread_n, uint16 PDOassign)
 
int ecx_readPDOmap (ecx_contextt *context, uint16 Slave, int *Osize, int *Isize)
 
int ecx_readPDOmapCA (ecx_contextt *context, uint16 Slave, int Thread_n, int *Osize, int *Isize)
 
int ecx_readODlist (ecx_contextt *context, uint16 Slave, ec_ODlistt *pODlist)
 
int ecx_readODdescription (ecx_contextt *context, uint16 Item, ec_ODlistt *pODlist)
 
int ecx_readOEsingle (ecx_contextt *context, uint16 Item, uint8 SubI, ec_ODlistt *pODlist, ec_OElistt *pOElist)
 
int ecx_readOE (ecx_contextt *context, uint16 Item, ec_ODlistt *pODlist, ec_OElistt *pOElist)
 
void ec_SDOerror (uint16 Slave, uint16 Index, uint8 SubIdx, int32 AbortCode)
 
int ec_SDOread (uint16 slave, uint16 index, uint8 subindex, boolean CA, int *psize, void *p, int timeout)
 
int ec_SDOwrite (uint16 Slave, uint16 Index, uint8 SubIndex, boolean CA, int psize, void *p, int Timeout)
 
int ec_RxPDO (uint16 Slave, uint16 RxPDOnumber, int psize, void *p)
 
int ec_TxPDO (uint16 slave, uint16 TxPDOnumber, int *psize, void *p, int timeout)
 
int ec_readPDOassign (uint16 Slave, uint16 PDOassign)
 
int ec_readPDOassignCA (uint16 Slave, uint16 PDOassign, int Thread_n)
 
int ec_readPDOmap (uint16 Slave, int *Osize, int *Isize)
 
int ec_readPDOmapCA (uint16 Slave, int Thread_n, int *Osize, int *Isize)
 
int ec_readODlist (uint16 Slave, ec_ODlistt *pODlist)
 
int ec_readODdescription (uint16 Item, ec_ODlistt *pODlist)
 
int ec_readOEsingle (uint16 Item, uint8 SubI, ec_ODlistt *pODlist, ec_OElistt *pOElist)
 
int ec_readOE (uint16 Item, ec_ODlistt *pODlist, ec_OElistt *pOElist)
 

Detailed Description

CAN over EtherCAT (CoE) module.

SDO read / write and SDO service functions

Function Documentation

◆ ec_readODdescription()

int ec_readODdescription ( uint16  Item,
ec_ODlistt pODlist 
)

CoE read Object Description. Adds textual description to object indexes.

Parameters
[in]Item= Item number in ODlist.
[in,out]pODlist= referencing Object Description list.
Returns
Workcounter of slave response.
See also
ecx_readODdescription

◆ ec_readODlist()

int ec_readODlist ( uint16  Slave,
ec_ODlistt pODlist 
)

CoE read Object Description List.

Parameters
[in]Slave= Slave number.
[out]pODlist= resulting Object Description list.
Returns
Workcounter of slave response.
See also
ecx_readODlist

◆ ec_readOE()

int ec_readOE ( uint16  Item,
ec_ODlistt pODlist,
ec_OElistt pOElist 
)

CoE read SDO service object entry.

Parameters
[in]Item= Item in ODlist.
[in]pODlist= Object description list for reference.
[out]pOElist= resulting object entry structure.
Returns
Workcounter of slave response.
See also
ecx_readOE

◆ ec_readOEsingle()

int ec_readOEsingle ( uint16  Item,
uint8  SubI,
ec_ODlistt pODlist,
ec_OElistt pOElist 
)

◆ ec_readPDOassign()

int ec_readPDOassign ( uint16  Slave,
uint16  PDOassign 
)

Read PDO assign structure

Parameters
[in]Slave= Slave number
[in]PDOassign= PDO assign object
Returns
total bitlength of PDO assign

◆ ec_readPDOassignCA()

int ec_readPDOassignCA ( uint16  Slave,
uint16  PDOassign,
int  Thread_n 
)

Read PDO assign structure in Complete Access mode

Parameters
[in]Slave= Slave number
[in]PDOassign= PDO assign object
[in]Thread_n= Calling thread index
Returns
total bitlength of PDO assign
See also
ecx_readPDOmap

◆ ec_readPDOmap()

int ec_readPDOmap ( uint16  Slave,
int *  Osize,
int *  Isize 
)

CoE read PDO mapping.

CANopen has standard indexes defined for PDO mapping. This function tries to read them and collect a full input and output mapping size of designated slave.

For details, see ecx_readPDOmap

Parameters
[in]Slave= Slave number
[out]Osize= Size in bits of output mapping (rxPDO) found
[out]Isize= Size in bits of input mapping (txPDO) found
Returns
>0 if mapping succesful.

◆ ec_readPDOmapCA()

int ec_readPDOmapCA ( uint16  Slave,
int  Thread_n,
int *  Osize,
int *  Isize 
)

CoE read PDO mapping in Complete Access mode (CA).

CANopen has standard indexes defined for PDO mapping. This function tries to read them and collect a full input and output mapping size of designated slave. Slave has to support CA, otherwise use ec_readPDOmap().

Parameters
[in]Slave= Slave number
[in]Thread_n= Calling thread index
[out]Osize= Size in bits of output mapping (rxPDO) found
[out]Isize= Size in bits of input mapping (txPDO) found
Returns
>0 if mapping succesful.
See also
ecx_readPDOmap ec_readPDOmapCA

◆ ec_RxPDO()

int ec_RxPDO ( uint16  Slave,
uint16  RxPDOnumber,
int  psize,
void *  p 
)

CoE RxPDO write, blocking.

A RxPDO download request is issued.

Parameters
[in]Slave= Slave number
[in]RxPDOnumber= Related RxPDO number
[in]psize= Size in bytes of PDO buffer.
[out]p= Pointer to PDO buffer
Returns
Workcounter from last slave response
See also
ecx_RxPDO

◆ ec_SDOerror()

void ec_SDOerror ( uint16  Slave,
uint16  Index,
uint8  SubIdx,
int32  AbortCode 
)

Report SDO error.

Parameters
[in]Slave= Slave number
[in]Index= Index that generated error
[in]SubIdx= Subindex that generated error
[in]AbortCode= Abortcode, see EtherCAT documentation for list
See also
ecx_SDOerror

◆ ec_SDOread()

int ec_SDOread ( uint16  slave,
uint16  index,
uint8  subindex,
boolean  CA,
int *  psize,
void *  p,
int  timeout 
)

CoE SDO read, blocking. Single subindex or Complete Access.

Only a "normal" upload request is issued. If the requested parameter is <= 4bytes then a "expedited" response is returned, otherwise a "normal" response. If a "normal" response is larger than the mailbox size then the response is segmented. The function will combine all segments and copy them to the parameter buffer.

Parameters
[in]slave= Slave number
[in]index= Index to read
[in]subindex= Subindex to read, must be 0 or 1 if CA is used.
[in]CA= FALSE = single subindex. TRUE = Complete Access, all subindexes read.
[in,out]psize= Size in bytes of parameter buffer, returns bytes read from SDO.
[out]p= Pointer to parameter buffer
[in]timeout= Timeout in us, standard is EC_TIMEOUTRXM
Returns
Workcounter from last slave response
See also
ecx_SDOread

◆ ec_SDOwrite()

int ec_SDOwrite ( uint16  Slave,
uint16  Index,
uint8  SubIndex,
boolean  CA,
int  psize,
void *  p,
int  Timeout 
)

CoE SDO write, blocking. Single subindex or Complete Access.

A "normal" download request is issued, unless we have small data, then a "expedited" transfer is used. If the parameter is larger than the mailbox size then the download is segmented. The function will split the parameter data in segments and send them to the slave one by one.

Parameters
[in]Slave= Slave number
[in]Index= Index to write
[in]SubIndex= Subindex to write, must be 0 or 1 if CA is used.
[in]CA= FALSE = single subindex. TRUE = Complete Access, all subindexes written.
[in]psize= Size in bytes of parameter buffer.
[out]p= Pointer to parameter buffer
[in]Timeout= Timeout in us, standard is EC_TIMEOUTRXM
Returns
Workcounter from last slave response
See also
ecx_SDOwrite

◆ ec_TxPDO()

int ec_TxPDO ( uint16  slave,
uint16  TxPDOnumber,
int *  psize,
void *  p,
int  timeout 
)

CoE TxPDO read remote request, blocking.

A RxPDO download request is issued.

Parameters
[in]slave= Slave number
[in]TxPDOnumber= Related TxPDO number
[in,out]psize= Size in bytes of PDO buffer, returns bytes read from PDO.
[out]p= Pointer to PDO buffer
[in]timeout= Timeout in us, standard is EC_TIMEOUTRXM
Returns
Workcounter from last slave response
See also
ecx_TxPDO

◆ ecx_readODdescription()

int ecx_readODdescription ( ecx_contextt *  context,
uint16  Item,
ec_ODlistt pODlist 
)

CoE read Object Description. Adds textual description to object indexes.

Parameters
[in]context= context struct
[in]Item= Item number in ODlist.
[in,out]pODlist= referencing Object Description list.
Returns
Workcounter of slave response.

◆ ecx_readODlist()

int ecx_readODlist ( ecx_contextt *  context,
uint16  Slave,
ec_ODlistt pODlist 
)

CoE read Object Description List.

Parameters
[in]context= context struct
[in]Slave= Slave number.
[out]pODlist= resulting Object Description list.
Returns
Workcounter of slave response.

◆ ecx_readOE()

int ecx_readOE ( ecx_contextt *  context,
uint16  Item,
ec_ODlistt pODlist,
ec_OElistt pOElist 
)

CoE read SDO service object entry.

Parameters
[in]context= context struct
[in]Item= Item in ODlist.
[in]pODlist= Object description list for reference.
[out]pOElist= resulting object entry structure.
Returns
Workcounter of slave response.

◆ ecx_readOEsingle()

int ecx_readOEsingle ( ecx_contextt *  context,
uint16  Item,
uint8  SubI,
ec_ODlistt pODlist,
ec_OElistt pOElist 
)

CoE read SDO service object entry, single subindex. Used in ec_readOE().

Parameters
[in]context= context struct
[in]Item= Item in ODlist.
[in]SubI= Subindex of item in ODlist.
[in]pODlist= Object description list for reference.
[out]pOElist= resulting object entry structure.
Returns
Workcounter of slave response.

◆ ecx_readPDOassign()

int ecx_readPDOassign ( ecx_contextt *  context,
uint16  Slave,
uint16  PDOassign 
)

Read PDO assign structure

Parameters
[in]context= context struct
[in]Slave= Slave number
[in]PDOassign= PDO assign object
Returns
total bitlength of PDO assign

◆ ecx_readPDOassignCA()

int ecx_readPDOassignCA ( ecx_contextt *  context,
uint16  Slave,
int  Thread_n,
uint16  PDOassign 
)

Read PDO assign structure in Complete Access mode

Parameters
[in]context= context struct
[in]Slave= Slave number
[in]Thread_n= Calling thread index
[in]PDOassign= PDO assign object
Returns
total bitlength of PDO assign

◆ ecx_readPDOmap()

int ecx_readPDOmap ( ecx_contextt *  context,
uint16  Slave,
int *  Osize,
int *  Isize 
)

CoE read PDO mapping.

CANopen has standard indexes defined for PDO mapping. This function tries to read them and collect a full input and output mapping size of designated slave.

Principal structure in slave:
1C00:00 is number of SM defined
1C00:01 SM0 type -> 1C10
1C00:02 SM1 type -> 1C11
1C00:03 SM2 type -> 1C12
1C00:04 SM3 type -> 1C13
Type 0 = unused, 1 = mailbox in, 2 = mailbox out, 3 = outputs (RxPDO), 4 = inputs (TxPDO).

1C12:00 is number of PDO's defined for SM2
1C12:01 PDO assign SDO #1 -> f.e. 1A00
1C12:02 PDO assign SDO #2 -> f.e. 1A04\

1A00:00 is number of object defined for this PDO
1A00:01 object mapping #1, f.e. 60100710 (SDO 6010 SI 07 bitlength 0x10)

Parameters
[in]context= context struct
[in]Slave= Slave number
[out]Osize= Size in bits of output mapping (rxPDO) found
[out]Isize= Size in bits of input mapping (txPDO) found
Returns
>0 if mapping successful.

◆ ecx_readPDOmapCA()

int ecx_readPDOmapCA ( ecx_contextt *  context,
uint16  Slave,
int  Thread_n,
int *  Osize,
int *  Isize 
)

CoE read PDO mapping in Complete Access mode (CA).

CANopen has standard indexes defined for PDO mapping. This function tries to read them and collect a full input and output mapping size of designated slave. Slave has to support CA, otherwise use ec_readPDOmap().

Parameters
[in]context= context struct
[in]Slave= Slave number
[in]Thread_n= Calling thread index
[out]Osize= Size in bits of output mapping (rxPDO) found
[out]Isize= Size in bits of input mapping (txPDO) found
Returns
>0 if mapping successful.

◆ ecx_RxPDO()

int ecx_RxPDO ( ecx_contextt *  context,
uint16  Slave,
uint16  RxPDOnumber,
int  psize,
void *  p 
)

CoE RxPDO write, blocking.

A RxPDO download request is issued.

Parameters
[in]context= context struct
[in]Slave= Slave number
[in]RxPDOnumber= Related RxPDO number
[in]psize= Size in bytes of PDO buffer.
[out]p= Pointer to PDO buffer
Returns
Workcounter from last slave response

◆ ecx_SDOerror()

PACKED_END void ecx_SDOerror ( ecx_contextt *  context,
uint16  Slave,
uint16  Index,
uint8  SubIdx,
int32  AbortCode 
)

Report SDO error.

Parameters
[in]context= context struct
[in]Slave= Slave number
[in]Index= Index that generated error
[in]SubIdx= Subindex that generated error
[in]AbortCode= Abortcode, see EtherCAT documentation for list

◆ ecx_SDOinfoerror()

static void ecx_SDOinfoerror ( ecx_contextt *  context,
uint16  Slave,
uint16  Index,
uint8  SubIdx,
int32  AbortCode 
)
static

Report SDO info error

Parameters
[in]context= context struct
[in]Slave= Slave number
[in]Index= Index that generated error
[in]SubIdx= Subindex that generated error
[in]AbortCode= Abortcode, see EtherCAT documentation for list

◆ ecx_SDOread()

int ecx_SDOread ( ecx_contextt *  context,
uint16  slave,
uint16  index,
uint8  subindex,
boolean  CA,
int *  psize,
void *  p,
int  timeout 
)

CoE SDO read, blocking. Single subindex or Complete Access.

Only a "normal" upload request is issued. If the requested parameter is <= 4bytes then a "expedited" response is returned, otherwise a "normal" response. If a "normal" response is larger than the mailbox size then the response is segmented. The function will combine all segments and copy them to the parameter buffer.

Parameters
[in]context= context struct
[in]slave= Slave number
[in]index= Index to read
[in]subindex= Subindex to read, must be 0 or 1 if CA is used.
[in]CA= FALSE = single subindex. TRUE = Complete Access, all subindexes read.
[in,out]psize= Size in bytes of parameter buffer, returns bytes read from SDO.
[out]p= Pointer to parameter buffer
[in]timeout= Timeout in us, standard is EC_TIMEOUTRXM
Returns
Workcounter from last slave response

◆ ecx_SDOwrite()

int ecx_SDOwrite ( ecx_contextt *  context,
uint16  Slave,
uint16  Index,
uint8  SubIndex,
boolean  CA,
int  psize,
void *  p,
int  Timeout 
)

CoE SDO write, blocking. Single subindex or Complete Access.

A "normal" download request is issued, unless we have small data, then a "expedited" transfer is used. If the parameter is larger than the mailbox size then the download is segmented. The function will split the parameter data in segments and send them to the slave one by one.

Parameters
[in]context= context struct
[in]Slave= Slave number
[in]Index= Index to write
[in]SubIndex= Subindex to write, must be 0 or 1 if CA is used.
[in]CA= FALSE = single subindex. TRUE = Complete Access, all subindexes written.
[in]psize= Size in bytes of parameter buffer.
[out]p= Pointer to parameter buffer
[in]Timeout= Timeout in us, standard is EC_TIMEOUTRXM
Returns
Workcounter from last slave response

◆ ecx_TxPDO()

int ecx_TxPDO ( ecx_contextt *  context,
uint16  slave,
uint16  TxPDOnumber,
int *  psize,
void *  p,
int  timeout 
)

CoE TxPDO read remote request, blocking.

A RxPDO download request is issued.

Parameters
[in]context= context struct
[in]slave= Slave number
[in]TxPDOnumber= Related TxPDO number
[in,out]psize= Size in bytes of PDO buffer, returns bytes read from PDO.
[out]p= Pointer to PDO buffer
[in]timeout= Timeout in us, standard is EC_TIMEOUTRXM
Returns
Workcounter from last slave response