EtherCAT主站SOEM -- 1 -- SOEM之ethercattype.h文件分析

EtherCAT主站SOEM -- 1 -- SOEM之ethercattype.h文件分析

  • 一 文件功能预览:
  • 二 该文件重要功能介绍:
    • 1. 返回值定义 (Return Values)
      • 2.1.1 EC_NOFRAME (-1)
      • 2.1.2 EC_OTHERFRAME (-2)
      • 2.1.3 EC_ERROR (-3)
      • 2.1.4 EC_SLAVECOUNTEXCEEDED (-4)
      • 2.1.5 EC_TIMEOUT (-5)
    • 2. EtherCAT 命令类型定义 (EtherCAT Command Types)
      • 2.2.1 EC_CMD_NOP (No Operation)
      • 2.2.2 EC_CMD_APRD (Auto Increment Read)
      • 2.2.3 EC_CMD_APWR (Auto Increment Write)
      • 2.2.4 EC_CMD_APRW (Auto Increment Read Write)
      • 2.2.5 EC_CMD_FPRD (Configured Address Read)
      • 2.2.6 EC_CMD_FPWR (Configured Address Write)
      • 2.2.7 EC_CMD_FPRW (Configured Address Read Write)
      • 2.2.8 EC_CMD_BRD (Broadcast Read)
      • 2.2.9 EC_CMD_BWR (Broadcast Write)
      • 2.2.10 EC_CMD_BRW (Broadcast Read Write)
      • 2.2.11 EC_CMD_LRD (Logical Memory Read)
      • 2.2.12 EC_CMD_LWR (Logical Memory Write)
      • 2.2.13 EC_CMD_LRW (Logical Memory Read Write)
      • 2.2.14 EC_CMD_ARMW (Auto Increment Read Multiple Write)
      • 2.2.15 EC_CMD_FRMW (Configured Read Multiple Write)
    • 3. 数据类型定义 (Data Types)
    • 4. EtherCAT 状态定义 (EtherCAT States)
      • 2.4.1 EC_STATE_NONE (No valid state)
      • 2.4.2 EC_STATE_INIT (Init State)
      • 2.4.3 EC_STATE_PRE_OP (Pre-operational)
      • 2.4.4 EC_STATE_BOOT (Boot State)
      • 2.4.5 EC_STATE_SAFE_OP (Safe-operational)
      • 2.4.6 EC_STATE_OPERATIONAL (Operational)
      • 2.4.7 EC_STATE_ACK (Error or ACK Error)
    • 5. 数据帧缓冲状态定义 (Buffer States)
      • 2.5.1 EC_BUF_EMPTY (Empty)
      • 2.5.2 EC_BUF_ALLOC (Allocated, but not filled)
      • 2.5.3 EC_BUF_TX (Transmitted)
      • 2.5.4 EC_BUF_RCVD (Received, but not consumed)
      • 2.5.5 EC_BUF_COMPLETE (Cycle completed)
    • 6. 错误类型定义 (Error Types)
      • 2.6.1 EC_ERR_TYPE_SDO_ERROR (SDO Error)
      • 2.6.2 EC_ERR_TYPE_EMERGENCY (Emergency)
      • 2.6.3 EC_ERR_TYPE_PACKET_ERROR (Packet Error)
      • 2.6.4 EC_ERR_TYPE_SDOINFO_ERROR (SDO Info Error)
      • 2.6.5 EC_ERR_TYPE_FOE_ERROR (File Access over EtherCAT Error)
      • 2.6.6 EC_ERR_TYPE_FOE_BUF2SMALL (FOE Buffer Too Small)
      • 2.6.7 EC_ERR_TYPE_FOE_PACKETNUMBER (FOE Packet Number Error)
      • 2.6.8 EC_ERR_TYPE_SOE_ERROR (Service Over EtherCAT Error)
      • 2.6.9 EC_ERR_TYPE_MBX_ERROR (Mailbox Error)
      • 2.6.10 EC_ERR_TYPE_FOE_FILE_NOTFOUND (FOE File Not Found)
      • 2.6.11 EC_ERR_TYPE_EOE_INVALID_RX_DATA (EOE Invalid Receive Data)
    • 7. EtherCAT 寄存器 (EtherCAT Registers)
      • 2.7.1 ECT_REG_TYPE
      • 2.7.2 ECT_REG_PORTDES
      • 2.7.3 ECT_REG_ESCSUP
      • 2.7.4 ECT_REG_STADR
      • 2.7.5 ECT_REG_ALIAS
      • 2.7.6 ECT_REG_DLCTL
      • 2.7.7 ECT_REG_DLPORT
      • 2.7.8 ECT_REG_DLALIAS
      • 2.7.9 ECT_REG_DLSTAT
      • 2.7.10 ECT_REG_ALCTL
      • 2.7.11 ECT_REG_ALSTAT
      • 2.7.12 ECT_REG_ALSTATCODE
      • 2.7.13 ECT_REG_PDICTL
      • 2.7.14 ECT_REG_IRQMASK
      • 2.7.15 ECT_REG_RXERR
      • 2.7.16 ECT_REG_FRXERR
      • 2.7.17 ECT_REG_EPUECNT
      • 2.7.18 ECT_REG_PECNT
      • 2.7.19 ECT_REG_PECODE
      • 2.7.20 ECT_REG_LLCNT
      • 2.7.21 ECT_REG_WDCNT
      • 2.7.22 ECT_REG_EEPCFG
      • 2.7.23 ECT_REG_EEPCTL
      • 2.7.24 ECT_REG_EEPSTAT
      • 2.7.25 ECT_REG_EEPADR
      • 2.7.26 ECT_REG_EEPDAT
      • 2.7.27 ECT_REG_FMMU0, 2.7.28 ECT_REG_FMMU1, 2.7.29 ECT_REG_FMMU2, 2.7.30 ECT_REG_FMMU3
      • 2.7.31 ECT_REG_SM0, 2.7.32 ECT_REG_SM1, 2.7.33 ECT_REG_SM2, 2.7.34 ECT_REG_SM3
      • 2.7.35 ECT_REG_SM0STAT, 2.7.36 ECT_REG_SM1STAT
      • 2.7.37 ECT_REG_SM1ACT, 2.7.38 ECT_REG_SM1CONTR
      • 2.7.39 ECT_REG_DCTIME0, 2.7.40 ECT_REG_DCTIME1, 2.7.41 ECT_REG_DCTIME2, 2.7.42 ECT_REG_DCTIME3
      • 2.7.43 ECT_REG_DCSYSTIME, 2.7.44 ECT_REG_DCSOF
      • 2.7.45 ECT_REG_DCSYSOFFSET, 2.7.46 ECT_REG_DCSYSDELAY, 2.7.47 ECT_REG_DCSYSDIFF
      • 2.7.48 ECT_REG_DCSPEEDCNT
      • 2.7.49 ECT_REG_DCTIMEFILT
      • 2.7.50 ECT_REG_DCCUC
      • 2.7.51 ECT_REG_DCSYNCACT
      • 2.7.52 ECT_REG_DCSTART0, 2.7.53 ECT_REG_DCCYCLE0, 2.7.54 ECT_REG_DCCYCLE1
    • 8. 包类型 (Packet Types)
    • 9. Helper 宏 (Helper Macros)
  • 三 ethercattype.h 原文件的中文注释
  • 该文档修改记录:
  • 总结

