Detailed explanation of master station SOEM function--SDO read and write function

Detailed explanation of SOEM function of EtherCAT master station----SDO read and write function

The functions related to the ethercatcoe file in this article, the full name of COE is CanOpen over EtherCAT, and the application layer of EtherCAT is developed by using CanOpen's related protocols. The core is the object dictionary. If you want to know about PDO, you can read CanOpen Communication----PDO and SDO . For the knowledge about the message structure, you can refer to the introduction of EtherCAT data frame and SOEM message data structure , which will help you understand the following.

ethercatcoe.h header file

In order to have a more comprehensive understanding of COE, this article will first give the header file of ethercatcoe.h, as shown below, the core of which is the read and write functions.

/*
 * Licensed under the GNU General Public License version 2 with exceptions. See
 * LICENSE file in the project root for full license information
 */
/** \file
 * \brief
 * Headerfile for ethercatcoe.c
 */
#ifndef _ethercatcoe_
#define _ethercatcoe_
#ifdef __cplusplus
extern "C"
{
    
    
#endif
/** max entries in Object Description list */
#define EC_MAXODLIST   1024
/** max entries in Object Entry list */
#define EC_MAXOELIST   256
/* Storage for object description list */
typedef struct
{
    
    
   /** slave number */
   uint16  Slave;
   /** number of entries in list */
   uint16  Entries;
   /** array of indexes */
   uint16  Index[EC_MAXODLIST];
   /** array of datatypes, see EtherCAT specification */
   uint16  DataType[EC_MAXODLIST];
   /** array of object codes, see EtherCAT specification */
   uint8   ObjectCode[EC_MAXODLIST];
   /** number of subindexes for each index */
   uint8   MaxSub[EC_MAXODLIST];
   /** textual description of each index */
   char    Name[EC_MAXODLIST][EC_MAXNAME+1];
} ec_ODlistt;
/* storage for object list entry information */
typedef struct
{
    
    
   /** number of entries in list */
   uint16 Entries;
   /** array of value infos, see EtherCAT specification */
   uint8  ValueInfo[EC_MAXOELIST];
   /** array of value infos, see EtherCAT specification */
   uint16 DataType[EC_MAXOELIST];
   /** array of bit lengths, see EtherCAT specification */
   uint16 BitLength[EC_MAXOELIST];
   /** array of object access bits, see EtherCAT specification */
   uint16 ObjAccess[EC_MAXOELIST];
   /** textual description of each index */
   char   Name[EC_MAXOELIST][EC_MAXNAME+1];
} ec_OElistt;
#ifdef EC_VER1
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_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);
#endif
void ecx_SDOerror(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_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);
#ifdef __cplusplus
}
#endif
#endif

SDO read and write functions

SDO service data, also known as mailbox data, is usually used in the drive configuration phase, and its data transmission is aperiodic.

SDO read function

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.
 *
 * @param[in]  context    = context struct
 * @param[in]  slave      = Slave number
 * @param[in]  index      = Index to read
 * @param[in]  subindex   = Subindex to read, must be 0 or 1 if CA is used.
 * @param[in]  CA         = FALSE = single subindex. TRUE = Complete Access, all subindexes read.
 * @param[in,out] psize   = Size in bytes of parameter buffer, returns bytes read from SDO.
 * @param[out] p          = Pointer to parameter buffer
 * @param[in]  timeout    = Timeout in us, standard is EC_TIMEOUTRXM
 * @return Workcounter from last slave response
 */

Parameter explanation:

  • ecx_contextt *context: message structure pointer, all information is transmitted through the message, which contains a series of configuration information;
  • uint16 slave: Slave station number, including sequential addressing, logical addressing, etc., using sequential addressing to automatically scan and assign during drive configuration, related to the connection sequence;
  • uint16 index: object dictionary index, CanOpen related protocol
  • uint8 subindex: object dictionary subindex, CanOpen related protocol
  • boolean CA: Complete Access (Complete Access), will access all sub-indexes, generally fill in False, only access the given sub-index.
  • int *psize: read parameter bytes
  • void *p: Read the parameter pointer, through which the desired information can be obtained
  • int timeout: read maximum timeout, unit us (microseconds), generally for EC_TIMEOUTRXM, its value is 700000
  • @return Workcounter: Returns the count wck, which is used to compare whether the message is processed correctly.

SDO write function

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.
 *
 * @param[in]  context    = context struct
 * @param[in]  Slave      = Slave number
 * @param[in]  Index      = Index to write
 * @param[in]  SubIndex   = Subindex to write, must be 0 or 1 if CA is used.
 * @param[in]  CA         = FALSE = single subindex. TRUE = Complete Access, all subindexes written.
 * @param[in]  psize      = Size in bytes of parameter buffer.
 * @param[out] p          = Pointer to parameter buffer
 * @param[in]  Timeout    = Timeout in us, standard is EC_TIMEOUTRXM
 * @return Workcounter from last slave response

Parameter explanation:

  • ecx_contextt *context: message structure pointer, all information is transmitted through the message, which contains a series of configuration information;
  • uint16 slave: Slave station number, including sequential addressing, logical addressing, etc., using sequential addressing to automatically scan and assign during drive configuration, related to the connection sequence;
  • uint16 index: object dictionary index, CanOpen related protocol
  • uint8 subindex: object dictionary subindex, CanOpen related protocol
  • boolean CA: Complete Access (Complete Access), will access all sub-indexes, generally fill in False, only access the given sub-index.
  • int psize: the number of bytes of parameters that need to be written
  • void *p: Write the parameter pointer, through which the data of the corresponding slave station can be modified
  • int timeout: the maximum timeout for writing, the unit is us (microseconds), generally for EC_TIMEOUTRXM, its value is 700000
  • @return Workcounter: Returns the count wck, which is used to compare whether the message is processed correctly.

Guess you like

Origin blog.csdn.net/soinlove36/article/details/120415853