部分名称 | 介绍 |
---|---|
版权声明 (License) | 代码受 GNU General Public License 版本 2 许可协议保护。请参见 LICENSE 文件以获取完整的许可信息。 |
文件描述 (File Description) | 该文件包含了 EtherCAT 的一般类型定义和宏定义。 |
EC_TIMEOUT 宏 | 用于特定应用程序中的通信超时进行优化的定义。 |
字节序定义 (Byte Order) | 默认情况下,定义了小端字节序,但允许用户根据需要定义大端字节序。 |
返回值定义 (Return Values) | 包括各种可能的返回值,例如 EC_NOFRAME(没有帧返回)、EC_ERROR(一般错误)、EC_TIMEOUT(请求超时)等。 |
帧长度定义 (Frame Length) | 定义了 EtherCAT 帧的最大长度和其他相关帧长度信息。 |
数据类型定义 (Data Types) | 包括 EtherCAT 数据类型的枚举,例如 ECT_BOOLEAN(布尔)、ECT_INTEGER8(8 位整数)、ECT_REAL32(32 位实数)等。 |
EtherCAT 命令类型定义 (EtherCAT Command Types) | 定义了 EtherCAT 命令类型的枚举,如 EC_CMD_NOP(无操作)、EC_CMD_APRD(自动递增读取)等。 |
EtherCAT 状态定义 (EtherCAT States) | 包括 EtherCAT 从站可能的状态的枚举,如 EC_STATE_NONE(无效状态)、EC_STATE_INIT(初始化状态)等。 |
数据帧缓冲状态定义 (Buffer States) | 定义了用于表示数据帧缓冲区状态的枚举,如 EC_BUF_EMPTY(空)、EC_BUF_ALLOC(已分配但未填充)等。 |
错误类型定义 (Error Types) | 包括可能的错误类型的枚举,如 EC_ERR_TYPE_SDO_ERROR(SDO 错误类型)、EC_ERR_TYPE_EMERGENCY(紧急错误类型)等。 |
EtherCAT 寄存器 (EtherCAT Registers) | 定义了各种 EtherCAT 寄存器和寄存器类型,如 ECT_REG_TYPE(类型寄存器)、ECT_REG_DLCTL(数据链接控制寄存器)等。 |
包类型 (Packet Types) | 定义了与 EtherCAT 数据包类型相关的常量,如 ETH_P_ECAT(EtherCAT 数据包类型)。 |
Helper 宏 (Helper Macros) | 包含了一些用于数据处理和转换的宏,如 MK_WORD(创建一个字)、SWAP(交换字节序)等。 |
“ethercattype.h” 文件用于支持 EtherCAT 网络通信,提供了各种类型定义和宏,以便开发者更轻松地开发 EtherCAT 相关应用程序。这些定义包括数据类型、命令类型、状态类型和错误类型,以支持 EtherCAT 通信。根据具体应用需求,还可以调整一些超时和帧长度设置。
这些定义用于处理函数调用的结果,如 EC_NOFRAME(没有帧返回)、EC_ERROR(一般错误)、EC_TIMEOUT(请求超时)等。
这些定义用于处理 EtherCAT 命令,例如 EC_CMD_APRD(自动递增读取)、EC_CMD_FPRW(配置地址读写)等。
WR 通常用于将相同的数据写入所有从站,例如发送全局配置或控制命令。
SOEM库支持多种数据类型,例如 ECT_BOOLEAN、ECT_INTEGER8、ECT_REAL32 等,用于 EtherCAT 数据的解释和处理。开发者通常需要了解这些数据类型以正确解释和处理 EtherCAT 数据。
SOEM库支持不同的 EtherCAT 从站状态,例如 EC_STATE_INIT(初始化状态)、EC_STATE_SAFE_OP(安全运行状态)等。开发者需要了解和管理这些状态。
请注意,EC_STATE_NONE、EC_STATE_INIT 和 EC_STATE_ACK 通常用于初始化和处理错误情况,而 EC_STATE_PRE_OP、EC_STATE_BOOT、EC_STATE_SAFE_OP 和 EC_STATE_OPERATIONAL 是正常操作状态。在实际应用中,EtherCAT 从站的状态将根据应用需求在这些状态之间切换。
开发者通常需要了解 EtherCAT 数据帧缓冲区的状态,以了解数据传输的进展和状态。
这些数据帧缓冲状态用于跟踪数据帧的处理和传输过程,有助于确保数据的可靠传输和及时处理。在 EtherCAT 通信中,数据帧的状态会在这些状态之间进行转换,以表示数据的处理进展和成功传输。
EtherCAT 通信可能会出现各种错误,例如 SDO 错误、紧急错误、数据包错误等。了解这些错误类型对于故障排除和处理至关重要。
作用:EC_ERR_TYPE_SDO_ERROR 表示 EtherCAT 通讯中的 SDO(Service Data Object)错误。SDO 用于在 EtherCAT 网络中读取或写入从站的数据。这个错误类型指示 SDO 通讯过程中发生了问题。
使用场景:当 EtherCAT 主站尝试与 EtherCAT 从站进行 SDO 通讯时,如果遇到了通讯错误,将返回 EC_ERR_TYPE_SDO_ERROR。这可能是由于数据传输问题、参数设置错误或其他与 SDO 通讯相关的问题引起的。
作用:EC_ERR_TYPE_EMERGENCY 表示 EtherCAT 通讯中发生了紧急情况。紧急情况通常是指 EtherCAT 网络中出现了需要立即处理的问题,如安全问题或重大错误。
使用场景:当 EtherCAT 网络中发生紧急情况,主站可能会收到 EC_ERR_TYPE_EMERGENCY 错误。这时,应立即采取适当的措斀,以处理紧急情况,确保网络的安全和正常运行。
作用:EC_ERR_TYPE_PACKET_ERROR 表示 EtherCAT 数据包错误。数据包错误可能是指 EtherCAT 数据包的格式不正确或数据包损坏。
使用场景:当在 EtherCAT 通讯中检测到数据包错误时,将返回 EC_ERR_TYPE_PACKET_ERROR。这可能是由于通讯噪声、硬件故障或其他问题导致的。
作用:EC_ERR_TYPE_SDOINFO_ERROR 表示与 SDO 通讯相关的信息错误。这个错误类型指示在 SDO 通讯中出现了与 SDO 参数或信息有关的问题。
使用场景:当 SDO 通讯中的参数或信息不正确或无效时,将返回 EC_ERR_TYPE_SDOINFO_ERROR。这可能导致无法正常读取或写入从站数据。
作用:EC_ERR_TYPE_FOE_ERROR 表示在通过 EtherCAT 访问文件时发生错误。EtherCAT 网络支持文件访问,此错误类型指示在处理文件时出现问题。
使用场景:当通过 EtherCAT 尝试访问文件但发生错误时,将返回 EC_ERR_TYPE_FOE_ERROR。这可能包括文件不存在、权限问题或其他与文件操作相关的问题。
作用:EC_ERR_TYPE_FOE_BUF2SMALL 表示在文件访问过程中,用于缓存文件数据的缓冲区太小。这可能导致无法正常传输文件数据。
使用场景:当 EtherCAT 主站尝试访问文件时,但缓冲区不足以容纳文件数据时,将返回 EC_ERR_TYPE_FOE_BUF2SMALL。需要增加缓冲区大小或调整文件传输方式以解决问题。
作用:EC_ERR_TYPE_FOE_PACKETNUMBER 表示在文件访问过程中,文件传输的数据包编号错误。这可能是由于传输的数据包顺序错误引起的。
使用场景:当在 EtherCAT 文件传输中检测到数据包编号错误时,将返回 EC_ERR_TYPE_FOE_PACKETNUMBER。需要检查数据包传输的编号以确保正确的传输顺序。
作用:EC_ERR_TYPE_SOE_ERROR 表示在 Service Over EtherCAT (SOE) 通讯中出现错误。SOE 用于执行 EtherCAT 从站的服务请求。
使用场景:当 SOE 通讯中发生错误时,将返回 EC_ERR_TYPE_SOE_ERROR。这可能是由于服务请求的问题或通讯错误引起的。
作用:EC_ERR_TYPE_MBX_ERROR 表示在邮箱通讯中发生错误。邮箱通讯用于主站和从站之间的异步通讯。
使用场景:当在邮箱通讯中发生错误时,将返回 EC_ERR_TYPE_MBX_ERROR。可能是由于邮箱数据格式错误或通讯问题引起的。
作用:EC_ERR_TYPE_FOE_FILE_NOTFOUND 表示在通过 EtherCAT 访问文件时,所请求的文件不存在。
使用场景:当尝试访问 EtherCAT 文件但请求的文件不存在时,将返回 EC_ERR_TYPE_FOE_FILE_NOTFOUND。需要确保请求的文件路径和名称正确。
作用:EC_ERR_TYPE_EOE_INVALID_RX_DATA 表示在 Ethernet Over EtherCAT (EOE) 通讯中收到无效的数据。
使用场景:当在 EOE 通讯中接收到无效的数据时,将返回 EC_ERR_TYPE_EOE_INVALID_RX_DATA。需要检查数据格式或通讯设置以解决问题。
这些定义包括了与 EtherCAT 寄存器和寄存器类型相关的常量。开发者可能需要访问和配置这些寄存器来管理 EtherCAT 通信。
作用:ECT_REG_TYPE 是 EtherCAT 寄存器中的一个参数,用于指示 EtherCAT 从站类型。不同的从站类型可能需要不同的配置和处理。
使用场景:主站可以读取 ECT_REG_TYPE 寄存器,以确定与之通信的 EtherCAT 从站的类型。这有助于主站根据从站类型采取不同的配置和控制策略。
作用:ECT_REG_PORTDES 用于描述 EtherCAT 从站端口的属性,包括端口数量和特性。
使用场景:主站可以查询 ECT_REG_PORTDES 寄存器,以获取有关从站端口的信息,例如支持的端口数量、端口类型和特性。这有助于主站配置通信参数,以与从站进行通信。
作用:ECT_REG_ESCSUP 表示 EtherCAT 从站支持的 EtherCAT State Configuration(ESC)。
使用场景:主站可以读取 ECT_REG_ESCSUP 寄存器,以了解从站支持的 ESC 配置,这可以帮助主站在 EtherCAT 网络中设置和维护不同从站的状态。
作用:ECT_REG_STADR 用于指示从站的物理地址。
使用场景:主站需要知道每个从站的物理地址,以正确路由和发送数据。通过查询 ECT_REG_STADR 寄存器,主站可以获取从站的地址信息。
作用:ECT_REG_ALIAS 是 EtherCAT 寄存器,用于配置从站的别名。
使用场景:别名是一种便于主站标识和访问从站的方式。主站可以写入 ECT_REG_ALIAS 寄存器来为从站分配别名。
作用:ECT_REG_DLCTL 用于控制 EtherCAT 数据包传输的参数和配置。
使用场景:主站可以通过写入 ECT_REG_DLCTL 寄存器来配置数据包传输的控制参数,如数据包大小和传输速率。
作用:ECT_REG_DLPORT 是 EtherCAT 寄存器,用于配置数据包传输的端口。
使用场景:主站可以通过写入 ECT_REG_DLPORT 寄存器来选择要用于数据包传输的端口。
作用:ECT_REG_DLALIAS 是 EtherCAT 寄存器,用于为数据包传输配置别名。
使用场景:主站可以写入 ECT_REG_DLALIAS 寄存器来配置数据包传输的别名,以便从站可以根据别名进行识别和处理。
作用:ECT_REG_DLSTAT 表示数据包传输的状态。
使用场景:主站可以查询 ECT_REG_DLSTAT 寄存器,以获取关于数据包传输状态的信息,如传输完成、错误状态等。
作用:ECT_REG_ALCTL 是 EtherCAT 寄存器,用于控制 EtherCAT 从站的激活状态。
使用场景:主站可以通过写入 ECT_REG_ALCTL 寄存器来激活或停用从站。这有助于主站在需要时控制从站的状态。
作用:ECT_REG_ALSTAT 表示 EtherCAT 从站的激活状态。
使用场景:主站可以查询 ECT_REG_ALSTAT 寄存器,以获取从站的激活状态信息。这有助于主站了解从站是否处于激活状态。
作用:ECT_REG_ALSTATCODE 表示 EtherCAT 从站激活状态的状态代码。
使用场景:主站可以查询 ECT_REG_ALSTATCODE 寄存器,以获取更具体的激活状态信息,以进一步了解从站的状态。
作用:ECT_REG_PDICTL 用于控制 EtherCAT 数据包的传输。
使用场景:主站可以通过写入 ECT_REG_PDICTL 寄存器来控制数据包的传输,如启用或禁用数据包传输,以适应不同的通信需求。
作用:ECT_REG_IRQMASK 是中断掩码寄存器,用于配置中断的掩码。
使用场景:主站可以通过写入 ECT_REG_IRQMASK 寄存器来配置中断的掩码,以控制中断的触发和处理。
作用:ECT_REG_RXERR 表示接收错误的计数。
使用场景:主站可以查询 ECT_REG_RXERR 寄存器,以了解接收错误的次数。这有助于主站监视通信质量。
作用:ECT_REG_FRXERR 是帧接收错误寄存器,用于指示帧接收错误的次数。
使用场景:主站可以通过查询 ECT_REG_FRXERR 寄存器来获取帧接收错误的统计信息,以帮助排除通信问题。
作用:ECT_REG_EPUECNT 表示 EtherCAT 从站所支持的同步更新事件计数。
使用场景:主站可以查询 ECT_REG_EPUECNT 寄存器,以确定从站支持的同步事件更新的数量。这有助于主站正确配置同步事件。
作用:ECT_REG_PECNT 用于表示传输错误的计数。
使用场景:主站可以查询 ECT_REG_PECNT 寄存器,以获取传输错误的次数,有助于主站监视通信质量和性能。
作用:ECT_REG_PECODE 表示传输错误的错误码。
使用场景:主站可以查询 ECT_REG_PECODE 寄存器,以了解传输错误的具体错误码,有助于进一步分析和解决通信问题。
作用:ECT_REG_LLCNT 用于表示丢失数据包的计数。
使用场景:主站可以查询 ECT_REG_LLCNT 寄存器,以了解丢失数据包的次数,这有助于主站了解通信质量。
作用:ECT_REG_WDCNT 表示看门狗计时器的计数。
使用场景:主站可以查询 ECT_REG_WDCNT 寄存器,以了解看门狗计时器的计数情况,有助于监视和维护通信连接的稳定性。
作用:ECT_REG_EEPCFG 是 EtherCAT EEPROM 配置寄存器,用于配置 EEPROM。
使用场景:主站可以通过写入 ECT_REG_EEPCFG 寄存器来配置从站的 EEPROM,以定制从站的行为和特性。
作用:ECT_REG_EEPCTL 是 EtherCAT EEPROM 控制寄存器,用于控制 EEPROM 的读写操作。
使用场景:主站可以通过写入 ECT_REG_EEPCTL 寄存器来控制从站 EEPROM 的读写操作,有助于配置和维护从站的参数。
作用:ECT_REG_EEPSTAT 表示 EEPROM 的状态。
使用场景:主站可以查询 ECT_REG_EEPSTAT 寄存器,以了解 EEPROM 的状态信息,例如是否可以正常读取或写入 EEPROM。
作用:ECT_REG_EEPADR 用于指示 EEPROM 的地址。
使用场景:主站需要知道 EEPROM 的地址,以正确读取或写入 EEPROM 中的数据。
作用:ECT_REG_EEPDAT 用于读写 EEPROM 中的数据。
使用场景:主站可以通过 ECT_REG_EEPDAT 寄存器读取或写入 EEPROM 中的数据,以配置或修改从站参数。
作用:这些寄存器用于配置 EtherCAT 主站的分布式时钟同步和数据传输。
使用场景:主站可以配置这些寄存器,以确保从站之间的同步和数据传输。分布式时钟同步对于精确的数据同步非常关键。
作用:这些寄存器用于配置 EtherCAT 主站的状态机。
使用场景:主站可以配置这些寄存器,以控制从站的状态机。这对于实现自定义通信协议非常有用。
作用:这些寄存器用于表示从站状态机的状态。
使用场景:主站可以查询这些寄存器,以了解从站状态机的当前状态。这有助于监控和维护通信过程。
作用:这些寄存器用于配置从站的状态机行为和控制。
使用场景:主站可以通过配置这些寄存器,定制从站状态机的行为,以适应不同的应用需求。
作用:这些寄存器用于配置 EtherCAT 数据通信的时间参数。
使用场景:主站可以通过配置这些寄存器,确保数据通信的时序和同步,以满足应用需求。
作用:这些寄存器用于配置 EtherCAT 数据通信的系统时钟和周期。
使用场景:主站需要配置这些寄存器,以确保数据通信按照预定的系统时钟和周期进行,以保证同步性。
作用:这些寄存器用于配置 EtherCAT 数据通信的时钟偏移、延迟和差异。
使用场景:主站可以通过配置这些寄存器,调整时钟偏移、延迟和差异,以确保数据通信的精确同步。
作用:ECT_REG_DCSPEEDCNT 表示 EtherCAT 数据通信速度计数。
使用场景:主站可以查询这个寄存器,以了解数据通信的速度计数,有助于监视通信性能。
作用:ECT_REG_DCTIMEFILT 用于配置 EtherCAT 数据通信的时间过滤器。
使用场景:主站可以通过配置这个寄存器,过滤掉不符合时间要求的通信,以提高通信质量。
作用:ECT_REG_DCCUC 表示 EtherCAT 数据通信的计数。
使用场景:主站可以查询这个寄存器,以了解数据通信的计数情况,有助于监视通信性能。
作用:ECT_REG_DCSYNCACT 用于表示 EtherCAT 数据通信的同步活动。
使用场景:主站可以查询这个寄存器,以了解同步活动情况,有助于监视通信的同步性。
作用:这些寄存器用于配置 EtherCAT 数据通信的启动时间和周期。
使用场景:主站需要配置这些寄存器,确保数据通信在指定的时间启动和以指定的周期运行,以满足应用需求。
这些寄存器和参数在 EtherCAT 网络中扮演关键角色,帮助主站和从站之间实现高性能和精确同步的数据通信。主站通过配置这些寄存器,可以满足各种不同应用场景的通信需求。
这些定义包括了与 EtherCAT 数据包类型相关的常量,如 ETH_P_ECAT(EtherCAT 数据包类型)。
这些宏可用于数据处理和转换,如创建字、交换字节序等。这些宏可以帮助开发者更轻松地处理数据。
这些定义和宏在 SOEM 库中是核心组成部分,用于支持 EtherCAT 通信的各个方面。开发者根据其 EtherCAT 主站应用程序的具体需求使用这些定义和宏。
/** \file
* \brief
* EtherCAT的通用typedefs和定义。
*
* 对于特定应用可能需要优化的定义是EC_TIMEOUTxxx。对于标准设置的假设是使用标准的Linux PC或笔记本电脑,以及与最多100个从站的有线连接。对于使用无线连接或大量从站的情况,需要增加超时时间。对于运行Xenomai和RT-net等的快速系统,超时时间需要缩短。
*/
#ifndef _EC_TYPE_H
#define _EC_TYPE_H
#ifdef __cplusplus
extern "C"
{
#endif
#include "osal.h"
/** 如果需要默认上下文和函数的版本1,请定义EC_VER1
* 如果应用程序仅使用ecx_函数和自己的上下文,请定义EC_VER2
*/
#if !defined(EC_VER1) && !defined(EC_VER2)
# define EC_VER1
#endif
/** 默认情况下,如果未设置大小端,则定义为小端目标 */
#if !defined(EC_LITTLE_ENDIAN) && !defined(EC_BIG_ENDIAN)
# define EC_LITTLE_ENDIAN
#endif
/** 返回值,无帧返回 */
#define EC_NOFRAME -1
/** 返回值,未知帧接收 */
#define EC_OTHERFRAME -2
/** 返回值,一般错误 */
#define EC_ERROR -3
/** 返回值,从站过多 */
#define EC_SLAVECOUNTEXCEEDED -4
/** 返回值,请求超时 */
#define EC_TIMEOUT -5
/** 最大EtherCAT帧长度(字节) */
#define EC_MAXECATFRAME 1518
/** 最大EtherCAT LRW帧长度(字节) */
/* MTU - 以太网头部 - 长度 - 数据报头部 - WCK - FCS */
#define EC_MAXLRWDATA (EC_MAXECATFRAME - 14 - 2 - 10 - 2 - 4)
/** 在第一个LRW帧中使用的DC数据报大小 */
#define EC_FIRSTDCDATAGRAM 20
/** 标准帧缓冲大小(字节) */
#define EC_BUFSIZE EC_MAXECATFRAME
/** 数据报类型 EtherCAT */
#define EC_ECATTYPE 0x1000
/** 每通道(tx、rx1 rx2)的帧缓冲数 */
#define EC_MAXBUF 16
/** 帧返回到rx的超时值(以微秒为单位) */
#define EC_TIMEOUTRET 2000
/** 安全数据传输的超时值(以微秒为单位),最多三次重试 */
#define EC_TIMEOUTRET3 (EC_TIMEOUTRET * 3)
/** 返回“安全”变种的超时值(例如,无线网络)(以微秒为单位) */
#define EC_TIMEOUTSAFE 20000
/** EEPROM访问的超时值(以微秒为单位) */
#define EC_TIMEOUTEEP 20000
/** tx邮箱周期的超时值(以微秒为单位) */
#define EC_TIMEOUTTXM 20000
/** rx邮箱周期的超时值(以微秒为单位) */
#define EC_TIMEOUTRXM 700000
/** 检查状态更改的超时值(以微秒为单位) */
#define EC_TIMEOUTSTATE 2000000
/** EEPROM位图缓存大小 */
#define EC_MAXEEPBITMAP 128
/** EEPROM缓存缓冲区大小 */
#define EC_MAXEEPBUF EC_MAXEEPBITMAP << 5
/** 如果wkc <= 0,则默认重试次数 */
#define EC_DEFAULTRETRIES 3
/** 默认组大小,为2^x */
#define EC_LOGGROUPOFFSET 16
/** 帧缓冲的定义 */
typedef uint8 ec_bufT[EC_BUFSIZE];
/** 以太网头部定义 */
PACKED_BEGIN
typedef struct PACKED
{
/** 目的MAC地址 */
uint16 da0,da1,da2;
/** 源MAC地址 */
uint16 sa0,sa1,sa2;
/** 以太网类型 */
uint16 etype;
} ec_etherheadert;
PACKED_END
/** 以太网头部大小 */
#define ETH_HEADERSIZE sizeof(ec_etherheadert)
/** EtherCAT数据报头部定义 */
PACKED_BEGIN
typedef struct PACKED
{
/** EtherCAT数据报长度 */
uint16 elength;
/** EtherCAT命令,参见ec_cmdtype */
uint8 command;
/** 索引,在SOEM中用于Tx到Rx重组 */
uint8 index;
/** ADP */
uint16 ADP;
/** ADO */
uint16 ADO;
/** 数据报部分的长度 */
uint16 dlength;
/** 中断,目前未使用 */
uint16 irpt;
} ec_comt;
PACKED_END
/** EtherCAT头部大小 */
#define EC_HEADERSIZE sizeof(ec_comt)
/** EtherCAT头部中ec_comt.elength项的大小 */
#define EC_ELENGTHSIZE sizeof(uint16)
/** EtherCAT头部中命令的偏移位置 */
#define EC_CMDOFFSET EC_ELENGTHSIZE
/** EtherCAT数据报中工作计数器项的大小 */
#define EC_WKCSIZE sizeof(uint16)
/** 数据报跟随位在ec_comt.dlength中 */
#define EC_DATAGRAMFOLLOWS (1 << 15)
/** 可能的错误代码返回值。 */
typedef enum
{
/** 无错误 */
EC_ERR_OK = 0,
/** 库已初始化。 */
EC_ERR_ALREADY_INITIALIZED,
/** 库未初始化。 */
EC_ERR_NOT_INITIALIZED,
/** 在执行函数时发生超时。 */
EC_ERR_TIMEOUT,
/** 未找到从站。 */
EC_ERR_NO_SLAVES,
/** 函数失败。 */
EC_ERR_NOK
} ec_err;
/** 可能的EtherCAT从站状态 */
typedef enum
{
/** 无有效状态。 */
EC_STATE_NONE = 0x00,
/** 初始化状态 */
EC_STATE_INIT = 0x01,
/** 预操作状态 */
EC_STATE_PRE_OP = 0x02,
/** 启动状态 */
EC_STATE_BOOT = 0x03,
/** 安全操作状态 */
EC_STATE_SAFE_OP = 0x04,
/** 运行状态 */
EC_STATE_OPERATIONAL = 0x08,
/** 错误或应答错误 */
EC_STATE_ACK = 0x10,
EC_STATE_ERROR = 0x10
} ec_state;
/** 可能的缓冲区状态 */
typedef enum
{
/** 空的 */
EC_BUF_EMPTY = 0x00,
/** 已分配,但未填充 */
EC_BUF_ALLOC = 0x01,
/** 已传输 */
EC_BUF_TX = 0x02,
/** 已接收,但未消耗 */
EC_BUF_RCVD = 0x03,
/** 循环完成 */
EC_BUF_COMPLETE = 0x04
} ec_bufstate;
/** Ethercat数据类型 */
typedef enum
{
ECT_BOOLEAN = 0x0001,
ECT_INTEGER8 = 0x0002,
ECT_INTEGER16 = 0x0003,
ECT_INTEGER32 = 0x0004,
ECT_UNSIGNED8 = 0x0005,
ECT_UNSIGNED16 = 0x0006,
ECT_UNSIGNED32 = 0x0007,
ECT_REAL32 = 0x0008,
ECT_VISIBLE_STRING = 0x0009,
ECT_OCTET_STRING = 0x000A,
ECT_UNICODE_STRING = 0x000B,
ECT_TIME_OF_DAY = 0x000C,
ECT_TIME_DIFFERENCE = 0x000D,
ECT_DOMAIN = 0x000F,
ECT_INTEGER24 = 0x0010,
ECT_REAL64 = 0x0011,
ECT_INTEGER64 = 0x0015,
ECT_UNSIGNED24 = 0x0016,
ECT_UNSIGNED64 = 0x001B,
ECT_BIT1 = 0x0030,
ECT_BIT2 = 0x0031,
ECT_BIT3 = 0x0032,
ECT_BIT4 = 0x0033,
ECT_BIT5 = 0x0034,
ECT_BIT6 = 0x0035,
ECT_BIT7 = 0x0036,
ECT_BIT8 = 0x0037
} ec_datatype;
/** Ethercat命令类型 */
typedef enum
{
/** 无操作 */
EC_CMD_NOP = 0x00,
/** 自动增量读 */
EC_CMD_APRD,
/** 自动增量写 */
EC_CMD_APWR,
/** 自动增量读写 */
EC_CMD_APRW,
/** 配置地址读 */
EC_CMD_FPRD,
/** 配置地址写 */
EC_CMD_FPWR,
/** 配置地址读写 */
EC_CMD_FPRW,
/** 广播读 */
EC_CMD_BRD,
/** 广播写 */
EC_CMD_BWR,
/** 广播读写 */
EC_CMD_BRW,
/** 逻辑存储器读 */
EC_CMD_LRD,
/** 逻辑存储器写 */
EC_CMD_LWR,
/** 逻辑存储器读写 */
EC_CMD_LRW,
/** 自动增量读多写 */
EC_CMD_ARMW,
/** 配置读多写 */
EC_CMD_FRMW
/** 保留 */
} ec_cmdtype;
/** Ethercat EEPROM命令类型 */
typedef enum
{
/** 无操作 */
EC_ECMD_NOP = 0x0000,
/** 读取 */
EC_ECMD_READ = 0x0100,
/** 写入 */
EC_ECMD_WRITE = 0x0201,
/** 重新加载 */
EC_ECMD_RELOAD = 0x0300
} ec_ecmdtype;
/** EEPROM状态机读取大小 */
#define EC_ESTAT_R64 0x0040
/** EEPROM状态机忙标志 */
#define EC_ESTAT_BUSY 0x8000
/** EEPROM状态机错误标志掩码 */
#define EC_ESTAT_EMASK 0x7800
/** EEPROM状态机错误确认 */
#define EC_ESTAT_NACK 0x2000
/* Ethercat SSI(Slave Information Interface) */
/** EEPROM中SII部分的起始地址 */
#define ECT_SII_START 0x0040
enum
{
/** SII类别字符串 */
ECT_SII_STRING = 10,
/** SII类别一般 */
ECT_SII_GENERAL = 30,
/** SII类别FMMU */
ECT_SII_FMMU = 40,
/** SII类别SM */
ECT_SII_SM = 41,
/** SII类别PDO */
ECT_SII_PDO = 50
};
/** SII一般部分中的项偏移 */
enum
{
ECT_SII_MANUF = 0x0008,
ECT_SII_ID = 0x000a,
ECT_SII_REV = 0x000c,
ECT_SII_BOOTRXMBX = 0x0014,
ECT_SII_BOOTTXMBX = 0x0016,
ECT_SII_MBXSIZE = 0x0019,
ECT_SII_TXMBXADR = 0x001a,
ECT_SII_RXMBXADR = 0x0018,
ECT_SII_MBXPROTO = 0x001c
};
/** 邮箱类型定义 */
enum
{
/** 错误邮箱类型 */
ECT_MBXT_ERR = 0x00,
/** 通过EtherCAT的ADS邮箱类型 */
ECT_MBXT_AOE,
/** 通过EtherCAT的以太网邮箱类型 */
ECT_MBXT_EOE,
/** 通过EtherCAT的CANopen邮箱类型 */
ECT_MBXT_COE,
/** 通过EtherCAT的文件邮箱类型 */
ECT_MBXT_FOE,
/** 通过EtherCAT的伺服邮箱类型 */
ECT_MBXT_SOE,
/** 通过EtherCAT的供应商邮箱类型 */
ECT_MBXT_VOE = 0x0f
};
/** CoE邮箱类型 */
enum
{
ECT_COES_EMERGENCY = 0x01,
ECT_COES_SDOREQ,
ECT_COES_SDORES,
ECT_COES_TXPDO,
ECT_COES_RXPDO,
ECT_COES_TXPDO_RR,
ECT_COES_RXPDO_RR,
ECT_COES_SDOINFO
};
/** CoE SDO命令 */
enum
{
ECT_SDO_DOWN_INIT = 0x21,
ECT_SDO_DOWN_EXP = 0x23,
ECT_SDO_DOWN_INIT_CA = 0x31,
ECT_SDO_UP_REQ = 0x40,
ECT_SDO_UP_REQ_CA = 0x50,
ECT_SDO_SEG_UP_REQ = 0x60,
ECT_SDO_ABORT = 0x80
};
/** CoE对象描述命令 */
enum
{
ECT_GET_ODLIST_REQ = 0x01,
ECT_GET_ODLIST_RES = 0x02,
ECT_GET_OD_REQ = 0x03,
ECT_GET_OD_RES = 0x04,
ECT_GET_OE_REQ = 0x05,
ECT_GET_OE_RES = 0x06,
ECT_SDOINFO_ERROR = 0x07
};
/** FoE操作码 */
enum
{
ECT_FOE_READ = 0x01,
ECT_FOE_WRITE
ECT_FOE_WRITE,
ECT_FOE_DATA,
ECT_FOE_ACK,
ECT_FOE_ERROR,
ECT_FOE_BUSY
};
/** SoE操作码 */
enum
{
ECT_SOE_READREQ = 0x01,
ECT_SOE_READRES,
ECT_SOE_WRITEREQ,
ECT_SOE_WRITERES,
ECT_SOE_NOTIFICATION,
ECT_SOE_EMERGENCY
};
/** Ethercat寄存器 */
enum
{
ECT_REG_TYPE = 0x0000,
ECT_REG_PORTDES = 0x0007,
ECT_REG_ESCSUP = 0x0008,
ECT_REG_STADR = 0x0010,
ECT_REG_ALIAS = 0x0012,
ECT_REG_DLCTL = 0x0100,
ECT_REG_DLPORT = 0x0101,
ECT_REG_DLALIAS = 0x0103,
ECT_REG_DLSTAT = 0x0110,
ECT_REG_ALCTL = 0x0120,
ECT_REG_ALSTAT = 0x0130,
ECT_REG_ALSTATCODE = 0x0134,
ECT_REG_PDICTL = 0x0140,
ECT_REG_IRQMASK = 0x0200,
ECT_REG_RXERR = 0x0300,
ECT_REG_FRXERR = 0x0308,
ECT_REG_EPUECNT = 0x030C,
ECT_REG_PECNT = 0x030D,
ECT_REG_PECODE = 0x030E,
ECT_REG_LLCNT = 0x0310,
ECT_REG_WDCNT = 0x0442,
ECT_REG_EEPCFG = 0x0500,
ECT_REG_EEPCTL = 0x0502,
ECT_REG_EEPSTAT = 0x0502,
ECT_REG_EEPADR = 0x0504,
ECT_REG_EEPDAT = 0x0508,
ECT_REG_FMMU0 = 0x0600,
ECT_REG_FMMU1 = ECT_REG_FMMU0 + 0x10,
ECT_REG_FMMU2 = ECT_REG_FMMU1 + 0x10,
ECT_REG_FMMU3 = ECT_REG_FMMU2 + 0x10,
ECT_REG_SM0 = 0x0800,
ECT_REG_SM1 = ECT_REG_SM0 + 0x08,
ECT_REG_SM2 = ECT_REG_SM1 + 0x08,
ECT_REG_SM3 = ECT_REG_SM2 + 0x08,
ECT_REG_SM0STAT = ECT_REG_SM0 + 0x05,
ECT_REG_SM1STAT = ECT_REG_SM1 + 0x05,
ECT_REG_SM1ACT = ECT_REG_SM1 + 0x06,
ECT_REG_SM1CONTR = ECT_REG_SM1 + 0x07,
ECT_REG_DCTIME0 = 0x0900,
ECT_REG_DCTIME1 = 0x0904,
ECT_REG_DCTIME2 = 0x0908,
ECT_REG_DCTIME3 = 0x090C,
ECT_REG_DCSYSTIME = 0x0910,
ECT_REG_DCSOF = 0x0918,
ECT_REG_DCSYSOFFSET = 0x0920,
ECT_REG_DCSYSDELAY = 0x0928,
ECT_REG_DCSYSDIFF = 0x092C,
ECT_REG_DCSPEEDCNT = 0x0930,
ECT_REG_DCTIMEFILT = 0x0934,
ECT_REG_DCCUC = 0x0980,
ECT_REG_DCSYNCACT = 0x0981,
ECT_REG_DCSTART0 = 0x0990,
ECT_REG_DCCYCLE0 = 0x09A0,
ECT_REG_DCCYCLE1 = 0x09A4
};
/** 标准SDO同步管理器通信类型 */
#define ECT_SDO_SMCOMMTYPE 0x1c00
/** 标准SDO PDO分配 */
#define ECT_SDO_PDOASSIGN 0x1c10
/** 标准SDO RxPDO分配 */
#define ECT_SDO_RXPDOASSIGN 0x1c12
/** 标准SDO TxPDO分配 */
#define ECT_SDO_TXPDOASSIGN 0x1c13
/** Ethercat数据包类型 */
#define ETH_P_ECAT 0x88A4
/** 错误类型 */
typedef enum
{
EC_ERR_TYPE_SDO_ERROR = 0,
EC_ERR_TYPE_EMERGENCY = 1,
EC_ERR_TYPE_PACKET_ERROR = 3,
EC_ERR_TYPE_SDOINFO_ERROR = 4,
EC_ERR_TYPE_FOE_ERROR = 5,
EC_ERR_TYPE_FOE_BUF2SMALL = 6,
EC_ERR_TYPE_FOE_PACKETNUMBER = 7,
EC_ERR_TYPE_SOE_ERROR = 8,
EC_ERR_TYPE_MBX_ERROR = 9,
EC_ERR_TYPE_FOE_FILE_NOTFOUND = 10,
EC_ERR_TYPE_EOE_INVALID_RX_DATA = 11
} ec_err_type;
/** 用于检索错误的结构。 */
typedef struct
{
/** 生成错误的时间。 */
ec_timet Time;
/** 信号位,错误已设置但尚未读取 */
boolean Signal;
/** 生成错误的从站号 */
uint16 Slave;
/** 生成错误的CoE SDO索引 */
uint16 Index;
/** 生成错误的CoE SDO子索引 */
uint8 SubIdx;
/** 错误类型 */
ec_err_type Etype;
union
{
/** 一般中止代码 */
int32 AbortCode;
/** 紧急邮箱的特定错误 */
struct
{
uint16 ErrorCode;
uint8 ErrorReg;
uint8 b1;
uint16 w1;
uint16 w2;
};
};
}
} ec_errort;
/** 帮助宏 */
/** 设置邮箱头中的计数值 */
#define MBX_HDR_SET_CNT(cnt) ((uint8)((cnt) << 4))
/** 从2个字节中生成一个字 */
#define MK_WORD(msb, lsb) ((((uint16)(msb))<<8) | (lsb))
/** 获取字的高字节 */
#define HI_BYTE(w) ((w) >> 8)
/** 获取字的低字节 */
#define LO_BYTE(w) ((w) & 0x00ff)
/** 交换字的高字节和低字节 */
#define SWAP(w) ((((w)& 0xff00) >> 8) | (((w) & 0x00ff) << 8))
/** 获取双字的低字 */
#define LO_WORD(l) ((l) & 0xffff)
/** 获取双字的高字 */
#define HI_WORD(l) ((l) >> 16)
#define get_unaligned(ptr) \
({ __typeof__(*(ptr)) __tmp; memcpy(&__tmp, (ptr), sizeof(*(ptr))); __tmp; })
#define put_unaligned32(val, ptr) \
(memcpy((ptr), &(val), 4))
#define put_unaligned64(val, ptr) \
(memcpy((ptr), &(val), 8))
#if !defined(EC_BIG_ENDIAN) && defined(EC_LITTLE_ENDIAN)
#define htoes(A) (A)
#define htoel(A) (A)
#define htoell(A) (A)
#define etohs(A) (A)
#define etohl(A) (A)
#define etohll(A) (A)
#elif !defined(EC_LITTLE_ENDIAN) && defined(EC_BIG_ENDIAN)
#define htoes(A) ((((uint16)(A) & 0xff00) >> 8) | \
(((uint16)(A) & 0x00ff) << 8))
#define htoel(A) ((((uint32)(A) & 0xff000000) >> 24) | \
(((uint32)(A) & 0x00ff0000) >> 8) | \
(((uint32)(A) & 0x0000ff00) << 8) | \
(((uint32)(A) & 0x000000ff) << 24))
#define htoell(A) ((((uint64)(A) & (uint64)0xff00000000000000ULL) >> 56) | \
(((uint64)(A) & (uint64)0x00ff000000000000ULL) >> 40) | \
(((uint64)(A) & (uint64)0x0000ff0000000000ULL) >> 24) | \
(((uint64)(A) & (uint64)0x000000ff00000000ULL) >> 8) | \
(((uint64)(A) & (uint64)0x00000000ff000000ULL) << 8) | \
(((uint64)(A) & (uint64)0x0000000000ff0000ULL) << 24) | \
(((uint64)(A) & (uint64)0x000000000000ff00ULL) << 40) | \
(((uint64)(A) & (uint64)0x00000000000000ffULL) << 56))
#define etohs htoes
#define etohl htoel
#define etohll htoell
#else
#error "必须定义EC_BIG_ENDIAN或EC_LITTLE_ENDIAN之一"
#endif
#ifdef __cplusplus
}
#endif
#endif /* _EC_TYPE_H */
修改时间 | 修改说明 |
---|---|
2023年11月1日 | EtherCAT主站SOEM – 1 – SOEM之ethercattype.h文件分析 |
以上就是EtherCAT主站SOEM – 1 – SOEM之ethercattype.h文件分析的内容。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。