主站对象字典 (Master OD)
符合 ETG.1510 标准的主站对象字典, 提供主站身份信息、从站配置 / 状态 / 诊断数据, 供外部诊断工具和 HMI 通过标准 SDO 接口访问。
ETG.1510 标准
主站对象字典按照 ETG.1510 规范实现, 配合 邮箱网关 使用可实现远程诊断工具对主站的标准访问。
对象索引总览
| 索引 | 名称 | 子索引数 | 读写 | 说明 |
|---|---|---|---|---|
| 0x1000 | Device Type | 0 | 只读 | 0x00001389 (EtherCAT Master) |
| 0x1008 | Device Name | 0 | 只读 | "Darra EtherCAT Master" |
| 0x1009 | Hardware Version | 0 | 只读 | x64 |
| 0x100A | Software Version | 0 | 只读 | SDK 版本号 |
| 0x1018 | Identity Object | 4 | 只读 | 主站身份信息 |
| 0x8nnn | Configuration Data | 40 | 只读 | 第 n 个从站的配置数据 |
| 0x9nnn | Information Data | 32 | 只读 | 第 n 个从站的检测信息 |
| 0xAnnn | Diagnosis Data | 19 | 部分可写 | 第 n 个从站的诊断数据 |
| 0xF002 | Detect Modules | 3 | 只读 | 从站扫描状态 |
| 0xF120 | Master Diag Data | 16 | 只读 | 主站诊断数据 |
| 0xF200 | Diag Interface Control | 16 | 可写 | 诊断接口控制 |
备注
nnn = 从站编号 (1-based), 索引根据从站数量动态生成。
MasterObjectDictionary
namespace darra::ethercat {
class MasterObjectDictionary {
public:
MasterObjectDictionary(dll_t& dll, uint16_t master);
std::optional<ec_master_identity_t> master_identity();
std::optional<ec_master_diag_data_t> master_diag_data();
uint16_t ALStatusCode(uint16_t slaveIndex);
int16_t SlaveLinkQuality(uint16_t slaveIndex);
uint32_t PdoLostFrames(uint8_t group = 0);
uint32_t PdoConsecutiveLost(uint8_t group = 0);
uint32_t PdoMaxConsecutiveLost(uint8_t group = 0);
};
}
直接构造:
MasterObjectDictionary od(dll, master.MasterNumber());
master_identity()
std::optional<ec_master_identity_t> master_identity();
获取主站身份 (ETG.1510 0x1018)。
master_diag_data()
std::optional<ec_master_diag_data_t> master_diag_data();
获取主站诊断数据 (ETG.1510 0xF120)。
ALStatusCode()
uint16_t ALStatusCode(uint16_t slaveIndex);
获取从站 AL Status Code (ETG.1510 0xAnnn:1)。
SlaveLinkQuality()
int16_t SlaveLinkQuality(uint16_t slaveIndex);
获取从站链路质量 (ETG.1510 0xAnnn:3)。
PdoLostFrames() / PdoConsecutiveLost() / PdoMaxConsecutiveLost()
uint32_t PdoLostFrames(uint8_t group = 0);
uint32_t PdoConsecutiveLost(uint8_t group = 0);
uint32_t PdoMaxConsecutiveLost(uint8_t group = 0);
PDO 丢帧统计: 累计丢帧 / 当前连续丢帧 / 历史最大连续丢帧 (按组)。
完整示例
#include "ethercat.hpp"
using namespace darra::ethercat;
void dump_master_od(EtherCATMaster& master) {
MasterObjectDictionary od(master.Dll(), master.MasterNumber());
// 主站身份
auto identity = od.master_identity();
if (identity) {
printf("VendorId: 0x%08X\n", identity->VendorId);
printf("设备名称: %s\n", identity->DeviceName);
printf("软件版本: %s\n", identity->SwVersion);
}
// 主站诊断
auto diag = od.master_diag_data();
if (diag) {
printf("周期帧频率: %u Hz\n", diag->CyclicFramesPerSec);
printf("丢帧率: %.2f%%\n", diag->CyclicLostFrames / 100.0);
printf("主站状态: 0x%04X\n", diag->MasterState);
}
// 从站诊断
for (uint16_t i = 1; i <= master.SlaveCount(); ++i) {
printf("从站%d: AL_Code=0x%04X, LinkQuality=%d\n",
i, od.ALStatusCode(i), od.SlaveLinkQuality(i));
}
// PDO 丢帧统计
for (uint8_t g = 0; g < 8; ++g) {
uint32_t total = od.PdoLostFrames(g);
if (total > 0) {
printf("组 %d: 累计=%u, 连续=%u, 最大连续=%u\n",
g, total, od.PdoConsecutiveLost(g), od.PdoMaxConsecutiveLost(g));
}
}
}