一、问题现象
IGH主站在实际使用中,偶尔出现以下三类异常:
| 序号 | 现象描述 |
|---|---|
| 1 | 确认safeop超时,并报出sync manager watchdog错误 |
| 2 | 从站拒绝状态改变,报出no sync error/fatal sync error/PLL error等错误 |
| 3 | 最严重:从站无法进入INIT状态,无任何回复,且 SDO 数据无法读写。通过读取从站邮箱缓冲寄存器发现,邮箱缓冲区虽有数据,但从站已“挂死”,无法再接收新数据,必须重启从站才能恢复OP状态 |
二、尝试过的初步方案
对比 TwinCAT 的 ENI 文件,分析其从站初始化流程,并据此修改了
fsm_slave_config.c中的相关逻辑。(未明显起效)修改详情可参考博客:fsm_slave_config.c-CSDN博客
该方案未明显解决上述问题。
三、根本原因分析(原始流程缺陷)
原始主站状态机流程(进入配置状态机的逻辑)
情况1:主站(APP)先启动,从站后启动
主站直接进入操作线程,
master->config_changed置 1;从站在扫描结束后直接进入配置状态机。
情况2:从站先启动,主站驱动后启动,主站 APP 再后启动
从站在扫描结束后,因主站尚未激活,主站状态机进入
else分支,调用ec_fsm_master_restart重启,重新进入ec_fsm_master_state_broadcast;此时
config_changed = 0(APP未启动),进入另一个else分支:该分支会确认从站当前状态,并通过配置状态机将从站转为
PREOP;其中
ec_fsm_master_action_configure根据主站是否激活决定行为:若已激活,则进入
ec_fsm_master_enter_write_system_times,计算时钟偏移并请求所有从站进入OP;若未激活,则配置为
PREOP(扫描时分配状态);
若从站存在错误标志,则进入
ec_fsm_master_state_acknowledge,调用fsm_change状态机,读取寄存器0x0134查看 AL 状态,并向0x0124写入无错误标志的当前状态以清除错误。
关键故障点:
多次测试发现,进不了 OP的典型流程是:
主站在配置状态机的“设置状态”阶段,检测到从站异常
al_code;随后在确认(清除)错误状态时,从站清除超时,导致无法进入
OP;但若该超时发生在扫描结束后、配置状态机尚未开始之前,后续进入配置状态机时错误已被清除,从站可正常进入
OP。
结论:原始流程中,扫描结束后立即进入配置状态机过于仓促,未预先清理从站的错误状态,导致后续配置阶段因错误清除超时而失败。
四、最终解决方案(修改状态机流程)
核心思路
在扫描结束与进入配置状态机之间,强制插入“确认并清除错误状态”环节,确保所有从站错误码被清理干净后,再进入配置流程。
具体修改内容(代码级)
| 序号 | 修改动作 |
|---|---|
| 1 | 删除扫描完成后直接进入配置状态机的代码,改为执行restart |
| 2 | 删除ec_fsm_master_state_broadcast中进入ec_fsm_master_enter_write_system_times的代码 |
| 3 | 删除ec_fsm_master_action_configure中进入ec_fsm_master_enter_write_system_times的代码 |
| 4 | 在确认状态结束后,于ec_fsm_master_action_next_slave_state轮询完所有从站后,统一进入ec_fsm_master_enter_write_system_times(记得在末尾添加return) |
| 5 | 在ec_fsm_master_state_broadcast的recan_request下,当主站处于 OP 线程(即主站激活)时,将master->config_changed置 1(因为删除了原入口,需在此补上) |
修改后固定流程(不依赖启动顺序)
从站开始扫描 ↓ 扫描结束 ↓ 进入“确认状态机” → 检查各从站是否有错误码,如有则清除 ↓ 所有从站状态确认完成 ↓ (主站激活后)进入配置状态机 ↓ 配置完成 → 主站正常通讯(OP)
无论从站、主站驱动、主站 APP三者以何种顺序启动,均遵循上述统一流程。
五、验证结果
经后续反复测试,该方案成功解决了 IGH 主站无法进入 OP 的问题,所有从站可稳定进入运行状态。