applInterface.h 是 SSC协议栈与用户应用程序之间的接口定义文件,它定义了两类东西:函数指针(应用层需要实现的回调)和导出函数(SSC
提供给应用层调用的 API)。
一、函数指针(应用层必须实现的回调)
SSC 通过这些函数指针调用应用层代码,应用层在初始化时把函数地址赋给这些指针。
EEPROM 仿真组(ESC_EEPROM_EMULATION = 1 时生效)
函数指针: pAPPL_EEPROM_Read(wordaddr)
作用: 从用户 EEPROM 中读取数据,拷贝到 ESC 的 EEPROM 数据寄存器(0x508 偏移处)。主站读取 EEPROM 时触发
────────────────────────────────────────
函数指针: pAPPL_EEPROM_Write(wordaddr)
作用: 将 ESC EEPROM 数据寄存器中的数据写入用户 EEPROM 存储器。主站写入 EEPROM 时触发
────────────────────────────────────────
函数指针: pAPPL_EEPROM_Reload()
作用: EEPROM 重载:将 EEPROM 的重载信息复制到 ESC 的 EEPROM 数据寄存器。EtherCAT 有些 ESC 支持热重载 EEPROM 内容
────────────────────────────────────────
函数指针: pAPPL_EEPROM_Store()
作用: 延迟存储:如果 EEPROM 仿真写数据时不能即时存入永久存储器,SSC 会在最后一次 EEPROM 访问 1000ms
后调用此函数,让你把缓存的数据真正固化
EoE 组(EOE_SUPPORTED = 1 时生效)
函数指针: pAPPL_EoeReceive(pData, length)
作用: 收到以太网帧时回调:主站通过 EoE 发来一帧以太网数据时触发。应用层处理后,通过 EOE_SendFrameRequest() 发送响应帧
────────────────────────────────────────
函数指针: pAPPL_EoeSettingInd(pMac, pIp, pSubNet, pDefaultGateway, pDnsIp)
作用: EoE 网络参数变更通知:当主站写入了新的 MAC/IP/子网掩码/网关/DNS 配置时回调,通知应用层更新网络参数
FoE 组(FOE_SUPPORTED = 1 时生效)
函数指针: pAPPL_FoeRead(pName, nameSize, password, maxBlockSize, pData)
作用: 文件读取请求:主站请求读取从站某个文件。应用层把第一个数据块填到 pData,返回实际块大小。用 busy
码可以延迟响应(比如文件还没准备好)
────────────────────────────────────────
函数指针: pAPPL_FoeReadData(offset, maxBlockSize, pData)
作用: 文件读取续传:主站确认了上一次读取应答后,SSC 调用此函数传输文件的第 2~N 块数据。offset 是文件偏移量
────────────────────────────────────────
函数指针: pAPPL_FoeError(errorCode)
作用: FoE 传输被主站中止:主站发送了 FoE Abort 时回调,通知应用层传输失败
────────────────────────────────────────
函数指针: pAPPL_FoeWrite(pName, nameSize, password)
作用: 文件写入请求:主站请求向从站写入一个文件。应用层校验文件名和密码,返回 0 表示接受,返回错误码表示拒绝
────────────────────────────────────────
函数指针: pAPPL_FoeWriteData(pData, Size, bDataFollowing)
作用: 文件写入数据:主站发来文件数据块时回调。bDataFollowing 指示后面是否还有数据。应用层返回 0 表示继续,返回 busy
码可以暂停接收
主循环回调
函数指针: pAPPL_MainLoop()
作用: 应用层自定义主循环:SSC 在每次 MainLoop()
中,处理完邮箱和状态机之后调用这个函数。应用层可以在这里插入自己的周期性任务
二、SSC 导出的 API(供应用层调用的函数)
函数: MainInit(void)
作用: 协议栈初始化入口。在硬件平台和 ESC 就绪后,应用层调用此函数来初始化整个 EtherCAT
从站协议栈(硬件→ESC→EEPROM→SM→邮箱→对象字典→应用)
────────────────────────────────────────
函数: MainLoop(void)
作用: 协议栈主循环。应用层必须周期性调用此函数(通常
1ms~几ms),它负责处理状态机、邮箱协议、过程数据(无同步模式下)等低优先级任务
────────────────────────────────────────
函数: ECAT_StateChange(alStatus, alStatusCode)
作用: 触发状态变更。当应用层检测到错误(如断线、过温),调用此函数请求向更低状态切换。注意只能请求低等级状态(OP→SafeO
P→PreOP→INIT),不能请求升到更高状态
────────────────────────────────────────
函数: EOE_SendFrameRequest(pData, length)
作用: 发送以太网帧(需要 EOE_SUPPORTED)。应用层在收到 pAPPL_EoeReceive 回调后,调用此函数将响应帧通过 EoE
发给主站。返回 0 表示成功,1 表示忙需要稍后重试
核心设计模式
这个接口文件体现了 SSC 的依赖反转设计:
-
协议栈核心(ecatslv.c)不依赖具体应用,只通过函数指针调用应用层
-
应用层在初始化时把回调函数地址赋给这些指针
-
协议栈导出 MainInit/MainLoop/ECAT_StateChange/EOE_SendFrameRequest 给应用层调用
这样可以做到应用层代码和协议栈代码完全解耦,方便移植到不同平台。