EoE (Ethernet over EtherCAT)
EoE 协议通过 EtherCAT 总线实现以太网通信,支持配置 IP/MAC/DNS 地址和以太网帧收发,符合 ETG.1000.6 和 ETG.1020 标准。
通过 slave.EoE 访问。从站不支持 EoE 时为 null。
属性
读写属性实时操作:getter 从设备读取当前值,setter 校验格式后立即写入设备。
| 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|
| CanSendFrame | bool | 只读 | 是否支持发送以太网帧 |
| CanReceiveFrame | bool | 只读 | 是否支持接收以太网帧 |
| CanSetIP | bool | 只读 | 是否支持设置 IP 参数 |
| CanGetIP | bool | 只读 | 是否支持获取 IP 参数 |
| IP | IPAddress? | 读写 | IP 地址(仅 IPv4) |
| Subnet | IPAddress? | 读写 | 子网掩码 |
| Gateway | IPAddress? | 读写 | 默认网关 |
| MAC | string? | 读写 | MAC 地址(格式 "AA:BB:CC:DD:EE:FF") |
| DNS | IPAddress? | 读写 | DNS 服务器地址 |
| DNSName | string? | 读写 | DNS 名称 |
示例:
if (slave.EoE)
{
// 读取
Console.WriteLine($"IP: {slave.EoE.IP}");
Console.WriteLine($"MAC: {slave.EoE.MAC}");
// 写入
slave.EoE.IP = IPAddress.Parse("192.168.1.100");
slave.EoE.Subnet = IPAddress.Parse("255.255.255.0");
slave.EoE.Gateway = IPAddress.Parse("192.168.1.1");
slave.EoE.MAC = "AA:BB:CC:DD:EE:FF";
slave.EoE.DNS = IPAddress.Parse("8.8.8.8");
slave.EoE.DNSName = "dns.google";
}
地址过滤器 (ETG.1020)
GetAddressFilters(int timeoutMs = DefaultTimeoutMs)
public List<PhysicalAddress> GetAddressFilters(int timeoutMs = DefaultTimeoutMs)
获取 MAC 地址过滤器列表。
SetAddressFilters(IList<PhysicalAddress> filters, int timeoutMs = DefaultTimeoutMs)
public bool SetAddressFilters(IList<PhysicalAddress> filters, int timeoutMs = DefaultTimeoutMs)
设置地址过滤器列表。
AddAddressFilter / RemoveAddressFilter / ClearAddressFilters
public bool AddAddressFilter(PhysicalAddress mac, int timeoutMs = DefaultTimeoutMs)
public bool RemoveAddressFilter(PhysicalAddress mac, int timeoutMs = DefaultTimeoutMs)
public bool ClearAddressFilters(int timeoutMs = DefaultTimeoutMs)
示例:
var mac = PhysicalAddress.Parse("AA-BB-CC-DD-EE-FF");
slave.EoE.AddAddressFilter(mac);
var filters = slave.EoE.GetAddressFilters();
foreach (var f in filters)
Console.WriteLine($"过滤器: {f}");
slave.EoE.ClearAddressFilters();
以太网帧收发
SendFrame(byte[] frame, int timeoutMs = DefaultTimeoutMs)
public bool SendFrame(byte[] frame, int timeoutMs = DefaultTimeoutMs)
public bool SendFrame(byte[] frame, byte port, int timeoutMs = DefaultTimeoutMs)
发送以太网帧。
ReceiveFrame(int timeoutMs = DefaultTimeoutMs)
public byte[]? ReceiveFrame(int timeoutMs = DefaultTimeoutMs)
public byte[]? ReceiveFrame(byte port, int timeoutMs = DefaultTimeoutMs)
接收以太网帧。
返回值:
byte[]?— 接收到的帧数据,失败返回null
Ping 测试
Ping(IPAddress targetIp, int timeoutMs = 5000, byte ttl = 64)
public EoEPingResult Ping(IPAddress targetIp, int timeoutMs = 5000, byte ttl = 64)
通过 EoE 发送 ICMP Ping 并等待响应。
参数:
targetIp(IPAddress) — 目标 IP 地址timeoutMs(int) — 超时时间(毫秒)ttl(byte) — 生存时间
相关结构:
public class EoEPingResult
{
public bool Success { get; } // 是否成功
public double RoundTripTimeMs { get; } // 往返时间(毫秒)
public string TargetAddress { get; } // 目标地址
public byte TTL { get; } // 生存时间
public string ErrorMessage { get; } // 错误信息
}
示例:
var result = slave.EoE.Ping(IPAddress.Parse("192.168.1.1"));
Console.WriteLine(result.ToString());
完整示例
网络配置与 Ping
if (slave.EoE)
{
Console.WriteLine($"当前 IP: {slave.EoE.IP}");
Console.WriteLine($"当前 MAC: {slave.EoE.MAC}");
slave.EoE.IP = IPAddress.Parse("10.0.0.100");
slave.EoE.Subnet = IPAddress.Parse("255.255.255.0");
slave.EoE.Gateway = IPAddress.Parse("10.0.0.1");
slave.EoE.DNS = IPAddress.Parse("10.0.0.1");
var ping = slave.EoE.Ping(IPAddress.Parse("10.0.0.1"));
if (ping.Success)
Console.WriteLine($"Ping 成功: {ping.RoundTripTimeMs:F1}ms");
}