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 
void APPL_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  
前面是一些变量定义 
void PDO_ResetOutputs( void )  复位输出 

   sDOOutputs.LEDs = 0x00; 
   sDO1Outputs.Cmd = 0x00; 
   sDO1Outputs.Count = 0x00; 
   sDO1Outputs.MotorData = 0x1000; 

后面是与el9800appl内容一样 
Ecatappl.c  
void PDO_InputMapping() //  执行输入数据操作  
void PDO_OutputMapping()                     /* 将ESC 缓存中的输出数据拷贝到当地缓存区 
void ECAT_CheckTimer( void
如果开关ecat_timer_int 是,在不用中断的情况下实现看门狗的控制 
在这种情况下,每ecat_main 周期检查本地一个定时器寄存器 
该函数在毫秒触发  
void PDI_Isr( void )                    //PDI 接口中断函数同步模式处理周期性数据 中断向量INT1 对应该中断程序 
void Sync0_Isr( void )              // 中断中断向量,本程序INT3 不使能中断,(分布时钟不用) 
void ECAT_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 = 0;                               
   Sync0WdCounter = 0; 
   Sync0WdValue = 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 服务将被存储在该变量, 
  当邮箱下次读取主战的时候,将自动从邮箱chǔ理程序发送  
* /  
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  
  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: EtherCAT是一种高性能的实时通信协议,常用于工业自动化和机器控制系统中。EtherCAT代码是指在EtherCAT设备上运行的程序代码,用于实现从设备与EtherCAT之间的通信和数据交换。 EtherCAT代码主要包括以下几个方面的功能: 1. EtherCAT协议栈:从代码需要实现完整的EtherCAT协议栈,包括物理层和数据链路层的处理。物理层处理主要是将数据从物理介质上接收和发送,例如通过以太网接口。数据链路层处理主要是对接收的数据进行解析和处理,包括帧解析、校验、数据重组等。 2. 通信接口:从代码需要提供适当的接口,用于与主进行通信。这些接口通常包括发送和接收数据的函数、配置从参数的函数等。通过这些接口,从可以与主进行数据的交换和通信。 3. 数据处理:从代码需要将从主接收到的数据进行处理,并根据具体的应用需求进行相应的操作。例如,对于某些传感器的数据,可以进行采样、滤波和校准等处理;对于某些执行器的数据,可以进行位置控制、速度控制等操作。 4. 状态监控和诊断:从代码需要实现对从设备的状态监控和诊断功能,以便及时发现和解决潜在的问题。这些功能包括检测通信故障、识别通信丢失等,并通过相应的报警或日志记录通知用户。 5. 硬件适配:从代码需要与具体的硬件设备适配,包括对硬件接口进行调用、配置和控制等。这需要根据具体的硬件平台和接口特性进行相应的编程和开发。 总之,EtherCAT代码负责实现EtherCAT设备与主之间的通信和数据交换,以及相应的数据处理、状态监控和硬件适配等功能。其编写需要充分理解EtherCAT协议和相应的硬件平台,同时也要考虑特定应用需求和性能要求,以保证实时性和可靠性。 ### 回答2: EtherCAT (Ethernet for Control Automation Technology)是一种用于工业自动化领域的高性能实时以太网网络通信协议。EtherCAT网络包括一个或多个主和许多从,从是网络中的设备,用于接收和处理主发送的指令。 EtherCAT代码主要由以下几个方面组成: 1. 配置:在从代码中,首先需要进行网络配置和参数设置。这包括从的ID、通信速率、网络拓扑等。此配置步骤执行后,从可以正确地与主进行通信。 2. 数据解析:从代码中的数据解析是从主接收到的数据进行解析和处理的过程。从通过解析数据来识别指令类型、数据格式等,并采取相应的控制措施。 3. 实时通信:作为实时以太网协议,EtherCAT要求从能够以高速实时地从主接收和发送数据。从代码需要确保能够按照要求及时响应主的指令,并将实时数据返回给主。 4. 错误处理:从代码还需要处理可能出现的错误情况。这包括网络连接故障、通信丢失、数据错误等。从代码应具备错误检测和处理的能力,保证网络通信的可靠性和稳定性。 5. 功能扩展:从代码还可以根据实际需求进行功能扩展。例如,添加新的指令、增加传感器设备的接口等。代码的设计应具备灵活性和可扩展性,以满足不同应用场景。 综上所述,EtherCAT代码是用于实现EtherCAT功能的代码,主要包括网络配置、数据解析、实时通信、错误处理和功能扩展等方面。它使得从能够与主进行高性能实时通信,实现工业自动化领域的控制和监测任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值