3、关键字段详解(上):0x0000-0x000F(ESC配置字)、0x0010-0x0011(配置站别名)、0x0012-0x0013(配置看门狗)、0x0014-0x0015(配置同步管理器)
好,咱们直接进入正题。EEPROM 里前 16 个字节,也就是 0x0000 到 0x000F,是 ESC 的配置字区域。这部分我习惯叫它「芯片的身份证+开关面板」。你想想看,EtherCAT 从站芯片上电后,第一件事就是读这 16 个字节,来决定自己怎么工作。
核心要点:ESC 配置字决定了从站芯片的基本行为模式,包括是否启用分布式时钟、是否支持 FMMU、PDI 接口类型等。改错一个 bit,从站可能直接「哑火」。
3.1 0x0000-0x000F:ESC 配置字
这 16 个字节,每个 bit 都有含义。我挑几个最关键的说说:
- 0x0000-0x0001(字 0):PDI 控制与状态。比如你用的是 SPI 接口还是 8/16 位并行接口,就在这里配。我记得有一次项目,客户说从站死活连不上,我查了半天,发现是 EEPROM 里 PDI 类型写成了 0x02(SPI 从模式),但硬件上实际接的是 8 位并行总线。嗯,这种低级错误,排查起来最费时间。
- 0x0002-0x0003(字 1):FMMU 与 SyncManager 配置。这里控制着是否启用 FMMU 保护、是否允许 LRD/LWR 命令。我个人习惯,调试阶段先把保护关掉,等跑通了再打开。
- 0x0004-0x0005(字 2):分布式时钟配置。如果你要做同步运动控制,这里必须配成 DC 模式。我曾经遇到一个伺服驱动器,位置环抖动特别大,最后发现是 EEPROM 里 DC 配置字没写对,导致时钟同步偏差达到了 1μs 级别。
- 0x0006-0x000F:保留字与扩展配置。这部分通常填 0,但有些特殊芯片会用到。
我的小技巧:写 EEPROM 之前,先用 SOEM 的 eepromtool 读一遍原厂配置,备份下来。万一改错了,还能刷回去。别问我怎么知道的——都是泪。
3.2 0x0010-0x0011:配置站别名
站别名,说白了就是给从站起个「小名」。EtherCAT 主站可以通过这个别名来寻址,而不必依赖物理位置。
为什么需要这个?你想想看,一条 EtherCAT 总线上挂了 30 个从站,如果某个从站坏了,换一个新的上去,物理位置没变,但 EEPROM 里的站地址可能变了。这时候如果主站用的是固定站地址,就得重新配置。但如果你用了站别名,只要新从站的 EEPROM 里写对了别名,主站就能自动识别。
我建议:站别名不要用 0x0000。因为 0x0000 是无效别名,主站会忽略。我曾经在产线上遇到过,一个 IO 模块的别名写成了 0x0000,结果主站始终找不到它,折腾了整整一个下午。
注意:站别名只在「配置态」有效。进入运行态后,主站通常使用物理站地址。所以别名的作用范围是有限的,别指望它能解决所有寻址问题。
3.3 0x0012-0x0013:配置看门狗
看门狗,就是防止从站「死机」的保险丝。EtherCAT 从站芯片内部有两个看门狗:
- PDI 看门狗:监控从站微控制器与 ESC 芯片之间的通信。如果微控制器长时间不响应,看门狗会触发,把输出置为安全状态。
- SM 看门狗:监控同步管理器通道的数据交换。如果主站长时间不发数据,看门狗也会动作。
这两个看门狗的超时时间,就在 0x0012-0x0013 里配置。单位是 100μs。比如你写 0x0064,就是 100 * 100μs = 10ms。
嗯,这里有个坑:看门狗时间不要设得太短。我曾经在一个项目中,把看门狗设成了 1ms,结果主站稍微有点网络抖动,从站就频繁触发看门狗复位,整个系统像抽风一样。后来改成了 50ms,世界清净了。
经验值:对于大多数 IO 从站,看门狗设在 10ms-100ms 之间比较合适。对于运动控制从站,可以适当缩短到 5ms-20ms,但一定要配合主站的周期时间。
3.4 0x0014-0x0015:配置同步管理器
同步管理器(SyncManager,简称 SM)是 EtherCAT 数据交换的核心机制。每个 SM 通道负责管理一段数据缓冲区,主站和从站通过它来交换过程数据或邮箱数据。
0x0014-0x0015 这个字,配置的是 SM 通道的起始地址和长度。但注意,这里只配置了 SM0 和 SM1 的起始地址,更详细的配置(比如通道类型、方向、中断使能等)在后面的 0x0016-0x001F 区域。
我画了一张图,帮你理解 SM 在 EEPROM 中的位置关系:
在实际项目中,SM0 通常用于输出过程数据(主站→从站),SM1 用于输入过程数据(从站→主站)。如果你做的是带邮箱通信的从站,SM2 和 SM3 会用于邮箱收发。
SOEM 对接提示:在 SOEM 中,ec_config_map() 函数会根据 EEPROM 里的 SM 配置自动映射 PDO。如果你的 SM 起始地址或长度写错了,映射就会失败。我建议你在写 EEPROM 后,用 ec_read_state() 检查一下从站状态,如果卡在 INIT 态,多半是 SM 配置有问题。
好了,这一节的内容就到这里。EEPROM 的前 16 个字节虽然少,但每一个 bit 都牵一发而动全身。下一节我们继续看 0x0016 之后的字段,那里有更详细的 SM 配置和 FMMU 信息。