Slave API
通过 master.Slaves[n] 访问(0-based 索引)。
快速开始
索引访问
Slave slave = master.Slaves[0]; // 第1个从站(0-based)
int count = master.Slaves.Count; // 从站总数
组访问
Slave servo = master.Groups[0][0]; // 默认组第1个从站
Slave io = master.Groups[1][2]; // 组1第3个从站
int groupCount = master.Groups[1].Count; // 组1从站数
提示
组相关属性详见 从站分组。
地址访问
// 物理配置地址(自动分配)
ushort addr = slave.ConfigAddr; // 如 0x1001
// 别名地址(EEPROM 中配置,可选)
ushort alias = slave.AliasAddress;
// 按地址查找
var target = master.Slaves.FirstOrDefault(s => s.ConfigAddr == 0x1001);
标识访问
string name = slave.Name; // 设备名称
string driveName = slave.DriveName; // 驱动名称(SDO 0x1008)
uint vendorId = slave.VendorId; // 厂商 ID
uint productId = slave.ProductId; // 产品 ID
uint revision = slave.RevId; // 修订号
uint serial = slave.SerialNumber; // 序列号
// 按名称查找
var target = master.Slaves.FirstOrDefault(s => s.Name == "EL2008");
协议访问
| 协议 | 属性 | 说明 |
|---|---|---|
| PDO | slave.PDO | 过程数据对象,实时 IO 数据读写 |
| CoE | slave.CoE | CANopen over EtherCAT,SDO 对象字典访问 |
| CiA 402 | slave.CoE.CiA402 | 伺服驱动器协议,状态机管理与使能控制 |
| CiA 401 | slave.CoE.CiA401 | 通用 I/O 模块协议,数字/模拟输入输出 |
| MDP | slave.MDP | 模块化设备协议,模块检测与自动配置 |
| SoE | slave.SoE | Servo over EtherCAT,伺服驱动器参数 |
| FoE | slave.FoE | File over EtherCAT,文件传输 |
| EoE | slave.EoE | Ethernet over EtherCAT,以太网隧道 |
| AoE | slave.AoE | ADS over EtherCAT,Beckhoff ADS 协议 |
| VoE | slave.VoE | Vendor over EtherCAT,厂商特定协议 |
| FSoE | slave.FSoE | Functional Safety over EtherCAT,功能安全协议 |
PDO 数据读写
详细的 PDO 读写方式请参见 PDO 输入输出。
推荐方式 — 结构体映射(零拷贝):
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct ServoInput
{
public ushort StatusWord;
public int ActualPosition;
public int ActualVelocity;
}
ref ServoInput input = ref slave.PDO.InputsMapping<ServoInput>();
Console.WriteLine($"当前位置: {input.ActualPosition}");
EMCY 紧急消息
EtherCAT 从站在检测到异常时会发送 EMCY(Emergency)紧急消息。通过 slave.CoE 访问,详见 CoE — EMCY 紧急消息。
// 获取紧急消息历史
var history = slave.CoE.GetEmergencyHistory();
foreach (var msg in history)
{
Console.WriteLine($"错误码: 0x{msg.ErrorCode:X4}, 寄存器: 0x{msg.ErrorRegister:X2}");
}
// 清除紧急消息历史
slave.CoE.ClearEmergencyHistory();
拓扑查询
通过从站的 Children 属性获取子从站列表,实现拓扑树的遍历。
// 获取从站的子从站
var children = slave.Children;
// 遍历拓扑树
void PrintTree(Slave s, int depth)
{
var indent = new string(' ', depth * 2);
Console.WriteLine($"{indent}[{s.SlaveNum}] {s.Name}");
foreach (var child in s.Children)
PrintTree(child, depth + 1);
}
foreach (var slave in master.Slaves.Where(s => s.Topology == 1 || s.ParentStation == 0))
PrintTree(slave, 0);