跳到主要内容

主站对象字典 (Master OD)

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

ETG.1510 标准

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

对象索引总览

索引名称子索引数读写说明
0x1000Device Type0只读0x00001389 (EtherCAT Master)
0x1008Device Name0只读"Darra EtherCAT Master"
0x1009Hardware Version0只读x64
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), 索引根据从站数量动态生成。

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));
}
}
}