跳到主要内容

Slave API

通过 master.getSlave(n) 访问(1-based 索引)或 master.Slaves() 获取列表。

快速开始

索引访问

Slave slave = master.getSlave(1);            // 第1个从站(1-based)
List<Slave> all = master.Slaves(); // 从站列表
int count = master.SlaveCount(); // 从站总数

组访问

// 设置从站分组和分频器
master.getSlave(2).Group((byte) 1);
master.Divider((byte) 1, (byte) 4);

int activeGroups = master.ActiveGroupCount();
提示

组相关属性详见 从站分组

地址访问

// 物理配置地址(自动分配)
short addr = slave.ConfigAddr();

// 别名地址(EEPROM 中配置,可选)
short alias = slave.AliasAddress();

// 按地址查找
Slave target = master.Slaves().stream()
.filter(s -> s.ConfigAddr() == 0x1001)
.findFirst().orElse(null);

标识访问

String name = slave.Name();              // 设备名称
String driveName = slave.DriveName(); // 驱动名称(SDO 0x1008)
int vendorId = slave.VendorId(); // 厂商 ID
int productId = slave.ProductId(); // 产品 ID
int revision = slave.RevId(); // 修订号
int serial = slave.SerialNumber(); // 序列号

// 按名称查找
Slave target = master.Slaves().stream()
.filter(s -> "EL2008".equals(s.Name()))
.findFirst().orElse(null);

协议访问

协议方法说明
PDOslave.PDO()过程数据对象,实时 IO 数据读写
CoEslave.CoE()CANopen over EtherCAT,SDO 对象字典访问
CiA 402slave.CiA402()伺服驱动器协议,状态机管理与使能控制
CiA 401slave.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 输入输出

推荐方式 — ByteBuffer 零拷贝访问:

ByteBuffer inBuf = slave.PDO().GetInputByteBuffer();
ByteBuffer outBuf = slave.PDO().GetOutputByteBuffer();

short statusWord = inBuf.getShort(0);
int actualPosition = inBuf.getInt(2);

outBuf.putShort(0, (short) 0x000F);
outBuf.putInt(2, 10000);

EMCY 紧急消息

EtherCAT 从站在检测到异常时会发送 EMCY(Emergency)紧急消息。通过 slave.CoE() 访问,详见 CoE — EMCY 紧急消息

// 获取紧急消息历史
List<CoE.EmergencyMessage> history = slave.CoE().GetEmergencyHistory();
for (CoE.EmergencyMessage msg : history) {
System.out.printf("错误码: 0x%04X, 寄存器: 0x%02X%n",
msg.ErrorCode, msg.ErrorRegister);
}

// 清除紧急消息历史
slave.CoE().ClearEmergencyHistory();

拓扑查询

通过 master.TopologyChildren / master.TopologyRoots 获取拓扑关系,实现拓扑树的遍历。

// 重建拓扑(通常在进入 OP 后调用一次)
master.rebuildTopology();

// 遍历拓扑树
void printTree(int slaveIdx, int depth) {
String indent = " ".repeat(depth * 2);
Slave slave = master.getSlave(slaveIdx);
System.out.printf("%s[%d] %s%n", indent, slaveIdx, slave.Name());

for (int child : master.TopologyChildren(slaveIdx)) {
printTree(child, depth + 1);
}
}

for (int root : master.TopologyRoots()) {
printTree(root, 0);
}