f2838x_cm_cia402_solution/objdef.h
Alex 9661838676 rev.(UML-1899): рабочий пример EtherCAT Slave на CM
Работает. Есть CiA402, OD из SSC Tool. Автономный со своим main(). Проверялся тестами на SOEM.
2024-02-02 12:33:48 +03:00

294 lines
14 KiB
C

/*
* This source file is part of the EtherCAT Slave Stack Code licensed by Beckhoff Automation GmbH & Co KG, 33415 Verl, Germany.
* The corresponding license agreement applies. This hint shall not be removed.
* https://www.beckhoff.com/media/downloads/slave-stack-code/ethercat_ssc_license.pdf
*/
/**
* \addtogroup CoE CAN Application Profile over EtherCAT
* @{
*/
/**
\file objdef.h
\author EthercatSSC@beckhoff.com
\brief CAN application profile over EtherCAT object dictionary
\version 5.11
<br>Changes to version V5.10:<br>
V5.11 COE2: update synctype supported flag for freerun<br>
V5.11 COE3: change 0x10F3.2 (Sync Error limit) from UINT32 to UINT16 (according to the ETG.1020)<br>
V5.11 ECAT10: change PROTO handling to prevent compiler errors<br>
<br>Changes to version V5.01:<br>
V5.10 COE1: Define one entry description for all 0x1C3x objects and change data type of SI11,12,13 to UINT16 (according ETG.1020)<br>
V5.10 COE2: Change return value of Get ObjectSize to UINT32<br>
Change object size to UINT32<br>
V5.10 ECAT13: Update Synchronisation handling (FreeRun,SM Sync, Sync0, Sync1)<br>
Compare DC UINT configuration (by ESC Config data) vs. DC activation register settings<br>
Update 0x1C3x entries<br>
V5.10 ECAT8: Update Datatype defines according ETG.1020<br>
<br>Changes to version - :<br>
V5.01 : Start file change log
*/
/*-----------------------------------------------------------------------------------------
------
------ Includes
------
-----------------------------------------------------------------------------------------*/
#include "sdoserv.h"
#ifndef _OBJDEF_H_
#define _OBJDEF_H_
/*-----------------------------------------------------------------------------------------
------
------ Defines and Types
------
-----------------------------------------------------------------------------------------*/
/*---------------------------------------------
- DataTypes
-----------------------------------------------*/
#define DEFTYPE_NULL 0x0000 /**< \brief Null*/
#define DEFTYPE_BOOLEAN 0x0001 /**< \brief BOOLEAN*/
#define DEFTYPE_INTEGER8 0x0002 /**< \brief INTEGER8*/
#define DEFTYPE_INTEGER16 0x0003 /**< \brief INTEGER16*/
#define DEFTYPE_INTEGER24 0x0010 /**< \brief INTEGER24*/
#define DEFTYPE_INTEGER32 0x0004 /**< \brief INTEGER32*/
#define DEFTYPE_INTEGER40 0x0012 /**< \brief INTEGER40*/
#define DEFTYPE_INTEGER48 0x0013 /**< \brief INTEGER48*/
#define DEFTYPE_INTEGER56 0x0014 /**< \brief INTEGER56*/
#define DEFTYPE_UNSIGNED8 0x0005 /**< \brief UNSIGNED8*/
#define DEFTYPE_UNSIGNED16 0x0006 /**< \brief UNSIGNED16*/
#define DEFTYPE_UNSIGNED24 0x0016 /**< \brief UNSIGNED24*/
#define DEFTYPE_UNSIGNED32 0x0007 /**< \brief UNSIGNED32*/
#define DEFTYPE_REAL32 0x0008 /**< \brief REAL32*/
#define DEFTYPE_VISIBLESTRING 0x0009 /**< \brief VISIBLE_STRING*/
#define DEFTYPE_OCTETSTRING 0x000A /**< \brief OCTET_STRING*/
#define DEFTYPE_UNICODE_STRING 0x000B /**< \brief UNICODE_STRING*/
#define DEFTYPE_TIME_OF_DAY 0x000C /**< \brief TIME_OF_DAY*/
#define DEFTYPE_TIME_DIFFERENCE 0x000D /**< \brief TIME_DIFFERENCE*/
#define DEFTYPE_INTEGER24 0x0010 /**< \brief INTEGER24*/
#define DEFTYPE_REAL64 0x0011 /**< \brief REAL64*/
#define DEFTYPE_INTEGER40 0x0012 /**< \brief INTEGER40*/
#define DEFTYPE_INTEGER48 0x0013 /**< \brief INTEGER48*/
#define DEFTYPE_INTEGER56 0x0014 /**< \brief INTEGER56*/
#define DEFTYPE_INTEGER64 0x0015 /**< \brief INTEGER64*/
#define DEFTYPE_UNSIGNED24 0x0016 /**< \brief UNSIGNED24*/
#define DEFTYPE_UNSIGNED40 0x0018 /**< \brief UNSIGNED40*/
#define DEFTYPE_UNSIGNED48 0x0019 /**< \brief UNSIGNED48*/
#define DEFTYPE_UNSIGNED56 0x001A /**< \brief UNSIGNED56*/
#define DEFTYPE_UNSIGNED64 0x001B /**< \brief UNSIGNED64*/
#define DEFTYPE_GUID 0x001D /**< \brief DEFTYPE_GUID*/
#define DEFTYPE_BYTE 0x001E /**< \brief DEFTYPE_BYTE*/
#define DEFTYPE_WORD 0x001F /**< \brief DEFTYPE_WORD*/
#define DEFTYPE_DWORD 0x0020 /**< \brief DEFTYPE_DWORD*/
#define DEFTYPE_PDOMAPPING 0x0021 /**< \brief PDO_MAPPING*/
#define DEFTYPE_IDENTITY 0x0023 /**< \brief IDENTITY*/
#define DEFTYPE_COMMAND 0x0025 /**< \brief COMMAND_PAR*/
#define DEFTYPE_PDOCOMPAR 0x0027 /**< \brief PDO_PARAMETER*/
#define DEFTYPE_ENUM 0x0028 /**< \brief DEFTYPE_ENUM */
#define DEFTYPE_SMPAR 0x0029 /**< \brief SM_SYNCHRONISATION*/
#define DEFTYPE_RECORD 0x002A /**< \brief DEFTYPE_RECORD */
#define DEFTYPE_BACKUP 0x002B /**< \brief BACKUP_PARAMETER*/
#define DEFTYPE_MDP 0x002C /**< \brief MODULAR_DEVICE_PROFILE*/
#define DEFTYPE_BITARR8 0x002D /**< \brief BITARR8*/
#define DEFTYPE_BITARR16 0x002E /**< \brief BITARR16*/
#define DEFTYPE_BITARR32 0x002F /**< \brief BITARR32*/
#define DEFTYPE_BIT1 0x0030 /**< \brief BIT1*/
#define DEFTYPE_BIT2 0x0031 /**< \brief BIT2*/
#define DEFTYPE_BIT3 0x0032 /**< \brief BIT3*/
#define DEFTYPE_BIT4 0x0033 /**< \brief BIT4*/
#define DEFTYPE_BIT5 0x0034 /**< \brief BIT5*/
#define DEFTYPE_BIT6 0x0035 /**< \brief BIT6*/
#define DEFTYPE_BIT7 0x0036 /**< \brief BIT7*/
#define DEFTYPE_BIT8 0x0037 /**< \brief BIT8*/
#define DEFTYPE_ARRAY_OF_INT 0x0260 /**< \brief DEFTYPE_ARRAY_OF_INT*/
#define DEFTYPE_ARRAY_OF_SINT 0x0261 /**< \brief DEFTYPE_ARRAY_OF_SINT*/
#define DEFTYPE_ARRAY_OF_DINT 0x0262 /**< \brief DEFTYPE_ARRAY_OF_DINT*/
#define DEFTYPE_ARRAY_OF_UDINT 0x0263 /**< \brief DEFTYPE_ARRAY_OF_UDINT*/
#define DEFTYPE_ERRORHANDLING 0x0281 /**< \brief DEFTYPE_ERRORHANDLING*/
#define DEFTYPE_DIAGHISTORY 0x0282 /**< \brief DEFTYPE_DIAGHISTORY*/
#define DEFTYPE_SYNCSTATUS 0x0283 /**< \brief DEFTYPE_SYNCSTATUS*/
#define DEFTYPE_SYNCSETTINGS 0x0284 /**< \brief DEFTYPE_SYNCSETTINGS*/
#define DEFTYPE_FSOEFRAME 0x0285 /**< \brief DEFTYPE_FSOEFRAME*/
#define DEFTYPE_FSOECOMMPAR 0x0286 /**< \brief DEFTYPE_FSOECOMMPAR*/
/*---------------------------------------------
- Flags for supported Synctypes (0x1C32.4 / 0x1C33.4)
-----------------------------------------------*/
#define SYNCTYPE_FREERUNSUPP 0x0001 /**< \brief FreeRun supported*/
#define SYNCTYPE_SYNCHRONSUPP 0x0002 /**< \brief SyncManager synchron supported*/
#define SYNCTYPE_DCSYNC0SUPP 0x0004 /**< \brief Sync0 synchron supported*/
#define SYNCTYPE_DCSYNC1SUPP 0x0008 /**< \brief Sync1 synchron supported*/
#define SYNCTYPE_SUBCYCLESUPP 0x0010 /**< \brief Subordinated Application with fixed Sync0 supported*/
#define SYNCTYPE_LOCALSHIFTSUPP 0x0020 /**< \brief Event shift with local timer supported. Output shift : 0x1C32.4 ; Input shift : 0x1C33.4 (not supported by the default SSC)*/
#define SYNCTYPE_SHIFTBYSYNC1SUPP 0x0040 /**< \brief Event shift with Sync1 event supported. Output shift : 0x1C32.4 ; Input shift : 0x1C33.4*/
#define SYNCTYPE_MEASURE_DELAYSUPP 0x0200 /**< \brief Delay times should be measured (not supported by the default SSC, only the cycle time can be measured (1ms resolution)*/
#define SYNCTYPE_FIXED_DELAYSUPP 0x0400 /**< \brief Delay times are fixed*/
#define SYNCTYPE_TIMESVARIABLE 0x4000 /**< \brief Dynamic Cycle Times supported*/
#define IS_PDO_ASSIGN(x) ((x >= 0x1C10) && (x <= 0x1C2F)) /**< \brief Macro to check if object index is SyncManager assign object*/
#define IS_RX_PDO(x) (((x) >= 0x1600) && ((x) <= 0x17FF)) /**< \brief Macro to check if object index RxPDO mapping object*/
#define IS_TX_PDO(x) (((x) >= 0x1A00) && ((x) <= 0x1BFF)) /**< \brief Macro to check if object index TxPDO mapping object*/
/**
* \brief Object dictionary entry structure
*/
typedef struct OBJ_ENTRY
{
struct OBJ_ENTRY *pPrev; /**< \brief Previous entry(object) in the object dictionary list*/
struct OBJ_ENTRY *pNext; /**< \brief Next entry(object) in the object dictionary list*/
UINT16 Index; /**< \brief Object index*/
TSDOINFOOBJDESC ObjDesc; /**< \brief Object access, type and code*/
OBJCONST TSDOINFOENTRYDESC OBJMEM *pEntryDesc; /**< \brief pointer to object entry descriptions*/
OBJCONST UCHAR OBJMEM *pName; /**< \brief Pointer to object and entry names*/
void MBXMEM *pVarPtr; /**< \brief Pointer to object buffer*/
UINT8 (* Read)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess ); /**< \brief Function pointer to read function (if NULL default read function will be used)*/
UINT8 (* Write)( UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess ); /**< \brief Function pointer to write function (if NULL default write function will be used)*/
UINT16 NonVolatileOffset; /**< \brief Offset within the non volatile memory (need to be defined for backup objects)*/
}
TOBJECT;
/**
* Object 0x1C3x (SyncManager Parameter) data structure
*/
typedef struct OBJ_STRUCT_PACKED_START
{
UINT16 subindex0;/**< \brief SubIndex0*/
UINT16 u16SyncType; /**< \brief SunbIndex 001: Sync type*/
UINT32 u32CycleTime;/**< \brief SunbIndex 002: Cycle time */
UINT32 u32Subindex003;/**< \brief SunbIndex 003: Shift time (not supported, variable is only used as a place holder)*/
UINT16 u16SyncTypesSupported;/**< \brief SunbIndex 004: Supported Sync types*/
UINT32 u32MinCycleTime;/**< \brief SunbIndex 005: Min cycle time*/
UINT32 u32CalcAndCopyTime;/**< \brief SunbIndex 006: Calc and Copy time*/
UINT32 u32Si7Reserved;/**< \brief SunbIndex 007: 32Bit Reserved*/
UINT16 u16GetCycleTime;/**< \brief SunbIndex 008: Get cycle time*/
UINT32 u32DelayTime; /**< \brief SunbIndex 009: Delay time*/
UINT32 u32Sync0CycleTime; /**< \brief SunbIndex 010: Sync0 cycle time*/
UINT16 u16SmEventMissedCounter; /**< \brief SunbIndex 011: SyncManager event missed counter*/
UINT16 u16CycleExceededCounter; /**< \brief SunbIndex 012: Cycle exceed counter*/
UINT16 u16ShiftTooShort; /**< \brief SunbIndex 013: Shift too short*/
UINT16 u16Si14Reserved; /**< \brief SubIndex14 not supported*/
UINT32 u32Si15Reserved; /**< \brief SubIndex15 not supported*/
UINT32 u32Si16Reserved; /**< \brief SubIndex16 not supported*/
UINT32 u32Si17Reserved; /**< \brief SubIndex17 not supported*/
UINT32 u32Si18Reserved; /**< \brief SubIndex18 not supported*/
UINT8 u8SyncError; /**< \brief Sync Error*/
}OBJ_STRUCT_PACKED_END
TSYNCMANPAR;
/**
* Cycle diagnosis
*/
typedef struct OBJ_STRUCT_PACKED_START
{
UINT16 syncFailedCounter; /**< \brief Sync Failed Counter*/
}OBJ_STRUCT_PACKED_END
TCYCLEDIAG;
/**
* Object 0x10F1 (Error Settings Object) data structure
*/
typedef struct OBJ_STRUCT_PACKED_START {
UINT16 u16SubIndex0; /**< \brief SubIndex0*/
UINT32 u32LocalErrorReaction; /**< \brief Local error reaction*/
UINT16 u16SyncErrorCounterLimit; /**< \brief Sync error counter limit*/
} OBJ_STRUCT_PACKED_END
TOBJ10F1;
#endif //_OBJDEF_H_
/*-----------------------------------------------------------------------------------------
------
------ Global variables
------
-----------------------------------------------------------------------------------------*/
#if defined(_OBJDEF_) && (_OBJDEF_ == 1)
#define PROTO
#else
#define PROTO extern
#endif
/**
* Indicates if the synchronisation was written by the user on startup (by writing 0x1C3x.1).
* If it was not written the sync mode will be set based on the DC registers 0x980:0x981
*/
PROTO BOOL bSyncSetByUser;
/**
* \brief Cycle diagnosis variable
*/
PROTO TCYCLEDIAG sCycleDiag;
/**
* \brief Object 0x1C32 (SyncManager 2 Parameter) object variable
*/
PROTO TSYNCMANPAR MBXMEM sSyncManOutPar;
/**
* \brief Object 0x1C33 (SyncManager 3 Parameter) object variable
*/
PROTO TSYNCMANPAR MBXMEM sSyncManInPar;
/**
* \brief Object 0x10F1 (Error Settings) object variable
*
* SubIndex0 : 2
* Local error reaction : 1
* Sync error counter limit : MAX_SM_EVENT_MISSED
*/
PROTO TOBJ10F1 sErrorSettings
#if defined(_OBJDEF_) && (_OBJDEF_ == 1)
= {2, 0x01, MAX_SM_EVENT_MISSED}
#endif
;
/**
* \brief Default entry name "SubIndex 000"
*/
PROTO CHAR OBJMEM aSubindexDesc[13]
#if defined(_OBJDEF_) && (_OBJDEF_ == 1)
= { "SubIndex 000" }
#endif
;
/*-----------------------------------------------------------------------------------------
------
------ Global functions
------
-----------------------------------------------------------------------------------------*/
PROTO OBJCONST TOBJECT OBJMEM * OBJ_GetObjectHandle( UINT16 index );
PROTO UINT32 OBJ_GetObjectLength( UINT16 index, UINT8 subindex, OBJCONST TOBJECT OBJMEM * pObjEntry, UINT8 bCompleteAccess);
PROTO UINT16 OBJ_GetNoOfObjects(UINT8 listType);
PROTO UINT16 OBJ_GetObjectList(UINT16 listType, UINT16 *pIndex, UINT16 size, UINT16 MBXMEM *pData,UINT8 *pAbort);
PROTO UINT16 OBJ_GetDesc( UINT16 index, UINT8 subindex, OBJCONST TOBJECT OBJMEM * pObjEntry, UINT16 MBXMEM * pData );
PROTO OBJCONST TSDOINFOENTRYDESC OBJMEM * OBJ_GetEntryDesc(OBJCONST TOBJECT OBJMEM * pObjEntry, UINT8 Subindex);
PROTO OBJCONST TSDOINFOOBJDESC OBJMEM * OBJ_GetObjDesc(OBJCONST TOBJECT OBJMEM * pObjEntry);
PROTO UINT16 OBJ_GetEntryOffset(UINT8 subindex, OBJCONST TOBJECT OBJMEM * pObjEntry);
PROTO UINT8 CheckSyncTypeValue(UINT16 index, UINT16 NewSyncType);
PROTO UINT8 OBJ_Read(UINT16 index, UINT8 subindex, UINT32 objSize, OBJCONST TOBJECT OBJMEM * pObjEntry, UINT16 MBXMEM * pData, UINT8 bCompleteAccess);
PROTO UINT8 OBJ_Write(UINT16 index, UINT8 subindex, UINT32 dataSize, OBJCONST TOBJECT OBJMEM * pObjEntry, UINT16 MBXMEM * pData, UINT8 bCompleteAccess);
PROTO void COE_WriteBackupEntry(UINT8 subindex, OBJCONST TOBJECT OBJMEM * pObjEntry);
#undef PROTO
/** @}*/