Slave 属性与方法
通过 master.Slaves[n] 访问(0-based 索引)。
属性
| 类别 | 属性 | 类型 | 读写 | 说明 |
|---|---|---|---|---|
| 基本标识 | SlaveNum | ushort | 只读 | 从站编号(1-based) |
| Index | int | 只读 | 从站索引(SlaveNum 别名) | |
| Name | string | 只读 | 设备名称(从 EEPROM group_name 读取) | |
| DriveName | string | 只读 | 驱动/设备名称(从 SDO 0x1008 读取) | |
| 设备信息 | VendorId | uint | 只读 | 制造商 ID(从 SII EEPROM 读取) |
| VendorName | string? | 只读 | 制造商名称(从 ESI 文件读取) | |
| ProductId | uint | 只读 | 产品 ID | |
| RevId | uint | 只读 | 修订版本号 | |
| SerialNumber | uint | 只读 | 序列号(从 SII EEPROM 读取) | |
| Dtype | ushort | 只读 | 设备类型标识(可转换为 EcDeviceType) | |
| HasMDP | bool | 只读 | 是否支持模块化设备配置文件(ETG.5001) | |
| BlockLRW | bool | 只读 | LRW 逻辑读写操作阻止标志 | |
| 地址 | ConfigAddr | ushort | 只读 | 物理配置地址 |
| AliasAddress | ushort | 只读 | 别名地址 | |
| 状态 | State | EcState | 只读 | 从站当前状态 |
| ErrorCode | EcALState | 只读 | 错误码 | |
| IsLost | bool | 只读 | 从站是否丢失(断开连接) | |
| 拓扑 | Topology | byte | 只读 | 拓扑类型 (0=无链接, 1=端点, 2=中间, 3=分支, 4=交叉) |
| ParentStation | ushort | 只读 | 父从站的站地址 | |
| ParentPort | byte | 只读 | 父端口号 | |
| EntryPort | byte | 只读 | 入口端口号 | |
| ActivePorts | byte | 只读 | 激活端口位掩码 | |
| PhysicalType | byte | 只读 | 物理端口类型 | |
| ChildCount | int | 只读 | 子模块数量 | |
| PDO 数据 | Ibits / Obits | ushort | 只读 | 输入/输出数据位数 |
| Ibytes / Obytes | uint | 只读 | 输入/输出数据字节数 | |
| Ioffset / Ooffset | uint | 只读 | 输入/输出数据偏移 | |
| Istartbit / Ostartbit | byte | 只读 | 输入/输出起始位 | |
| ESI/配置 | HasEsi | bool | 只读 | 是否已加载 ESI 文件 |
| Esiname | string? | 只读 | ESI 文件名 | |
| EsiVersion | string | 只读 | ESI 版本号 | |
| ConfigByEsi | dynamic? | 只读 | 从 ESI 文件获取的设备配置 | |
| EEPROM | Eep8ByteAddressing | bool | 只读 | EEPROM 寻址模式(true=8字节, false=4字节) |
| EepPDI | byte | 只读 | 物理设备接口(PDI)类型 | |
| EbusCurrent | short | 只读 | E-bus 电流消耗(mA) | |
| SIIindex | ushort | 只读 | SII EEPROM 配置索引 | |
| 邮箱 | MbxProto | MailboxType | 只读 | 支持的邮箱协议类型(位掩码) |
| MbxLength | ushort | 只读 | 邮箱发送缓冲区大小 | |
| MbxReadLength | ushort | 只读 | 邮箱接收缓冲区大小 | |
| MbxReadOffset / MbxWriteOffset | ushort | 只读 | 邮箱读/写偏移 | |
| MbxCount | byte | 只读 | 邮箱协议计数器 | |
| 协议详情 | CoEdetails | EcCoEDetails | 只读 | CoE 协议功能标志(SDO/PDO Assign/Complete Access 等) |
| EoEdetails | EcEoEDetails | 只读 | EoE 协议功能标志(发送帧/接收帧/IP 参数等) | |
| FoEdetails | byte | 只读 | FoE 协议详情(来自 SII EEPROM) | |
| SoEdetails | byte | 只读 | SoE 协议详情(来自 SII EEPROM) | |
| FMMU | FMMU0Function | byte | 只读 | FMMU0 功能类型(bit 0=输出, bit 1=输入) |
| FMMU1Function | byte | 只读 | FMMU1 功能类型 | |
| FMMU2Function | byte | 只读 | FMMU2 功能类型 | |
| FMMU3Function | byte | 只读 | FMMU3 功能类型 | |
| DC | HasDC | bool | 只读 | 是否支持 DC,详见 DC 同步 |
| DCActive | ushort | 只读 | DC 激活状态(0=禁用, 非0=已激活),详见 DC 同步 | |
| DCCycle0 | int | 只读 | SYNC0 周期(纳秒),详见 DC 同步 | |
| DCCycle1 | int | 只读 | SYNC1 周期(纳秒),详见 DC 同步 | |
| DCShift | int | 只读 | 相位偏移(纳秒),详见 DC 同步 | |
| PropagationDelay | int | 只读 | 帧从主站到达此从站的传播延迟(纳秒),详见 DC 同步 | |
| PDelay | int | 只读 | PropagationDelay 别名,传播延迟(纳秒) | |
| DCNext | ushort | 只读 | DC 链中下一个从站的索引 | |
| DCPrevious | ushort | 只读 | DC 链中上一个从站的索引 | |
| DCParentPort | int | 只读 | DC 父端口 | |
| DCReceiveTimeA | int | 只读 | 端口 A 接收时间(纳秒) | |
| DCReceiveTimeB | int | 只读 | 端口 B 接收时间(纳秒) | |
| DCReceiveTimeC | int | 只读 | 端口 C 接收时间(纳秒) | |
| DCReceiveTimeD | int | 只读 | 端口 D 接收时间(纳秒) | |
| 拓扑扩展 | Children | List<Slave> | 只读 | 子从站列表(配合 ChildCount 使用,导航拓扑树) |
| SupportsFrameRepeat | bool | 只读 | 是否支持帧重复功能(ETG.1500 5.4.3) | |
| 冗余 | RedundancyActivated | bool | 只读 | 冗余是否激活 |
| PrimaryLinkBroken | bool | 只读 | 主链路是否断开 | |
| SecondaryLinkBroken | bool | 只读 | 副链路是否断开 | |
| 配置 | Group | byte | 读写 | 从站分组号(0-7,0=默认组,必须在 SAFE_OP 前设置),详见 从站分组 |
| IsOptional | bool | 读写 | 可选从站标记,缺席时不影响 WKC 检查、不触发组离线告警(必须在 OP 前设置) |
EcDeviceType 枚举值
public enum EcDeviceType : ushort
{
Undefined = 0, // 未定义
Static = 1, // 静态设备,无IO映射,如EK1100耦合器
InputNoMailbox = 2, // 输入设备(无邮箱)
OutputNoMailbox = 3, // 输出设备(无邮箱)
InputWithMailbox = 4, // 输入设备(有邮箱)
OutputWithMailbox = 5, // 输出设备(有邮箱)
IONoMailbox = 6, // 输入输出设备(无邮箱)
IOWithMailbox = 7 // 输入输出设备(有邮箱)
}
EcTopologyType / EcPortType 枚举值
public enum EcTopologyType : byte
{
NoLink = 0, // 无链接
EndPoint = 1, // 端点
Line = 2, // 中间节点(线性拓扑)
Fork = 3, // 分支点
Cross = 4 // 交叉点
}
public enum EcPortType : byte
{
NotUsed = 0, // 未使用
MII = 1, // MII
EBUS = 2, // EBUS
EBUSEnhanced = 3 // EBUS 增强型
}
MailboxType 枚举值
public enum MailboxType : ushort
{
ErrorMailbox = 0x00, // 错误邮箱
ADSOverEtherCAT = 0x01, // AoE
EthernetOverEtherCAT = 0x02, // EoE
CANopenOverEtherCAT = 0x03, // CoE
FileOverEtherCAT = 0x04, // FoE
ServoOverEtherCAT = 0x05, // SoE
VendorOverEtherCAT = 0x0F // VoE
}
EcCoEDetails 枚举值
[Flags]
public enum EcCoEDetails : byte
{
None = 0x00,
SDO = 0x01, // 支持 SDO
SDOInfo = 0x02, // 支持 SDO Info
PDOAssign = 0x04, // 支持 PDO Assign
PDOConfig = 0x08, // 支持 PDO Config
Startup = 0x10, // 支持 Startup
CompleteAccess = 0x20 // 支持 Complete Access
}
EcEoEDetails 枚举值
[Flags]
public enum EcEoEDetails : byte
{
None = 0x00,
SendFrame = 0x01, // 支持发送帧
ReceiveFrame = 0x02, // 支持接收帧
SetIPParam = 0x04, // 支持设置 IP 参数
GetIPParam = 0x08 // 支持获取 IP 参数
}
子对象
| 属性 | 类型 | 说明 |
|---|---|---|
| PDO | SlavePdo | PDO 数据访问器,详见 PDO 输入输出 |
| Events | SlaveEvents | 从站级事件,详见 从站事件 |
| Diagnostics | SlaveDiagnostics | 诊断信息访问器,详见 从站诊断 |
| Startup | StartupParameterList | 启动参数列表 |
| CoE | CoEInstance? | CANopen over EtherCAT,从站不支持时为 null |
| SoE | SoEInstance? | Servo over EtherCAT,从站不支持时为 null |
| FoE | FoEInstance? | File over EtherCAT,从站不支持时为 null |
| EoE | EoEInstance? | Ethernet over EtherCAT,从站不支持时为 null |
| AoE | AoEInstance? | ADS over EtherCAT,从站不支持时为 null |
| VoE | VoEInstance? | Vendor over EtherCAT,从站不支持时为 null |
| FSoE | FSoEInstance? | Functional Safety over EtherCAT,从站不支持时为 null |
| MDP | MdpInstance? | MDP 模块化设备,从站不支持时为 null |
| Esi | EsiInstance | ESI 文件加载器实例,提供 ESI 文件加载和解析功能 |
枚举描述
所有枚举统一使用 .GetDescription() 扩展方法获取中文描述:
EcState state = slave.State;
string desc = state.GetDescription(); // "OP"
StateCiA402 driveState = slave.CoE.CiA402.StateDrive;
string driveDesc = driveState.GetDescription(); // "运行使能"
ModeCiA402 mode = slave.CoE.CiA402.OperationMode;
string modeDesc = mode.GetDescription(); // "周期同步位置 (CSP)"
FSoEState fsoeState = slave.FSoE.State;
string fsoeDesc = fsoeState.GetDescription(); // "数据交换"
项目中所有枚举描述均通过 .GetDescription() 扩展方法获取,包括 EcState、EcALState、SDOError、FSoEState、FSoEError、StateCiA402、ModeCiA402 等。
诊断
从站诊断信息(通信异常率、冗余状态、DC 同步)通过 slave.Diagnostics 访问,详见 从站诊断。
ESI 方法
SetEsiFile(string esiFileName)
public bool SetEsiFile(string esiFileName)
设置从站使用的 ESI 文件。
返回值:
bool— 是否成功
ESI 实例
通过 slave.Esi 访问,提供 ESI 文件的加载和解析功能。
Esi.Loading(string esiFilePath)
public bool Loading(string esiFilePath)
加载 ESI 文件并提取启动参数(SDO 初始化配置)。
参数:
esiFilePath(string) — ESI XML 文件路径
返回值:
bool— 是否加载成功
示例:
bool ok = slave.Esi.Loading(@"C:\ESI\Beckhoff EL7xxx.xml");
if (ok)
Console.WriteLine($"已加载 {slave.Startup.Count} 个启动参数");
Esi.IsLoaded
public bool IsLoaded { get; }
检查 ESI 文件是否已加载。
EsiInstance 支持隐式布尔转换,可直接用于条件判断:
if (slave.Esi) // 等同于 slave.HasEsi
Console.WriteLine("ESI 已加载");
过程数据看门狗
SetWatchdog(uint timeoutMs)
public bool SetWatchdog(uint timeoutMs)
设置从站过程数据看门狗超时。从站在超时时间内未收到过程数据帧时触发看门狗错误(ALStatusCode 0x001B)。
参数:
timeoutMs(uint) — 超时时间(毫秒),0 = 禁用,最大 6553ms
返回值:
bool— 是否成功
应在 SafeOp 或 OP 状态下调用。
SetPdiWatchdog(int timeoutMs)
public bool SetPdiWatchdog(int timeoutMs)
设置从站 PDI 看门狗超时。PDI 看门狗监控从站本地应用(微控制器固件)是否正常运行。
参数:
timeoutMs(int) — 超时时间(毫秒),0 = 禁用
返回值:
bool— 是否成功
示例:
slave.SetWatchdog(100); // 100ms 超时
slave.SetWatchdog(0); // 禁用看门狗
GetWatchdogConfig()
public (ushort Divider, ushort PdiTimeout, ushort PdTimeout)? GetWatchdogConfig()
读取从站看门狗当前配置。返回 null 表示读取失败。
返回值:
Divider(ushort) — 看门狗分频器PdiTimeout(ushort) — PDI 看门狗超时值(分频器单位)PdTimeout(ushort) — 过程数据看门狗超时值(分频器单位)
示例:
var config = slave.GetWatchdogConfig();
if (config.HasValue)
Console.WriteLine($"PD超时: {config.Value.PdTimeout} × {config.Value.Divider * 0.04}µs");
GetWatchdogStatus()
public (bool Expired, byte Counter, ushort Divider, ushort TimeoutValue)? GetWatchdogStatus()
读取从站看门狗运行状态。返回 null 表示读取失败。
返回值:
Expired(bool) — 看门狗是否已过期Counter(byte) — 看门狗计数器(过期累计次数)Divider(ushort) — 当前分频器值TimeoutValue(ushort) — 当前超时值
示例:
var status = slave.GetWatchdogStatus();
if (status?.Expired == true)
Console.WriteLine($"看门狗过期! 计数: {status.Value.Counter}");
状态切换
SetState(EcState targetState, uint timeoutMs = 3000)
public bool SetState(EcState targetState, uint timeoutMs = 3000)
设置从站 EtherCAT 状态(带超时)。用于手动恢复单个从站或将从站切换到指定状态。
参数:
targetState(EcState) — 目标状态timeoutMs(uint) — 超时时间(毫秒),默认 3000ms
返回值:
bool— 是否成功
状态切换遵循 EtherCAT 标准状态机流程,协议层自动处理中间状态。例如从 INIT 切换到 OP 会自动经过 PreOp → SafeOp → OP。
示例:
// 手动恢复单个从站到 OP
if (slave.State != EcState.OP)
slave.SetState(EcState.OP);
// 将从站切换到 Init(重置)
slave.SetState(EcState.Init, timeoutMs: 5000);
ESC 寄存器访问 (高级)
直接读写从站 ESC (EtherCAT Slave Controller) 寄存器,用于故障诊断、自定义 ESC 操作、底层调试。冗余/双网口部署下自动选用可达路径。
正常使用 SDK 时无需调用 — 状态切换 / PDO / 邮箱等流程 SDK 已自动配置寄存器。此 API 用于深度诊断和特殊场景(例如读取错误计数器、强制端口策略、调试 ESI 烧写不生效等)。
寄存器定义见 ETG.1000.4 §6 / ETG.1000.6 §5(公开标准), 例如:
| 寄存器 | 说明 |
|---|---|
| 0x0000 | Type / Revision / Build(设备类型) |
| 0x0030 | AL Control(主站发起状态请求) |
| 0x0130 | AL Status(从站当前状态) |
| 0x0134 | AL Status Code(错误码) |
| 0x0300-0x030F | 端口 0-3 错误计数器 |
| 0x0400-0x043F | 看门狗配置 / 计数 |
ReadRegister(ushort, byte[], uint)
public bool ReadRegister(ushort registerAddress, byte[] data, uint length)
读取从站 ESC 寄存器(FPRD)。
参数:
registerAddress(ushort) — 寄存器地址(例如0x0130= AL Status)data(byte[]) — 接收缓冲区,长度 ≥ lengthlength(uint) — 读取字节数(1 / 2 / 4 等)
返回值:
bool— 成功返回true,失败(从站离线 / 超时)返回false
WriteRegister(ushort, byte[], uint)
public bool WriteRegister(ushort registerAddress, byte[] data, uint length)
写入从站 ESC 寄存器(FPWR)。
参数:
registerAddress(ushort) — 寄存器地址data(byte[]) — 写入数据length(uint) — 字节数
返回值:
bool— 成功返回true
示例:
var slave = master.Slaves[0];
// 读取 AL Status (0x0130, 2 字节)
byte[] alStatus = new byte[2];
if (slave.ReadRegister(0x0130, alStatus, 2))
{
ushort state = (ushort)(alStatus[0] | (alStatus[1] << 8));
Console.WriteLine($"AL Status = 0x{state:X4} (state={state & 0x0F}, err={(state & 0x10) != 0})");
}
// 读取 AL Status Code (0x0134, 错误码)
byte[] alCode = new byte[2];
slave.ReadRegister(0x0134, alCode, 2);
ushort code = (ushort)(alCode[0] | (alCode[1] << 8));
Console.WriteLine($"AL Status Code = 0x{code:X4}");
// 写 AL Control = 0x04 (请求 SafeOp)
slave.WriteRegister(0x0030, new byte[] { 0x04, 0x00 }, 2);
EEPROM (SII) 访问
读写从站 SII EEPROM (Slave Information Interface, ETG.1000.6 §6)。EEPROM 存储 VendorID / ProductCode / RevisionNo / SerialNo / SyncManager / FMMU / PDO 映射 / Strings 等设备身份与配置信息。SDK 在 config_init 阶段已自动读取,应用一般无需直接访问。
通过 slave.Sii 子对象(SiiInstance)访问 EEPROM 完整 API。
EEPROM 写入慎用 — 写错可能导致从站身份信息错乱,严重时永久 brick 从站, 需厂家工具恢复。仅在以下场景使用:
- 烧写 alias 地址(Hot-Connect 别名)
- 修复出厂数据被误覆盖
- 厂商授权的固件 / 参数烧录
写入前必须先调用 Acquire() 接管 EEPROM, 写入完成后调用 Release() 归还给 PDI。EEPROM 写需要从站处于 Init / PreOp 状态,OP 状态下写入会被拒绝。
EEPROM 大小通常 1 KB - 16 KB(按 word 寻址,1 word = 2 byte)。起始 8 word 为厂商基本信息,之后是 Category 链表(Strings / General / FMMU / SyncM / TxPdo / RxPdo / DC / End=0xFFFF)。
ReadEeprom(int byteOffset, int byteLength)
public byte[] ReadEeprom(int byteOffset, int byteLength)
读取从站 SII EEPROM 字节区域。SDK 自动处理 BUSY 轮询和字对齐, 推荐应用层优先使用此高层 API。
参数:
byteOffset(int) — EEPROM 字节偏移 (建议偶数对齐, 奇数自动按低字节对齐)byteLength(int) — 读取字节数 (建议偶数, 奇数末尾自动取低字节)
返回值:
byte[]— 读取的字节数据, 失败或参数非法返回空数组
WriteEeprom(int byteOffset, byte[] data)
public bool WriteEeprom(int byteOffset, byte[] data)
写入从站 SII EEPROM 字节区域。byteOffset 与 data.Length 都必须是偶数。
参数:
byteOffset(int) — EEPROM 字节偏移 (必须偶数)data(byte[]) — 写入字节 (长度必须偶数)
返回值:
bool— 全部 word 成功写入返回true
示例:
var slave = master.Slaves[0];
// 读 vendor_id (EEPROM 字节偏移 0x10, 长度 4)
byte[] data = slave.ReadEeprom(0x10, 4);
if (data.Length == 4)
{
uint vendorId = BitConverter.ToUInt32(data, 0);
Console.WriteLine($"VendorID = 0x{vendorId:X8}");
}
// 写 alias address (EEPROM 字节偏移 0x08, 2 字节)
// 必须从站处于 Init/PreOp 状态!
if (slave.State == EcState.Init)
{
slave.WriteEeprom(0x08, new byte[] { 0x01, 0x00 });
}
- 首选:
ReadEeprom / WriteEeprom(按字节, 自动字对齐, 自动接管/归还 EEPROM) - 次选:
slave.VendorId / ProductId / SerialNumber等已封装属性 - 高级用法 (按需): 下方
Sii.ReadWord / WriteWord / Acquire / Release / FindCategory / ReadCategory / EnumerateCategories / GetStrings / GetGeneralInfo等低层 API, 用于枚举 Category / 读 PDO 映射原始字节 / 烧写 alias 等场景
高级用法: Sii 低层 API
下列 slave.Sii.* 子对象 API 提供 word 级、Category 级、控制权管理等更精细的控制。普通应用建议使用上方 ReadEeprom / WriteEeprom。
Sii.ReadWord(ushort, out ushort)
public bool ReadWord(ushort wordAddr, out ushort value)
读取单个 EEPROM word。
参数:
wordAddr(ushort) — word 偏移(不是字节)value(out ushort) — 读出的 16-bit 值
返回值:
bool— 成功返回true
Sii.WriteWord(ushort, ushort)
public bool WriteWord(ushort wordAddr, ushort value)
写入单个 EEPROM word(带 PDI 切换保护,写后自动归还)。
Sii.Acquire() / Sii.Release()
public bool Acquire() // 强制主站接管 EEPROM
public bool Release() // 归还 EEPROM 控制权给 PDI
Sii.IsHeldByPdi
public bool IsHeldByPdi { get; }
EEPROM 控制权归属:false = 主站掌控,true = PDI(从站本地固件)掌控。
Sii.FindCategory(SiiCategory)
public (uint byteOffset, uint byteSize)? FindCategory(SiiCategory cat)
查找指定 Category 的字节偏移与大小,返回 null 表示该 Category 不存在。
Sii.ReadCategory(SiiCategory, int)
public byte[]? ReadCategory(SiiCategory cat, int maxBytes = 4096)
读取整个 Category 数据为字节数组。
Sii.EnumerateCategories(int)
public SiiCategory[] EnumerateCategories(int max = 64)
枚举从站所有 Category 类型。
Sii.GetStrings(int) / Sii.GetStringByIndex(byte, int)
public List<string> GetStrings(int maxBufBytes = 4096)
public string GetStringByIndex(byte stringIndex, int maxBytes = 256)
读取 Strings Category 并解析为字符串列表,或按索引(1-based)取单个字符串(GroupName / DeviceName / ImageName 等)。
Sii.GetGeneralInfo()
public SiiGeneralInfo? GetGeneralInfo()
读取并解析 General Category(type = 30)为结构化信息(CoeDetails / FoeDetails / EoeDetails / SoeDetails / EbusCurrentMa / PhysicalPort 等)。
SiiCategory 枚举(ETG.1000.6 Table 17)
public enum SiiCategory : ushort
{
Strings = 10,
DataTypes = 20,
General = 30,
FMMU = 40,
SyncM = 41,
TxPdo = 50,
RxPdo = 51,
DC = 60,
End = 0xFFFF,
}
Sii 低层用法示例:
var slave = master.Slaves[0];
// 枚举 Category
foreach (var cat in slave.Sii.EnumerateCategories())
Console.WriteLine($" Category: {cat}");
// 读 General Category 结构化信息
var info = slave.Sii.GetGeneralInfo();
if (info != null)
Console.WriteLine($"E-bus 电流: {info.EbusCurrentMa} mA, " +
$"CoE Complete Access: {info.SupportsCompleteAccess}");
// 读 PDO 映射 Category 字节数组 (TxPdo)
byte[]? txPdo = slave.Sii.ReadCategory(SiiCategory.TxPdo);
Console.WriteLine($"TxPdo Category: {txPdo?.Length ?? 0} 字节");
// word 级写入 (Sii.Acquire/Release 手动管理 EEPROM 接管)
// 必须从站处于 Init/PreOp 状态!
if (slave.State == EcState.Init && slave.Sii.Acquire())
{
slave.Sii.WriteWord(0x04, 0x0001); // alias = 1
slave.Sii.Release();
}
DL Port 端口控制
直接读写 ESC 的 DL Port Control 寄存器 (0x0101),用于端口故障注入测试和冗余/环拓扑的手动诊断。
正常运行时无需调用。大部分用户应该通过订阅 SlavePortLinkChanged 事件和读取 端口错误计数器 来诊断端口状态。仅在需要主动模拟端口故障(测试冗余切换)或排查特定端口问题时使用。
ESC 有 4 个物理端口 P0 / P1 / P2 / P3,DL Port Control 寄存器的位定义如下:
| DLPORT 值 | 行为 |
|---|---|
| 0x00 | Auto — 所有端口由 ESC 自动管理(默认) |
| 0x03 | 关闭 P0 |
| 0x0C | 关闭 P1 |
| 0x30 | 关闭 P2 |
| 0xC0 | 关闭 P3 |
即使 P0 关闭后, SDK 仍可通过副网口/广播路径恢复访问。
WriteDLPort(byte value)
public bool WriteDLPort(byte value)
写入从站 DL Port 控制寄存器(0x0101)。
参数:
value(byte) — DLPORT 值(见上表)
返回值:
bool— 成功返回true
ReadDLPort()
public byte ReadDLPort()
读取从站 DL Port 控制寄存器的当前值。
返回值:
byte— 当前 DLPORT 值
示例:
// 模拟 P1 端口故障 (测试冗余切换)
bool ok = slave.WriteDLPort(0x0C);
Console.WriteLine($"关闭 P1: {(ok ? "成功" : "失败")}");
// 读回确认
byte dlport = slave.ReadDLPort();
Console.WriteLine($"当前 DLPORT = 0x{dlport:X2}");
// 故障恢复后还原
slave.WriteDLPort(0x00); // 恢复 Auto
关闭一个端口后,观察 master.Events.SlavePortLinkChanged 和 master.Diagnostics.BreakPoint 验证冗余切换是否生效。
Startup 配置
| 属性 | 类型 | 说明 |
|---|---|---|
| Startup | StartupParameterList | 启动参数列表 |
| ShouldWritePDOAssignment | bool | 启动时是否写入 PDO Assignment,默认 true |
| ShouldWritePDOConfiguration | bool | 启动时是否写入 PDO Configuration,默认 false |
| SupportsCompleteAccess | bool | 从站是否支持 SDO Complete Access |
AutoStartup() / AutoStartupFromMDP() / AutoStartupFromSM()
public bool AutoStartup()
// AutoStartupFromESI(string esiFilePath) - ESI-based startup is implemented in the runtime but
// is intentionally omitted from the public API documentation (internal/advanced usage).
public bool AutoStartupFromMDP()
public bool AutoStartupFromSM()
对从站执行自动启动配置。AutoStartup() 会自动检测 ESI/MDP/SM 并生成参数。
SetConfigSourceENI() / SetConfigSourceDENI()
public void SetConfigSourceENI()
public void SetConfigSourceDENI()
设置从站配置来源。
RefreshPDOStartupParameters()
public int RefreshPDOStartupParameters()
刷新 PDO 启动参数(重新从当前配置生成 PDO 映射参数)。
StartupParameterList 方法(通过 slave.Startup 访问):
Add(StartupParameter param)— 添加启动参数AddParameter(index, subIndex, data, ...)— 添加启动参数(显式参数)Remove(index, subIndex)— 移除启动参数Clear()— 清除所有启动参数Apply(slave, transition, writeTiming)— 应用启动参数到从站
示例:
slave.Startup.Add(new StartupParameter
{
Index = 0x1C12, SubIndex = 0,
Data = new byte[] { 0 },
TransitionEnum = StartupTransition.PS, Priority = 10
});
相关结构:
IP— Init → PreOp,默认 AfterTransitionPS— PreOp → SafeOp,默认 BeforeTransitionSO— SafeOp → Op,默认 BeforeTransitionOS— Op → SafeOp,默认 AfterTransitionSP— SafeOp → PreOp,默认 AfterTransitionPI— PreOp → Init,默认 BeforeTransition