跳到主要内容

主站对象字典 (Master OD)

符合 ETG.1510 标准的主站对象字典,提供主站身份信息、从站配置/状态/诊断数据,供外部诊断工具和 HMI 通过标准 SDO 接口访问。

通过 master.master_od() 访问。​

ETG.1510 标准

主站对象字典按照 ETG.1510 规范实现,使用标准 CoE 索引约定。与从站 CoE 对象字典不同,这里是主站自身暴露的诊断对象。配合邮箱网关使用,可实现远程诊断工具对主站的标准访问。

对象索引总览​

类别索引名称子索引数读写说明
基本0x1000Device Type0只读0x00001389(EtherCAT Master)
基本0x1008Device Name0只读"Darra EtherCAT Master"
基本0x1009Hardware Version0只读"1.0"
基本0x100ASoftware Version0只读SDK 版本号
身份0x1018Identity Object4只读主站身份信息(见下方子索引表)
从站0x8nnnConfiguration Data40只读第 n 个从站的配置数据
从站0x9nnnInformation Data32只读第 n 个从站的检测信息
从站0xAnnnDiagnosis Data19部分可写第 n 个从站的诊断数据
扫描0xF002Detect Modules3只读从站扫描状态
诊断0xF120Master Diag Data16只读主站诊断数据
诊断0xF200Diag Interface Control16可写诊断接口控制
备注

nnn = 从站编号 (1-based),索引根据 master.slave_count() 动态生成。例如 3 个从站时,0x8001 ~ 0x8003、0x9001 ~ 0x9003、0xA001 ~ 0xA003 均可访问。

Rust 侧实际实现的子索引

对象模型按 ETG.1510;Rust 的 MasterObjectDictionary 目前只实现下列子索引,其余子索引读回 SDO abort(read_object() 返回 None,不会拿全 0 冒充成功):

对象已实现子索引
0x8nnn0(Count=40)、1 Vendor ID、2 Product Code、3 Revision Number、4 Serial Number
0x9nnn0(Count=32)、1 AL 状态(u8)、2 AL 状态码(u16)
0xAnnn0(Count=19)、1 AL 状态(u8)、2 AL 状态码(u16;写该子索引 = 写从站 AL Control 寄存器 0x0120)、3 链路质量(u16)
0xF0020、1、2(扫描到的从站数,u16)、3
0xF1200(Count=16)、1~4(丢帧计数 / 帧频)、5 Master State
0xF2000(Count=16)、16(复位请求电平原值)

0x1018 — 主站身份 (Identity Object)​

子索引名称类型读写值说明
0Number of Entriesu8只读4固定
1Vendor IDu32只读0x00001164ETG 分配,固定值
2Product Codeu32只读0x00000001固定值
3Revision Numberu32只读自动自动从 DLL 版本派生
4Serial Numberu32只读自动自增每个实例自动分配 0, 1, 2...

0x8nnn — 从站配置数据(ETG.1510 模型)​

每个从站对应一个 0x8nnn 对象,包含 ENI 中配置的静态信息。下表为 ETG.1510 对象模型;Rust 实际实现的子索引见上文 caution。

子索引名称类型读写说明
0Number of Entriesu8只读固定 40
1Fixed Station Addressu16只读配置地址 (ConfigAddr)
2TypeString只读设备类型字符串
3NameString只读设备名称
4Device Typeu32只读设备类型编码
5Vendor IDu32只读厂商 ID
6Product Codeu32只读产品代码
7Revision Numberu32只读修订号
8Serial Numberu32只读序列号
33Mailbox Out Sizeu16只读SM0 邮箱输出大小
34Mailbox In Sizeu16只读SM1 邮箱输入大小
35Link Statusu8只读端口链路状态
36Link Presetu8只读端口链路预设
37Flagsu8只读从站标志
38Port Physicsu16只读端口物理类型
39Mailbox Protocolsu16只读支持的邮箱协议
40Diag History Supportedu8只读是否支持 0x10F3 诊断历史

0x9nnn — 从站检测信息(ETG.1510 模型)​

每个从站对应一个 0x9nnn 对象,包含运行时检测到的实际信息。下表为 ETG.1510 对象模型;Rust 实际实现的子索引见上文 caution。

子索引名称类型读写说明
0Number of Entriesu8只读固定 32
1Station Addressu16只读实际配置地址
5Vendor IDu32只读检测到的厂商 ID
6Product Codeu32只读检测到的产品代码
7Revision Numberu32只读检测到的修订号
8Serial Numberu32只读检测到的序列号
32DL Statusu16只读DL Status 寄存器 (ESC 0x0110)

0xAnnn — 从站诊断数据(ETG.1510 模型)​

每个从站对应一个 0xAnnn 对象,包含实时诊断数据。每次读取时自动更新。下表为 ETG.1510 对象模型;Rust 实际实现的子索引见上文 caution(注意 sub 1 是 u8 AL 状态、sub 2 读写 AL 状态码、sub 3 是链路质量)。

