news 2026/4/18 8:12:36

Ehercat代码解析中文摘录<3>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ehercat代码解析中文摘录<3>

7. 对象

EtherCAT 主站访问从站本地内存时,需通过 “对象” 实现。每个对象由以下特性唯一标识:

  • 本地内存(7.1 定义本地内存)
  • 条目描述(7.2 条目描述)
  • 对象名称(7.3 对象名称)
  • 对象描述(7.4 对象描述)

所有对象的特性集合于 “对象字典”,作为主站与从站的交互接口。对象按对象代码分为三类:

  • 变量(VARIABLE):单个基础数据类型构成的对象
  • 数组(ARRAY):多个相同基础数据类型构成的对象
  • 记录(RECORD):多个不同基础数据类型构成的对象

注:16 位、32 位和 64 位条目必须从偶数字地址开始,否则需增强对象读写函数。

7.1 定义本地内存

本地内存的分配取决于对象代码(VARIABLE、ARRAY 或 RECORD):

  • 变量(VARIABLE):若对象大小与平台定义的数据类型一致,直接定义变量即可。示例:

    UINT32 u32VarObject; // 32 位变量对象
  • 数组(ARRAY)和记录(RECORD):通过结构体定义,首个成员为 8 位变量(子索引 0),存储最大子索引值。注:SSC 中为对齐需求,子索引 0 定义为 16 位变量!

    数组示例:

    typedef struct { UINT16 u16SubIndex0; // 子索引 0,存储最大子索引值 UINT32 aEntries[4]; // 4 个 32 位数组元素 } _ARR_OBJ_DEF; _ARR_OBJ_DEF ArrObj;

    记录示例:

    typedef struct { UINT16 u16SubIndex0; // 子索引 0,存储最大子索引值 UINT8 u8FirstEntry; // 8 位条目 UINT32 u32SecondEntry; // 32 位条目 INT16 i16ThirdEntry; // 16 位有符号条目 } _REC_OBJ_DEF; _REC_OBJ_DEF RecObj;

7.2 条目描述

单个条目描述通过 TSDOINFOENTRYDESC 定义,一个对象的所有条目描述存储在数组中。数组(ARRAY)类型对象仅需描述首个条目。

表 4:TSDOINFOENTRYDESC 成员变量

成员数据类型描述
DataType无符号 16 位[REF2] 中定义的基础数据类型索引
BitLength无符号 16 位对象(条目)的位长度
ObjAccess无符号 16 位位 0:Pre-Op 状态读访问;位 1:Safe-Op 状态读访问;位 2:Op 状态读访问;位 3:Pre-Op 状态写访问;位 4:Safe-Op 状态写访问;位 5:Op 状态写访问;位 6:可映射到 RxPDO;位 7:可映射到 TxPDO;位 8:条目包含在备份中;位 9:条目包含在设置中;位 10:安全输入;位 11:安全输出;位 12:安全参数

条目描述示例

  • 变量(VARIABLE):
    TSDOINFOENTRYDESC VarObjectEntryDesc = {DEFTYPE_UNSIGNED32, 0x20, (ACCESS_READ | OBJACCESS_TXPDOMAPPING)};
  • 数组(ARRAY):
    TSDOINFOENTRYDESC ArrObjEntryDesc[] = { {DEFTYPE_UNSIGNED8, 0x08, ACCESS_READ}, // 子索引 0 描述 {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}}; // 数组元素描述(所有元素相同)
  • 记录(RECORD):
    TSDOINFOENTRYDESC RecObjEntryDesc[] = { {DEFTYPE_UNSIGNED8, 0x08, ACCESS_READ}, // 子索引 0 描述 {DEFTYPE_UNSIGNED8, 0x08, ACCESS_WRITE_PREOP}, // 第一个条目(8 位,Pre-Op 可写) {DEFTYPE_UNSIGNED32, 0x20, (ACCESS_WRITE | OBJACCESS_RXPDOMAPPING)}, // 第二个条目(32 位,可写,映射到 RxPDO) {DEFTYPE_INTEGER16, 0x10, ACCESS_WRITE}}; // 第三个条目(16 位有符号,可写)

7.3 对象名称

对象名称为 ASCII 编码字符串:

  • 变量(VARIABLE)和数组(ARRAY):单个名称,以 “\0” 结尾。示例:
    UCHAR VarObjName[] = "Test var obj\0"; // 变量对象名称 UCHAR ArrObjName[] = "Array Obj\0"; // 数组对象名称
  • 记录(RECORD):每个条目(除子索引 0 外)需描述名称,条目间以 “\000” 分隔,整体以 “\000\377” 结尾。示例:
    UCHAR RecObjName[] = "Record Obj\000First Entry\000Second Entry\000Third Entry\000\377";

7.4 对象描述

对象描述通过 “TOBJECT” 结构体关联所有对象特性,结构体成员如下:

表 5:TOBJECT 成员变量

成员数据类型描述
Prev Entrystruct OBJECT指向前一个字典条目的指针,仅当对象字典条目动态链接(STATIC_OBJECT_DIC = 0)时可用
Next Entrystruct OBJECT指向后一个字典条目的指针,仅当对象字典条目动态链接(STATIC_OBJECT_DIC = 0)时可用
Index无符号 16 位对象的索引,值取决于 EtherCAT 从站类型和对象用途(7.5 索引范围)
ObjDescTSDOINFOOBJDESC(32 位)包含对象的数据类型索引([2] 中定义)和对象标志
Data Type无符号 16 位对象的数据类型索引([2] 中定义)
ObjFlags无符号 16 位位 0-7:最大子索引(子索引 0 的值);位 8-15:对象代码([2] 中定义)
pName无符号字符 *指向对象名称的指针(7.3 中定义)
pVarPtrvoid *指向本地内存的指针(7.1 中定义)
Read函数指针读取函数指针,原型:UINT8 ReadFunction (UINT16 Index, UINT8 Subindex, UINT32 Size, UINT16 MBXMEM * pData, UINT8 bCompleteAccess)。收到 SDO 上传请求时调用,为 NULL 则执行标准 SDO 上传函数
Write函数指针写入函数指针,原型:UINT8 WriteFunction (UINT16 index, UINT8 subindex, UINT32 dataSize, UINT16 MBXMEM * pData, UINT8 bCompleteAccess)。收到 SDO 下载请求时调用,为 NULL 则执行标准 SDO 下载函数
NonVolatileOffset无符号 32 位非易失性内存中的偏移量,对象需作为备份参数存储(加载)时生效

对象字典条目描述示例

  • 变量(VARIABLE):
    TOBJECT VarObj_ODEntryDesc = { NULL, NULL, 0x6000, // 前序指针、后序指针、对象索引 {DEFTYPE_UNSIGNED32, 0 | (OBJCODE_VAR << 8)}, // 数据类型、对象标志(最大子索引 0,对象代码 VAR) &VarObjectEntryDesc, // 条目描述 VarObjName, // 对象名称 &u32VarObject, // 本地内存指针 NULL, NULL, 0x0000 // 读取函数、写入函数、非易失性偏移量 };
  • 数组(ARRAY)
    TOBJECT ArrObj_ODEntryDesc = { NULL, NULL, 0x9000, // 前序指针、后序指针、对象索引 {DEFTYPE_UNSIGNED32, 5 | (OBJCODE_ARR << 8)}, // 数据类型、对象标志(最大子索引 5,对象代码 ARR) ArrObjEntryDesc, // 条目描述数组 ArrObjName, // 对象名称 &ArrObj, // 本地内存指针 NULL, NULL, 0x0000 // 读取函数、写入函数、非易失性偏移量 };
  • 记录(RECORD):
    TOBJECT RecObj_ODEntryDesc = { NULL, NULL, 0x7000, // 前序指针、后序指针、对象索引 {DEFTYPE_RECORD, 4 | (OBJCODE_REC << 8)}, // 数据类型、对象标志(最大子索引 4,对象代码 REC) RecObjEntryDesc, // 条目描述数组 RecObjName, // 对象名称 &RecObj, // 本地内存指针 NULL, NULL, 0x0000 // 读取函数、写入函数、非易失性偏移量 };

7.5 索引范围

索引范围取决于使用的 EtherCAT 协议,详见 [5]。SSC 中使用的基础索引范围如下:

表 6:基础对象索引范围

索引范围描述
0x0000 – 0x0FFF数据类型区域
0x1000 – 0x1FFF通信区域
0x1600 – 0x19FFRxPDO

来源:AN_ET9300.pdf

用作个人学习和分享,侵删

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 9:43:52

福建土楼围屋:客家人大年初一的祭祖祷告

福建土楼围屋&#xff1a;客家人大年初一的祭祖祷告 在福建西南部连绵的山峦之间&#xff0c;一座座圆形或方形的土楼静静矗立&#xff0c;历经数百年风雨。每逢大年初一清晨&#xff0c;薄雾未散&#xff0c;土楼中央的祖堂前便已燃起香火。年长的族人手持黄纸&#xff0c;面向…

作者头像 李华
网站建设 2026/4/16 16:34:16

曾贝贝湖南卫视跨年首秀搭档徐佳莹 《身骑白马》融合舒曼金曲惊艳全场

12月31日晚&#xff0c;湖南卫视2025-2026跨年演唱会在海口盛大举行。在一众精彩表演中&#xff0c;00后钢琴家曾贝贝与金曲歌后徐佳莹合作的《身骑白马》成为整晚最具艺术深度与情感张力的舞台之一。这位年仅21岁的英国皇家音乐学院学生&#xff0c;以不凡的钢琴技艺和独特的艺…

作者头像 李华
网站建设 2026/4/18 5:29:57

Ubuntu22.04(ROS2 humble)小车仿真环境搭建

博客地址&#xff1a;https://www.cnblogs.com/zylyehuo/下载 mobile-3d-lidar-simmobile-3d-lidar-sim&#xff1a;ROS2 Humble 社区中最轻量、专门用于 3D 雷达 仿真的项目这个项目结构非常简单&#xff0c;只有一个机器人模型&#xff0c;且原生配置了 Velodyne 3D 雷达 插件…

作者头像 李华
网站建设 2026/4/18 8:02:52

基于YOLO的咖啡店物品检测系统

文章目录 毕设救星!从0到1打造基于YOLO的咖啡店物品检测系统,让你的毕设亮眼过人 一、项目背景:咖啡店为啥需要物品检测? 二、核心技术:YOLO系列该怎么选? 1. YOLOv5 2. YOLOv8 3. YOLOv10 三、项目目标:我们的系统要实现哪些功能? 四、数据准备:模型的“养料”从哪来…

作者头像 李华
网站建设 2026/4/18 8:01:49

企业批量生成数字人视频?Sonic提供API解决方案

企业批量生成数字人视频&#xff1f;Sonic提供API解决方案 在短视频日更、直播常态化、AI内容泛滥的今天&#xff0c;企业对“真人出镜”内容的需求并未减弱&#xff0c;反而更加迫切——用户渴望真实感&#xff0c;但真人拍摄成本高、效率低、难以规模化。于是&#xff0c;一个…

作者头像 李华
网站建设 2026/4/3 3:45:50

神经符号方法在数学问题分解推理中的应用

神经符号方法在数学问题分解推理中的应用关键词&#xff1a;神经符号方法、数学问题分解推理、人工智能、机器学习、符号推理、神经网络摘要&#xff1a;本文深入探讨了神经符号方法在数学问题分解推理中的应用。首先介绍了研究的背景&#xff0c;包括目的、预期读者、文档结构…

作者头像 李华