2.4. Example codes

A master application which includes DCM API needs to call following steps:

Main Thread:

Master initialization and controller configuration, main loop, shutdown.

#include <AtEthercat.h>

/* initialize the master */
dwRes = emInitMaster(&oInitParms);

/* configure the master */
dwRes = emConfigureMaster(eCnfType_Filename, (EC_T_PBYTE)szCfgFile, OsStrlen(szCfgFile));

/* register client */
dwRes = emRegisterClient(emNotifyCallback, pNotification, &oRegisterResults);

/* configure DCM bus shift */
OsMemset(&oDcmConfigure, 0, sizeof(EC_T_DCM_CONFIG_BUSSHIFT));
oDcmConfigure.nCtlSetVal  = DCM_CONTROLLER_SETVAL_NANOSEC;
oDcmConfigure.bLogEnabled = EC_FALSE;
dwRes = emDcmConfigure(&oDcmConfigure, 0);

/* set master and bus state to OP */
dwRes = emSetMasterState(dwStartTimeout+dwScanBustimeout, eemState_OP);

/* application loop */
while(bRun)
{
    dwRes = emDcmGetStatus(&dwStatus, &nDiffCur, &nDiffAvg, &nDiffMax);
}

/* stop master operation */
dwTmpRes = emStop(dwStartTimeout);

Cyclic (Job) Thread:

Master jobs and dcm logging.

EC_T_VOID tEcJobTask(EC_T_VOID* pvAppThreadParamDesc)
{
    while (!pDemoThreadParam->bJobThreadShutdown)
        {
                dwRes = emExecJob(eUsrJob_ProcessAllRxFrames, &bPrevCycProcessed);

                /* get logging information */
                dwRes = emDcmGetLog(&pszLog);

                /* send all cyclic frames */
                dwRes = emExecJob(eUsrJob_SendAllCycFrames, EC_NULL);

                /* run the master timer handler */
                dwRes = emExecJob(eUsrJob_MasterTimer, EC_NULL);

                /* send all queued acyclic EtherCAT frames */
                dwRes = emExecJob(eUsrJob_SendAcycFrames, EC_NULL);

                OsSleep(CYCLE_TIME);
        }
}

For closer details find a DCM example in project EcMasterDemoDc in the folder Examples.