跳到主要内容

主站对象字典 (Master OD)

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

ETG.1510 标准

主站对象字典按照 ETG.1510 规范实现, 配合 邮箱网关 使用可实现远程诊断工具对主站的标准访问。

对象索引总览​

索引名称类别子索引数读写说明
0x1000Device Type身份0只读0x00001389 (EtherCAT Master)
0x1008Device Name身份0只读"Darra EtherCAT Master"
0x1009Hardware Version身份0只读x64
0x100ASoftware Version身份0只读SDK 版本号
0x1018Identity Object身份4只读主站身份信息
0x8nnnConfiguration Data配置40只读第 n 个从站的配置数据
0x9nnnInformation Data信息32只读第 n 个从站的检测信息
0xAnnnDiagnosis Data诊断19部分可写第 n 个从站的诊断数据
0xF002Detect Modules诊断3只读从站扫描状态
0xF120Master Diag Data诊断16只读主站诊断数据
0xF200Diag 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)。返回的 ec_master_identity_t 字段:

  • VendorId — 厂商 ID
  • ProductCode — 产品代码
  • RevisionNo — 修订号
  • SerialNo — 序列号
  • DeviceName — 设备名称
  • HwVersion — 硬件版本
  • SwVersion — 软件版本

master_diag_data()​

std::optional<ec_master_diag_data_t> master_diag_data();

获取主站诊断数据 (ETG.1510 0xF120),一次返回整个结构;字段与 ETG.1510 子索引一一对应:

  • CyclicLostFrames — 周期丢帧累计计数 (内核丢帧计数器原值,不是百分比)
  • AcyclicLostFrames — 非周期丢帧计数 (当前实现固定返回 0,暂不区分周期 / 非周期丢帧)
  • CyclicFramesPerSec — 每秒周期帧数
  • AcyclicFramesPerSec — 每秒非周期帧数 (当前实现固定返回 0)
  • MasterState — 主站当前 EtherCAT 状态

ALStatusCode()​

uint16_t ALStatusCode(uint16_t slaveIndex);

获取从站 AL Status Code (ETG.1510 0xAnnn:1)。

SlaveLinkQuality()​

int16_t SlaveLinkQuality(uint16_t slaveIndex);

获取从站链路质量百分比 (100 = 完美)。

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("周期帧丢失计数: %u\n", diag->CyclicLostFrames);
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));
}
}
}