资讯详情

资讯详情

EtherCAT伺服调试:从站卡在SAFEOP到DS402使能的完整解析

1. 从“上电”到“使能”一台伺服电机到底经历了什么很多人第一次接触EtherCAT伺服调试都会卡在同一个地方主站跑起来了从站也扫到了PDO映射配好了DC同步也开了可电机就是不转。查报警码从站显示状态停在SAFE_OP或者SWITCH_ON_DISABLED主站这边ec_master日志干干净净什么错误都没有。你盯着IGH的代码翻来覆去看ecrt_master_slave_config返回了指针ecrt_slave_config_pdos也没报错ecrt_domain_data拿到的数据看着也对但伺服就是不动。这个问题我踩过不止一次。后来把IGH源码里fsm_slave.c和fsm_master.c翻了一遍又对着DS402协议文档逐条比对才真正搞明白EtherCAT从站的状态机和DS402伺服状态机是两套独立但必须协同工作的机制。前者管的是通信链路能不能通后者管的是电机能不能出力。很多人把它们混为一谈所以调试的时候一头雾水。这篇内容就是把我自己从“上电”到“使能”这一路踩过的坑、翻过的代码、验证过的流程完整梳理一遍。不管你是用IGH还是SOEM不管主站跑在x86工控机还是RK3568这类ARM平台上底层逻辑是一样的。看完之后你至少能做到看到从站卡在某个状态时知道该去查哪一层、改哪个参数、看哪段代码。提示本文涉及的IGH代码基于稳定版2.9不同版本函数名可能有细微差异但状态机流转逻辑一致。2. EtherCAT状态机与DS402状态机两套机制一个目标2.1 为什么需要两套状态机先把这个事情说清楚。EtherCAT从站控制器ESC内部有一个EtherCAT状态机它管的是通信层面的状态标准定义在ETG.1000里。这个状态机只有四个状态INIT、PREOP、SAFEOP、OP。它的核心任务是确保主站和从站之间的通信链路是可靠的PDO数据能正常交换DC同步能正常工作。而DS402状态机也叫CiA402状态机管的是伺服驱动器的行为状态定义在IEC 61800-7-201里。它描述的是电机从“不能动”到“能动”再到“正在动”的完整过程状态包括Not Ready to Switch On、Switch On Disabled、Ready to Switch On、Switched On、Operation Enabled等等。这两套状态机的关系可以这样理解EtherCAT状态机是“路修好了没有”DS402状态机是“车能不能开”。路没修好车肯定开不了但路修好了车也不一定就能开——还得看钥匙插了没有、档位挂了没有、手刹松了没有。这些“钥匙、档位、手刹”就是DS402的控制字Controlword和状态字Statusword。2.2 IGH中状态机的代码位置IGH主站代码里EtherCAT状态机的核心逻辑在master/fsm_slave.c和master/fsm_master.c两个文件里。fsm_slave.c负责单个从站的状态切换fsm_master.c负责整个网络的启动流程。DS402状态机在IGH主站代码里没有直接实现——因为IGH是通用EtherCAT主站不针对特定设备类型。DS402的状态切换需要应用层自己通过PDO写入控制字来实现。但IGH提供了ecrt_slave_config_state等接口让你可以查询从站当前的EtherCAT状态。这里有个关键点EtherCAT状态机进入OP状态是DS402状态机能够工作的前提条件。因为只有在OP状态下PDO数据交换才被允许。如果你的从站一直卡在SAFEOP进不了OP那DS402状态机根本不会启动你写控制字也没用。2.3 状态流转的完整链路从主站启动到电机使能完整的链路是这样的主站启动扫描总线识别所有从站主站请求所有从站进入INIT状态配置站地址主站请求进入PREOP状态此时SDO通信可用可以配置PDO映射和DC参数主站配置PDO映射、DC同步、FMMU等参数主站请求进入SAFEOP状态此时PDO数据开始交换但输出被冻结主站检查从站是否成功进入SAFEOP检查输入数据是否有效主站请求进入OP状态PDO输入输出正常交换应用层开始通过PDO写入DS402控制字驱动伺服状态机流转DS402状态机从Switch On Disabled逐步切换到Operation Enabled电机使能开始响应指令每一步都有坑下面逐个拆。3. 从INIT到OPIGH主站启动流程的代码级拆解3.1 主站启动与从站扫描IGH主站的启动入口是ecrt_request_master之后调用ecrt_master_create_domain创建域再调用ecrt_master_slave_config配置每个从站。这个阶段对应的是EtherCAT状态机的INIT状态。在INIT状态下ESC只响应状态查询不进行任何PDO数据交换。主站通过广播读的方式扫描总线上的从站给每个从站分配站地址。IGH的ec_master_scan_bus函数负责这件事它发送一个广播读命令然后根据返回的数据确定从站数量和拓扑结构。这里有个容易忽略的细节从站的站地址分配是在INIT状态下完成的。如果你用的是固定站地址比如通过拨码开关设置那主站扫描时会直接读取如果是动态分配主站会写入新的站地址。不管哪种方式站地址必须在进入PREOP之前就确定好否则后续的寄存器读写会找不到目标。3.2 PREOP状态下的SDO配置进入PREOP后SDO通信可用。这个阶段主站要做的事情包括配置PDO映射、配置DC同步参数、配置FMMU、写入厂商特定的初始化参数。PDO映射的配置是通过SDO写入0x1C12SyncManager 2 PDO分配和0x1C13SyncManager 3 PDO分配来实现的。IGH的ecrt_slave_config_pdos函数封装了这个过程。你需要先定义好ec_pdo_entry_info_t数组和ec_pdo_info_t数组然后调用这个函数。// 以汇川IS620N为例的PDO配置 static ec_pdo_entry_info_t slave_pdo_entries[] { {0x6040, 0x00, 16}, // Controlword {0x607A, 0x00, 32}, // Target Position {0x6060, 0x00, 8}, // Modes of Operation {0x6041, 0x00, 16}, // Statusword {0x6064, 0x00, 32}, // Position Actual Value {0x6061, 0x00, 8}, // Modes of Operation Display }; static ec_pdo_info_t slave_pdos[] { {0x1600, 3, slave_pdo_entries 0}, // RxPDO {0x1A00, 3, slave_pdo_entries 3}, // TxPDO }; static ec_sync_info_t slave_syncs[] { {0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE}, {1, EC_DIR_INPUT, 0, NULL, EC_WD_DISABLE}, {2, EC_DIR_OUTPUT, 1, slave_pdos 0, EC_WD_ENABLE}, {3, EC_DIR_INPUT, 1, slave_pdos 1, EC_WD_DISABLE}, {0xff} };这段代码里0x1600是RxPDO的映射对象0x1A00是TxPDO的映射对象。EC_WD_ENABLE表示启用看门狗EC_WD_DISABLE表示禁用。看门狗这个参数很关键如果启用了看门狗但主站没有及时刷新数据从站会触发看门狗超时直接掉出OP状态。调试阶段建议先禁用看门狗等通信稳定后再启用。3.3 SAFEOP到OP的切换条件从SAFEOP进入OPIGH会检查几个条件所有从站都成功进入了SAFEOP状态输入数据有效通过检查SM3的看门狗状态DC同步如果启用需要确认同步信号正常在fsm_slave.c里ec_fsm_slave_state_safeop函数负责处理SAFEOP状态的进入ec_fsm_slave_state_op负责OP状态的进入。如果从站没有成功进入OPIGH会在ec_master_state_t里反映出来你可以通过ecrt_master_state查询。注意有些伺服驱动器在SAFEOP状态下会检查DC同步配置。如果DC配置不正确比如同步周期和从站支持的不匹配从站会拒绝进入OP。这时候IGH日志里可能只显示“slave did not enter OP”不会告诉你具体原因。你需要用ethercat命令行工具的slaves命令查看从站的AL状态码。3.4 常见卡点为什么从站进不了OP根据我的经验从站进不了OP的原因主要有这几类现象可能原因排查方法一直停在PREOPPDO映射配置错误检查SDO写入是否成功用ethercat pdos查看停在SAFEOPDC同步配置不匹配检查0x1C32/0x1C33的同步模式停在SAFEOP看门狗超时检查SM看门狗是否启用主站周期是否稳定进入OP后立即掉出过程数据刷新不及时检查主站循环周期和DC同步进入OP后读不到数据FMMU配置错误检查FMMU映射地址和PDO偏移其中“进入OP后读不到数据”这个问题在RK3568这类ARM平台上特别常见。原因通常是网卡驱动的问题——ARM平台上的网卡可能不支持IGH需要的实时特性导致过程数据刷新不稳定。解决办法是换用支持实时补丁的内核或者调整主站循环周期。4. DS402状态机从“不能动”到“能动”的每一步4.1 DS402状态机的状态定义DS402状态机的状态定义在0x6041Statusword的位域里。关键位包括Bit 0: Ready to Switch OnBit 1: Switched OnBit 2: Operation EnabledBit 3: FaultBit 4: Voltage EnabledBit 5: Quick StopBit 6: Switch On DisabledBit 7: WarningBit 8: Manufacturer SpecificBit 9: RemoteBit 10: Target ReachedBit 11: Internal Limit Active这些位的组合决定了当前状态。比如0x0040Bit 6置位表示Switch On Disabled0x0021Bit 0和Bit 5置位表示Ready to Switch On0x0027Bit 0、1、2、5置位表示Operation Enabled。4.2 控制字与状态字的配合DS402状态机的流转是通过控制字0x6040和状态字0x6041的配合来实现的。控制字的关键位包括Bit 0: Switch OnBit 1: Enable VoltageBit 2: Quick StopBit 3: Enable OperationBit 4-6: Operation Mode SpecificBit 7: Fault ResetBit 8: HaltBit 9: Operation Mode SpecificBit 10: ReservedBit 11: Manufacturer Specific从Switch On Disabled到Operation Enabled的典型流程是写入控制字0x0006Enable Voltage Quick Stop等待状态字变为0x0021Ready to Switch On写入控制字0x0007Enable Voltage Quick Stop Switch On等待状态字变为0x0023Switched On写入控制字0x000FEnable Voltage Quick Stop Switch On Enable Operation等待状态字变为0x0027Operation Enabled每一步都需要等待状态字确认不能连续写入。这是新手最容易犯的错误一次性把控制字从0x0006写到0x000F中间没有等待状态字反馈结果伺服状态机没有正确流转电机不转。4.3 在IGH中实现DS402状态切换在IGH主站里DS402状态切换需要你在应用层实现。典型的结构是// 状态机状态定义 typedef enum { DS402_SWITCH_ON_DISABLED, DS402_READY_TO_SWITCH_ON, DS402_SWITCHED_ON, DS402_OPERATION_ENABLED, DS402_FAULT } ds402_state_t; // 状态切换函数 ds402_state_t ds402_update(uint16_t statusword, uint16_t *controlword) { ds402_state_t state; if (statusword 0x0008) { state DS402_FAULT; *controlword 0x0080; // Fault Reset return state; } if ((statusword 0x004F) 0x0040) { state DS402_SWITCH_ON_DISABLED; *controlword 0x0006; } else if ((statusword 0x006F) 0x0021) { state DS402_READY_TO_SWITCH_ON; *controlword 0x0007; } else if ((statusword 0x006F) 0x0023) { state DS402_SWITCHED_ON; *controlword 0x000F; } else if ((statusword 0x006F) 0x0027) { state DS402_OPERATION_ENABLED; // 保持使能根据模式设置控制字 } return state; }这段代码的核心逻辑是根据当前状态字判断处于哪个状态然后写入对应的控制字。注意0x004F、0x006F这些掩码——它们屏蔽了不相关的位只关注状态判断需要的位。4.4 模式选择与使能后的行为进入Operation Enabled后还需要设置操作模式0x6060。DS402定义了多种模式位置模式PPProfile Position0x6060 1速度模式PVProfile Velocity0x6060 3扭矩模式PTProfile Torque0x6060 4循环同步位置CSP0x6060 8循环同步速度CSV0x6060 9循环同步扭矩CST0x6060 10模式设置必须在Operation Enabled之前完成或者至少在使能后立即设置。如果模式设置不正确电机可能不响应指令或者以错误的方式运动。提示汇川伺服在CSP模式下目标位置通过0x607A写入位置实际值通过0x6064读取。如果发现位置指令写了但电机不动先检查0x6061Modes of Operation Display是否和0x6060一致。5. 实操全流程从零搭建IGHDS402伺服控制系统5.1 硬件与软件环境准备我用的硬件配置是主站RK3568开发板正点原子运行Linux 5.10内核从站汇川IS620N伺服驱动器 400W伺服电机网线标准Cat5e屏蔽网线软件环境IGH EtherCAT Master 2.9内核打了RT补丁PREEMPT_RT编译工具链aarch64-linux-gnu-gccRK3568上跑IGH有个坑板载网卡可能不支持EtherCAT需要的原始套接字特性。我试过用板载千兆网口IGH能识别但过程数据刷新不稳定。后来换了一个USB3.0转千兆网卡问题解决。如果你也遇到类似情况先确认网卡驱动是否支持SO_PRIORITY和PACKET_MMAP。5.2 IGH主站编译与安装在RK3568上编译IGH的步骤# 下载源码 git clone https://gitlab.com/etherlab.org/ethercat.git cd ethercat # 配置 ./bootstrap ./configure --prefix/usr/local/ethercat \ --with-linux-dir/usr/src/linux \ --enable-generic \ --disable-8139too \ --enable-hrtimer # 编译安装 make -j4 sudo make install # 配置 sudo cp /usr/local/ethercat/etc/sysconfig/ethercat /etc/sysconfig/ # 编辑/etc/sysconfig/ethercat设置MASTER0_DEVICE为你的网卡MAC--enable-hrtimer这个选项很关键。它让IGH使用高精度定时器而不是内核定时器能显著提高主站循环的稳定性。在ARM平台上这个选项几乎是必须的。5.3 从站配置与PDO映射汇川IS620N的PDO配置需要注意几点RxPDO0x1600默认映射了Controlword、Target Position、Modes of OperationTxPDO0x1A00默认映射了Statusword、Position Actual Value、Modes of Operation Display如果需要扭矩控制还需要映射0x6071Target Torque和0x6077Torque Actual ValueDC同步配置在0x1C32和0x1C33里。汇川伺服支持DC同步模式同步周期建议设置为1ms。如果主站循环周期是1msDC同步周期也设为1ms这样主站和从站的时钟能精确对齐。5.4 完整使能流程的代码实现下面是一个完整的使能流程实现基于IGH的示例代码修改#include ecrt.h #define PERIOD_NS 1000000 // 1ms int main() { ec_master_t *master; ec_domain_t *domain; ec_slave_config_t *sc; uint8_t *domain_data; unsigned int off_controlword, off_target_pos, off_modes; unsigned int off_statusword, off_actual_pos, off_modes_display; // 请求主站 master ecrt_request_master(0); domain ecrt_master_create_domain(master); // 配置从站 sc ecrt_master_slave_config(master, 0, 0, vendor_id, product_code); ecrt_slave_config_pdos(sc, EC_END, slave_syncs); // 注册PDO条目 off_controlword ecrt_slave_config_reg_pdo_entry(sc, 0x6040, 0x00, domain, NULL); off_target_pos ecrt_slave_config_reg_pdo_entry(sc, 0x607A, 0x00, domain, NULL); off_modes ecrt_slave_config_reg_pdo_entry(sc, 0x6060, 0x00, domain, NULL); off_statusword ecrt_slave_config_reg_pdo_entry(sc, 0x6041, 0x00, domain, NULL); off_actual_pos ecrt_slave_config_reg_pdo_entry(sc, 0x6064, 0x00, domain, NULL); off_modes_display ecrt_slave_config_reg_pdo_entry(sc, 0x6061, 0x00, domain, NULL); // 配置DC ecrt_slave_config_dc(sc, 0x0300, PERIOD_NS, 0, 0, 0); // 激活主站 ecrt_master_activate(master); domain_data ecrt_domain_data(domain); // 主循环 ds402_state_t ds402_state DS402_SWITCH_ON_DISABLED; uint16_t controlword 0; int32_t target_pos 0; int8_t modes 8; // CSP模式 while (1) { ecrt_master_receive(master); ecrt_domain_process(domain); // 读取状态字 uint16_t statusword EC_READ_U16(domain_data off_statusword); int32_t actual_pos EC_READ_S32(domain_data off_actual_pos); int8_t modes_display EC_READ_S8(domain_data off_modes_display); // 更新DS402状态机 ds402_state ds402_update(statusword, controlword); // 写入控制字 EC_WRITE_U16(domain_data off_controlword, controlword); EC_WRITE_S32(domain_data off_target_pos, target_pos); EC_WRITE_S8(domain_data off_modes, modes); // 如果使能成功开始运动 if (ds402_state DS402_OPERATION_ENABLED) { target_pos 1000; // 每次增加1000个脉冲 } ecrt_domain_queue(domain); ecrt_master_send(master); // 等待下一个周期 clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, next, NULL); } }这段代码的关键点ecrt_slave_config_dc的第二个参数0x0300是DC配置字0x0300表示启用DC同步同步周期为PERIOD_NSds402_update函数根据状态字决定控制字实现状态流转只有在DS402_OPERATION_ENABLED状态下才更新目标位置5.5 调试与验证调试阶段建议分步验证先用ethercat slaves确认从站被识别用ethercat pdos确认PDO映射正确用ethercat sdos读取0x6041确认状态字运行主站程序观察状态字变化如果卡在某个状态用ethercat states查看EtherCAT状态机状态注意调试时先把电机负载断开避免意外运动造成危险。等状态机流转正常后再接负载。6. 常见问题与排查技巧实录6.1 从站进不了OP的排查思路这个问题我遇到过至少五次每次原因都不一样。整理一个排查顺序第一步确认EtherCAT状态机卡在哪ethercat slaves # 输出示例0 0:0 PREOP IS620N如果显示PREOP说明PDO配置有问题如果显示SAFEOP说明DC同步或看门狗有问题。第二步检查PDO映射ethercat pdos # 查看0x1600和0x1A00的映射内容确认映射的条目和从站支持的条目一致。有些从站不支持某些PDO条目如果映射了不支持的条目从站会拒绝进入OP。第三步检查DC同步配置ethercat sdos -p 0 0x1C32 0x01 # 读取SM2的同步模式如果返回0x0000表示自由运行模式返回0x0002表示DC同步模式。如果从站配置为DC同步但主站没有启用DC从站会卡在SAFEOP。第四步检查看门狗ethercat sdos -p 0 0x0400 0x01 # 读取看门狗分频如果看门狗启用但主站刷新周期不稳定从站会触发看门狗超时。调试阶段可以先禁用看门狗。6.2 进入OP后读不到数据的排查这个问题在RK3568上特别常见。现象是ethercat slaves显示OP但domain_data里的数据全是0或者不更新。原因通常是网卡驱动的问题。IGH需要网卡支持原始套接字和PACKET_MMAP有些ARM平台的网卡驱动不支持这些特性。解决办法换用支持PACKET_MMAP的网卡或者使用--enable-generic编译选项让IGH使用通用网卡驱动或者调整主站循环周期从1ms放宽到2ms我实测下来RK3568板载网卡在1ms周期下丢包率很高换成USB3.0转千兆网卡后1ms周期稳定运行。6.3 DS402状态机卡在Switch On Disabled如果EtherCAT状态机已经进入OP但DS402状态机一直停在Switch On Disabled检查以下几点控制字是否正确写入。用ethercat upload读取0x6040确认状态字是否在变化。如果状态字一直是0x0040说明从站没有收到控制字是否有故障。检查状态字Bit 3是否置位如果置位需要先执行Fault Reset电压是否正常。状态字Bit 4表示电压使能如果为0说明驱动器主回路没有上电6.4 常见问题速查表问题可能原因解决方法从站扫描不到网线连接问题检查网线确认从站供电卡在PREOPPDO映射错误用ethercat pdos检查映射卡在SAFEOPDC配置不匹配检查0x1C32同步模式进入OP后掉出看门狗超时禁用看门狗或提高刷新频率读不到数据FMMU配置错误检查ecrt_slave_config_reg_pdo_entry返回值DS402不流转控制字未写入检查PDO输出偏移是否正确电机不转模式设置错误检查0x6060和0x6061是否一致电机抖动DC同步不稳定调整DC周期或主站循环周期6.5 独家避坑技巧技巧一用Wireshark抓包分析IGH支持--with-wireshark编译选项编译后可以用Wireshark抓EtherCAT帧。当状态机卡住时抓包能看到主站发了什么、从站回了什么比看日志直观得多。技巧二先用SOEM验证硬件如果IGH调试不顺利可以先用SOEM跑一遍。SOEM的代码更简单状态机逻辑更直观。如果SOEM能跑通说明硬件没问题问题在IGH配置上。技巧三注意PDO偏移对齐IGH的ecrt_slave_config_reg_pdo_entry返回的偏移量是按位计算的。如果PDO条目不是字节对齐的比如8位和16位混合偏移量可能不是字节边界。写入数据时要用EC_WRITE_U16这类宏不要直接指针操作。技巧四DC同步的启动顺序DC同步的启动顺序很重要先配置DC参数再激活主站最后在主循环里调用ecrt_master_application_time和ecrt_master_sync_reference_clock。顺序错了会导致DC同步不工作。7. 从代码到实践我的调试体会翻IGH源码这件事一开始是为了解决一个具体问题从站进不了OP。后来发现很多问题的根源不在IGH本身而在对EtherCAT状态机和DS402状态机的理解不够透彻。把这两套状态机的流转逻辑搞清楚之后调试效率至少提高了一倍。我现在的习惯是拿到一个新的伺服驱动器先不急着写代码先用ethercat命令行工具把状态机从INIT一步步推到OP确认通信链路没问题。然后再用SDO读写测试DS402状态字和控制字确认状态机能正常流转。最后才写主站程序把PDO映射和状态机逻辑加进去。这样分步验证出问题的时候很容易定位是哪一层的问题。还有一个体会是不要迷信“稳定”的配置。网上很多教程给的PDO映射和DC配置直接抄过来不一定能用。不同品牌的伺服驱动器甚至同一品牌不同型号PDO支持的范围和DC同步的要求都可能不一样。最可靠的方法是查驱动器的手册确认它支持哪些PDO条目、DC同步模式是什么、看门狗怎么配置。最后分享一个我常用的调试命令组合能快速定位大部分状态机问题# 查看从站状态 ethercat slaves # 查看PDO映射 ethercat pdos # 查看SDO配置 ethercat sdos # 查看DC配置 ethercat sdos -p 0 0x1C32 0x01 ethercat sdos -p 0 0x1C33 0x01 # 读取状态字 ethercat upload -p 0 0x6041 0x00 # 写入控制字 ethercat download -p 0 0x6040 0x00 -t uint16 0x000F这套命令组合覆盖了从EtherCAT状态机到DS402状态机的所有关键检查点。遇到问题的时候按顺序跑一遍基本能定位到问题出在哪一层。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →