EtherCAT Slave  1.06.01
ESL_cia402Demo.c

CiA 402 Directive Example

Author
KUNBUS GmbH
Date
2020-06-19
#include <osal.h>
#include <ESL_os.h>
#include <ESL_BOARD_OS_config.h>
#include "ecSlvCiA402.h"
#include "ESL_cia402Demo.h"
#include "ESL_cia402Obd.h"
#include "ESL_gpioHelper.h"
#if !(defined BIT2BYTE)
#define BIT2BYTE(x) (((x)+7) >> 3)
#endif
/* if dynamic value change while OP is required, this costs 15usec per cycle ! */
#define ENABLE_DYNAMIC_POSITION_LIMITS 0
#define EC_SLV_APP_CIA_GETAXISVALUE(type_p, target_p, axisDesc_p) \
if (gotOffsets && (NULL != (axisDesc_p).pdoObject)) { \
(target_p) = ((type_p*)&(pApplication_p->pdRxBuffer[(axisDesc_p).pdoOffset]))[0]; } else { \
EC_SLV_APP_getCiA402ObjectValue(pApplication_p, (axisDesc_p).pSdo, sizeof(type_p), (uint16_t*)&(target_p)); }
#define EC_SLV_APP_CIA_SETAXISVALUE(type_p, axisDesc_p, value_p) \
if (gotOffsets && (NULL != (axisDesc_p).pdoObject)) { \
((type_p*)&(pApplication_p->pdTxBuffer[(axisDesc_p).pdoOffset]))[0] = (value_p); } else { \
EC_SLV_APP_setCiA402ObjectValue(pApplication_p, &(axisDesc_p), sizeof(type_p), (uint16_t*)&(value_p)); }
typedef struct
{
uint8_t id;
bool axisIsActive;
bool brakeApplied;
bool lowLevelPowerApplied;
bool highLevelPowerApplied;
bool axisFunctionEnabled;
bool configurationAllowed;
double positionActualValue;
uint32_t cycleTime;
}
/*-----------------------------------------------------------------------------------------
------
------ local variables and constants
------
-----------------------------------------------------------------------------------------*/
static EC_SLV_API_CiA402_SAxis_t localAxes_s[AXES_NUMBER];
//Supported drive modes: ETG6010 6.8.1
#define SUPPORTED_DRIVE_MODE_CSP_BIT 7
#define SUPPORTED_DRIVE_MODE_CSV_BIT 8
#define SUPPORTED_DRIVE_MODE_CST_BIT 9
#define DRIVE_MODE_CSP (1 << SUPPORTED_DRIVE_MODE_CSP_BIT)
#define DRIVE_MODE_CSV (1 << SUPPORTED_DRIVE_MODE_CSV_BIT)
#define DRIVE_MODE_CST (1 << SUPPORTED_DRIVE_MODE_CST_BIT)
#define DRIVE_GEAR_RELATION 0.0010922
#define POSITION_MAX_LIMIT 0xFFFFFFFF
#define NON_DC_DEFAULT_CYCLE_TIME_USEC 4000
#define NSEC_TO_USEC 1000
#define ESC_DC_SYNC0_CYCLETIME_REG 0x09A0
uint32_t EC_SLV_APP_getCiA402ObjectValue(EC_SLV_APP_Sapplication_t* pApplication_p, EC_API_SLV_SCoE_Object_t* pObject_p, uint16_t length_p, uint16_t* pValue_p)
{
EC_API_SLV_SHandle_t* pEcApiSlv = NULL;
uint32_t err = EC_API_eERR_INVALID;
if (NULL == pApplication_p || NULL == pObject_p)
{
goto Exit;
}
pEcApiSlv = pApplication_p->ptEcSlvApi;
err = EC_API_SLV_CoE_getObjectData(pEcApiSlv, pObject_p, length_p, pValue_p);
Exit:
return err;
}
uint32_t EC_SLV_APP_setCiA402ObjectValue(EC_SLV_APP_Sapplication_t* pApplication_p, EC_SLV_APP_sCIA_object_t* pCiaObject_p, uint16_t length_p, uint16_t* pValue_p)
{
uint32_t err;
EC_API_SLV_SCoE_Object_t* pObject = NULL;
if (pCiaObject_p->pSdo)
{
pObject = pCiaObject_p->pSdo;
}
else
{
err = EC_API_SLV_CoE_getObject(pApplication_p->ptEcSlvApi, pCiaObject_p->objectIndex, &pObject);
if (err)
{
goto Exit;
}
}
err = EC_API_SLV_CoE_setObjectData(pApplication_p->ptEcSlvApi, pObject, length_p, pValue_p);
Exit:
return err;
}
uint32_t EC_SLV_APP_getCiA402ObjectEntryValue(void* pAppCtxt_p, EC_API_SLV_SCoE_ObjEntry_t* pObjectEntry_p, uint16_t length_p, uint16_t* pValue_p)
{
uint32_t error = EC_API_eERR_INVALID;
EC_API_SLV_SHandle_t* pEcSlvApi = NULL;
if (!pApplication || !pObjectEntry_p)
{
goto Exit;
}
pEcSlvApi = pApplication->ptEcSlvApi;
error = EC_API_SLV_CoE_getObjectEntryData(pEcSlvApi, pObjectEntry_p, length_p, pValue_p);
Exit:
return error;
}
uint32_t EC_SLV_APP_setCiA402ObjectEntryValue(EC_API_SLV_SHandle_t* pEcApiSlv_p, uint16_t index_p, uint8_t subIndex_p, uint16_t length_p, uint16_t* pValue_p)
{
uint32_t err;
err = EC_API_SLV_CoE_getObjectEntry(pEcApiSlv_p,index_p, subIndex_p, &pObjEntry);
if (err == EC_API_eERR_NONE)
{
err = EC_API_SLV_CoE_setObjectEntryData(pEcApiSlv_p, pObjEntry, length_p, pValue_p);
}
return err;
}
{
uint32_t err;
uint32_t driveMode = DRIVE_MODE_CSP | DRIVE_MODE_CSV | DRIVE_MODE_CST;
for(uint8_t axisNo = 0; axisNo < AXES_NUMBER; axisNo++)
{
err = EC_SLV_APP_setCiA402ObjectValue(pApplication_p,
&pApplication_p->CiA402_axisData[axisNo].supportedDriveModesIndex,
sizeof (driveMode), (uint16_t*) &driveMode);
}
return err;
}
void EC_SLV_APP_setObdValues(void* pCtxt_p)
{
EC_SLV_APP_Sapplication_t* pApplicationInstance = (EC_SLV_APP_Sapplication_t*)pCtxt_p;
int32_t posMaxLimit = POSITION_MAX_LIMIT;
OSAL_printf("+%s\r\n", __FUNCTION__);
EC_SLV_APP_setSupportedDriveModes(pApplicationInstance);
for(uint8_t axisNo = 0; axisNo < AXES_NUMBER; axisNo++)
{
EC_SLV_APP_setCiA402ObjectEntryValue(pApplicationInstance->ptEcSlvApi, OBD_SW_POSITION_LIMIT_INDEX(axisNo), 2, sizeof(posMaxLimit), (uint16_t*) &posMaxLimit);
}
}
EC_API_SLV_EUserRetCodes_t EC_SLV_APP_startInputHandler(void* pCtxt_p, uint16_t* pIntMask_p)
{
EC_SLV_APP_Sapplication_t* pApplicationInstance = (EC_SLV_APP_Sapplication_t*)pCtxt_p;
EC_API_SLV_SHandle_t* pEcApiSlv = NULL;
uint32_t sync0CycleTime = 0;
OSALUNREF_PARM(pIntMask_p);
if (!pApplicationInstance)
{
goto Exit;
}
pEcApiSlv = pApplicationInstance->ptEcSlvApi;
sync0CycleTime= EC_API_SLV_readDoubleWordEscRegister(pEcApiSlv, ESC_DC_SYNC0_CYCLETIME_REG);
sync0CycleTime = sync0CycleTime / NSEC_TO_USEC; //get cycle time in us
for(uint8_t axisNo = 0; axisNo < AXES_NUMBER; axisNo++)
{
localAxes_s[axisNo].id = axisNo;
if (localAxes_s[axisNo].axisIsActive)
{
localAxes_s[axisNo].cycleTime = sync0CycleTime;
}
if(!localAxes_s[axisNo].cycleTime)
{
localAxes_s[axisNo].cycleTime = NON_DC_DEFAULT_CYCLE_TIME_USEC;
}
}
retVal = EC_USR_eRET_OK;
Exit:
return retVal;
}
bool EC_SLV_APP_transitionAction(int16_t characteristic_p)
{
switch(characteristic_p)
{
//do stuff
break;
//do stuff
break;
//do stuff
break;
//do stuff
break;
default:
break;
}
return true;
}
void EC_SLV_APP_CST(EC_SLV_APP_Sapplication_t* pApplication_p, EC_SLV_API_CiA402_SAxis_t* pCiA402Axis_p, bool gotOffsets)
{
int16_t targetTorque;
//Read target torque value
EC_SLV_APP_CIA_GETAXISVALUE(int16_t, targetTorque, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].targetTorqueIndex);
//Update torque value
EC_SLV_APP_CIA_SETAXISVALUE(int16_t, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].torqueActualValueIndex, targetTorque);
}
void EC_SLV_APP_CSV(EC_SLV_APP_Sapplication_t* pApplication_p, EC_SLV_API_CiA402_SAxis_t* pCiA402Axis_p, bool gotOffsets)
{
int32_t targetVelocity;
//Read target velocity value
EC_SLV_APP_CIA_GETAXISVALUE(int32_t, targetVelocity, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].targetVelocityIndex);
//Update velocity value
EC_SLV_APP_CIA_SETAXISVALUE(int32_t, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].velocityActualValueIndex, targetVelocity);
}
void EC_SLV_APP_CSP(EC_SLV_APP_Sapplication_t* pApplication_p, EC_SLV_API_CiA402_SAxis_t* pCiA402Axis_p, bool gotOffsets)
{
uint32_t targetPosition, actualPosition;
int32_t targetVelocity, actualVelocity;
int16_t targetTorque, actualTorque;
float incFactor = (float) (DRIVE_GEAR_RELATION * pCiA402Axis_p->cycleTime);
//Read target position, velocity and torque values
EC_SLV_APP_CIA_GETAXISVALUE(uint32_t, targetPosition, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].targetPositionIndex);
EC_SLV_APP_CIA_GETAXISVALUE(int32_t, targetVelocity, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].targetVelocityIndex);
EC_SLV_APP_CIA_GETAXISVALUE(int16_t, targetTorque, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].targetTorqueIndex);
//Read actual position, velocity and torque values
EC_SLV_APP_CIA_GETAXISVALUE(uint32_t, actualPosition, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].positionActualValueIndex);
EC_SLV_APP_CIA_GETAXISVALUE(int32_t, actualVelocity, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].velocityActualValueIndex);
EC_SLV_APP_CIA_GETAXISVALUE(int16_t, actualTorque, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].torqueActualValueIndex);
if (incFactor != 0)
{
actualVelocity = (targetPosition - actualPosition) / incFactor;
pCiA402Axis_p->positionActualValue = actualPosition + actualVelocity;
}
//Update position and velocity value
EC_SLV_APP_CIA_SETAXISVALUE(int32_t, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].velocityActualValueIndex, actualVelocity);
EC_SLV_APP_CIA_SETAXISVALUE(uint32_t, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].positionActualValueIndex, pCiA402Axis_p->positionActualValue);
}
void EC_SLV_APP_motionControl(EC_SLV_APP_Sapplication_t* pApplication_p, EC_SLV_API_CiA402_SAxis_t* pCiA402Axis_p, bool gotOffsets)
{
uint16_t statusWord, controlWord;
uint32_t targetPosition;
uint32_t posMaxLimit, posMinLimit;
uint8_t operationModeDisplay;
if (!pApplication_p)
{
goto Exit;
}
//Read control, status and drive operation mode objects
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, controlWord, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].controlWordIndex);
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, statusWord, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].statusWordIndex);
EC_SLV_APP_CIA_GETAXISVALUE(uint8_t, operationModeDisplay, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].modesOfOperationDisplayIndex);
//Read target position
EC_SLV_APP_CIA_GETAXISVALUE(uint32_t, targetPosition, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].targetPositionIndex);
//Get software position limits
#if (defined ENABLE_DYNAMIC_POSITION_LIMITS) && (1==ENABLE_DYNAMIC_POSITION_LIMITS) /* if dynamic value change while OP is required, this costs 15usec per cycle ! */
pApplication_p->CiA402_axisData[pCiA402Axis_p->id].positionLimitMin.pObjetEntry,
sizeof(pApplication_p->CiA402_axisData[pCiA402Axis_p->id].posLimitMin),
(uint16_t *) &pApplication_p->CiA402_axisData[pCiA402Axis_p->id].posLimitMin);
pApplication_p->CiA402_axisData[pCiA402Axis_p->id].positionLimitMax.pObjetEntry,
sizeof(pApplication_p->CiA402_axisData[pCiA402Axis_p->id].posLimitMax),
(uint16_t *) &pApplication_p->CiA402_axisData[pCiA402Axis_p->id].posLimitMax);
#endif
posMinLimit = pApplication_p->CiA402_axisData[pCiA402Axis_p->id].posLimitMin;
posMaxLimit = pApplication_p->CiA402_axisData[pCiA402Axis_p->id].posLimitMax;
//Calculate new targets for CSP, CSV or CST modes
{
if((posMaxLimit> pCiA402Axis_p->positionActualValue || pCiA402Axis_p->positionActualValue > targetPosition)
&&(posMinLimit < pCiA402Axis_p->positionActualValue || pCiA402Axis_p->positionActualValue < targetPosition))
{
statusWord &= ~STATUSWORD_INTERNAL_LIMIT;
switch(operationModeDisplay)
{
EC_SLV_APP_CSP(pApplication_p, pCiA402Axis_p, gotOffsets);
break;
//nothing
EC_SLV_APP_CSV(pApplication_p, pCiA402Axis_p, gotOffsets);
break;
//nothing
EC_SLV_APP_CST(pApplication_p, pCiA402Axis_p, gotOffsets);
break;
default:
break;
}
}
else
{
}
}
//Update drive status
EC_SLV_APP_CIA_SETAXISVALUE(uint16_t, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].statusWordIndex, statusWord);
//Accept new mode of operation
EC_SLV_APP_CIA_GETAXISVALUE(uint8_t, operationModeDisplay, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].modesOfOperationIndex);
EC_SLV_APP_CIA_SETAXISVALUE(uint8_t, pApplication_p->CiA402_axisData[pCiA402Axis_p->id].modesOfOperationDisplayIndex, operationModeDisplay);
Exit:
return;
}
void EC_SLV_APP_cia402Application(void* pCtxt_p)
{
EC_API_SLV_SHandle_t* pEcApiSlv = NULL;
static
bool gotOffsets = false;
uint16_t controlWord, statusWord, errorCode;
int16_t quickStopOptionCode, shutdownOptionCode, disableOperationCode, faultReactionCode;
uint8_t operationDisplayCode;
uint16_t driveRamp = DISABLE_DRIVE;
if (!pApplication_p)
{
goto Exit;
}
pEcApiSlv = pApplication_p->ptEcSlvApi;
#if (defined GPIO_TEST_PINS) && (1==GPIO_TEST_PINS)
#if (defined GPIO_TEST_PROFILE_SEL) && (GPIO_TEST_PROFILE_1 == GPIO_TEST_PROFILE_SEL)
ESL_GPIO_testPins_set(ESL_TESTPIN_STATE_REG_BANK, ESL_TESTPIN_2_MASK);
#endif
#endif
curState = EC_API_SLV_getState();
if ((EC_API_SLV_eESM_op != curState) && (EC_API_SLV_eESM_safeop != curState) && gotOffsets)
{
EC_SLV_APP_CiA_dropPDOffsets(pApplication_p);
pApplication_p->pdoOutLen = ~0;
pApplication_p->pdoInLen = ~0;
gotOffsets = false;
}
if (((EC_API_SLV_eESM_op == curState) || (EC_API_SLV_eESM_safeop == curState)) && !gotOffsets)
{
EC_SLV_APP_CiA_fetchPDOffsets(pApplication_p);
pApplication_p->pdoOutLen = BIT2BYTE(EC_API_SLV_getOutputProcDataLength(pApplication_p->ptEcSlvApi));
pApplication_p->pdoInLen = BIT2BYTE(EC_API_SLV_getInputProcDataLength(pApplication_p->ptEcSlvApi));
OSAL_printf("PDO size Out:0x%x/0x%x, In:0x%x/0x%x\r\n", pApplication_p->pdoOutLen, pApplication_p->realPdoOutLen, pApplication_p->pdoInLen, pApplication_p->realPdoInLen);
gotOffsets = true;
}
#if (defined GPIO_TEST_PINS) && (1==GPIO_TEST_PINS)
#if (defined GPIO_TEST_PROFILE_SEL) && (GPIO_TEST_PROFILE_1 == GPIO_TEST_PROFILE_SEL)
ESL_GPIO_testPins_clear(ESL_TESTPIN_STATE_REG_BANK, ESL_TESTPIN_2_MASK);
#endif
#endif
#if (defined GPIO_TEST_PINS) && (1==GPIO_TEST_PINS)
#if (defined GPIO_TEST_PROFILE_SEL) && (GPIO_TEST_PROFILE_1 == GPIO_TEST_PROFILE_SEL)
ESL_GPIO_testPins_set(ESL_TESTPIN_STATE_REG_BANK, ESL_TESTPIN_2_MASK);
#endif
#endif
if (((EC_API_SLV_eESM_op == curState) || (EC_API_SLV_eESM_safeop == curState)) && gotOffsets)
{
EC_API_SLV_preSeqInputPDBuffer(pApplication_p->ptEcSlvApi, pApplication_p->realPdoInLen, (void**)&(pApplication_p->pdTxBuffer));
}
if (EC_API_SLV_eESM_op == curState && gotOffsets)
{
EC_API_SLV_preSeqOutputPDBuffer(pApplication_p->ptEcSlvApi, pApplication_p->realPdoOutLen, (void**)&(pApplication_p->pdRxBuffer));
}
for(uint8_t axisNo = 0; axisNo < AXES_NUMBER; axisNo++)
{
//Read drive control and status objects
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, controlWord, pApplication_p->CiA402_axisData[axisNo].controlWordIndex);
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, statusWord, pApplication_p->CiA402_axisData[axisNo].statusWordIndex);
//Enable high level power, no torque on the motor.
if(controlWord == CONTROLWORD_COMMAND_SWITCHON)
{
OSAL_printf("Axis %d Activated\n\r", axisNo);
EC_API_SLV_CiA402_activateAxis(pEcApiSlv, axisNo, true);
}
//Read drive's operation mode
EC_SLV_APP_CIA_GETAXISVALUE(uint8_t, operationDisplayCode, pApplication_p->CiA402_axisData[axisNo].modesOfOperationDisplayIndex);
//Read supported error option codes (ETG6010 Chapter 4).
errorCode = EC_API_SLV_CiA402_SM_getErrorCode(pEcApiSlv, axisNo);
if(errorCode &&
(operationDisplayCode == CYCLIC_SYNC_POSITION_MODE ||
operationDisplayCode == CYCLIC_SYNC_VELOCITY_MODE ||
operationDisplayCode == CYCLIC_SYNC_TORQUE_MODE))
{
}
else
{
}
//Analyse error codes
switch(errorCode)
{
/*State transition 11 is pending analyse shutdown option code (0x605A)*/
{
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, quickStopOptionCode, pApplication_p->CiA402_axisData[axisNo].quickStopIndex);
/*Masked and execute specified quick stop ramp characteristic */
if(quickStopOptionCode >= SLOWDOWN_RAMP_NO_TRANSIT && quickStopOptionCode <= VOLTAGE_LIMIT_NO_TRANSIT)
{
if (quickStopOptionCode == SLOWDOWN_RAMP_NO_TRANSIT)
{
driveRamp = SLOW_DOWN_RAMP;
}
if (quickStopOptionCode == QUICKSTOP_RAMP_NO_TRANSIT)
{
driveRamp = QUICKSTOP_RAMP;
}
if (quickStopOptionCode == CURRENT_LIMIT_NO_TRANSIT)
{
driveRamp = STOP_ON_CURRENT_LIMIT;
}
if (quickStopOptionCode == VOLTAGE_LIMIT_NO_TRANSIT)
{
driveRamp = STOP_ON_VOLTAGE_LIMIT;
}
}
{
/*Quick stop ramp is finished complete state transition*/
if (quickStopOptionCode >= SLOWDOWN_RAMP_NO_TRANSIT && quickStopOptionCode <= VOLTAGE_LIMIT_NO_TRANSIT)
{
}
}
}
break;
/*State transition 8 is pending analyse shutdown option code (0x605B)*/
{
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, shutdownOptionCode, pApplication_p->CiA402_axisData[axisNo].shutdownIndex);
if(EC_SLV_APP_transitionAction(shutdownOptionCode))
{
/*shutdown ramp is finished complete state transition*/
}
}
break;
/*State transition 5 is pending analyse Disable operation option code (0x605C)*/
{
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, disableOperationCode, pApplication_p->CiA402_axisData[axisNo].disableOperationIndex);
if(EC_SLV_APP_transitionAction(disableOperationCode))
{
/*disable operation ramp is finished complete state transition*/
}
}
break;
/*State transition 14 is pending analyse Fault reaction option code (0x605E)*/
{
EC_SLV_APP_CIA_GETAXISVALUE(uint16_t, faultReactionCode, pApplication_p->CiA402_axisData[axisNo].faultReactionIndex);
if(EC_SLV_APP_transitionAction(faultReactionCode))
{
/*fault reaction ramp is finished complete state transition*/
}
}
break;
default:
//Pending transition code is invalid => values from the master are used
break;
}
EC_SLV_APP_CIA_SETAXISVALUE(uint16_t, pApplication_p->CiA402_axisData[axisNo].statusWordIndex, statusWord);
#if (defined GPIO_TEST_PINS) && (1==GPIO_TEST_PINS)
#if (defined GPIO_TEST_PROFILE_SEL) && (GPIO_TEST_PROFILE_1 == GPIO_TEST_PROFILE_SEL)
ESL_GPIO_testPins_set(ESL_TESTPIN_STATE_REG_BANK, ESL_TESTPIN_1_MASK);
#endif
#endif
EC_SLV_APP_motionControl(pApplication_p, &localAxes_s[axisNo], gotOffsets);
#if (defined GPIO_TEST_PINS) && (1==GPIO_TEST_PINS)
#if (defined GPIO_TEST_PROFILE_SEL) && (GPIO_TEST_PROFILE_1 == GPIO_TEST_PROFILE_SEL)
ESL_GPIO_testPins_clear(ESL_TESTPIN_STATE_REG_BANK, ESL_TESTPIN_1_MASK);
#endif
#endif
}
if (((EC_API_SLV_eESM_op == curState) || (EC_API_SLV_eESM_safeop == curState)) && gotOffsets)
{
EC_API_SLV_postSeqInputPDBuffer(pApplication_p->ptEcSlvApi, pApplication_p->realPdoInLen, pApplication_p->pdTxBuffer);
}
if (EC_API_SLV_eESM_op == curState && gotOffsets)
{
EC_API_SLV_postSeqOutputPDBuffer(pApplication_p->ptEcSlvApi, pApplication_p->realPdoOutLen, pApplication_p->pdRxBuffer);
}
#if (defined GPIO_TEST_PINS) && (1==GPIO_TEST_PINS)
#if (defined GPIO_TEST_PROFILE_SEL) && (GPIO_TEST_PROFILE_1 == GPIO_TEST_PROFILE_SEL)
ESL_GPIO_testPins_clear(ESL_TESTPIN_STATE_REG_BANK, ESL_TESTPIN_2_MASK);
#endif
#endif
Exit:
return;
}
void EC_SLV_APP_cia402LocalError(void* pCtxt_p, uint16_t errorCode_p)
{
OSALUNREF_PARM(pCtxt_p);
OSAL_printf("Local error triggered: 0x%04x\r\n", errorCode_p);
}
//*************************************************************************************************
EC_API_SLV_CoE_setObjectData
uint32_t EC_API_SLV_CoE_setObjectData(EC_API_SLV_SHandle_t *pEcSlaveApi_p, EC_API_SLV_SCoE_Object_t *pObject_p, uint32_t length_p, uint16_t *pData_p)
This function writes Data to the Object Dictionary.
Definition: ecSlvApi_CoEStub.c:188
EC_SLV_API_CiA402_SAxis_t::cycleTime
uint32_t cycleTime
Motion controller cycletime in us.
Definition: ESL_cia402Demo.c:74
SLOW_DOWN_RAMP
#define SLOW_DOWN_RAMP
Slow down ramp (options: 0x605B; 0x605C; 0x605E)
Definition: ecApiDef.h:525
EC_SLV_API_CiA402_SAxis_t::id
uint8_t id
Axis Identification.
Definition: ESL_cia402Demo.c:114
EC_SLV_APP_sCIA_axisData::positionLimitMax
EC_SLV_APP_sCIA_objectEntry_t positionLimitMax
Definition: ecSlvCiA402.h:147
DISABLE_DRIVE
#define DISABLE_DRIVE
Disable drive (options: 0x605B; 0x605C; 0x605E)
Definition: ecApiDef.h:524
EC_SLV_APP_Sapplication::pdRxBuffer
uint8_t * pdRxBuffer
Definition: ecSlvCiA402.h:201
CONTROLWORD_COMMAND_SWITCHON
#define CONTROLWORD_COMMAND_SWITCHON
Switch on command.
Definition: ecApiDef.h:279
EC_SLV_APP_CSP
void EC_SLV_APP_CSP(EC_SLV_APP_Sapplication_t *pApplication_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p, bool gotOffsets)
Cyclic synchronous position mode. ETG6010 6.2.
Definition: ESL_cia402Demo.c:693
EC_SLV_APP_setSupportedDriveModes
uint32_t EC_SLV_APP_setSupportedDriveModes(EC_SLV_APP_Sapplication_t *pApplication_p)
Set supported drive modes.
Definition: ESL_cia402Demo.c:398
EC_SLV_APP_Sapplication::pdTxBuffer
uint8_t * pdTxBuffer
Definition: ecSlvCiA402.h:202
EC_API_SLV_preSeqInputPDBuffer
uint32_t EC_API_SLV_preSeqInputPDBuffer(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint32_t length_p, void **ppInProcData_p)
Acquire process data input buffer (TX)
Definition: ecSlvApi_ProcDataStub.c:1047
EC_API_SLV_CoE_getObjectEntry
uint32_t EC_API_SLV_CoE_getObjectEntry(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint16_t index_p, uint8_t subIndex_p, EC_API_SLV_SCoE_ObjEntry_t **ppObjectEntry_p)
This function returns object entries from the Object Dictionary.
Definition: ecSlvApi_CoEStub.c:325
EC_SLV_APP_sCIA_axisData::positionActualValueIndex
EC_SLV_APP_sCIA_object_t positionActualValueIndex
Definition: ecSlvCiA402.h:90
EC_API_SLV_readDoubleWordEscRegister
uint32_t EC_API_SLV_readDoubleWordEscRegister(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint16_t escAddress_p)
This is the function reads a byte from ESC Register.
Definition: ecSlvApiStub.c:1190
EC_SLV_APP_sCIA_axisData::supportedDriveModesIndex
EC_SLV_APP_sCIA_object_t supportedDriveModesIndex
Definition: ecSlvCiA402.h:145
EC_USR_eRET_ERROR
@ EC_USR_eRET_ERROR
Unspecified error occurred.
Definition: ecSlvApi.h:79
OBD_SHUTDOWN_INDEX
#define OBD_SHUTDOWN_INDEX(x)
Definition: ecApiDef.h:554
EC_SLV_APP_Sapplication::pdoOutLen
uint16_t pdoOutLen
Definition: ecSlvCiA402.h:199
EC_SLV_APP_sCIA_object::pSdo
EC_API_SLV_SCoE_Object_t * pSdo
Definition: ecSlvCiA402.h:60
EC_API_SLV_getInputProcDataLength
uint32_t EC_API_SLV_getInputProcDataLength(EC_API_SLV_SHandle_t *pEcSlaveApi_p)
Read the input process data length.
Definition: ecSlvApi_ProcDataStub.c:636
EC_SLV_API_CiA402_SAxis_t
Data structure to handle an CiA 402 axis.
Definition: ESL_cia402Demo.c:64
EC_SLV_APP_getCiA402ObjectValue
uint32_t EC_SLV_APP_getCiA402ObjectValue(EC_SLV_APP_Sapplication_t *pApplication_p, EC_API_SLV_SCoE_Object_t *pObject_p, uint16_t length_p, uint16_t *pValue_p)
Read CiA402 Objects.
Definition: ESL_cia402Demo.c:184
EC_SLV_APP_Sapplication::pdoInLen
uint16_t pdoInLen
Definition: ecSlvCiA402.h:200
EC_SLV_APP_CSV
void EC_SLV_APP_CSV(EC_SLV_APP_Sapplication_t *pApplication_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p, bool gotOffsets)
Cyclic synchronous velocity mode. ETG6010 6.3.
Definition: ESL_cia402Demo.c:652
CONTROLWORD_COMMAND_ENABLEOPERATION
#define CONTROLWORD_COMMAND_ENABLEOPERATION
Enable operation command.
Definition: ecApiDef.h:284
EC_SLV_APP_transitionAction
bool EC_SLV_APP_transitionAction(int16_t characteristic_p)
This function shall calculate the desired Axis input values to move on a predefined ramp.
Definition: ESL_cia402Demo.c:558
QUICKSTOP_RAMP_NO_TRANSIT
#define QUICKSTOP_RAMP_NO_TRANSIT
Slow down on quick stop ramp and stay in Quick Stop Active.
Definition: ecApiDef.h:537
EC_SLV_APP_setCiA402ObjectValue
uint32_t EC_SLV_APP_setCiA402ObjectValue(EC_SLV_APP_Sapplication_t *pApplication_p, EC_SLV_APP_sCIA_object_t *pCiaObject_p, uint16_t length_p, uint16_t *pValue_p)
Write CiA402 Object value.
Definition: ESL_cia402Demo.c:237
EC_API_SLV_EUserRetCodes_t
enum EC_API_SLV_EUserRetCodeserRetCodes EC_API_SLV_EUserRetCodes_t
EC_RETCODE_T Error codes used during EtherCAT State Machine transitions.
VOLTAGE_LIMIT_NO_TRANSIT
#define VOLTAGE_LIMIT_NO_TRANSIT
Slow down on voltage limit and stay in Quick Stop Active.
Definition: ecApiDef.h:539
EC_API_SLV_CoE_getObjectData
uint32_t EC_API_SLV_CoE_getObjectData(EC_API_SLV_SHandle_t *pEcSlaveApi_p, EC_API_SLV_SCoE_Object_t *pObject_p, uint32_t length_p, uint16_t *pData_p)
This function read the object data from the Object Dictionary.
Definition: ecSlvApi_CoEStub.c:138
EC_API_SLV_preSeqOutputPDBuffer
uint32_t EC_API_SLV_preSeqOutputPDBuffer(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint32_t length_p, void **ppOutProcData_p)
Acquire process data output buffer (RX)
Definition: ecSlvApi_ProcDataStub.c:1121
EC_SLV_APP_sCIA_axisData::controlWordIndex
EC_SLV_APP_sCIA_object_t controlWordIndex
Definition: ecSlvCiA402.h:79
EC_API_SLV_SCoE_Object_t
struct EC_API_SLV_SCoE_Object EC_API_SLV_SCoE_Object_t
TSdo describes an Object Dictionary Object.
Definition: ecSlvApi.h:132
STOP_ON_VOLTAGE_LIMIT
#define STOP_ON_VOLTAGE_LIMIT
Stop on voltage limit (options: 0x605E)
Definition: ecApiDef.h:528
STATUSWORD_INTERNAL_LIMIT
#define STATUSWORD_INTERNAL_LIMIT
Internal limit.
Definition: ecApiDef.h:295
EC_SLV_APP_sCIA_axisData::modesOfOperationDisplayIndex
EC_SLV_APP_sCIA_object_t modesOfOperationDisplayIndex
Definition: ecSlvCiA402.h:87
EC_SLV_APP_Sapplication
Definition: ecSlvSimple.h:55
EC_SLV_APP_sCIA_object
Definition: ecSlvCiA402.h:57
EC_API_SLV_SHandle_t
struct EC_API_SLV_SHandle EC_API_SLV_SHandle_t
EC_API_SLV_SHandle_t describes the EtherCAT Slave API.
Definition: ecSlvApi.h:135
EC_SLV_APP_CIA_GETAXISVALUE
#define EC_SLV_APP_CIA_GETAXISVALUE(type_p, target_p, axisDesc_p)
Read CiA402 Axis value.
Definition: ESL_cia402Demo.c:80
EC_SLV_APP_sCIA_object::objectIndex
uint16_t objectIndex
Definition: ecSlvCiA402.h:59
EC_SLV_APP_sCIA_axisData::targetVelocityIndex
EC_SLV_APP_sCIA_object_t targetVelocityIndex
Definition: ecSlvCiA402.h:112
EC_API_SLV_getOutputProcDataLength
uint32_t EC_API_SLV_getOutputProcDataLength(EC_API_SLV_SHandle_t *pEcSlaveApi_p)
Read the output process data length.
Definition: ecSlvApi_ProcDataStub.c:674
EC_SLV_APP_sCIA_axisData::posLimitMax
uint32_t posLimitMax
Definition: ecSlvCiA402.h:150
EC_SLV_APP_setCiA402ObjectEntryValue
uint32_t EC_SLV_APP_setCiA402ObjectEntryValue(EC_API_SLV_SHandle_t *pEcApiSlv_p, uint16_t index_p, uint8_t subIndex_p, uint16_t length_p, uint16_t *pValue_p)
Write CiA402 Object entry.
Definition: ESL_cia402Demo.c:355
EC_SLV_APP_sCIA_axisData::statusWordIndex
EC_SLV_APP_sCIA_object_t statusWordIndex
Definition: ecSlvCiA402.h:80
EC_API_SLV_CoE_getObject
uint32_t EC_API_SLV_CoE_getObject(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint16_t index_p, EC_API_SLV_SCoE_Object_t **pObject_p)
This function returns an object of the Object Dictionary.
Definition: ecSlvApi_CoEStub.c:87
EC_SLV_APP_CIA_SETAXISVALUE
#define EC_SLV_APP_CIA_SETAXISVALUE(type_p, axisDesc_p, value_p)
Write CiA402 Axis value.
Definition: ESL_cia402Demo.c:106
EC_API_SLV_getState
EC_API_SLV_EEsmState_t EC_API_SLV_getState(void)
This is the function to read the EtherCAT Slave state machine.
Definition: ecSlvApiStub.c:969
EC_SLV_APP_sCIA_axisData::targetPositionIndex
EC_SLV_APP_sCIA_object_t targetPositionIndex
Definition: ecSlvCiA402.h:107
OBD_FAULT_REACTION_INDEX
#define OBD_FAULT_REACTION_INDEX(x)
Definition: ecApiDef.h:557
OBD_DISABLE_OPERATION_INDEX
#define OBD_DISABLE_OPERATION_INDEX(x)
Definition: ecApiDef.h:555
EC_SLV_APP_getCiA402ObjectEntryValue
uint32_t EC_SLV_APP_getCiA402ObjectEntryValue(void *pAppCtxt_p, EC_API_SLV_SCoE_ObjEntry_t *pObjectEntry_p, uint16_t length_p, uint16_t *pValue_p)
Read CiA402 Object entry.
Definition: ESL_cia402Demo.c:296
EC_API_SLV_CoE_getObjectEntryData
uint32_t EC_API_SLV_CoE_getObjectEntryData(EC_API_SLV_SHandle_t *pEcSlaveApi_p, EC_API_SLV_SCoE_ObjEntry_t *pObjectEntry_p, uint32_t length_p, uint16_t *pData_p)
This function reads Data from the Object Dictionary.
Definition: ecSlvApi_CoEStub.c:425
EC_SLV_APP_Sapplication::CiA402_axisData
EC_SLV_APP_sCIA_axisData_t CiA402_axisData[AXES_NUMBER]
Definition: ecSlvCiA402.h:206
EC_SLV_APP_sCIA_axisData::quickStopIndex
EC_SLV_APP_sCIA_object_t quickStopIndex
Definition: ecSlvCiA402.h:81
CURRENT_LIMIT_NO_TRANSIT
#define CURRENT_LIMIT_NO_TRANSIT
Slow down on current limit and stay in Quick Stop Active.
Definition: ecApiDef.h:538
EC_API_eERR_INVALID
@ EC_API_eERR_INVALID
Definition: ecApiError.h:73
EC_API_SLV_EEsmState_t
enum EC_API_SLV_EEsmState EC_API_SLV_EEsmState_t
EC_STATE_T EtherCAT State Machine states.
EC_API_eERR_NULLPTR
@ EC_API_eERR_NULLPTR
Definition: ecApiError.h:79
STATUSWORD_TARGET_REACHED
#define STATUSWORD_TARGET_REACHED
Target reached.
Definition: ecApiDef.h:297
EC_API_SLV_CiA402_SM_getErrorCode
uint16_t EC_API_SLV_CiA402_SM_getErrorCode(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint8_t axisNo_p)
Get Local Error value.
Definition: ecSlvApi_CiA402Stub.c:443
CYCLIC_SYNC_TORQUE_MODE
#define CYCLIC_SYNC_TORQUE_MODE
Cyclic Synchronous Torque mode.
Definition: ecApiDef.h:344
SLOWDOWN_RAMP_NO_TRANSIT
#define SLOWDOWN_RAMP_NO_TRANSIT
Slow down on slow down ramp and stay in Quick Stop Active.
Definition: ecApiDef.h:536
EC_SLV_APP_CST
void EC_SLV_APP_CST(EC_SLV_APP_Sapplication_t *pApplication_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p, bool gotOffsets)
Cyclic synchronous torque mode. ETG6010 6.4.
Definition: ESL_cia402Demo.c:611
CYCLIC_SYNC_POSITION_MODE
#define CYCLIC_SYNC_POSITION_MODE
Cyclic Synchronous Position mode.
Definition: ecApiDef.h:342
EC_API_SLV_CoE_setObjectEntryData
uint32_t EC_API_SLV_CoE_setObjectEntryData(EC_API_SLV_SHandle_t *pEcSlaveApi_p, EC_API_SLV_SCoE_ObjEntry_t *pObjectEntry_p, uint32_t length_p, uint16_t *pData_p)
This function writes Data to the Object Dictionary.
Definition: ecSlvApi_CoEStub.c:528
EC_API_SLV_eESM_safeop
@ EC_API_SLV_eESM_safeop
SafeOP State.
Definition: ecSlvApi.h:90
EC_API_SLV_SCoE_ObjEntry_t
struct EC_API_SLV_SCoE_ObjEntry EC_API_SLV_SCoE_ObjEntry_t
TSdoEntry describes an OBD Object Entry.
Definition: ecSlvApi.h:129
EC_SLV_APP_sCIA_axisData::disableOperationIndex
EC_SLV_APP_sCIA_object_t disableOperationIndex
Definition: ecSlvCiA402.h:83
EC_API_SLV_eESM_errState
@ EC_API_SLV_eESM_errState
Error Flag.
Definition: ecSlvApi.h:92
EC_SLV_APP_sCIA_axisData::positionLimitMin
EC_SLV_APP_sCIA_objectEntry_t positionLimitMin
Definition: ecSlvCiA402.h:148
STATUSWORD_DRIVE_FOLLOWS_COMMAND
#define STATUSWORD_DRIVE_FOLLOWS_COMMAND
Drive follows command (used in cyclic synchronous modes)
Definition: ecApiDef.h:299
EC_SLV_APP_Sapplication::realPdoInLen
uint16_t realPdoInLen
Definition: ecSlvCiA402.h:205
EC_SLV_API_CiA402_SAxis_t::positionActualValue
double positionActualValue
Actual position within control loop.
Definition: ESL_cia402Demo.c:73
EC_SLV_APP_Sapplication::ptEcSlvApi
EC_API_SLV_SHandle_t * ptEcSlvApi
Definition: ecSlvSimple.h:97
CYCLIC_SYNC_VELOCITY_MODE
#define CYCLIC_SYNC_VELOCITY_MODE
Cyclic Synchronous Velocity mode.
Definition: ecApiDef.h:343
EC_SLV_APP_sCIA_objectEntry::pObjetEntry
EC_API_SLV_SCoE_ObjEntry_t * pObjetEntry
Definition: ecSlvCiA402.h:73
QUICKSTOP_RAMP
#define QUICKSTOP_RAMP
Quick stop ramp (options: 0x605E)
Definition: ecApiDef.h:526
STOP_ON_CURRENT_LIMIT
#define STOP_ON_CURRENT_LIMIT
Stop on current limit (options: 0x605E)
Definition: ecApiDef.h:527
EC_SLV_APP_setObdValues
void EC_SLV_APP_setObdValues(void *pCtxt_p)
Set default values for CiA 402 object dictionary.
Definition: ESL_cia402Demo.c:443
EC_SLV_APP_motionControl
void EC_SLV_APP_motionControl(EC_SLV_APP_Sapplication_t *pApplication_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p, bool gotOffsets)
This functions provides a simple feedback functionality.
Definition: ESL_cia402Demo.c:755
OBD_SW_POSITION_LIMIT_INDEX
#define OBD_SW_POSITION_LIMIT_INDEX(x)
Definition: ecApiDef.h:587
OBD_QUICKSTOP_INDEX
#define OBD_QUICKSTOP_INDEX(x)
Definition: ecApiDef.h:553
EC_API_SLV_eESM_op
@ EC_API_SLV_eESM_op
Operational State.
Definition: ecSlvApi.h:91
EC_USR_eRET_OK
@ EC_USR_eRET_OK
no error occurred
Definition: ecSlvApi.h:78
EC_SLV_APP_sCIA_axisData::posLimitMin
uint32_t posLimitMin
Definition: ecSlvCiA402.h:151
EC_SLV_APP_Sapplication::realPdoOutLen
uint16_t realPdoOutLen
Definition: ecSlvCiA402.h:204
EC_SLV_APP_cia402Application
void EC_SLV_APP_cia402Application(void *pCtxt_p)
CiA402 Application function.
Definition: ESL_cia402Demo.c:871
EC_API_SLV_postSeqOutputPDBuffer
uint32_t EC_API_SLV_postSeqOutputPDBuffer(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint32_t length_p, void *pOutProcData_p)
Return process data output buffer (RX)
Definition: ecSlvApi_ProcDataStub.c:1254
EC_API_SLV_CiA402_SM_clearErrorCode
void EC_API_SLV_CiA402_SM_clearErrorCode(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint8_t axisNo_p)
Inform the CiA402 state machine whether a state change finished or not.
Definition: ecSlvApi_CiA402Stub.c:402
EC_API_SLV_CiA402_activateAxis
void EC_API_SLV_CiA402_activateAxis(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint8_t axisNo_p, bool active_p)
Activate Axis. This function is required to inform the CiA402 state machine that the axis is switched...
Definition: ecSlvApi_CiA402Stub.c:356
EC_SLV_APP_sCIA_axisData::targetTorqueIndex
EC_SLV_APP_sCIA_object_t targetTorqueIndex
Definition: ecSlvCiA402.h:102
EC_SLV_APP_startInputHandler
EC_API_SLV_EUserRetCodes_t EC_SLV_APP_startInputHandler(void *pCtxt_p, uint16_t *pIntMask_p)
Get cycle time information.
Definition: ESL_cia402Demo.c:490
EC_API_eERR_NONE
@ EC_API_eERR_NONE
Definition: ecApiError.h:66
EC_API_SLV_postSeqInputPDBuffer
uint32_t EC_API_SLV_postSeqInputPDBuffer(EC_API_SLV_SHandle_t *pEcSlaveApi_p, uint32_t length_p, void *pInProcData_p)
Return process data input buffer (TX)
Definition: ecSlvApi_ProcDataStub.c:1192
EC_SLV_APP_sCIA_axisData::velocityActualValueIndex
EC_SLV_APP_sCIA_object_t velocityActualValueIndex
Definition: ecSlvCiA402.h:97
EC_SLV_APP_sCIA_axisData::shutdownIndex
EC_SLV_APP_sCIA_object_t shutdownIndex
Definition: ecSlvCiA402.h:82
EC_SLV_APP_cia402LocalError
void EC_SLV_APP_cia402LocalError(void *pCtxt_p, uint16_t errorCode_p)
Local Error function handler.
Definition: ESL_cia402Demo.c:1123
EC_SLV_APP_sCIA_axisData::faultReactionIndex
EC_SLV_APP_sCIA_object_t faultReactionIndex
Definition: ecSlvCiA402.h:85
EC_SLV_APP_sCIA_axisData::modesOfOperationIndex
EC_SLV_APP_sCIA_object_t modesOfOperationIndex
Definition: ecSlvCiA402.h:86
EC_SLV_APP_sCIA_axisData::torqueActualValueIndex
EC_SLV_APP_sCIA_object_t torqueActualValueIndex
Definition: ecSlvCiA402.h:105