EtherCAT Slave  1.04.01
ESL_cia402Demo.c

CiA 402 Directive Example

Author
KUNBUS GmbH
Date
2020-06-19
#include "ESL_cia402Demo.h"
#include "ESL_cia402Obd.h"
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_API_SLV_SHandle_t* pEcApiSlv_p, uint16_t index_p, uint16_t length_p, uint16_t* pValue_p)
{
uint32_t err;
err = EC_API_SLV_CoE_getObject(pEcApiSlv_p,index_p, &pObject);
if (err == EC_API_eERR_NONE)
{
err = EC_API_SLV_CoE_getObjectData(pEcApiSlv_p, pObject, length_p, pValue_p);
}
return err;
}
uint32_t EC_SLV_APP_setCiA402ObjectValue(EC_API_SLV_SHandle_t* pEcApiSlv_p, uint16_t index_p, uint16_t length_p, uint16_t* pValue_p)
{
uint32_t err;
err = EC_API_SLV_CoE_getObject(pEcApiSlv_p,index_p, &pObject);
if (err == EC_API_eERR_NONE)
{
err = EC_API_SLV_CoE_setObjectData(pEcApiSlv_p, pObject, length_p, pValue_p);
}
return err;
}
uint32_t EC_SLV_APP_getCiA402ObjectEntryValue(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_getObjectEntryData(pEcApiSlv_p, pObjEntry, length_p, pValue_p);
}
return err;
}
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(pEcApiSlv_p, OBD_SUPPORTED_DRIVE_MODES_INDEX(axisNo), sizeof (driveMode), (uint16_t*) &driveMode);
}
return err;
}
void EC_SLV_APP_setObdValues(void* pCtxt_p)
{
EC_API_SLV_SHandle_t* pEcApiSlv = (EC_API_SLV_SHandle_t*) pCtxt_p;
int32_t posMaxLimit = POSITION_MAX_LIMIT;
for(uint8_t axisNo = 0; axisNo < AXES_NUMBER; axisNo++)
{
EC_SLV_APP_setCiA402ObjectEntryValue(pEcApiSlv, 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)
{
OSALUNREF_PARM(pIntMask_p);
EC_API_SLV_SHandle_t* pEcApiSlv = (EC_API_SLV_SHandle_t*) pCtxt_p;
uint32_t 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;
}
}
}
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;
}
{
int32_t targetTorque;
//Read target position, velocity and torque values
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_TARGET_TORQUE_INDEX(pCiA402Axis_p->id), sizeof(targetTorque), (uint16_t*) &targetTorque);
//Update velocity value
EC_SLV_APP_setCiA402ObjectValue(pEcApiSlv_p, OBD_TORQUE_ACTUAL_VALUE_INDEX(pCiA402Axis_p->id), sizeof(targetTorque), (uint16_t*) &targetTorque);
}
{
int32_t targetVelocity;
//Read target position, velocity and torque values
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_TARGET_VELOCITY_INDEX(pCiA402Axis_p->id), sizeof(targetVelocity), (uint16_t*) &targetVelocity);
//Update velocity value
EC_SLV_APP_setCiA402ObjectValue(pEcApiSlv_p, OBD_VELOCITY_ACTUAL_VALUE_INDEX(pCiA402Axis_p->id), sizeof(targetVelocity), (uint16_t*) &targetVelocity);
}
{
uint32_t actualPosition, actualVelocity;
uint32_t targetPosition;
int32_t targetVelocity;
int16_t actualTorque, targetTorque;
float incFactor = (float) (DRIVE_GEAR_RELATION * pCiA402Axis_p->cycleTime);
//Read target position, velocity and torque values
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_TARGET_POSITION_INDEX(pCiA402Axis_p->id), sizeof(targetPosition), (uint16_t*) &targetPosition);
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_TARGET_VELOCITY_INDEX(pCiA402Axis_p->id), sizeof(targetVelocity), (uint16_t*) &targetVelocity);
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_TARGET_TORQUE_INDEX(pCiA402Axis_p->id), sizeof(targetTorque), (uint16_t*) &targetTorque);
//Read actual position, velocity and torque values
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_POSITION_ACTUAL_VALUE_INDEX(pCiA402Axis_p->id), sizeof(actualPosition), (uint16_t*) &actualPosition);
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_VELOCITY_ACTUAL_VALUE_INDEX(pCiA402Axis_p->id), sizeof(actualVelocity), (uint16_t*) &actualVelocity);
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_TORQUE_ACTUAL_VALUE_INDEX(pCiA402Axis_p->id), sizeof(actualTorque), (uint16_t*) &actualTorque);
if (incFactor != 0)
{
actualVelocity = (targetPosition - actualPosition) / incFactor;
pCiA402Axis_p->positionActualValue = actualPosition + actualVelocity;
}
//Update position and velocity value
EC_SLV_APP_setCiA402ObjectValue(pEcApiSlv_p, OBD_VELOCITY_ACTUAL_VALUE_INDEX(pCiA402Axis_p->id), sizeof(actualVelocity), (uint16_t*) &actualVelocity);
EC_SLV_APP_setCiA402ObjectValue(pEcApiSlv_p, OBD_POSITION_ACTUAL_VALUE_INDEX(pCiA402Axis_p->id), sizeof(pCiA402Axis_p->positionActualValue), (uint16_t*) &pCiA402Axis_p->positionActualValue);
}
{
uint32_t statusWord, controlWord, targetPosition;
uint32_t posMaxLimit, posMinLimit;
uint16_t operationModeDisplay;
//Read control, status and drive operation mode objects
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_CONTROLWORD_INDEX(pCiA402Axis_p->id), sizeof(controlWord), (uint16_t*) &controlWord);
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_STATUSWORD_INDEX(pCiA402Axis_p->id), sizeof(operationModeDisplay), (uint16_t*) &statusWord);
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_MODES_OF_OPERATION_DISPLAY_INDEX(pCiA402Axis_p->id), sizeof(operationModeDisplay), (uint16_t*) &operationModeDisplay);
//Read target position
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_TARGET_POSITION_INDEX(pCiA402Axis_p->id), sizeof(targetPosition), (uint16_t*) &targetPosition);
//Get software position limits
EC_SLV_APP_getCiA402ObjectEntryValue(pEcApiSlv_p, OBD_SW_POSITION_LIMIT_INDEX(pCiA402Axis_p->id), 1, sizeof(posMinLimit), (uint16_t *) &posMinLimit);
EC_SLV_APP_getCiA402ObjectEntryValue(pEcApiSlv_p, OBD_SW_POSITION_LIMIT_INDEX(pCiA402Axis_p->id), 2, sizeof(posMaxLimit), (uint16_t *) &posMaxLimit);
//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(pEcApiSlv_p, pCiA402Axis_p);
break;
//nothing
EC_SLV_APP_CSV(pEcApiSlv_p, pCiA402Axis_p);
break;
//nothing
EC_SLV_APP_CST(pEcApiSlv_p, pCiA402Axis_p);
break;
default:
break;
}
}
else
{
}
}
//Update drive status
EC_SLV_APP_setCiA402ObjectValue(pEcApiSlv_p, OBD_STATUSWORD_INDEX(pCiA402Axis_p->id), sizeof(statusWord), (uint16_t*) &statusWord);
//Accept new mode of operation
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv_p, OBD_MODES_OF_OPERATION_INDEX(pCiA402Axis_p->id), sizeof(operationModeDisplay), &operationModeDisplay);
EC_SLV_APP_setCiA402ObjectValue(pEcApiSlv_p, OBD_MODES_OF_OPERATION_DISPLAY_INDEX(pCiA402Axis_p->id), sizeof(operationModeDisplay), &operationModeDisplay);
}
void EC_SLV_APP_cia402Application(void* pCtxt_p)
{
EC_API_SLV_SHandle_t* pEcApiSlv = (EC_API_SLV_SHandle_t*) pCtxt_p;
uint16_t controlWord, statusWord, errorCode;
int16_t operationDisplayCode, quickStopOptionCode, shutdownOptionCode, disableOperationCode, faultReactionCode;
uint16_t driveRamp = DISABLE_DRIVE;
for(uint8_t axisNo = 0; axisNo < AXES_NUMBER; axisNo++)
{
//Read drive control and status objects
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv, OBD_CONTROLWORD_INDEX(axisNo), sizeof(controlWord), &controlWord);
EC_SLV_APP_getCiA402ObjectValue(pEcApiSlv, OBD_STATUSWORD_INDEX(axisNo), sizeof(statusWord), &statusWord);
//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_getCiA402ObjectValue(pEcApiSlv, OBD_MODES_OF_OPERATION_DISPLAY_INDEX(axisNo), sizeof(operationDisplayCode), (uint16_t*) &operationDisplayCode);
//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_getCiA402ObjectValue(pEcApiSlv, OBD_QUICKSTOP_INDEX(axisNo), sizeof(quickStopOptionCode), (uint16_t*) &quickStopOptionCode);
/*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_getCiA402ObjectValue(pEcApiSlv, OBD_SHUTDOWN_INDEX(axisNo), sizeof(shutdownOptionCode), (uint16_t*) &shutdownOptionCode);
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_getCiA402ObjectValue(pEcApiSlv, OBD_DISABLE_OPERATION_INDEX(axisNo), sizeof(disableOperationCode), (uint16_t*) &disableOperationCode);
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_getCiA402ObjectValue(pEcApiSlv, OBD_FAULT_REACTION_INDEX(axisNo), sizeof(faultReactionCode) , (uint16_t*) &faultReactionCode);
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_setCiA402ObjectValue(pEcApiSlv, OBD_STATUSWORD_INDEX(axisNo), sizeof(statusWord), &statusWord);
EC_SLV_APP_motionControl(pEcApiSlv, &localAxes_s[axisNo]);
}
}
void EC_SLV_APP_cia402LocalError(void* pCtxt_p, uint16_t errorCode_p)
{
OSALUNREF_PARM(pCtxt_p);
OSAL_printf("Local error triggered: %d\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:515
EC_SLV_API_CiA402_SAxis_t::id
uint8_t id
Axis Identification.
Definition: ESL_cia402Demo.c:47
DISABLE_DRIVE
#define DISABLE_DRIVE
Disable drive (options: 0x605B; 0x605C; 0x605E)
Definition: ecApiDef.h:514
CONTROLWORD_COMMAND_SWITCHON
#define CONTROLWORD_COMMAND_SWITCHON
Switch on command.
Definition: ecApiDef.h:269
OBD_MODES_OF_OPERATION_DISPLAY_INDEX
#define OBD_MODES_OF_OPERATION_DISPLAY_INDEX(x)
Definition: ecApiDef.h:550
OBD_MODES_OF_OPERATION_INDEX
#define OBD_MODES_OF_OPERATION_INDEX(x)
Definition: ecApiDef.h:549
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
OBD_TARGET_POSITION_INDEX
#define OBD_TARGET_POSITION_INDEX(x)
Definition: ecApiDef.h:573
EC_SLV_APP_getCiA402ObjectEntryValue
uint32_t EC_SLV_APP_getCiA402ObjectEntryValue(EC_API_SLV_SHandle_t *pEcApiSlv_p, uint16_t index_p, uint8_t subIndex_p, uint16_t length_p, uint16_t *pValue_p)
Read CiA402 Object entry.
Definition: ESL_cia402Demo.c:219
EC_SLV_APP_getCiA402ObjectValue
uint32_t EC_SLV_APP_getCiA402ObjectValue(EC_API_SLV_SHandle_t *pEcApiSlv_p, uint16_t index_p, uint16_t length_p, uint16_t *pValue_p)
Read CiA402 Objects.
Definition: ESL_cia402Demo.c:118
OBD_SHUTDOWN_INDEX
#define OBD_SHUTDOWN_INDEX(x)
Definition: ecApiDef.h:544
OBD_STATUSWORD_INDEX
#define OBD_STATUSWORD_INDEX(x)
Definition: ecApiDef.h:541
EC_SLV_API_CiA402_SAxis_t
Data structure to handle an CiA 402 axis.
Definition: ESL_cia402Demo.c:65
CONTROLWORD_COMMAND_ENABLEOPERATION
#define CONTROLWORD_COMMAND_ENABLEOPERATION
Enable operation command.
Definition: ecApiDef.h:274
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:454
QUICKSTOP_RAMP_NO_TRANSIT
#define QUICKSTOP_RAMP_NO_TRANSIT
Slow down on quick stop ramp and stay in Quick Stop Active.
Definition: ecApiDef.h:527
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:529
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_SLV_APP_setSupportedDriveModes
uint32_t EC_SLV_APP_setSupportedDriveModes(EC_API_SLV_SHandle_t *pEcApiSlv_p)
Set supported drive modes.
Definition: ESL_cia402Demo.c:313
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:131
STOP_ON_VOLTAGE_LIMIT
#define STOP_ON_VOLTAGE_LIMIT
Stop on voltage limit (options: 0x605E)
Definition: ecApiDef.h:518
STATUSWORD_INTERNAL_LIMIT
#define STATUSWORD_INTERNAL_LIMIT
Internal limit.
Definition: ecApiDef.h:285
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:134
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:270
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
OBD_FAULT_REACTION_INDEX
#define OBD_FAULT_REACTION_INDEX(x)
Definition: ecApiDef.h:547
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 **pObjectEntry_p)
This function returns object entries from the Object Dictionary.
Definition: ecSlvApi_CoEStub.c:325
OBD_DISABLE_OPERATION_INDEX
#define OBD_DISABLE_OPERATION_INDEX(x)
Definition: ecApiDef.h:545
EC_SLV_APP_CSV
void EC_SLV_APP_CSV(EC_API_SLV_SHandle_t *pEcApiSlv_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p)
Cyclic synchronous velocity mode. ETG6010 6.3.
Definition: ESL_cia402Demo.c:546
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:376
CURRENT_LIMIT_NO_TRANSIT
#define CURRENT_LIMIT_NO_TRANSIT
Slow down on current limit and stay in Quick Stop Active.
Definition: ecApiDef.h:528
OBD_CONTROLWORD_INDEX
#define OBD_CONTROLWORD_INDEX(x)
Definition: ecApiDef.h:540
OBD_POSITION_ACTUAL_VALUE_INDEX
#define OBD_POSITION_ACTUAL_VALUE_INDEX(x)
Definition: ecApiDef.h:554
STATUSWORD_TARGET_REACHED
#define STATUSWORD_TARGET_REACHED
Target reached.
Definition: ecApiDef.h:287
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
EC_SLV_APP_CSP
void EC_SLV_APP_CSP(EC_API_SLV_SHandle_t *pEcApiSlv_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p)
Cyclic synchronous position mode. ETG6010 6.2.
Definition: ESL_cia402Demo.c:585
CYCLIC_SYNC_TORQUE_MODE
#define CYCLIC_SYNC_TORQUE_MODE
Cyclic Synchronous Torque mode.
Definition: ecApiDef.h:334
SLOWDOWN_RAMP_NO_TRANSIT
#define SLOWDOWN_RAMP_NO_TRANSIT
Slow down on slow down ramp and stay in Quick Stop Active.
Definition: ecApiDef.h:526
CYCLIC_SYNC_POSITION_MODE
#define CYCLIC_SYNC_POSITION_MODE
Cyclic Synchronous Position mode.
Definition: ecApiDef.h:332
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:426
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:128
OBD_TORQUE_ACTUAL_VALUE_INDEX
#define OBD_TORQUE_ACTUAL_VALUE_INDEX(x)
Definition: ecApiDef.h:571
OBD_TARGET_TORQUE_INDEX
#define OBD_TARGET_TORQUE_INDEX(x)
Definition: ecApiDef.h:568
OBD_SUPPORTED_DRIVE_MODES_INDEX
#define OBD_SUPPORTED_DRIVE_MODES_INDEX(x)
Definition: ecApiDef.h:624
STATUSWORD_DRIVE_FOLLOWS_COMMAND
#define STATUSWORD_DRIVE_FOLLOWS_COMMAND
Drive follows command (used in cyclic synchronous modes)
Definition: ecApiDef.h:289
EC_SLV_API_CiA402_SAxis_t::positionActualValue
double positionActualValue
Actual position within control loop.
Definition: ESL_cia402Demo.c:73
CYCLIC_SYNC_VELOCITY_MODE
#define CYCLIC_SYNC_VELOCITY_MODE
Cyclic Synchronous Velocity mode.
Definition: ecApiDef.h:333
QUICKSTOP_RAMP
#define QUICKSTOP_RAMP
Quick stop ramp (options: 0x605E)
Definition: ecApiDef.h:516
STOP_ON_CURRENT_LIMIT
#define STOP_ON_CURRENT_LIMIT
Stop on current limit (options: 0x605E)
Definition: ecApiDef.h:517
EC_SLV_APP_setObdValues
void EC_SLV_APP_setObdValues(void *pCtxt_p)
Set default values for CiA 402 object dictionary.
Definition: ESL_cia402Demo.c:356
OBD_SW_POSITION_LIMIT_INDEX
#define OBD_SW_POSITION_LIMIT_INDEX(x)
Definition: ecApiDef.h:577
OBD_TARGET_VELOCITY_INDEX
#define OBD_TARGET_VELOCITY_INDEX(x)
Definition: ecApiDef.h:622
OBD_QUICKSTOP_INDEX
#define OBD_QUICKSTOP_INDEX(x)
Definition: ecApiDef.h:543
EC_SLV_APP_motionControl
void EC_SLV_APP_motionControl(EC_API_SLV_SHandle_t *pEcApiSlv_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p)
This functions provides a simple feedback functionality.
Definition: ESL_cia402Demo.c:647
EC_SLV_APP_CST
void EC_SLV_APP_CST(EC_API_SLV_SHandle_t *pEcApiSlv_p, EC_SLV_API_CiA402_SAxis_t *pCiA402Axis_p)
Cyclic synchronous torque mode. ETG6010 6.4.
Definition: ESL_cia402Demo.c:507
EC_USR_eRET_OK
@ EC_USR_eRET_OK
no error occurred
Definition: ecSlvApi.h:78
OBD_VELOCITY_ACTUAL_VALUE_INDEX
#define OBD_VELOCITY_ACTUAL_VALUE_INDEX(x)
Definition: ecApiDef.h:562
EC_SLV_APP_cia402Application
void EC_SLV_APP_cia402Application(void *pCtxt_p)
CiA402 Application function.
Definition: ESL_cia402Demo.c:745
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_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:401
EC_API_eERR_NONE
@ EC_API_eERR_NONE
Definition: ecApiError.h:66
EC_SLV_APP_setCiA402ObjectValue
uint32_t EC_SLV_APP_setCiA402ObjectValue(EC_API_SLV_SHandle_t *pEcApiSlv_p, uint16_t index_p, uint16_t length_p, uint16_t *pValue_p)
Write CiA402 Object value.
Definition: ESL_cia402Demo.c:167
EC_SLV_APP_cia402LocalError
void EC_SLV_APP_cia402LocalError(void *pCtxt_p, uint16_t errorCode_p)
Local Error function handler.
Definition: ESL_cia402Demo.c:901