首页 > 代码库 > EtherCAT从站代码注释(部分)

EtherCAT从站代码注释(部分)

整体软件架构

intmain(void)

{

   HW_Init();        /*初始化,包括硬件和A/D、SPI口读写配置*/

 

   MainInit();       /*主函数初始化包含:ESC 和COE   */

 

   bRunApplication = TRUE;      /*处于运行状态标志*/

   do

   {

       MainLoop();   /*主循环函数,实现周期性和非周期性数据交换*/

 

   } while (bRunApplication == TRUE); /*检查是否处于运行状态*/   

 

   HW_Release();     //无意义的函数

   return 0;         //设置正确返回

}

 

 

Testappl.c

测试应用程序是一个特定的奴隶堆栈提供大部分的指定的EtherCAT

特点和生成机制,这是奴隶的行为不符合

标准。这可以用来检查主行为不正确的奴隶的行为。

反应

Cia402appl从栈代码包含的cia402驱动剖面样品的实现

在[ 1 ]。此实现提供了运动控制器之间的接口应用层通信。

以下功能的支持:

- cia402对象(见8.1章对象)

- cia402状态机(见8.2章状态机)

这支持同步循环位置(CSP)和同步循环

速度(CSV)的操作模式。反应

 

 

EL9800appl应用程序层

void APPL_Application(void) 该函数在同步模式和自由模式中均被调用

void    APPL_AckErrorInd(UINT16 stateTrans)        //当发生主站承认发生错误时调用改程序

下面是包含状态转换函数

UINT16 APPL_StartMailboxHandler(void)   //从初始化状态向预运行状态转换

UINT16 APPL_StopMailboxHandler(void)    //从预运行状态向初始化状态转换

UINT16 APPL_StartInputHandler(UINT16*pIntMask)   //从预运行状态向安全运行状态转换

UINT16 APPL_StopInputHandler(void)             //从安全运行状态向预运行状态转换

UINT16 APPL_StartOutputHandler(void) //从安全运行状态向运行状态转换

UINT16 APPL_StopOutputHandler(void) //从运行状态向安全运行状态转换

UINT16 APPL_GenerateMapping(UINT16*pInputSize,UINT16* pOutputSize)计算过程数据的位数

voidAPPL_InputMapping(UINT16* pData)     //copies the inputs from the local memory to the ESC memory

voidAPPL_OutputMapping(UINT16* pData) ESC->code

voidAPPL_Application(void)                              //8位灯控制函数LATB8-LATB15   端口控制

UINT8 ReadObject0x1802处理SD0给TxPDO的读取应答

Main函数

intmain(void)

{

   /* initialize the Hardware and the EtherCATSlave Controller */

   HW_Init();        /*初始化,包括硬件和A/D、SPI口读写配置*/

 

   MainInit();       /*主函数初始化包含:ESC 和COE   */

 

   bRunApplication = TRUE;      /*处于运行状态标志*/

   do

   {

       MainLoop();   /*主循环函数,实现周期性和非周期性数据交换*/

 

   } while(bRunApplication == TRUE); /*检查是否处于运行状态*/   

 

   HW_Release();     //无意义的函数

   return 0;         //设置正确返回

}

 

 

Tiescappl.c

前面是一些变量定义

voidPDO_ResetOutputs(void)  复位输出

{

   sDOOutputs.LEDs = 0x00;

   sDO1Outputs.Cmd = 0x00;

   sDO1Outputs.Count = 0x00;

   sDO1Outputs.MotorData = http://www.mamicode.com/0x1000;

}

后面是与el9800appl内容一样

Ecatappl.c

voidPDO_InputMapping()//执行输入数据操作

