先说结论:如果你从三菱PLC转到汇川PLC做轴控,JOG功能往往就是第一道坎。我在现场见过太多人,梯形图写得飞起,一打开汇川 Easy320 的 Codesys 界面就开始怀疑人生——轴在哪里、使能怎么写、点动按钮为什么按一下动一下然后就不动了?这篇文章我会用一套实际跑过的设备方案(汇川 Easy320 + GL20-2HC 高速计数模块 + 三菱 JE-A 伺服,带 5:1 减速器和 5M20 同步轮,线速度 0.8 米每秒)从头拆一遍 JOG 怎么写、多轴怎么扩、以及怎么避开那些从三菱思维切换过来时必踩的坑。适合正在做汇川中小型轴控项目、或者打算从三菱生态迁移过来的工程师参考。
1. 项目需求拆解:这台设备到底要控什么
1.1 先还原现场工况
这套系统的原始需求说白了并不复杂:一条输送线,要求稳定跑 0.8 m/s 的线速度。机械部分用的是一条 5M20 同步轮带同步带,伺服电机经过 5:1 减速器带动同步轮。同步轮口径意味着什么?5M20 的意思是节距 5mm、20 齿,周长就是 20 × 5 = 100mm。也就是说同步轮转一圈,输送线走 100mm,而电机要转 5 圈同步轮才转 1 圈。
把这个速度换算到电机侧:线速度 800 mm/s ÷ 100mm/圈 = 8 圈/秒的同步轮转速,再乘减速比 5,电机转速就是 40 转/秒,也就是 2400rpm。这个转速对伺服电机来说在额定范围内,没问题。但问题从来不在转速,而在你用什么方式把“电机转 40 圈/秒”这件事表达给驱动器。
同时这套系统还要解决一个问题:电机轴的编码器反馈只能代表电机转子位置,机械上减速器间隙、同步带打滑、同步轮磨损都会让实际线速度与理论值发生偏差。所以项目里专门增加了 GL20-2HC 高速计数模块,接外部脉冲传感器,用来采集实际输送线的位移和速度,做反馈修正用。这也是三菱 FX3U 时代比较少见的玩法,但它恰恰是汇川中型 PLC 扩展 IO 的常规操作。
1.2 为什么选 Easy320 + GL20-2HC,而不是沿用三菱 FX5U
这里先把话说清楚:不是三菱不能用,而是在这道题里,汇川这套组合更贴合需求。Easy320 本身是汇川面向小型设备推出的 PLC,最大亮点是编程环境底层基于 Codesys 内核(InoProShop),轴控对象、PLCopen 功能块一应俱全。这跟三菱 FX5U 用 GX Works3 的“定位指令+特殊继电器”完全是两种编程范式。
GL20-2HC 是汇川 GL20 远程/本地 I/O 系列里的 2 路高速计数模块,支持 AB 相、脉冲+方向、上下计数等模式,单路最高 200kHz。它专门用来接外部编码器或脉冲型传感器。在这套系统里,三菱那边如果要实现同样功能,要么用 FX5U 本体高速计数器加扩展,要么也是加模块,但整体编程思路仍然是“每个计数器单独处理”。汇川这边则可以把外部计数器的值直接映射到软件变量,跟轴控逻辑放在同一个程序里,数据流通顺畅很多。
再加上成本因素:Easy320 加一个 GL20-2HC 模块的费用,比同档次三菱 PLC 加定位模块加高速计数模块的组合通常要低一截。对于小设备、OEM 项目来说,这个优势很实际。
1.3 三菱用户转汇川之前,必须认清的三个底层差异
第一,编程习惯从“梯形图思维”切换到“对象思维”。三菱 FX 系列定位控制主要靠 PLSY、DDRVI、DDRVA 这些指令,配合 M8340、M8348 之类的特殊继电器,你心里想的是“发多少脉冲、方向、停止”;汇川 Codesys 里你操作的是一个 AXIS_REF 轴对象,通过 MC_Power、MC_MoveVelocity、MC_MoveAbsolute 这些功能块去控制这个对象。指令和功能块的最大区别是:功能块要持续调用,轴是“带状态的对象”而不是“一条发完就结束的指令”。
第二,任务扫描机制不同。三菱的梯形图扫描就是 PLC 本体程序从头扫到尾,定位指令在扫描里被处理;Codesys 里你需要明确把轴控程序放在快速任务(比如 1ms 或 2ms)里,普通逻辑放慢速任务,混在同一个 10ms 任务里做轴控会出现响应慢、加减速顿挫的问题。这个坑三菱用户几乎必踩。
第三,数据对象层面,三菱是靠 D 寄存器、特殊继电器来搭程序,汇川则可以直接声明变量、结构体、功能块,轴的位置、速度、状态都是轴对象自带的属性。刚开始会觉得“虚”,但一旦你接受了这种模型,多轴扩展的代码量反而会大幅下降。
2. 动手写 JOG 之前,先把脉冲频率和电子齿轮算明白
2.1 一个很多人忽略的计算:0.8m/s 需要多高的指令脉冲频率
很多从三菱转过来的工程师,拿到 JE-A 伺服的第一反应是参数默认 1:1 电子齿轮比,然后开始写程序。这是最大的一颗雷。
JE-A 伺服电机的编码器分辨率是 131072 脉冲/圈(17bit)。如果驱动器电子齿轮比是 1:1,那么 PLC 每输出 1 个脉冲,电机位置环等效走 1 个编码器脉冲,电机转一圈需要 131072 个指令脉冲。
前面算过,0.8m/s 对应电机 40 转/秒。40 × 131072 = 5,242,880Hz,约 5.24MHz。这个数字放在任何小型 PLC 的脉冲输出口上都是“不可能任务”——Easy320 本体高速输出按常规 200kHz 算,差了 26 倍。哪怕你用更高规格的 500kHz 脉冲模块也远远不够。结果就是:程序看着没问题,一跑高速,脉冲跟不上,电机要么报警,要么直接丢步。
所以做脉冲型伺服控制,第一步永远是先核算指令脉冲频率。
2.2 电子齿轮比怎么设:用需求反推参数
伺服驱动器的电子齿轮比本质是一个倍率 G。外部输入 1 个指令脉冲,相当于位置环里的 G 个编码器脉冲。G 越大,电机转一圈需要的指令脉冲越少,同样的线速度下指令频率就越低,但位置分辨率也会变粗。
反推过程:0.8m/s 时电机转速是 40 转/秒。我们希望在不超过输出口额定频率的前提下,尽量保留位置精度。如果 PLC 输出口是 200kHz,那电子齿轮比至少要知道:40 × 131072 / G ≤ 200000,也就是 G ≥ 26.2。取整后,G = 32 或 64 都可行。
用 G = 64 来算:电机转一圈需要 131072 / 64 = 2048 个指令脉冲,0.8m/s 时指令频率 = 40 × 2048 = 81920Hz,约 82kHz,留了足够余量。位置分辨率呢?同步轮转一圈走 100mm,对应电机转 5 圈,也就是 5 × 2048 = 10240 个指令脉冲。单个脉冲对应的位移是 100 / 10240 ≈ 0.0098mm,也就是约 9.8μm。对 0.8m/s 的输送线来说,这个精度绰绰有余。
如果换成 G = 32,分辨率变成约 4.9μm,0.8m/s 时指令频率约 164kHz,还在 200kHz 以内但余量已经不大。具体选哪个,还要看驱动器允许的电子齿轮比范围。JE-A 这类伺服的电子齿轮比上限通常有明确限制,设置前翻一下驱动器手册,超范围会直接报警。
2.3 外部脉冲传感器与 GL20-2HC 的接线设计
GL20-2HC 在这个方案里的角色是“第二只眼睛”——它不控制伺服,而是独立采集现场脉冲传感器的信号。接外部编码器时,常见的是 AB 相正交信号,也有简单的单相脉冲+方向。GL20-2HC 支持差分输入和集电极开路输入,接法上要注意:
- 传感器如果是 NPN 开路集电极输出,模块输入公共端要接对极性。很多三菱用户之前习惯了 FX3U 输入端的 S/S 端子接法,但汇川模块的源型/漏型定义可能相反,不确认贸然接上,轻则读不到数,重则烧通道。
- 脉冲线必须用双绞屏蔽线,屏蔽层单端接地。GL20-2HC 虽然标称 200kHz,但现场变频器、伺服驱动器就在旁边,干扰问题从来不是模块能力问题,而是接线习惯问题。
- 传感器供电建议单独用一路 24V 开关电源,不要和伺服控制电共用。伺服母线启停瞬间电压波动很容易造成计数瞬跳。
接线确认后,在 InoProShop 里把 GL20-2HC 的通道映射到 PLC 输入区,程序里直接读 DINT 变量就行。后面做速度闭环修正时,这个值就是实际线速度的脉冲表示。
3. JOG 点动功能实战:用 PLCopen 轴对象替代三菱 PLSY
3.1 Easy320 的轴控库与任务配置
在 InoProShop 里新建工程后,轴控相关的功能块来自 PLCopen 库。Easy320 本体的高速输出会被封装成一个或多个 AXIS_REF 轴对象,你不需要自己写底层脉冲输出逻辑,只要给轴对象配置参数,比如:
- 每转反馈脉冲数:131072
- 电机每转用户位移:20mm(因为电机转 1 圈,同步轮走 100 / 5 = 20mm)
- 用户单位:mm
- 最大速度、加速度、减速度
这里刻意把用户单位设成 mm,而不是把脉冲数直接当用户单位。三菱时代大家习惯直接“发脉冲”,显示面板上还得自己乘系数;汇川轴控里把缩放关系配好后,程序里所有速度、位置都直接是工程单位,调试时非常直观。
任务配置方面,轴控程序必须放到快速任务里。推荐建一个 2ms 的 Motion_Task,轴控逻辑全放进去;普通逻辑放默认 10ms 任务。两个任务之间通过全局变量交换信号,不允许普通任务里直接调用轴控功能块。
3.2 一个能跑通的 JOG 点动代码示例
下面这段是完整的 JOG 控制逻辑,用 Codesys 结构化文本(ST)写的。代码里包含电源使能、正反向点动、停止和复位:
PROGRAM Axis_JOG VAR Axis_Main : AXIS_REF; // Easy320 封装的脉冲轴对象 diPower : MC_Power; diMoveVel : MC_MoveVelocity; diStop : MC_Stop; diReset : MC_Reset; xEnable : BOOL; // 伺服使能 xJogCW : BOOL; // 正向点动按钮 xJogCCW : BOOL; // 反向点动按钮 xStop : BOOL; // 停止按钮 xResetCmd : BOOL; // 复位报警 rJogSpeed : REAL := 80.0; // 点动速度 mm/s,运行速度的 1/10 rAcc : REAL := 500.0; // 加速度 mm/s^2 rDec : REAL := 500.0; // 减速度 mm/s^2 xJogCW_Edge : BOOL; xJogCCW_Edge: BOOL; END_VAR// 1. 轴使能:点动前必须保证 Enable 为 TRUE diPower( Enable := xEnable, Axis := Axis_Main ); // 2. 正向/反向点动,带互锁和上升沿处理 xJogCW_Edge := xJogCW AND NOT xJogCCW; xJogCCW_Edge := xJogCCW AND NOT xJogCW; diMoveVel( Axis := Axis_Main, Execute := (xJogCW_Edge OR xJogCCW_Edge) AND NOT xStop, Velocity := rJogSpeed, Direction := SEL(xJogCW_Edge, 1, 2), Acceleration := rAcc, Deceleration := rDec, Jog := TRUE ); // 3. 停止 diStop( Axis := Axis_Main, Execute := xStop ); // 4. 报警复位 diReset( Axis := Axis_Main, Execute := xResetCmd );这里有几个容易出问题的点。
第一,MC_Power 的 Enable 信号必须保持为 TRUE,不是给一个上升沿就结束。三菱用户习惯把 M 继电器置位后就不管了,但 Codesys 功能块大多需要持续调用、持续输入,一旦 Enable 变 FALSE,轴会立刻去使能。
第二,MC_MoveVelocity 的 Execute 参数建议用上升沿。如果你直接把按钮电平接上去,松开瞬间功能块仍可能认为自己还在执行,影响下一次点动。所以代码里先做互锁和沿处理。
第三,Direction 参数用 SEL 函数:SEL(xJogCW_Edge, 1, 2) 表示条件为 TRUE 时返回 1(正向),为 FALSE 时返回 2(负向)。注意这里不是简单的 1/-1,不同运动库对方向常量的定义不完全一致,最好先查库文档。
3.3 JOG 阶段就要做好的安全逻辑
JOG 点动是所有运动控制的第一步,也是安全逻辑最好的验证时机。除非你后面只做“永远往前跑”的设备,否则这几条建议从 JOG 阶段就埋进代码里。
正负限位信号必须在轴使能之前参与逻辑判断。建议用常闭触点输入,断线时视为触发限位,避免限位线掉了都不知道。在轴控程序里,限位生效时不仅要断开运动功能块的执行条件,还要触发 MC_Stop,并且从软件层面锁住反向信号。
急停和伺服使能的顺序也很关键。急停按下瞬间伺服应立刻去使能,同时 PLC 发停止指令。但复位时顺序反过来:先复位驱动器报警,再延时 200ms 左右给伺服使能,等伺服 Ready 后再允许 JOG。如果复位后马上按 JOG,驱动器可能还没准备好,很容易因为“伺服未就绪”报警。
点动速度不要太大。我的经验是点动速度设为运行速度的 10%-20%,加减速度可以设得比正常运行慢一些。这套系统里运行速度 800mm/s,点动取 80mm/s,加速度 500mm/s²,差不多 0.16 秒达到点动速度,手感舒服,也足够看清楚机械是否有异响。
4. 从单轴到多轴:模块化与同步控制
4.1 多轴不是把 JOG 代码复制粘贴两遍
很多三菱用户做多轴时习惯把单轴程序复制一份,改改寄存器地址就算完事。这套做法在小项目里能跑,但在汇川 Codesys 里非常别扭。正确做法是把轴控逻辑封装成一个功能块 FB_Axis,输入输出做成接口,然后在主程序里实例化两个副本:
FUNCTION_BLOCK FB_Axis VAR_INPUT xEnable : BOOL; xJogCW : BOOL; xJogCCW : BOOL; xStop : BOOL; rJogSpeed : REAL; END_VAR VAR_IN_OUT Axis : AXIS_REF; END_VAR VAR diPower : MC_Power; diMoveVel : MC_MoveVelocity; diStop : MC_Stop; END_VAR调用时:
VAR fbAxis1 : FB_Axis; fbAxis2 : FB_Axis; Axis1 : AXIS_REF; Axis2 : AXIS_REF; END_VAR fbAxis1( xEnable := bEnableAll, xJogCW := bJog1_CW, xJogCCW := bJog1_CCW, Axis := Axis1 ); fbAxis2( xEnable := bEnableAll, xJogCW := bJog2_CW, xJogCCW := bJog2_CCW, Axis := Axis2 );这样每根轴的点动、使能、停止逻辑完全一致,后续加轴只是再加一个实例。统一控制的另一个好处是:急停时只要把 bEnableAll 拉掉,所有轴同时去使能,不会出现“一根轴停了一根轴还在跑”的尴尬。
4.2 电子齿轮同步:把从轴“挂”到主轴上
多轴场景里最常见的需求是同步,比如两根辊筒以固定比例同速转动。三菱 FX 系列做同步通常需要自己测主轴速度,再换算成从轴脉冲频率去发,主轴一加速从轴就要滞后一拍。汇川 Codesys 里直接用 MC_GearIn 功能块,把从轴挂到主轴的速度参考上:
diGearIn( Axis := Axis_Slave, MasterAxis := Axis_Main, Execute := bEngageGear, RatioNumerator := 2, RatioDenominator := 1, Acceleration := rAcc, Deceleration := rDec );这个功能块的含义是:从轴与主轴建立一个固定速比同步关系,RatioNumerator / RatioDenominator 就是速比。上面设 2:1,意思是从轴速度是主轴的 2 倍。主轴用 MC_MoveVelocity 跑,从轴挂在主轴上,主轴速度变化时从轴自动跟着变化。
有几个细节必须注意。
第一,从轴在挂齿轮之前必须已经使能,否则 MC_GearIn 不会成功。
第二,MC_GearIn 的 Execute 同样建议用上升沿。解除同步时通常用 MC_GearOut,它会先按设定的减速度把从轴缓慢脱离,而不是瞬间断开,这样机械上不会有剧烈冲击。
第三,主轴和从轴的用户单位最好提前统一,或者在 Ratio 里把单位差异考虑进去。否则你会发现明明设了 2:1,实际速度看起来完全不对。
4.3 多轴联动中的启停优先级与异常策略
多轴联动最怕的是异常停机时序混乱。三菱时代很多人靠 M 继电器和步进梯形图做互锁,在汇川里我建议直接建立一套“状态优先级”规则:
正常停机时,先让各轴按减速度自然停止,不主动切使能,等全部到位后再去使能。相当于先速度停、后位置保持、最后断电。
急停时,所有轴同时 MC_Stop,驱动器的急停输入也直接断开伺服使能。这时候 PLC 侧要记住各轴当前位置,恢复时不要直接重新使能继续跑,而是先手动确认机械位置,必要时做原点回归。
还有一种容易被忽略的情况:如果主从轴已经用 MC_GearIn 同步,停主轴的时候从轴会跟着减速,但如果从轴因为某种原因没有成功挂上齿轮(比如使能失败),主轴停下来后从轴可能还在自由状态。所以多轴同步程序里一定要加状态诊断——PLCopen 功能块都带 Error、ErrorID 输出,程序里必须检查这些状态,一旦 Error 就触发报警,而不是继续执行下面的指令。
5. 现场调试实录:那些文档里不会写的坑
5.1 JOG 启动瞬间电机抖动甚至飞车
这是我从三菱转汇川后遇到的第一个大坑,现象是按下 JOG,电机 “哒哒哒”抖几下,然后马上报警,看驱动器报警码是编码器异常或者指令脉冲异常。查了半天,问题出在电子齿轮比和指令脉冲频率不匹配上。
当时我按三菱时代的“习惯”,先把电子齿轮比设成 1:1,想着分辨率高,结果 JOG 速度虽然设了 80mm/s,但换算成指令频率也有 5.24MHz × 0.1 = 524kHz,远超 Easy320 输出能力。脉冲口根本发不出去,电机就会抖动、报警。
解决方法是先把电子齿轮比按前面 2.2 节的方法重新算一遍,设到合适倍率后,再把轴参数里的“电机每转用户位移”和“每转反馈脉冲数”配好。JOG 一下就能顺滑跑起来。所以我又把这句话放在这里:发脉冲之前先算频率,别凭感觉设参数。
5.2 GL20-2HC 计数值乱跳,或者完全读不到数
这个问题的排查优先级,我总结出来基本是:接线极性 → 模块通道配置 → 传感器类型 → 干扰。
先看模块输入通道的定义,GL20-2HC 的公共端和信号端极性,和以前三菱 FX3U 输入端子的常用接法完全不一样。很多设备用的是 NPN 输出传感器,在 FX3U 上可能直接把 S/S 接到 +24V 就行,但在 GL20-2HC 上公共端极性是反的,接错以后读数是全 0 或者全 F。
其次确认模块是配置成 AB 相还是脉冲+方向。外部传感器如果发的是单圈脉冲,你却配成了 AB 相,计数会按 4 倍频算,速度显示差异很大,甚至方向判断错误。
最后才是干扰问题。GL20-2HC 的线缆不要和伺服的电机线、编码器线捆在一起走,必须分开线槽。屏蔽层单端接地。如果计数还是偶尔跳几个脉冲,可以在程序里加一个简单的数字滤波:连续两次采样值跳变超过合理范围,就丢弃本次数据。经验值方法是根据实际速度设定“每 10ms 最多允许跳变多少脉冲”,超过就认为是干扰。
5.3 从三菱 RS 指令切换到 Modbus RTU,寄存器地址总对不上
三菱 FX 系列做串口通信,很多老工程师习惯用 RS 指令自己拼帧、自己算 CRC,地址偏多少心里都有数。到了汇川 Easy320 的 Modbus RTU 主从配置,界面化配置反而让人犯迷糊。
最常见的坑是寄存器地址“0 偏置”和“1 偏置”的问题。比如上位机软件或触摸屏里写的是 40001,协议帧里的实际地址是 0x0000;而 InoProShop 的 Modbus 从站配置里填的往往也是协议地址。填 40001 和填 0 可能是一样的,但填成 1 就会整体错开一个寄存器。读回来的数据乱七八糟,多半就是这里差了一位。
另外,Modbus RTU 通信异常时不要第一时间怀疑 PLC,先把串口参数、从站地址、CRC 校验方式逐项核对。现场遇到过很多次所谓的“通讯不稳定”,最后发现是伺服驱动器的通讯参数里没关“每次上电自动清报警”,导致偶发异常一帧重试就断站。
5.4 避坑速查表:三菱思维与汇川 Codesys 思维对照
下面这张表是我在实际项目里反复用到的一张对照表,建议截图保存:
| 事项 | 三菱 FX/FX5U 习惯 | 汇川 Easy320 / Codesys 习惯 |
|---|---|---|
| 编程软件 | GX Works2 / GX Works3 | InoProShop(Codesys 内核) |
| 点动控制 | PLSY / DDRVI + 特殊继电器 | MC_Power + MC_MoveVelocity |
| 轴状态 | 靠 M 继电器自己维护 | 轴对象自带状态机 |
| 多轴扩展 | 复制梯形图改地址 | 封装 FB_Axis,实例化多个轴对象 |
| 电子齿轮比 | 经常忘记计算 | 依然必须算,不然脉冲频率爆表 |
| 串口通讯 | RS 指令手写报文 | Modbus 配置或功能块,注意 0/1 偏置 |
| 外部高速计数 | C235~C255 等计数器 | GL20-2HC 模块,软件变量直接读 |
| 检测接线 | 注意 S/S 端口 NPN/PNP 切换 | 同样要核对模块源型/漏型定义 |
5.5 关于圆弧插补和传统三菱指令的对比
热词里出现了“三菱PLC圆弧插补程序梯形图”,这里也借机多说一句。三菱 FX3U/FX5U 做圆弧插补,梯形图写起来非常繁琐,本质上是在每个扫描周期里给两轴分配微小的增量位置,程序量和调试难度都很高。汇川 Codesys 里提供 MC_MoveCircularAbsolute 这类功能块,指定终点、圆心或半径,运动内核自动完成路径规划。
但如果你用的是 Easy320 这类以逻辑控制为主的小型 PLC,我的建议是:少于两轴的圆弧插补能不做就不做,用电子凸轮或者虚拟主轴加同步来做曲线运动,稳定性更高。如果项目确实要求多轴圆弧插补,选型时优先考虑支持 EtherCAT 总线轴控的汇川 AM 系列,不要指望脉冲轴在插补精度上达到很好的效果。
6. 程序架构的后续扩展思路
6.1 从 JOG 直接升级到自动运行
JOG 跑通以后,自动运行其实就是在同一根轴上叠加一层逻辑。建议把 JOG 功能块和自动定位功能块分开,不要混在一个程序里。自动运行用 MC_MoveAbsolute / MC_MoveRelative,JOG 用 MC_MoveVelocity,两者在执行上天然互斥,但程序层面仍然要做互锁:自动模式下禁止 JOG,JOG 模式下禁止自动。
这样做的好处是,设备从手动调试切换到自动生产时,你不需要改轴控底层,只需要切换模式变量。三菱时代很多人习惯把 JOG 和自动定位放在同一个梯形图段里,互相干扰的坑我踩过不止一次。
6.2 把外部反馈变成真正的速度闭环
GL20-2HC 读到的外部脉冲,如果只停在显示层面就浪费了。在这套方案里,我建议用外部脉冲算出来的实际线速度和伺服设定速度做差,加一个简单 PID 修正。修正量叠加到轴速度指令上,或者作为伺服电子齿轮比的微调。
具体实现上,在 2ms 任务里每 100ms 采样一次 GL20-2HC 的值,做差值得到实际速度。目标速度减去实际速度得到偏差,经过 PID 后输出速度补偿值。要注意标定比例:传感器每转多少脉冲、对应多少mm,都要先算准。这个闭环的好处是能弥补同步带打滑带来的速度误差,对要求平稳输送的设备非常有用。
6.3 设备开机要不要每次回归原点
三菱时代很多设备靠伺服绝对位置保持,或者干脆靠限位开关每次开机找原点。汇川 Codesys 里原点回归有专门功能块 MC_Home,支持多种回零模式,比如 正转找Z相、反转找限位、绝对位置自动设定等等。
我的建议是:除非机械结构有绝对编码器或电池保持,否则每次开机做一次 Homing,成本最低也最可靠。Easy320 的脉冲轴可以用外部 GL20-2HC 的 Z 相锁存,或者伺服驱动的 Z 相输出做精准原点,具体接法要看你现场有没有把 Z 相引出来。如果没引,退而求其次用外部限位加回退补偿,也能满足大部分设备的精度要求。
这套 JOG 到多轴的扩展思路,我在不同项目里已经重复过很多轮。核心原则其实只有一句话:先用计算把机械和伺服的边界摸清,再用 PLCopen 轴对象统一管理轴状态,最后把安全逻辑放在所有运动指令之前。这三条做到位,不管你后面接多少根轴,代码的结构都不会散。
最后再分享一个小技巧:所有轴控相关变量,命名统一加前缀,比如 Axis1_、Axis2_,模式变量用 Mode_Auto、Mode_Jog 这种语义化命名。三菱时代用 D0、D10 惯了,到了 Codesys 里还这么写,项目到后期你自己都看不下去。好的命名习惯能节约的调试时间,远比你想的多。