一 文件功能预览:

部分名称 介绍
版权声明 (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 通信。根据具体应用需求,还可以调整一些超时和帧长度设置。

二 该文件重要功能介绍:

1. 返回值定义 (Return Values)

这些定义用于处理函数调用的结果,如 EC_NOFRAME(没有帧返回)、EC_ERROR(一般错误)、EC_TIMEOUT(请求超时)等。

2.1.1 EC_NOFRAME (-1)

  • 作用:表示没有 EtherCAT 帧返回。
  • 使用场景:通常在 EtherCAT 通信期间,当没有数据帧返回时,函数可能返回此值。开发者可以使用此返回值来判断是否有数据帧可用。如果函数返回 EC_NOFRAME,可能需要重新尝试 EtherCAT 通信或采取其他处理措施。

2.1.2 EC_OTHERFRAME (-2)

  • 作用:表示接收到未知类型的数据帧。
  • 使用场景:当函数返回 EC_OTHERFRAME 时,可能表示接收到了不被当前应用程序处理的 EtherCAT 数据帧。开发者可以根据需要记录或处理这些数据帧,以便进一步调试或分析。

2.1.3 EC_ERROR (-3)

  • 作用:表示一般错误,通常指示在函数执行期间发生了通信或处理错误。
  • 使用场景:当函数返回 EC_ERROR 时,应用程序应该进行错误处理。这包括记录错误信息、通知用户、执行容错措施等。EC_ERROR 可能与通信故障或其他不寻常情况相关。

2.1.4 EC_SLAVECOUNTEXCEEDED (-4)

  • 作用:表示附属到总线上的从站数量超过了支持的限制。
  • 使用场景:通常用于指示从站数量超出了总线控制器的最大支持数量。开发者需要确保总线拓扑结构不超出控制器的能力,否则会导致通信问题。

2.1.5 EC_TIMEOUT (-5)

  • 作用:表示请求超时,即在规定的时间内未获得所需的响应。
  • 使用场景:EC_TIMEOUT 常用于指示通信超时情况。当函数返回 EC_TIMEOUT 时,通常需要重新发送请求或采取其他超时处理措施。

2. EtherCAT 命令类型定义 (EtherCAT Command Types)

这些定义用于处理 EtherCAT 命令,例如 EC_CMD_APRD(自动递增读取)、EC_CMD_FPRW(配置地址读写)等。

2.2.1 EC_CMD_NOP (No Operation)

  • 作用:EC_CMD_NOP 是一个空操作命令,不执行任何具体操作。它通常用于维持通信连接或测试通信通道的可用性。
  • 使用场景:EC_CMD_NOP 可能在需要保持通信通道打开但不需要执行特定操作的情况下使用。例如,可以周期性地发送 EC_CMD_NOP 以确保通信通道仍然有效。

2.2.2 EC_CMD_APRD (Auto Increment Read)

  • 作用:EC_CMD_APRD 命令用于执行从 EtherCAT 从站的自动增量读取操作。它逐个读取从站的对象字典中的数据。
  • 使用场景:EC_CMD_APRD 通常用于批量读取多个对象的数据。这在需要读取一系列相关数据时很有用,如传感器数据、状态信息等。

2.2.3 EC_CMD_APWR (Auto Increment Write)

  • 作用:EC_CMD_APWR 命令用于执行从 EtherCAT 从站的自动增量写入操作。它逐个写入从站的对象字典中的数据。
  • 使用场景:EC_CMD_APWR 通常用于批量写入多个对象的数据。这在需要设置多个相关参数时非常有用,如配置控制参数、校准数据等。

2.2.4 EC_CMD_APRW (Auto Increment Read Write)

  • 作用:EC_CMD_APRW 命令用于执行从 EtherCAT 从站的自动增量读写操作。它逐个执行读取和写入操作。
  • 使用场景:EC_CMD_APRW 可用于在一个命令中执行混合的读取和写入操作,以减少通信的复杂性和提高效率。

2.2.5 EC_CMD_FPRD (Configured Address Read)

  • 作用:EC_CMD_FPRD 命令用于执行从 EtherCAT 从站的配置地址读取操作。它根据配置的地址读取对象字典中的数据。
  • 使用场景:EC_CMD_FPRD 通常用于根据预定义的地址读取特定数据,而不需要自动增量或广播。这对于访问特定对象的数据非常有用。

2.2.6 EC_CMD_FPWR (Configured Address Write)

  • 作用:EC_CMD_FPWR 命令用于执行从 EtherCAT 从站的配置地址写入操作。它根据配置的地址写入对象字典中的数据。
  • 使用场景:EC_CMD_FPWR 通常用于根据预定义的地址写入特定数据,而不需要自动增量或广播。这对于设置特定对象的数据非常有用。

2.2.7 EC_CMD_FPRW (Configured Address Read Write)

  • 作用:EC_CMD_FPRW 命令用于执行从 EtherCAT 从站的配置地址读写操作。它根据配置的地址执行读取和写入操作。
  • 使用场景:EC_CMD_FPRW 可用于在一个命令中执行混合的读取和写入操作,而不需要自动增量或广播,以减少通信的复杂性和提高效率。

2.2.8 EC_CMD_BRD (Broadcast Read)

  • 作用:EC_CMD_BRD 命令用于执行广播读取操作,该操作将数据广播到所有 EtherCAT 从站。
  • 使用场景:EC_CMD_BRD 通常用于读取数据并将其广播到所有从站。这对于同步从多个从站读取相同数据的应用非常有用。

2.2.9 EC_CMD_BWR (Broadcast Write)

  • 作用:EC_CMD_BWR 命令用于执行广播写入操作,该操作将数据广播到所有 EtherCAT 从站。
  • 使用场景:EC_CMD_B

WR 通常用于将相同的数据写入所有从站,例如发送全局配置或控制命令。

2.2.10 EC_CMD_BRW (Broadcast Read Write)

  • 作用:EC_CMD_BRW 命令用于执行广播读写操作,该操作将读取和写入操作广播到所有 EtherCAT 从站。
  • 使用场景:EC_CMD_BRW 可用于在一个命令中执行广播读取和写入操作,以减少通信的复杂性和提高效率。

2.2.11 EC_CMD_LRD (Logical Memory Read)

  • 作用:EC_CMD_LRD 命令用于执行从 EtherCAT 从站的逻辑内存读取操作。
  • 使用场景:EC_CMD_LRD 通常用于读取从站的逻辑内存中的数据,这些数据通常不在对象字典中。

2.2.12 EC_CMD_LWR (Logical Memory Write)

  • 作用:EC_CMD_LWR 命令用于执行从 EtherCAT 从站的逻辑内存写入操作。
  • 使用场景:EC_CMD_LWR 通常用于向从站的逻辑内存中写入数据,这些数据通常不在对象字典中。这对于配置特殊功能或执行特定控制操作非常有用。

2.2.13 EC_CMD_LRW (Logical Memory Read Write)

  • 作用:EC_CMD_LRW 命令用于执行从 EtherCAT 从站的逻辑内存读写操作。
  • 使用场景:EC_CMD_LRW 可用于在一个命令中执行逻辑内存的读取和写入操作,以减少通信的复杂性和提高效率。

2.2.14 EC_CMD_ARMW (Auto Increment Read Multiple Write)

  • 作用:EC_CMD_ARMW 命令用于执行从 EtherCAT 从站的自动增量读取和多重写入操作。它逐个读取从站的对象字典中的数据,然后执行多个写入操作。
  • 使用场景:EC_CMD_ARMW 通常用于批量读取多个对象的数据,然后一次性写入多个数据,以减少通信的开销。

2.2.15 EC_CMD_FRMW (Configured Read Multiple Write)

  • 作用:EC_CMD_FRMW 命令用于执行从 EtherCAT 从站的配置地址读取和多重写入操作。它根据配置的地址读取对象字典中的数据,然后执行多个写入操作。
  • 使用场景:EC_CMD_FRMW 通常用于根据预定义的地址读取特定数据,然后一次性写入多个数据,以提高通信效率。

3. 数据类型定义 (Data Types)

SOEM库支持多种数据类型,例如 ECT_BOOLEAN、ECT_INTEGER8、ECT_REAL32 等,用于 EtherCAT 数据的解释和处理。开发者通常需要了解这些数据类型以正确解释和处理 EtherCAT 数据。

4. EtherCAT 状态定义 (EtherCAT States)

SOEM库支持不同的 EtherCAT 从站状态,例如 EC_STATE_INIT(初始化状态)、EC_STATE_SAFE_OP(安全运行状态)等。开发者需要了解和管理这些状态。

2.4.1 EC_STATE_NONE (No valid state)

  • 作用:EC_STATE_NONE 表示 EtherCAT 从站处于无效状态,即尚未初始化或未能确定其状态。
  • 使用场景:通常,EC_STATE_NONE 在 EtherCAT 从站刚上电或初始化失败时使用。在此状态下,从站需要进行初始化流程以确定其有效状态。

2.4.2 EC_STATE_INIT (Init State)

  • 作用:EC_STATE_INIT 表示 EtherCAT 从站处于初始化状态。在此状态下,从站正在进行初始化过程,但尚未准备好进行数据交换或控制操作。
  • 使用场景:EC_STATE_INIT 通常用于初始化 EtherCAT 从站。在此状态下,从站执行必要的初始化任务,例如加载配置,设置参数,但尚未准备好进行实际操作。一旦初始化完成,从站将进入 EC_STATE_PRE_OP 或其他更高级的状态。

2.4.3 EC_STATE_PRE_OP (Pre-operational)

  • 作用:EC_STATE_PRE_OP 表示 EtherCAT 从站处于“预操作”状态。在此状态下,从站已完成引导并成功配置,但尚未进行实际的数据交换。此状态用于准备从站,配置参数和检查通信设置。
  • 使用场景:通常,EC_STATE_PRE_OP 用于初始化 EtherCAT 从站并进行配置。在此状态下,开发者可以设置参数,检查硬件和网络连接,确保一切准备就绪。一旦完成配置和准备工作,从站可以切换到 EC_STATE_SAFE_OP 或 EC_STATE_OPERATIONAL 状态,以开始实际的数据交换和控制操作。

2.4.4 EC_STATE_BOOT (Boot State)

  • 作用:EC_STATE_BOOT 表示 EtherCAT 从站处于“引导”状态。在此状态下,从站正在进行初始化和引导过程,准备进入预操作状态。
  • 使用场景:EC_STATE_BOOT 通常在 EtherCAT 从站上电或重置后初始状态。从站将进入引导状态,执行引导过程,加载配置,完成初始化。一旦引导完成,从站将切换到 EC_STATE_PRE_OP 状态。

2.4.5 EC_STATE_SAFE_OP (Safe-operational)

  • 作用:EC_STATE_SAFE_OP 表示 EtherCAT 从站处于“安全操作”状态。在此状态下,从站已经准备好进行实际的数据交换和控制操作,但保持在一种安全状态,以便在出现故障或错误时采取措施。
  • 使用场景:EC_STATE_SAFE_OP 用于确保从站可以在操作期间保持安全性。在此状态下,从站可以执行数据交换和控制任务,但会在检测到错误或异常情况时采取相应的安全措施。

2.4.6 EC_STATE_OPERATIONAL (Operational)

  • 作用:EC_STATE_OPERATIONAL 表示 EtherCAT 从站处于“操作”状态。在此状态下,从站已准备好进行实际的数据交换和控制操作。
  • 使用场景:EC_STATE_OPERATIONAL 是 EtherCAT 从站执行正常操作的状态。从站可以执行数据交换和控制任务,而不会将重大错误或故障视为致命。

2.4.7 EC_STATE_ACK (Error or ACK Error)

  • 作用:EC_STATE_ACK 表示 EtherCAT 从站处于错误状态或确认错误状态。在此状态下,从站报告了错误或等待确认错误的状态。
  • 使用场景:EC_STATE_ACK 用于报告错误或等待确认错误状态。一旦错误得到确认,从站可以采取适当的措施,例如尝试恢复或通知主站。这个状态有助于处理通信或硬件错误。

请注意,EC_STATE_NONE、EC_STATE_INIT 和 EC_STATE_ACK 通常用于初始化和处理错误情况,而 EC_STATE_PRE_OP、EC_STATE_BOOT、EC_STATE_SAFE_OP 和 EC_STATE_OPERATIONAL 是正常操作状态。在实际应用中,EtherCAT 从站的状态将根据应用需求在这些状态之间切换。

5. 数据帧缓冲状态定义 (Buffer States)

开发者通常需要了解 EtherCAT 数据帧缓冲区的状态,以了解数据传输的进展和状态。

2.5.1 EC_BUF_EMPTY (Empty)

  • 作用:EC_BUF_EMPTY 表示数据帧缓冲区为空,没有包含任何数据。
  • 使用场景:通常,EC_BUF_EMPTY 在初始化或重新启动周期时使用。当数据帧缓冲区被清空并准备接收新数据时,状态将设置为 EC_BUF_EMPTY。

2.5.2 EC_BUF_ALLOC (Allocated, but not filled)

  • 作用:EC_BUF_ALLOC 表示数据帧缓冲区已分配,但尚未填充数据。这意味着缓冲区已准备好接收数据,但还未接收到有效数据。
  • 使用场景:EC_BUF_ALLOC 用于表示缓冲区已准备好接收数据。在开始周期或数据交换时,数据帧缓冲区可能首先设置为 EC_BUF_ALLOC,然后等待有效数据的到来。

2.5.3 EC_BUF_TX (Transmitted)

  • 作用:EC_BUF_TX 表示数据已成功传输或发送。
  • 使用场景:EC_BUF_TX 用于指示数据已被发送到总线或接收方。这个状态通常在发送数据帧后设置,以指示数据的成功传输。

2.5.4 EC_BUF_RCVD (Received, but not consumed)

  • 作用:EC_BUF_RCVD 表示数据已被接收,但尚未被使用或消耗。
  • 使用场景:EC_BUF_RCVD 用于指示数据已被接收,但尚未被处理或消耗。在数据帧从总线上接收后,它可能首先设置为 EC_BUF_RCVD,然后等待进一步的处理。

2.5.5 EC_BUF_COMPLETE (Cycle completed)

  • 作用:EC_BUF_COMPLETE 表示数据帧的周期已完成,数据可以被视为完成。
  • 使用场景:EC_BUF_COMPLETE 通常用于指示数据帧的周期已经结束,可以对数据进行后续处理或分析。这个状态有助于确定何时可以开始下一个数据周期。

这些数据帧缓冲状态用于跟踪数据帧的处理和传输过程,有助于确保数据的可靠传输和及时处理。在 EtherCAT 通信中,数据帧的状态会在这些状态之间进行转换,以表示数据的处理进展和成功传输。

6. 错误类型定义 (Error Types)

EtherCAT 通信可能会出现各种错误,例如 SDO 错误、紧急错误、数据包错误等。了解这些错误类型对于故障排除和处理至关重要。

2.6.1 EC_ERR_TYPE_SDO_ERROR (SDO Error)

  • 作用:EC_ERR_TYPE_SDO_ERROR 表示 EtherCAT 通讯中的 SDO(Service Data Object)错误。SDO 用于在 EtherCAT 网络中读取或写入从站的数据。这个错误类型指示 SDO 通讯过程中发生了问题。

  • 使用场景:当 EtherCAT 主站尝试与 EtherCAT 从站进行 SDO 通讯时,如果遇到了通讯错误,将返回 EC_ERR_TYPE_SDO_ERROR。这可能是由于数据传输问题、参数设置错误或其他与 SDO 通讯相关的问题引起的。

2.6.2 EC_ERR_TYPE_EMERGENCY (Emergency)

  • 作用:EC_ERR_TYPE_EMERGENCY 表示 EtherCAT 通讯中发生了紧急情况。紧急情况通常是指 EtherCAT 网络中出现了需要立即处理的问题,如安全问题或重大错误。

  • 使用场景:当 EtherCAT 网络中发生紧急情况,主站可能会收到 EC_ERR_TYPE_EMERGENCY 错误。这时,应立即采取适当的措斀,以处理紧急情况,确保网络的安全和正常运行。

2.6.3 EC_ERR_TYPE_PACKET_ERROR (Packet Error)

  • 作用:EC_ERR_TYPE_PACKET_ERROR 表示 EtherCAT 数据包错误。数据包错误可能是指 EtherCAT 数据包的格式不正确或数据包损坏。

  • 使用场景:当在 EtherCAT 通讯中检测到数据包错误时,将返回 EC_ERR_TYPE_PACKET_ERROR。这可能是由于通讯噪声、硬件故障或其他问题导致的。

2.6.4 EC_ERR_TYPE_SDOINFO_ERROR (SDO Info Error)

  • 作用:EC_ERR_TYPE_SDOINFO_ERROR 表示与 SDO 通讯相关的信息错误。这个错误类型指示在 SDO 通讯中出现了与 SDO 参数或信息有关的问题。

  • 使用场景:当 SDO 通讯中的参数或信息不正确或无效时,将返回 EC_ERR_TYPE_SDOINFO_ERROR。这可能导致无法正常读取或写入从站数据。

2.6.5 EC_ERR_TYPE_FOE_ERROR (File Access over EtherCAT Error)

  • 作用:EC_ERR_TYPE_FOE_ERROR 表示在通过 EtherCAT 访问文件时发生错误。EtherCAT 网络支持文件访问,此错误类型指示在处理文件时出现问题。

  • 使用场景:当通过 EtherCAT 尝试访问文件但发生错误时,将返回 EC_ERR_TYPE_FOE_ERROR。这可能包括文件不存在、权限问题或其他与文件操作相关的问题。

2.6.6 EC_ERR_TYPE_FOE_BUF2SMALL (FOE Buffer Too Small)

  • 作用:EC_ERR_TYPE_FOE_BUF2SMALL 表示在文件访问过程中,用于缓存文件数据的缓冲区太小。这可能导致无法正常传输文件数据。

  • 使用场景:当 EtherCAT 主站尝试访问文件时,但缓冲区不足以容纳文件数据时,将返回 EC_ERR_TYPE_FOE_BUF2SMALL。需要增加缓冲区大小或调整文件传输方式以解决问题。

2.6.7 EC_ERR_TYPE_FOE_PACKETNUMBER (FOE Packet Number Error)

  • 作用:EC_ERR_TYPE_FOE_PACKETNUMBER 表示在文件访问过程中,文件传输的数据包编号错误。这可能是由于传输的数据包顺序错误引起的。

  • 使用场景:当在 EtherCAT 文件传输中检测到数据包编号错误时,将返回 EC_ERR_TYPE_FOE_PACKETNUMBER。需要检查数据包传输的编号以确保正确的传输顺序。

2.6.8 EC_ERR_TYPE_SOE_ERROR (Service Over EtherCAT Error)

  • 作用:EC_ERR_TYPE_SOE_ERROR 表示在 Service Over EtherCAT (SOE) 通讯中出现错误。SOE 用于执行 EtherCAT 从站的服务请求。

  • 使用场景:当 SOE 通讯中发生错误时,将返回 EC_ERR_TYPE_SOE_ERROR。这可能是由于服务请求的问题或通讯错误引起的。

2.6.9 EC_ERR_TYPE_MBX_ERROR (Mailbox Error)

  • 作用:EC_ERR_TYPE_MBX_ERROR 表示在邮箱通讯中发生错误。邮箱通讯用于主站和从站之间的异步通讯。

  • 使用场景:当在邮箱通讯中发生错误时,将返回 EC_ERR_TYPE_MBX_ERROR。可能是由于邮箱数据格式错误或通讯问题引起的。

2.6.10 EC_ERR_TYPE_FOE_FILE_NOTFOUND (FOE File Not Found)

  • 作用:EC_ERR_TYPE_FOE_FILE_NOTFOUND 表示在通过 EtherCAT 访问文件时,所请求的文件不存在。

  • 使用场景:当尝试访问 EtherCAT 文件但请求的文件不存在时,将返回 EC_ERR_TYPE_FOE_FILE_NOTFOUND。需要确保请求的文件路径和名称正确。

2.6.11 EC_ERR_TYPE_EOE_INVALID_RX_DATA (EOE Invalid Receive Data)

  • 作用:EC_ERR_TYPE_EOE_INVALID_RX_DATA 表示在 Ethernet Over EtherCAT (EOE) 通讯中收到无效的数据。

  • 使用场景:当在 EOE 通讯中接收到无效的数据时,将返回 EC_ERR_TYPE_EOE_INVALID_RX_DATA。需要检查数据格式或通讯设置以解决问题。

7. EtherCAT 寄存器 (EtherCAT Registers)

这些定义包括了与 EtherCAT 寄存器和寄存器类型相关的常量。开发者可能需要访问和配置这些寄存器来管理 EtherCAT 通信。

2.7.1 ECT_REG_TYPE

  • 作用:ECT_REG_TYPE 是 EtherCAT 寄存器中的一个参数,用于指示 EtherCAT 从站类型。不同的从站类型可能需要不同的配置和处理。

  • 使用场景:主站可以读取 ECT_REG_TYPE 寄存器,以确定与之通信的 EtherCAT 从站的类型。这有助于主站根据从站类型采取不同的配置和控制策略。

2.7.2 ECT_REG_PORTDES

  • 作用:ECT_REG_PORTDES 用于描述 EtherCAT 从站端口的属性,包括端口数量和特性。

  • 使用场景:主站可以查询 ECT_REG_PORTDES 寄存器,以获取有关从站端口的信息,例如支持的端口数量、端口类型和特性。这有助于主站配置通信参数,以与从站进行通信。

2.7.3 ECT_REG_ESCSUP

  • 作用:ECT_REG_ESCSUP 表示 EtherCAT 从站支持的 EtherCAT State Configuration(ESC)。

  • 使用场景:主站可以读取 ECT_REG_ESCSUP 寄存器,以了解从站支持的 ESC 配置,这可以帮助主站在 EtherCAT 网络中设置和维护不同从站的状态。

2.7.4 ECT_REG_STADR

  • 作用:ECT_REG_STADR 用于指示从站的物理地址。

  • 使用场景:主站需要知道每个从站的物理地址,以正确路由和发送数据。通过查询 ECT_REG_STADR 寄存器,主站可以获取从站的地址信息。

2.7.5 ECT_REG_ALIAS

  • 作用:ECT_REG_ALIAS 是 EtherCAT 寄存器,用于配置从站的别名。

  • 使用场景:别名是一种便于主站标识和访问从站的方式。主站可以写入 ECT_REG_ALIAS 寄存器来为从站分配别名。

2.7.6 ECT_REG_DLCTL

  • 作用:ECT_REG_DLCTL 用于控制 EtherCAT 数据包传输的参数和配置。

  • 使用场景:主站可以通过写入 ECT_REG_DLCTL 寄存器来配置数据包传输的控制参数,如数据包大小和传输速率。

2.7.7 ECT_REG_DLPORT

  • 作用:ECT_REG_DLPORT 是 EtherCAT 寄存器,用于配置数据包传输的端口。

  • 使用场景:主站可以通过写入 ECT_REG_DLPORT 寄存器来选择要用于数据包传输的端口。

2.7.8 ECT_REG_DLALIAS

  • 作用:ECT_REG_DLALIAS 是 EtherCAT 寄存器,用于为数据包传输配置别名。

  • 使用场景:主站可以写入 ECT_REG_DLALIAS 寄存器来配置数据包传输的别名,以便从站可以根据别名进行识别和处理。

2.7.9 ECT_REG_DLSTAT

  • 作用:ECT_REG_DLSTAT 表示数据包传输的状态。

  • 使用场景:主站可以查询 ECT_REG_DLSTAT 寄存器,以获取关于数据包传输状态的信息,如传输完成、错误状态等。

2.7.10 ECT_REG_ALCTL

  • 作用:ECT_REG_ALCTL 是 EtherCAT 寄存器,用于控制 EtherCAT 从站的激活状态。

  • 使用场景:主站可以通过写入 ECT_REG_ALCTL 寄存器来激活或停用从站。这有助于主站在需要时控制从站的状态。

2.7.11 ECT_REG_ALSTAT

  • 作用:ECT_REG_ALSTAT 表示 EtherCAT 从站的激活状态。

  • 使用场景:主站可以查询 ECT_REG_ALSTAT 寄存器,以获取从站的激活状态信息。这有助于主站了解从站是否处于激活状态。

2.7.12 ECT_REG_ALSTATCODE

  • 作用:ECT_REG_ALSTATCODE 表示 EtherCAT 从站激活状态的状态代码。

  • 使用场景:主站可以查询 ECT_REG_ALSTATCODE 寄存器,以获取更具体的激活状态信息,以进一步了解从站的状态。

2.7.13 ECT_REG_PDICTL

  • 作用:ECT_REG_PDICTL 用于控制 EtherCAT 数据包的传输。

  • 使用场景:主站可以通过写入 ECT_REG_PDICTL 寄存器来控制数据包的传输,如启用或禁用数据包传输,以适应不同的通信需求。

2.7.14 ECT_REG_IRQMASK

  • 作用:ECT_REG_IRQMASK 是中断掩码寄存器,用于配置中断的掩码。

  • 使用场景:主站可以通过写入 ECT_REG_IRQMASK 寄存器来配置中断的掩码,以控制中断的触发和处理。

2.7.15 ECT_REG_RXERR

  • 作用:ECT_REG_RXERR 表示接收错误的计数。

  • 使用场景:主站可以查询 ECT_REG_RXERR 寄存器,以了解接收错误的次数。这有助于主站监视通信质量。

2.7.16 ECT_REG_FRXERR

  • 作用:ECT_REG_FRXERR 是帧接收错误寄存器,用于指示帧接收错误的次数。

  • 使用场景:主站可以通过查询 ECT_REG_FRXERR 寄存器来获取帧接收错误的统计信息,以帮助排除通信问题。

2.7.17 ECT_REG_EPUECNT

  • 作用:ECT_REG_EPUECNT 表示 EtherCAT 从站所支持的同步更新事件计数。

  • 使用场景:主站可以查询 ECT_REG_EPUECNT 寄存器,以确定从站支持的同步事件更新的数量。这有助于主站正确配置同步事件。

2.7.18 ECT_REG_PECNT

  • 作用:ECT_REG_PECNT 用于表示传输错误的计数。

  • 使用场景:主站可以查询 ECT_REG_PECNT 寄存器,以获取传输错误的次数,有助于主站监视通信质量和性能。

2.7.19 ECT_REG_PECODE

  • 作用:ECT_REG_PECODE 表示传输错误的错误码。

  • 使用场景:主站可以查询 ECT_REG_PECODE 寄存器,以了解传输错误的具体错误码,有助于进一步分析和解决通信问题。

2.7.20 ECT_REG_LLCNT

  • 作用:ECT_REG_LLCNT 用于表示丢失数据包的计数。

  • 使用场景:主站可以查询 ECT_REG_LLCNT 寄存器,以了解丢失数据包的次数,这有助于主站了解通信质量。

2.7.21 ECT_REG_WDCNT

  • 作用:ECT_REG_WDCNT 表示看门狗计时器的计数。

  • 使用场景:主站可以查询 ECT_REG_WDCNT 寄存器,以了解看门狗计时器的计数情况,有助于监视和维护通信连接的稳定性。

2.7.22 ECT_REG_EEPCFG

  • 作用:ECT_REG_EEPCFG 是 EtherCAT EEPROM 配置寄存器,用于配置 EEPROM。

  • 使用场景:主站可以通过写入 ECT_REG_EEPCFG 寄存器来配置从站的 EEPROM,以定制从站的行为和特性。

2.7.23 ECT_REG_EEPCTL

  • 作用:ECT_REG_EEPCTL 是 EtherCAT EEPROM 控制寄存器,用于控制 EEPROM 的读写操作。

  • 使用场景:主站可以通过写入 ECT_REG_EEPCTL 寄存器来控制从站 EEPROM 的读写操作,有助于配置和维护从站的参数。

2.7.24 ECT_REG_EEPSTAT

  • 作用:ECT_REG_EEPSTAT 表示 EEPROM 的状态。

  • 使用场景:主站可以查询 ECT_REG_EEPSTAT 寄存器,以了解 EEPROM 的状态信息,例如是否可以正常读取或写入 EEPROM。

2.7.25 ECT_REG_EEPADR

  • 作用:ECT_REG_EEPADR 用于指示 EEPROM 的地址。

  • 使用场景:主站需要知道 EEPROM 的地址,以正确读取或写入 EEPROM 中的数据。

2.7.26 ECT_REG_EEPDAT

  • 作用:ECT_REG_EEPDAT 用于读写 EEPROM 中的数据。

  • 使用场景:主站可以通过 ECT_REG_EEPDAT 寄存器读取或写入 EEPROM 中的数据,以配置或修改从站参数。

2.7.27 ECT_REG_FMMU0, 2.7.28 ECT_REG_FMMU1, 2.7.29 ECT_REG_FMMU2, 2.7.30 ECT_REG_FMMU3

  • 作用:这些寄存器用于配置 EtherCAT 主站的分布式时钟同步和数据传输。

  • 使用场景:主站可以配置这些寄存器,以确保从站之间的同步和数据传输。分布式时钟同步对于精确的数据同步非常关键。

2.7.31 ECT_REG_SM0, 2.7.32 ECT_REG_SM1, 2.7.33 ECT_REG_SM2, 2.7.34 ECT_REG_SM3

  • 作用:这些寄存器用于配置 EtherCAT 主站的状态机。

  • 使用场景:主站可以配置这些寄存器,以控制从站的状态机。这对于实现自定义通信协议非常有用。

2.7.35 ECT_REG_SM0STAT, 2.7.36 ECT_REG_SM1STAT

  • 作用:这些寄存器用于表示从站状态机的状态。

  • 使用场景:主站可以查询这些寄存器,以了解从站状态机的当前状态。这有助于监控和维护通信过程。

2.7.37 ECT_REG_SM1ACT, 2.7.38 ECT_REG_SM1CONTR

  • 作用:这些寄存器用于配置从站的状态机行为和控制。

  • 使用场景:主站可以通过配置这些寄存器,定制从站状态机的行为,以适应不同的应用需求。

2.7.39 ECT_REG_DCTIME0, 2.7.40 ECT_REG_DCTIME1, 2.7.41 ECT_REG_DCTIME2, 2.7.42 ECT_REG_DCTIME3

  • 作用:这些寄存器用于配置 EtherCAT 数据通信的时间参数。

  • 使用场景:主站可以通过配置这些寄存器,确保数据通信的时序和同步,以满足应用需求。

2.7.43 ECT_REG_DCSYSTIME, 2.7.44 ECT_REG_DCSOF

  • 作用:这些寄存器用于配置 EtherCAT 数据通信的系统时钟和周期。

  • 使用场景:主站需要配置这些寄存器,以确保数据通信按照预定的系统时钟和周期进行,以保证同步性。

2.7.45 ECT_REG_DCSYSOFFSET, 2.7.46 ECT_REG_DCSYSDELAY, 2.7.47 ECT_REG_DCSYSDIFF

  • 作用:这些寄存器用于配置 EtherCAT 数据通信的时钟偏移、延迟和差异。

  • 使用场景:主站可以通过配置这些寄存器,调整时钟偏移、延迟和差异,以确保数据通信的精确同步。

2.7.48 ECT_REG_DCSPEEDCNT

  • 作用:ECT_REG_DCSPEEDCNT 表示 EtherCAT 数据通信速度计数。

  • 使用场景:主站可以查询这个寄存器,以了解数据通信的速度计数,有助于监视通信性能。

2.7.49 ECT_REG_DCTIMEFILT

  • 作用:ECT_REG_DCTIMEFILT 用于配置 EtherCAT 数据通信的时间过滤器。

  • 使用场景:主站可以通过配置这个寄存器,过滤掉不符合时间要求的通信,以提高通信质量。

2.7.50 ECT_REG_DCCUC

  • 作用:ECT_REG_DCCUC 表示 EtherCAT 数据通信的计数。

  • 使用场景:主站可以查询这个寄存器,以了解数据通信的计数情况,有助于监视通信性能。

2.7.51 ECT_REG_DCSYNCACT

  • 作用:ECT_REG_DCSYNCACT 用于表示 EtherCAT 数据通信的同步活动。

  • 使用场景:主站可以查询这个寄存器,以了解同步活动情况,有助于监视通信的同步性。

2.7.52 ECT_REG_DCSTART0, 2.7.53 ECT_REG_DCCYCLE0, 2.7.54 ECT_REG_DCCYCLE1

  • 作用:这些寄存器用于配置 EtherCAT 数据通信的启动时间和周期。

  • 使用场景:主站需要配置这些寄存器,确保数据通信在指定的时间启动和以指定的周期运行,以满足应用需求。

这些寄存器和参数在 EtherCAT 网络中扮演关键角色,帮助主站和从站之间实现高性能和精确同步的数据通信。主站通过配置这些寄存器,可以满足各种不同应用场景的通信需求。

8. 包类型 (Packet Types)

这些定义包括了与 EtherCAT 数据包类型相关的常量,如 ETH_P_ECAT(EtherCAT 数据包类型)。

9. Helper 宏 (Helper Macros)

这些宏可用于数据处理和转换,如创建字、交换字节序等。这些宏可以帮助开发者更轻松地处理数据。

这些定义和宏在 SOEM 库中是核心组成部分,用于支持 EtherCAT 通信的各个方面。开发者根据其 EtherCAT 主站应用程序的具体需求使用这些定义和宏。

三 ethercattype.h 原文件的中文注释

/** \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文件分析的内容。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。

你可能感兴趣的:(EtherCAT主站-SOEM,EtherCAT,SOEM,C语言,EtherCAT主站,ethercattype文件,经验分享,工业总线)