voidPDO_OutputMapping()                   /*将ESC缓存中的输出数据拷贝到当地缓存区

voidECAT_CheckTimer(void)

如果开关ecat_timer_int是,在不用中断的情况下实现看门狗的控制

在这种情况下,每ecat_main周期检查本地一个定时器寄存器

该函数在毫秒触发

voidPDI_Isr(void)                              //PDI接口中断函数同步模式处理周期性数据 中断向量INT1对应该中断程序

voidSync0_Isr(void)            //中断中断向量,本程序INT3不使能中断,(分布时钟不用)

voidECAT_SetLedIndication(void)//根据灯的状态设置运行或故障

 

voidECAT_Init(void)

{

   UINT8 i;                                       //定义位整形变量

   /*Get Maximum Number of SyncManagers*/

   UINT16 TmpVar = 0;                             //定义位整形变量

 

   HW_EscReadWord(TmpVar, ESC_COMM_INFO_OFFSET);  //读FMMU数 0-8个可配置

 

   TmpVar = SWAPWORD(TmpVar);                     //交换字 高低位互换

   nMaxSyncMan = (UINT8) ((TmpVar & ESC_SM_CHANNELS_MASK)>>ESC_SM_CHANNELS_SHIFT);  /*nMaxSyncMan变量中位表示当前需要配置的SM通道数,

                                                                                                                                                          ,用于下面使能代码, 执行完后留下TmpVar的低位*/

                                                                                                                         

   /* disable all Sync Manager channels,初始化时将所有的SM通道屏蔽,在应用层中根据需要使能相应的SM通道*/

   for (i = 0; i < nMaxSyncMan;i++)             //不使能所有的单元

       HW_DisableSyncManChannel(i);               //每个SM通道操作不使能

 

   /* initialize the mailbox handler */

   MBX_Init();                                    //邮箱通信机制初始化

 

   /* initialize variables */

   bApplEsmPending = FALSE;                       //AL访问ESM标志

   bEcatWaitForAlControlRes = FALSE;              //ESCAT等待AL控制寄存器

   bEcatFirstOutputsReceived = FALSE;             //ESCAT输入输出正确标志mainloop函数中用

    bEcatOutputUpdateRunning = FALSE;             //运行模式下,输出更新运行标志mainloop函数中用

    bEcatInputUpdateRunning = FALSE;              //安全运行或运行模式下、输入更新运行标志mainloop函数中用

   bWdTrigger = FALSE;                            //SM2看门狗使能不使能标志

   EcatWdValue = http://www.mamicode.com/0;

   Sync0WdCounter = 0;

   Sync0WdValue = http://www.mamicode.com/0;

   bDcSyncActive = FALSE;                         //分布时钟同步使能,mainloop函数中用

   bLocalErrorFlag = FALSE;

   u16LocalErrorCode = 0x00;                      //错误标志

 

   u16ALEventMask = 0;                            //在预运行和安全运行状态下将被赋给X204

 

   /* initialize the AL Status register */

   nAlStatus    = STATE_INIT;                     //AL状态赋值X01  初始化状态

   SetALStatus(nAlStatus, 0);                     //初始化通信变量和外设灯控制情况 ,只设置al  故障状态指示led

   nEcatStateTrans = 0;                           //状态切换标志为

   u8EcatErrorLed = LED_OFF;                      //错误指示灯,运行状态错误指示灯初始值为

 

   bEscIntEnabled = FALSE;                        //ESC中断SM2/3使能标志,mainloop函数中用

   /* initialize the COE part */

   COE_Init();                                    //COE部分变量初始化

}

void COE_Init(void)

{

   pCoeSendStored = 0;

   nSdoInfoFragmentsLeft = 0;

}

 

PROTO   TMBX MBXMEM * VARMEM pCoeSendStored;              

 /** if the mailbox service could not be sent(or stored),                                                               the CoE service will be stored in this variable                                                               

and will be sentautomatically from the mailbox handler                                                               (COE_ContinueInd) when the send mailbox will be read                                                               

the next time from themaster

/ **如果邮箱服务无法发送(或存储),COE服务将被存储在该变量,

 当邮箱下次读取主战的时候,将自动从邮箱处理程序发送

* /

PROTO UINT16          VARMEM                nSdoInfoFragmentsLeft;/**< \brief Number of fragments which need to betransmitted*/需要被传输的片段数量

 

Ecatappl.c中

Mainloop()

运行模式判断:

输入输出状态判断,并置为相应的标志位

Ecatapplication

APPL_Application();          /*/该函数主要实现个灯和个开关量以及一路A/D转换值,备与主站之间数据交换

                                           位于tiescappl中,该函数被SYNCISR 调用,或在sync不被支持时被mainloop调用。

                                 */

调用ECAT-Main;完成非周期数据操作,实现ESM和mailbox

调用ECATCheckError

 

EtherCAT从站代码注释(部分)