Slave API
通过 master.Slaves[n] 访问(0-based 索引)。
快速开始
索引访问
DarraEtherCAT.Slave slave = master.Slaves[0]; // 第1个从站(0-based)
int count = master.Slaves.Count; // 从站总数
组访问
DarraEtherCAT.Slave servo = master.Groups[1][0]; // 组1(默认组)第1个从站
DarraEtherCAT.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 输入输出。
进 OP 后把 packed 结构体映射到过程映像:输入方向只读、输出方向改字段即写总线,任意线程均可用:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct InPdo
{
public ushort StatusWord;
public int ActualPosition;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct OutPdo
{
public ushort ControlWord;
public int TargetPosition;
}
ref readonly InPdo inputs = ref slave.PDO.InputsMapping<InPdo>();
ref OutPdo outputs = ref slave.PDO.OutputsMapping<OutPdo>();
outputs.ControlWord = 0x000F;
Console.WriteLine($"当前位置: {inputs.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(DarraEtherCAT.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);
}
// 注: ParentStation 实际是从站索引 1-based, 不是 station address; 0 表示父节点是主站
foreach (var slave in master.Slaves.Where(s => s.Topology == 1 || s.ParentStation == 0))
PrintTree(slave, 0);