跳到主要内容

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

协议访问​

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