子索引名称类型读写说明
0Number of Entriesu8只读固定 19
1AL Statusu16只读当前 AL 状态
2AL Controlu16可写写入时同步到从站
3Last AL Status Codeu16只读最近一次 AL 错误码
4Link Conn. Statusu8只读端口链路连接状态
5Link Controlu8只读链路控制
6-9Fixed Addr Conn. Port 0-3u16只读各端口连接的从站配置地址
10-13Frame Error Port 0-3u32只读各端口帧错误计数
14Cyclic WC Error Counteru32只读周期性工作计数器错误
15Slave Not Present Counteru32只读从站不在线计数
16Abnormal State Change Counteru32只读异常状态变化计数
17Disable Auto Link Controlu8只读自动链路控制禁用标志
18Last CoE/SoE Protocol Erroru32只读最近一次协议错误码
19New Diag Messagesu8只读是否有新诊断消息

0xF120 — 主站诊断数据​

子索引名称类型读写说明
0Number of Entriesu8只读固定 16
1Cyclic Lost Framesu32只读周期性丢帧计数(内核 5 秒滑动窗口值,不是百分比)
2Acyclic Lost Framesu32只读非周期性丢帧计数(内核按超时帧统计,同为 5 秒滑动窗口值)
3Cyclic Frames/Secondu32只读每秒周期帧数
4Acyclic Frames/Secondu32只读每秒非周期帧数(内核不填该字段,读数恒 0)
5Master Stateu16只读主站当前 EtherCAT 状态
Master State 的子索引

ETG.1510 Table 13 把 Master State 定义在子索引 16;本腿由子索引 5 返回。

0xF200 — 诊断接口控制​

子索引名称类型读写说明
0Number of Entriesu8只读固定 16
16Reset Diag Infou8可写写入 1 复位所有诊断计数器

方法​

vendor_id() / product_code() / revision_number() / serial_number()​

pub fn vendor_id(&self) -> u32
pub fn product_code(&self) -> u32
pub fn revision_number(&self) -> u32
pub fn serial_number(&self) -> u32

主站身份信息便捷访问 (对应 0x1018:01..04).

read_object()​

pub fn read_object(&self, index: u16, subindex: u8) -> Option<Vec<u8>>

读取主站对象字典中指定索引的数据。

参数:

  • index — 对象索引(如 0x1018、0x8001、0xA001)
  • subindex — 子索引

返回值:

  • Option<Vec<u8>> — 读取的原始数据,未知对象返回 None

write_object()​

pub fn write_object(&self, index: u16, subindex: u8, data: &[u8]) -> bool

写入主站对象字典。仅部分对象支持写入(见上方各对象表格的读写列)。

参数:

  • index — 对象索引
  • subindex — 子索引
  • data — 要写入的数据

返回值:

  • bool — 写入成功返回 true

object_name()​

pub fn object_name(&self, index: u16) -> &str

获取对象的名称。未知索引返回 "Unknown"。

subindex_count()​

pub fn subindex_count(&self, index: u16) -> u8

获取对象的子索引数量。

supported_object_indices()​

pub fn supported_object_indices(&self) -> Vec<u16>

获取当前支持的所有对象索引列表(固定索引 + 按从站数量动态生成的 0x8nnn/0x9nnn/0xAnnn)。

完整示例​

let od = master.master_od();

// 遍历所有从站的诊断数据
for i in 1..=master.slave_count() {
let diag_idx = 0xA000 | i;
let slave = master.slave(i);

// 从站名称走 Slave 扁平方法
let name = slave.name();

// 读取 AL 状态 (u8, 子索引 1) 与 AL 状态码 (u16, 子索引 2)
let al_status = od.read_object(diag_idx, 1)
.map(|d| d[0])
.unwrap_or(0);

let al_code = od.read_object(diag_idx, 2)
.map(|d| u16::from_le_bytes([d[0], d[1]]))
.unwrap_or(0);

// 链路质量 (u16, 子索引 3)
let link_quality = od.read_object(diag_idx, 3)
.map(|d| u16::from_le_bytes([d[0], d[1]]))
.unwrap_or(0);

println!("从站{} [{}]: AL=0x{:02X}, Code=0x{:04X}, Quality={}",
i, name, al_status, al_code, link_quality);
}

// 复位所有诊断
od.write_object(0xF200, 16, &[1]);

命名约定​

Rust SDK 的方法名统一按 Rust 风格(snake_case + 动词优先)命名:

用途Rust 方法
列出主站 OD 支持的对象索引supported_object_indices()
获取从站对象描述OdList::get_object_description(mi, si, index)(返回 OdObject 元数据)
获取从站条目描述OdList::get_entry_description(mi, si, index, sub)(返回 ObjectEntry)
带 abort code 与 WKC 的 SDO 扩展读写CoEInstance::sdo_read_ex / sdo_write_ex(返回 SdoReadResultEx / SdoWriteResultEx)
批量 SDO 读取CoEInstance::read_multiple 同步 + tokio spawn_blocking 包装异步

主站 OD (MasterObjectDictionary) 本身只暴露 read_object / write_object / object_name / subindex_count / supported_object_indices 与四个身份便捷方法; 从站对象字典的描述符 / 扩展读写在 CoE 页。