前阵子调试一套三菱MR-JE-C伺服,走CC-Link IE Field Basic通信,主站用FX5U。项目本身不算复杂,就是JOG加定位控制,结果我在6040h控制字、6041h状态字这套CIA402协议对象上卡了两天。不是动作不出来,而是状态字读不懂,出了问题根本分不清是通信没通、指令写错、还是伺服压根没使能。后来把对象字典和状态机彻底捋了一遍,才发现这套东西本质就是一组标准“握手”信号,理解了之后不仅三菱的伺服好调,其它支持CIA402的驱动也能触类旁通。这篇博文把实战中踩过的坑、验证过的流程完整整理出来,重点讲清楚6040h/6041h每一位的含义、状态机切换顺序,以及JOG、定位两种常用控制的PLC实现思路,适合正在调试MR-JE-C但对控制字不熟的电气工程师,也适合做设备维护、想快速上手对象字典调试的现场人员。
1. 先把控制字和状态字说透
1.1 6040h控制字:每个bit都是一路开关
先纠正一个容易混淆的概念:标题里常说的“6040/6041状态字”其实分两类,6040h是控制字Controlword,方向是PLC写给伺服;6041h是状态字Statusword,方向是伺服反馈给PLC。很多人上来就乱改控制字,就是因为没搞清楚这两个对象的天然区别。
6040h本身是一个16位寄存器,每一位就是一路“开关指令”。虽然标准CIA402里定义了不少位,但在MR-JE-C上用CC-Link IE Field Basic做JOG和定位,最常用的就下面几个:
- bit0(Switch On):接通使能请求,和bit1配合使用。
- bit1(Enable Voltage):主电路电压使能请求。
- bit2(Quick Stop):快速停止请求,正常工作时必须是1,置0会触发快速停止。
- bit3(Enable Operation):运行使能请求,相当于最终“放行”信号。
- bit4(Run/Start):运动启动。在速度模式下是运行/停止,在位置模式下是定位启动沿。
- bit7(Fault Reset):故障复位,用上升沿触发。
把这些位组合起来,就成了命令字。实际调试中真正要背的其实就几个值,我整理成了表:
| 控制字值 | 命令名称 | 作用 |
|---|---|---|
| 0x0000 | Disable Voltage | 关闭主电路,电机失电 |
| 0x0006 | Shutdown | 进入待机,等待下一步 |
| 0x0007 | Switch On | 主电路接通 |
| 0x000F | Enable Operation | 运行使能,电机可以动 |
| 0x001F | Enable + Run | bit4置1,启动定位或运行 |
| 0x000F | Enable + Stop | bit4清0,停止运动 |
| 0x0080 | Fault Reset | 故障复位,需要上升沿 |
注意一个非常关键的点:0x000F这个值既是“使能”,也是“停止”。很多人以为停止要给0x0000,结果一给0x0000直接把伺服主电路切断了,电机直接掉使能。正确做法是把bit4清掉,其它使能位保持,也就是让控制字回到0x000F,而不是回到0x0000。
还有个容易踩的细节:bit2快速停止。如果你在运行中把控制字从0x000F改成0x000B(bit2变0),驱动器会进入快速停止状态,状态字bit5会跟着变化。这种停止方式和普通的bit4停止不一样,急停响应更快,但会有机械冲击,调试时最好不要拿它当普通停止按钮用。
1.2 6041h状态字:伺服在哪个状态,看这里
6041h是驱动器反馈给PLC的状态字,16位,每一位表示一种状态。常用的位如下:
- bit0(Ready to Switch On):伺服已准备好,可以接通主电路。
- bit1(Switched On):主电路已接通。
- bit2(Operation Enable):运行使能有效,电机可以接受运动指令。
- bit3(Fault):故障标志,1代表有报警。
- bit5(Quick Stop):快速停止状态,正常为1,触发快速停止后为0。
- bit6(Switch On Disabled):禁止接通状态,通常是刚上电或故障复位后的初始状态。
- bit9(Remote):远程控制有效,对象字典模式下一般自动置1。
- bit10(Target Reached):目标到达,定位完成判断最常用。
- bit12(Setpoint Acknowledge):位置设定值已被伺服接受,PP模式(定位模式)下很关键。
- bit13(Following Error):跟随误差过大报警位,1代表有跟随误差报警。
实际读状态字的时候,不要去背那些十六进制数,比如0x0237、0x0207之类的,不同状态、不同开关量反馈下数值都不一样,背了也容易对不上。正确方法是按位判断,重点看bit0、bit1、bit2是否同时为1,如果这三个都是1,说明伺服已经处于运行使能状态,可以发运动指令了。
判断定位完成时,很多人只盯着bit10,这在一些场景下会出问题。比如在速度模式下,bit10的含义是“达到目标速度”,只要你速度给的是0,它就可能一直是1。所以用bit10判断“定位完成”必须确认已经处于位置模式,或者配合bit12一起判断,后面第四章会展开讲。
1.3 状态机:为什么非要一步一步来
CIA402协议里的伺服控制和汽车点火很像:通电自检是“OFF”,钥匙拧到ACC是“待机”,再拧到ON是“接通”,最后拧到START才是“运行”。如果你直接在OFF状态给启动信号,车肯定不会走,因为中间有安全逻辑卡着。伺服也一样,刚上电时处于Switch On Disabled状态,你就算把控制字写成0x000F,它也不会理你,必须先按顺序给命令。
标准的状态机路径是:上电(Switch On Disabled)→ 给0x0006(Shutdown)→ 进入Ready to Switch On → 给0x0007(Switch On)→ 进入Switched On → 给0x000F(Enable Operation)→ 进入Operation Enable。
这个顺序不能跳,但实际调试中也不需要写得特别复杂,一个简单的CASE状态机就能搞定。下面是我在GX Works3里写的ST使能序列:
// 伺服使能状态机 CASE step OF 0: // 初始,发送Shutdown命令 g_ControlWord := 16#0006; step := 10; 10: // 等待状态字bit0=1 IF (g_StatusWord AND 16#0001) <> 0 THEN g_ControlWord := 16#0007; step := 20; END_IF; 20: // 等待状态字bit1=1 IF (g_StatusWord AND 16#0002) <> 0 THEN g_ControlWord := 16#000F; step := 30; END_IF; 30: // 等待状态字bit0、bit1、bit2全为1 IF (g_StatusWord AND 16#0007) = 16#0007 THEN b_ServoEnabled := TRUE; step := 99; END_IF; END_CASE;这里g_ControlWord就是6040h映射到PLC的标签,g_StatusWord是6041h的映射标签。注意第30步的判断条件用了十六进制掩码0x0007,意思是同时检查bit0、bit1、bit2,三个位都为1才认为是真正使能成功。
实际调试中,如果发现状态字一直卡在某个阶段不动,最常见的原因不是控制字写错,而是硬件端子没满足,比如EM1急停没短接,或者主电路电源没送。这一点在后面第五章排查部分会详细说。
2. 硬件与参数准备(MR-JE-C + CC-Link IE Field Basic)
2.1 选型确认与接线
先说选型。MR-JE系列里,带CC-Link IE Field Basic通信功能的型号是MR-JE-C,前面带A的是脉冲型,不带以太网口。如果你手头是MR-JE-A,就不要想着走CC-Link IE了,老老实实用脉冲或者换模块。MR-JE-C的以太网口在驱动器面板上,用普通网线就能和PLC连接,通过交换机组成星型网络也可以。
接线方面,除了主回路电源(L1、L2、L3)和控制电源(L11、L21)之外,有几个端子必须重视:
- EM1(紧急停止):这个端子如果不短接或者不给24V,驱动器不会进入使能状态,控制字写到天上去都没用。很多工程师第一次调试就把时间耗在这里。
- LSP/LSN(正负行程限位):如果外部限位开关没有接,不要把这些端子悬空,按手册要求处理。限位触发时驱动器会按急停方式停止,并且状态字里的运动使能会掉。
- 编码器线和电机动力线:MR-JE-C的编码器线建议使用三菱原装线,或者屏蔽层良好处理的线。编码器线松动是最难排查的偶发故障,表现为运动中偶发AL16、AL25报警。
电源接线完成后,第一次上电建议先不要接电机负载,用面板小键盘操作,确认驱动器自检正常、没有报警,再接电机线。千万不要带电插拔编码器线,这个习惯能帮你省掉一大半的编码器故障。
2.2 驱动器参数设置
驱动器参数设置是控制字能不能生效的前提。有几个参数必须提前检查:
- PA01(控制模式):需要设为网络控制模式,也就是通过CC-Link IE Field Basic接收指令。不同固件版本显示可能略有差异,但原则是“位置/速度/转矩通过通信给定”。
- PA03(位置检测模式):增量/绝对位置选择。如果做绝对位置控制,需要配电池,断电后位置不丢;如果只是做相对定位,用增量方式即可。
- PA05/PA06(电子齿轮分子/分母):这个直接决定位置指令单位,非常重要。
电子齿轮的计算举个实际例子:MR-JE-C的编码器分辨率是4194304脉冲/转,也就是2的22次方。假设对应丝杆导程是10mm,我们希望一个指令单位等于0.001mm,那么电机转一圈需要10000个指令单位。电子齿轮比就是4194304/10000=419.4304,所以设PA05=4194304,PA06=10000。设完之后,你给607Ah目标位置写10000,电机就刚好走一圈,也就是10mm。
如果是速度单位,标准CIA402里速度对象的单位是0.01r/min,比如给5000就是50r/min。JOG调试时建议先给一个低速值,比如1000(10r/min),确认方向没问题再往上调。
还有一个容易被忽略的参数是定位完成范围,它决定状态字bit10什么时候置位。范围设得太大,还没到位就报完成;设得太小,到位了但bit10迟迟不变,影响下个动作的触发。一般先设成电子齿轮换算后的几个脉冲,比如10个脉冲,现场根据机械精度再微调。
2.3 PLC侧网络组态
使用GX Works3配置CC-Link IE Field Basic通信时,先建立工程,添加MR-JE-C从站,设置站号,然后配置刷新映射。核心思路是把伺服对象字典里需要的对象,映射到PLC侧可以访问的地址或标签。
以我调试的项目为例,映射表建议做成这样:
| 对象字典 | 名称 | 方向 | 说明 |
|---|---|---|---|
| 6040h | Controlword | PLC→伺服 | 控制命令 |
| 6041h | Statusword | 伺服→PLC | 状态反馈 |
| 6060h | Modes of Operation | PLC→伺服 | 模式设置:1=位置,3=速度 |
| 6061h | Modes of Operation Display | 伺服→PLC | 当前生效模式回读 |
| 607Ah | Target Position | PLC→伺服 | 目标位置 |
| 6042h | VL Target Velocity | PLC→伺服 | 速度模式目标速度 |
| 6081h | Profile Velocity | PLC→伺服 | 定位运行速度 |
| 6083h | Profile Acceleration | PLC→伺服 | 加速时间 |
| 6084h | Profile Deceleration | PLC→伺服 | 减速时间 |
| 6064h | Position Actual Value | 伺服→PLC | 位置实际值 |
| 603Fh | Error Code | 伺服→PLC | 故障代码 |
通信周期会直接影响JOG的手感和定位触发的实时性。MR-JE-C走CC-Link IE Field Basic时,建议把主站通信周期设置在毫秒级。如果感觉JOG按下后反应慢半拍,除了检查控制字写入时序,也要看一下PLC扫描周期和网络刷新周期是否匹配。PLC程序里最好一个扫描周期只刷新一次控制字,不要在多个程序块里同时写同一个地址。
3. JOG控制实战
3.1 JOG的原理:速度模式+控制位
JOG的本质很简单:按着按钮电机以设定的速度转,松手就停。这种运动方式适合使用速度模式,也就是Profile Velocity Mode,模式码是3。
速度模式下,PLC要做三件事:一是把6060h写成3,切换到速度模式;二是把目标速度写入6042h;三是通过控制字bit4控制运行/停止。速度的正负方向由目标速度的正负决定,正数正转,负数反转。
加减速时间在速度模式下由6083h(加速时间)和6084h(减速时间)控制,单位通常是毫秒。现场调手感的时候,这两个参数比目标速度更重要。速度给得再大,只要加减速时间够长,机械冲击就小;反过来,速度不大但加减速设成0,启动瞬间照样能把机械打坏。
这里要特别提醒:模式切换必须在伺服停止状态下进行。如果你正在JOG运行中,突然把6060h从3改成1,伺服会报模式切换错误,或者干脆不响应。我习惯的做法是先把bit4清成0让电机停下来,等状态字显示停止后,再切模式。
3.2 PLC程序实现JOG
下面是一个简单的JOG正转实现,用ST语言写,适合放在扫描周期里循环执行:
// JOG正转 IF b_JOG_Fwd THEN // 第一次按下时,切换模式并设置速度 IF NOT b_JOG_Running THEN g_Mode := 3; // 速度模式 g_TargetVel := 1000; // 1000 * 0.01r/min = 10r/min b_JOG_Running := TRUE; END_IF; // 置bit4,运行 g_ControlWord := g_ControlWord OR 16#0010; ELSE // 松手,清bit4,停止 IF b_JOG_Running THEN g_ControlWord := g_ControlWord AND 16#FFEF; b_JOG_Running := FALSE; END_IF; END_IF;b_JOG_Fwd是外部按钮信号,b_JOG_Running是内部的第一次按下标志。g_Mode对应6060h,g_TargetVel对应6042h。控制字的其它位保持0x000F不变,只操作bit4。
这段代码在功能上没问题,但有一个细节要留意:模式切换不是瞬间生效的。写完6060h之后,驱动器和PLC之间的通信有一个周期延迟,如果马上写6042h和bit4,有可能指令到达时模式还没有切换完成,导致速度指令被忽略。稳妥的做法是先写6060h,然后延时几个扫描周期,或者回读6061h确认当前模式已经是3,再继续后续操作。
3.3 JOG调试验证注意
JOG看起来简单,现场调试时遇到最多的问题反而集中在这几个方面。
方向反了是最常见的。如果按下正转按钮电机反转,不要急着改程序,先在驱动器参数里确认PA07指令方向极性,或者把6042h目标速度改成负数,反过来转。很多设备上对JOG方向有明确要求,不能简单粗暴地换线,那样会影响后续定位的方向判断。
松手后电机还继续转一段距离,这种情况八成是减速时间设得太长。6084h减速时间单位是毫秒,如果设成5000,松手后还要转5秒才会停,给人的感觉就是“停不住”。JOG调试时减速时间先设100到200毫秒,先确认停止响应,再根据机械惯性调整。
启停瞬间有冲击,这是加减速时间过短。JOG调试先用低速验证方向和控制逻辑,确认没问题后再把速度往额定值靠,同时匹配加减速时间。这类问题在设备联调时最容易暴露,电机的刚性设得再高,加减速时间不合理,机械照样抖动。
4. 定位控制实战(Profile Position Mode)
4.1 定位模式原理与关键参数
定位控制使用Profile Position Mode,模式码是1。原理是PLC把目标位置、运行速度、加减速时间一次写给驱动器,驱动器自己规划梯形速度曲线并完成定位,全程不需要PLC实时参与。
这个模式下,PLC需要关注的对象包括:
- 607Ah(Target Position):目标位置,单位由电子齿轮决定。文章前面例子中,设好电子齿轮后单位是0.001mm。
- 6081h(Profile Velocity):定位运行速度,单位0.01r/min。
- 6083h(Profile Acceleration):加速时间,单位毫秒。
- 6084h(Profile Deceleration):减速时间,单位毫秒。
定位模式下不需要再写6042h,6042h是速度模式的目标速度。很多人在PP模式下写完607Ah和6081h,发现电机不动,就去检查6042h,结果越查越乱。
还有一点要搞清楚:位置数据是32位的,有符号数。正数正方向,负数负方向。如果你的目标位置可能超过32767,必须使用32位寄存器或标签。CC-Link IE映射时注意数据长度配置,映射成16位再拼接是在给自己挖坑。
4.2 从使能到定位完成的动作顺序
完整的定位流程非常固定,按顺序操作如下。
第一步,确认伺服处于使能状态,即状态字bit0、bit1、bit2都为1,控制字为0x000F。
第二步,把6060h写成1,切换位置模式。等待6061h回读为1,确认模式切换成功。
第三步,写6081h速度、6083h加速、6084h减速。如果连续多次定位且参数没变,这一步可以省略。
第四步,写607Ah目标位置。
第五步,把控制字bit4从0变1,产生一个上升沿,触发定位启动。
第六步,等待状态字bit12变为1(伺服已接受设定值),再等bit10变为1(目标到达)。
这六步里最容易出错的是第五步。bit4必须是一个从0到1的上升沿,如果之前bit4已经是1,你修改了607Ah再写一次0x001F,伺服会认为没有新指令,不动作。所以定位前要确保bit4处于0状态。
ST语言的简版实现如下:
// 定位触发 b_Trig := (b_Go AND NOT b_Go_Old); b_Go_Old := b_Go; // 确保bit4为0,产生沿 IF NOT b_MoveBusy THEN g_ControlWord := g_ControlWord AND 16#FFEF; END_IF; // 新的定位指令 IF b_Trig AND NOT b_MoveBusy THEN g_Mode := 1; // 位置模式 g_TargetPos := dwTargetPos; // 目标位置 g_ProfileVel := 3000; // 30r/min g_ProfileAcc := 200; // 200ms g_ProfileDec := 200; // 200ms g_ControlWord := g_ControlWord OR 16#0010; // bit4上升沿启动 b_MoveBusy := TRUE; END_IF; // 完成判断 IF b_MoveBusy AND (g_StatusWord.10 = TRUE) THEN g_ControlWord := g_ControlWord AND 16#FFEF; // 清bit4 b_MoveBusy := FALSE; END_IF;这里IF NOT b_MoveBusy先清bit4,是为了保证每次触发时都能产生有效的0到1沿。实际项目中,如果PLC扫描周期和通信刷新周期有延迟,还要考虑加一个延时,确保清bit4的命令真的送到了伺服,再发置位命令。
4.3 位置到达的判定细节
很多工程师喜欢用bit10判断定位完成,这本身没问题,但一定要理解bit10的含义是“位置偏差在定位完成范围内”。它说的是“差不多到了”,不是“已经精准停稳”。
定位完成范围在驱动器参数中设置。如果范围设得很大,比如几百个脉冲,那么电机离目标还有一段物理距离时,bit10就已经置1了;如果范围设得很小,电机到位后还在微小修正,bit10会延迟一点才置1。
稳妥的双重判断是:先看bit12(Setpoint Acknowledge)为1,表示伺服已经接收并响应了这次设定值;再看bit10为1,表示位置已经到了。两个位都满足,再去执行下一个动作。这样能避免因为定位完成范围设置不当带来的误判断。
还有一个容易忽略的坑:当控制字bit4被清掉后,状态字bit12会跟着变化。如果你在bit4还保持1的时候去判断bit12,读到的是旧值还是新值取决于通信时序,容易产生误判。所以在单次定位模式下,最可靠的做法是等到bit10=1后,再清bit4,然后再开始下一轮定位。
5. 常见问题与排查技巧实录
5.1 使能不上、状态字原地不动
这是所有问题里最多的。现象是控制字已经写了0x000F,但状态字始终没有变化,或者卡在初始状态。
按顺序排查:
第一步,查EM1急停端子。用万用表量24V有没有到驱动器端子,确认接触良好。EM1没有信号,驱动器永远进不了使能。
第二步,查主电路电源。控制电源有电,面板显示正常,但主回路没电,也会导致无法完全使能。很多设备调试时只送了控制电,忘了送三相电。
第三步,查通信映射地址。在GX Works3的监视里,确认写入的g_ControlWord确实对应到6040h,g_StatusWord确实对应到6041h。映射错位是常见问题,你写的是6040h,实际映射的却是另一个对象,驱动器当然没反应。
第四步,用MR Configurator2在线连接驱动器,直接在对象字典里看6040h和6041h的实时值。这是我特别推荐的做法,可以快速判断是通信问题还是控制逻辑问题。如果在专业软件里写0x000F能正常使能,那问题就在PLC通信侧;如果在软件里写也没反应,那就检查端子、电源和参数。
5.2 定位不动作或动作异常
定位指令发下去,电机不动或者动作不对,这属于第二大高频问题。
如果定位完全没反应,先回读6061h,确认当前模式确实是1。模式切换没生效是常见原因,尤其是JOG之后直接切定位模式时,一定要等伺服完全停止再切。有时因为通信延迟,6060h写入还没被驱动器处理,紧接着607Ah和bit4就来了,整条指令时序就乱了。
如果电机动了但位置不对,重点检查电子齿轮比PA05/PA06和位置单位。我见过把4194304/10000设成419430/10000的,结果走10倍距离,还以为是方向错误。这时看6064h实际位置,再对照目标位置,基本马上能定位问题。
如果定位过程中报警过载,常见原因是加减速时间太短,或轮廓速度太高,机械负载拉不动。排查时先看603Fh故障码,MR-JE常见的是AL50过载报警。对策是把加减速时间调长、降速,然后再试。
还有一种隐蔽问题:正负限位触发了,但程序里没有监控限位信号,导致定位一开始就发不出去。MR-JE的LSP/LSN接的是开关输入,如果某个限位开关一直处于断开状态,驱动器会认为行程到了,控制字再正确也不动作。
5.3 故障复位、报警处理与复位顺序
故障后伺服会进入Fault状态,状态字bit3为1。这时候用0x000F是没用的,必须走故障复位流程。
正确做法是:先排除故障源,比如急停复位、编码器线重新插紧、过载报警先让驱动器冷却,然后给控制字一个0x0080,保持若干扫描周期,再给0x0006,重新走使能序列。
很多人复位不成功,原因是把0x0080一直按住不放。实际上故障复位需要的是bit7上升沿,也就是从0变1的过程。如果一直保持1,驱动器只会响应一次,后面就不再理你了。所以正确的顺序是:先确认控制字bit7为0,然后置为1,再清0,形成一个完整脉冲。
复位是否成功不能只看驱动器面板报警是否消失,一定要看状态字bit3是否变回0。如果bit3还是1,说明报警源还在,或者复位时序不对。
我整理了一张速查表,现场调试时可以快速对照:
| 现象 | 可能原因 | 解决思路 |
|---|---|---|
| 状态字一直显示禁止接通 | EM1急停未短接 | 检查端子接线和24V |
| 控制字写了没反应 | 映射地址不对 | 用MR Configurator2在线核对对象字典 |
| JOG方向反了 | 速度符号或方向参数 | 改6042h正负号,或PA07方向参数 |
| 松开JOG后还继续走 | 减速时间太长 | 减小6084h |
| 定位指令发了不动 | 模式没切换成功 | 回读6061h确认当前模式 |
| 电机走了但位置不对 | 电子齿轮比错误 | 核对PA05/PA06,看6064h实际值 |
| 报警复位不成功 | 故障源未排除或复位无沿 | 先排除故障,再给0x0080上升沿 |
个人调试经验里,还有一个小技巧值得分享:把伺服使能、故障复位、JOG、定位这几个动作分别封装成独立的“伪函数块”,在PLC里用标准标签接口调用。这样换项目的时候,只需要改映射地址和电子齿轮参数,控制逻辑主体可以原封不动搬过去。三菱伺服从MR-JE到MR-J4,很多控制字逻辑是相通的,这套东西做好之后越用越省事。
最后再提醒一句:现场动控制字之前,最好先用MR Configurator2和手动模式把伺服的基本动作验证一遍,确认接线、方向、电子齿轮都没问题,再切换到网络控制。否则通信和控制字叠加在一起出问题,排查起来非常头疼。