资讯详情

资讯详情

汇川H5U PLC通过CANopen控制步进伺服电机项目实战与调试

前阵子做了一台小型绕线设备的控制柜改造客户指定用汇川H5U PLC做整机控制四根运动轴不接脉冲线全部走CANopen总线来控制步进伺服电机。项目本身不算复杂但从EDS文件导入到PDO映射、再到DS402状态机调试整个过程踩了不少坑也总结了不少可复用的经验。这篇就围绕这个真实案例把汇川H5U搭配步进伺服电机、通过CANopen通讯控制电机的完整链路讲清楚。不管是电气工程师、设备调试人员还是刚接触总线控制的大学生都能照着这个思路把项目落地。1. 方案整体设计与选型思路很多人一提到PLC控制步进、伺服电机第一反应还是“脉冲加方向”。这个方案确实成熟但在多轴、远距离、高干扰的场合脉冲方案的缺点会越来越明显。我这次选CANopen不是追新而是基于几个非常实际的现场原因。1.1 为什么用CANopen而不是脉冲或Modbus先看脉冲方案的痛点。四根轴如果都用脉冲控制每台电机至少需要脉冲、方向、使能、报警、复位这五组信号四台电机就是二十多根线。控制柜里的接线量、查线难度、故障率都会成倍上升。而且脉冲信号在长距离传输时抗干扰能力差一旦设备里有变频器或者大功率电机丢脉冲的现象经常让人抓狂。我之前遇到过一台设备脉冲线走到十二米就开始偶尔丢步最后只能降速运行非常被动。再看Modbus RTU。Modbus做点位读写没有问题但它本质是主从轮询机制一帧问一帧答。如果同时控制四个轴、还要实时看位置和状态轮询周期一长运动控制的实时性就保证不了。更麻烦的是Modbus没有统一的状态机驱动器是否真正使能到位、“运动完成”这些判断每个厂家实现得都不一样项目越做越累。CANopen则刚好卡在二者中间。它走的是CAN物理层差分信号抗干扰能力强且传输距离有优势应用层由CiA组织统一规范有标准对象字典、有NMT状态机、有事件触发的PDO。最关键的是PDO是生产消费模式PLC写一个CAN帧所有从站按COB-ID自己决定要不要认领从站状态变化也能主动上报实时性比Modbus轮询高一大截。所以我常跟同行说三轴以上、距离超过十米、现场有变频器干扰直接考虑CANopen基本不会错。1.2 硬件选型H5U、驱动器、通讯线缆主站方面汇川H5U本身自带CAN通讯口不需要额外扩展卡。在InoProShop软件里把对应端口配置为CANopen主站就能用。这个设计很省事控制柜省掉一个通信模块的空间和成本。选型号时注意H5U本体带CAN口的版本即可。从站方面市面上带CANopen接口的步进驱动器很多常见的有雷赛、步科、信浓等有些集成度高的甚至把驱动器和电机做成一体客户有时就叫“总线步进伺服电机”本质仍是步进系统加CANopen通讯。我这次用的是带CANopen接口的数字式步进驱动器配套57步进电机。选型时我主要看三点第一厂家能否提供对应的EDS文件这是Canopen从站的身份证没有EDS文件后面配置会非常痛苦第二是否兼容CiA402DS402运动控制行规兼容的话控制字、状态字、模式切换这些逻辑都是通用的第三现场电源电压和驱动器额定电流是否匹配。通讯线缆别省。CANopen要求用双绞屏蔽线推荐120Ω特性阻抗。市面上专门的CANopen总线电缆不便宜但至少也要用合格的双绞屏蔽线。我在这个项目里用的是2×0.75双绞屏蔽电缆CAN_H和CAN_L一组双绞屏蔽层单端接地。跑500K波特率总线长度大约三十米通讯非常稳。2. CANopen通讯核心原理速览如果你只会在软件里点点鼠标配置CANopen那遇到问题基本束手无策。因为调试过程中所有疑难杂症最后都要回到协议本身去排查。所以这里我花点篇幅把CANopen的核心原理讲透尤其是层级结构、对象字典和状态机这几块。2.1 CANopen的层级结构与对象字典CANopen很多人理解成一种串口协议其实不对。它建立在CAN物理层和数据链路层之上分得很清楚。用开车来类比CAN总线是高速公路和交通规则决定车怎么走、怎么避让、怎么检测碰撞CANopen则是路上的导航系统和每一个路牌告诉你要去哪、当前位置在哪、前方限速多少。在ISO/OSI模型里CANopen主要工作在应用层但它的可靠性又依赖底层的CAN数据链路层所以排查问题要分层来看层级对应内容调试关注点物理层CAN收发器、双绞线、终端电阻、波特率线缆是否良好、终端电阻是否匹配、波特率是否一致数据链路层CAN协议帧、仲裁、错误检测是否出现总线错误帧、CAN_H与CAN_L是否接反应用层对象字典、PDO/SDO、NMT、心跳EDS配置、PDO映射、状态机逻辑还有一点必须理解透彻对象字典。CANopen的每个从站内部都有一张“目录表”每一项用索引和子索引编号。比如0x6040是控制字0x6060是运行模式0x607A是目标位置。主站和从站之间的所有操作本质上都是在读写这张表。你不需要记住所有索引但用过几次DS402后控制字、状态字、目标位置、实际位置这几个常规索引基本能背下来。2.2 NMT状态机与PDO/SDO执行过程CANopen每个节点都有一套网络管理状态机叫NMT状态机。节点上电后先初始化然后进入Pre-operational预操作状态这时可以用SDO读写对象字典但不能收发PDO过程数据。主站通过NMT命令把节点切到Operational操作状态后PDO才真正开始传送。这个过程非常关键因为我见过不少新手把程序下载进去看到从站灰色或者没数据第一反应就是线坏了其实是忘了把节点切到Operational状态。SDO和PDO是两个容易混淆的概念。SDO是主站和从站之间像打电话一样的点对点问答用于配置参数、读取故障码慢但灵活PDO是像广播站一样的一对多的生产消费模式PLC发一个PDO帧对应COB-ID的从站立刻消费不需要应答快但格式固定。运动控制中控制字、目标位置、实际位置这类高频实时数据全部走PDO而回零方式、加速度设定这类低频配置数据走SDO比较合适。2.3 DS402设备行规里的关键对象步进伺服驱动器只要兼容CiA402DS402它的运动控制接口就是一致的。这里把常用对象字典整理成一个速查表调试时贴在本子旁边非常有用对象字典功能说明0x6040控制字bit0~bit3控制使能状态bit4触发新点位bit7复位故障0x6041状态字bit0~bit3反映状态机位置bit10目标到达bit12回零完成0x6060 / 0x6061模式设定 / 模式显示1PP位置模式3PV速度模式6HM回零模式0x607A目标位置32位单位由驱动器电子齿轮决定0x6081 / 0x6083 / 0x6084轮廓速度 / 加速度 / 减速度决定点位运动的速度曲线0x6098 / 0x6099回零方式 / 回零速度不同驱动器支持的回零方式不一样0x6063实际位置通常用此对象反馈当前位置DS402状态机里控制字和状态字是互相咬合的。最常用的使能序列是先给控制字0x06再给0x07最后给0x0F才能进入“Operation Enabled”可运行状态。很多现场电机不动作查到最后就是使能时序不对直接给0x0F往往没用。3. 实操配置全流程原理讲完下面进入实操。我按项目推进顺序把整个配置流程拆开你在自己项目里照着走一遍基本不会跑偏。3.1 硬件接线与驱动器参数设置先接线。CANopen总线在物理上就是CAN_H和CAN_L两条线从主站串到每一个从站再串回主站一个菊花链拓扑。接线时注意CAN_H接CAN_HCAN_L接CAN_L千万不要接反如果只有两个设备AB接反了主站根本扫描不到从站还会一直报总线错误。终端电阻是很多人忽略的问题。CAN总线规范要求在物理两端各接入一个120Ω终端电阻。主站H5U这一端如果硬件没有内置终端电阻就需要在CAN_H和CAN_L之间并一个120Ω电阻最末端那个驱动器如果拨码支持终端电阻就拨ON不支持就外接一个。如果只在总线一端接了终端电阻通讯短距离还能凑合距离一长就会出现偶发超时、丢帧的情况。另外中间节点不允许接终端电阻否则总线信号反射会更严重。驱动器端的参数设置因品牌而异我用的这款是通过拨码和面板菜单配置。关键要设三个东西节点ID站号、通讯波特率、终端电阻开关。节点ID我习惯从1开始排一个网络里不允许重复波特率我统一设500K。主站和从站的波特率必须一致有一个设错了这个站就掉线。还有部分驱动器有“CANopen使能”和“脉冲使能”是分开的如果拨码设置里选了脉冲模式后面CANopen命令再正确电机也不动这一项也容易踩。顺带提一下节点上线和下线的注意事项这也是很多现场电工常犯的不要在Operational状态下直接带电拔插总线插头。CANopen虽然有CAN层错误处理机制但带电拔插瞬间会造成总线竞争轻则当前报文丢失重则把终端电阻虚接的隐患暴露出来导致整个网络闪断。节点重新上电后会自动回到Pre-operational状态此时PDO停在旧数据上不更新必须由主站重新发NMT启动命令我一般在程序里对每个从站做启动后自动NMT切换这样换从站时不用PLC停机重启。3.2 InoProShop主站配置与EDS导入软件配置这一步我用汇川的InoProShop来演示。新建工程选好PLC型号后左侧设备树里找到CANopen主站节点。在端口参数里设置主站的波特率注意要和从站一致这里我选500K。然后右键添加从站选择“导入EDS文件”找到驱动器厂家提供的EDS文件导入后这个从站就会出现在设备树里。接着配置从站的通讯参数。最重要的三项节点ID必须和驱动器拨码拨的一致否则主站认为这个从站离线PDO参数要和驱动器出厂默认PDO配置匹配厂家特定的映射项尽量别乱动先保持EDS默认等项目跑通了再优化。配置完成后下载运行在InoProShop的通讯诊断界面里能看到各从站的状态。正常的顺序是上电初始化 → Pre-operational → Operational。如果你看到从站一直停在Pre-operational说明主站没有成功下发启动命令或者从站因配置错误拒绝切换。软件里一般有“启动从站”或“NMT管理”按钮手动点一下看能不能切过去这是判断主站配置是否正常最快的方法。EDS文件版本要特别注意。我踩过一次坑拿到的EDS文件是老版本驱动器固件已经更新了结果0x6060模式切换命令老是提示错误。后来重新问厂家要了新版本EDS问题立刻消失。所以拿到驱动器第一件事把固件版本和EDS文件版本核对清楚。3.3 PDO映射设计PDO映射是整个配置里最核心、也最容易出错的部分。所谓映射就是把对象字典里的几个数据打包到一帧CAN里比如把控制字、目标位置、运行模式打成一个RPDO把状态字、实际位置、实际速度打成一个TPDO。我这次四台步进伺服电机的PDO映射设计如下方向PDO映射内容字节数PLC→从站RPDO1控制字0x6040 运行模式0x60604字节PLC→从站RPDO2目标位置0x607A 轮廓速度0x60818字节PLC→从站RPDO3轮廓加速度0x6083 减速度0x60848字节从站→PLCTPDO1状态字0x6041 实际位置0x60636字节从站→PLCTPDO2实际速度0x606C4字节这样设计的好处是把“控制”和“运动参数”分开。RPDO1只放控制字和模式启停、急停时可以单独刷新不影响点位数据RPDO2放目标位置和速度每发一次就是一次完整点位指令加减速度不常变放RPDO3里只在需要变速时更新一次。PDO映射的顺序在CAN报文里就是字节排列顺序必须和从站端EDS里定义的映射顺序一致。比如RPDO2里先放目标位置后放轮廓速度那你PLC侧在启动前要先做一次SDO写操作把这两个对象的映射顺序确认好或者直接在InoProShop的PDO映射编辑界面里按同一个顺序配置。改完PDO映射后大部分驱动器要求重新上电才能生效这一点手册上不一定显著标注但实测下来基本如此。4. PLC程序实现与状态机控制配置做完下面进入PLC程序。H5U是支持IEC 61131-3编程的我习惯用结构化文本ST来写运动控制逻辑代码逻辑清晰也方便封装成功能块复用。4.1 通讯状态监控与错误复位程序里第一步不是运动控制而是通讯监控。我建了一个轴状态管理块每个周期扫描一次从站的状态字和主站诊断信息。如果发现从站掉线立刻停止当前运动并报故障如果状态字bit3Fault位为1就往控制字bit7置1发一个复位命令。这里有个细节复位命令不是一直给1而是给一个脉冲通常是控制字先写0x00或者0x80置位复位位等状态字的Fault位清零后再进入正常使能流程。我习惯的写法是检测到Fault位置1后把控制字写成0x80保持50ms再写0x00然后重新走使能状态机。复位失败的话再查具体故障码从状态字和报警代码配合判断。通讯状态的监控周期建议别太快也别太慢我一般放10ms的任务里跑。太快了因为总线自身抖动容易误报太慢了设备都停了才反应过来危险性也大。4.2 伺服使能状态机使能这个动作别看简单时序错了很折腾人。标准DS402的使能流程是先给0x06Shutdown驱动器状态从Switch On Disabled切到Ready To Switch On再给0x07Switch On切到Switched On最后给0x0FEnable Operation切到Operation Enabled。每切换一步最好都检查一下状态字的对应位。我封装了一个三步使能块代码如下// 使能状态机STEP CASE nStep OF 0: IF bEnableCmd THEN nCtrlWord : 16#06; nStep : 1; END_IF; 1: // 等待状态字bit0 Ready to switch on 置位 IF (nStatusWord AND 16#0001) 16#0001 THEN nCtrlWord : 16#07; nStep : 2; END_IF; 2: // 等待状态字bit1 Switched on 置位 IF (nStatusWord AND 16#0002) 16#0002 THEN nCtrlWord : 16#0F; nStep : 3; END_IF; 3: // 检查bit2 Operation enabled IF (nStatusWord AND 16#0004) 16#0004 THEN bEnabled : TRUE; nStep : 0; END_IF; END_CASE;注意不同驱动器对中间等待位的定义可能略不一样但大方向一致。如果卡在第一步不动多半是驱动器有报警需要先复位如果卡在第二步可能是驱动器没有在CANopen控制模式或者紧急停止输入没接通。使能失败是最常见的现场问题所以我把每一步的状态都放在HMI报警里方便现场一眼定位。4.3 点位运动控制使能成功后切到位置模式模式对象0x6060写1然后写入目标位置和速度最后通过控制字的bit4new setpoint新设定点触发运动。这里有一个新手特别容易犯的错直接把目标位置写入0x607A以为电机会自己动。实际上PP模式必须有bit4的触发信号从0变1或1变0这样Toggle一下驱动器才认为这是一个新点位。我习惯的触发逻辑是写位置前先把bit4清零写完后置位bit4等待位置到达后再把bit4清零准备下一次触发。// 点位运动样例 IF bStartMove THEN // 写目标位置与速度 nTargetPos : 50000; // 用户单位 nProfileVelo : 2000; // 速度单位 nMode : 1; // PP模式 // 触发新点位 nCtrlWord : nCtrlWord OR 16#0010; // 置位bit4 bStartMove : FALSE; END_IF; // 等待到达后清除触发位 IF (nStatusWord AND 16#0400) 16#0400 THEN // bit10 Target reached nCtrlWord : nCtrlWord AND NOT 16#0010; // 清bit4 bMoveDone : TRUE; END_IF;等待到达的标志我推荐看状态字bit10Target reached。在PP模式下这个位在驱动器完成位置命令后会置位。这样写的好处是不需要自己算运动时间驱动器替你判断好了既准确又省事。注意清除bit4和置位bit4之间要隔一个程序周期不要在同一周期内先OR再AND否则触发信号宽度不够驱动器可能不认。4.4 回零功能实现回零是步进系统必做的功能。很多项目里会接一个原点开关驱动器硬件上有一个原点输入点。CANopen控制下回零通常用HM模式实现。先通过SDO把回零参数配置好比如回零方式、两个回零速度、回零方向、偏移量然后切换模式到HM模式值为6再触发一次new setpoint和点位运动类似。回零完成后状态字bit12Homing attained会置位。// 切回零模式 nMode : 6; // HM模式 // 触发回零 nCtrlWord : 16#0F OR 16#0010; // 使能状态触发位 // 等待回零完成 IF (nStatusWord AND 16#1000) 16#1000 THEN // bit12 Homing attained bHomeDone : TRUE; // 切回位置模式 nMode : 1; END_IF;回零完成后的处理也容易忽略回零完成后一定要把运行模式从HM切回PP或PV不然下一步点位运动根本不执行。我就在现场遇到过一回程序里忘了切模式从站一直停在HM模式点位命令发下去电机纹丝不动后来查模式显示才发现这个问题。5. 常见问题与排查技巧实录项目调试中遇到的问题千奇百怪但归纳下来基本集中在下面几类。这里是现场排查的实战经验不代表所有品牌都一模一样但思路是通用的。5.1 通讯不上、扫描不到从站这个问题的排查顺序非常固定。先看接线CAN_H和CAN_L有没有接反再看波特率和节点ID主站与从站是否一致然后看终端电阻总线两端有没有各接一个。我一般拿CAN分析仪抓一下总线波形或者先在InoProShop用SDO手动读一下从站对象字典如果SDO能通而PDO不通那就是NMT状态没切到OP或者PDO映射配置有问题。如果主站扫描不到从站还有一个容易忽略的点从站供电。有些步进驱动器需要外部逻辑电源给通讯和光耦供电只接了电机主电源通讯部分根本没起来。这个坑很隐蔽因为电机可能都能抱闸但CANopen节点没有上线。5.2 使能失败、电机不动作能通讯但使能不了先把状态字读出来按DS402状态机手动分析。Fault位为1就先复位故障如果状态字卡在Switch On Disabled看是否给过0x06如果给了0x0F但没进Operation Enabled看看驱动器的硬件使能端子有没有信号。很多步进驱动器上有一路“ENA使能输入”默认是使能有效还是使能无效每个厂家不一样不接或接反都会导致软件使能命令无效。我遇到过一种特别无语的情况驱动器支持CANopen的同时还保留着脉冲接口而脉冲接口的使能端子上被上一手接线短接了结果无论怎么发CANopen命令驱动器都因为硬件使能信号被占住而拒绝软件使能。排查半天才找到把硬件使能去掉后一切正常。5.3 位置控制异常不动、走错位置、走飞位置模式能切换但不动优先检查0x607A有没有成功写入、bit4触发脉冲有没有送出去、TPDO里映射的实际位置有没有更新。走错位置大概率是单位换算问题步进驱动器的位置单位通常和电子齿轮有关一定要在配置阶段确认清楚“1个用户单位对应多少脉冲”最好做一个固定距离的点动测试来验证。走飞速度失控则要检查速度单位和加速度设置有些驱动器速度单位是脉冲每秒有些是0.1脉冲每秒换算错一位速度直接差十倍非常危险。5.4 回零点位置漂移与回零失败回零失败先看原点开关接线再看回零方式选得对不对。有些驱动器支持“负限位回零”“正限位回零”“Z信号回零”选错方式电机就会朝反方向跑甚至直接撞限位。回零速度太快也容易过冲丢原点我一般设两段速度接近开关速度快一点离开开关时切换低速爬行这样回零精度才有保证。5.5 常见问题速查表现象可能原因排查方法扫描不到从站节点ID不一致、波特率不一致、CAN_H/L接反检查拨码、主站参数、线序SDO能通但PDO无数据NMT未切到OP、PDO配置错误手动启动从站检查PDO映射电机能通讯但使能不上硬件使能端子占用、报警未复位读状态字按DS402状态机逐位分析点位指令发出但电机不动bit4未触发、模式没切对检查控制字触发位、0x6061模式显示位置偏差电子齿轮换算错误用固定距离测试验证单位偶发掉站终端电阻虚接、屏蔽层未接地、波特率过高检查总线两端电阻、线缆屏蔽、适当降波特率6. 一点个人调试心得整个项目做下来我最深的体会是CANopen调试不是靠猜而是靠“分层判断”。通讯上不去查物理层数据不对查配置层运动不执行查状态机层。每一层都有明确的判断依据不要上来就怀疑协议有问题。绝大多数情况下问题出在终端电阻、节点ID、EDS版本、使能时序这些看着不起眼的小地方。还有一条实用建议开发阶段先把每个轴单独调试不要四个轴同时上。单独调试时把所有状态字、模式显示都用监控表拉出来看着状态机的每一步切换来排查问题比一次性铺开四个轴高效得多。全部轴都调通后再统一联机联机时重点关注总线负载率。多个PDO加心跳报文500K波特率下如果负载率超过百分之五六十就要考虑减少映射数据或者提高波特率到1M。如果后续项目里用到了伺服驱动器而不是步进驱动器这套流程完全通用。伺服驱动器同样支持CANopen同样走DS402状态机无非是多了扭矩控制、电子凸轮这些复杂功能。掌握了H5U加步进伺服这套底层逻辑换成伺服只是对象字典和EDS配置上的差异核心方法一点不变。
觉得有用,分享给同行:

为您的企业打造数字门面

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

立即咨询 →