跳到主要内容

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

协议访问

协议属性说明
PDOslave.PDO过程数据对象,实时 IO 数据读写
CoEslave.CoECANopen over EtherCAT,SDO 对象字典访问
CiA 402slave.CoE.CiA402伺服驱动器协议,状态机管理与使能控制
CiA 401slave.CoE.CiA401通用 I/O 模块协议,数字/模拟输入输出
MDPslave.MDP模块化设备协议,模块检测与自动配置
SoEslave.SoEServo over EtherCAT,伺服驱动器参数
FoEslave.FoEFile over EtherCAT,文件传输
EoEslave.EoEEthernet over EtherCAT,以太网隧道
AoEslave.AoEADS over EtherCAT,Beckhoff ADS 协议
VoEslave.VoEVendor over EtherCAT,厂商特定协议
FSoEslave.FSoEFunctional 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);