
前面0到69行的程序主要是复位操作,现在先看第70行,首先通过X0==0才有右面的T5(手动条件),就可以确认X0 == 0是手动,X0 == 1是自动。
由于之前的复位操作中,已经做了ZRST M0 M499,所以第70行的运算结果就是K5时间到后,T5 == 1。

现在从78行开始看,T5 == 1可以通过,但是需要有M20的上升沿,M20在前面的程序中没有做SET操作,所以M20这个条件不成立,我估计这个M20应该是外界的一个赋值操作,比如HMI屏幕上按了一下某个按钮从而得到一个M20的上升沿信号。然后Y0 == 0 和 T50,这2个条件是成立的,但是Y3 == 1 这个条件目前是不成立的。然后下分支中,是当Y0 == 1时才继续往下执行,并且还需要T50 == 1,这个T50在前面的代码中也没有看到SET操作,所以我基本可以认为78行这里的程序在本轮扫描周期中应该是不会执行Y0 SET操作的。只能继续往下看。

第90行是需要Y0 == 1时才执行,所以这个代码也先不用管。

第94行代码比较好理解,T5 == 1条件是满足的,然后只要M21得到一个上升沿信号,后面的逻辑就是如果Y1 == 0,那么就执行SET Y1,也就是将夹子气缸B执行起来,然后需要等T51信号再RST,这个T51的计时应该是再后面执行,所以继续往下面看。

第105行就是刚刚T51计时器的执行,也就是说只要Y1 == 1,就可以开始计时T51。
代码读到这里,可以做一个小总结和猜测。
首先M20就是手动点击执行焊接上下气缸的一个操作请求,但是需要让Y3退让气缸D要SET作为前提条件,一旦Y0 == 1,那么就执行一个倒计时,时间到了就自动RST Y0(焊接上下气缸)。
同样的道理,M21是手动申请执行Y1夹子B气缸,一旦Y1==1,那么启动一个倒计时,倒计时到了就自动RST Y1。

然后第109行的代码,跟第94行的代码逻辑是一样的,M22就是手动申请执行Y2 夹子气缸C,一旦Y2==1,那么启动一个倒计时,时间到了之后就自动复位Y2对应的气缸C。

第124行的代码逻辑跟前面的思路是一样的,M23就是手动申请执行Y3退让气缸D,同样的一旦Y3==1,那么启动一个倒计时,时间到了之后就需要自动复位Y3对应的气缸D,但是我这里说的是需要不是一定,因为这里还需要另一个条件就是Y0==0,也就是说焊接上下气缸需要在RST状态。这样就好理解了,也就是说说Y1和Y2对应的夹子B气缸和夹子C气缸,没有额外的执行条件,基本就是只要目前是RST状态就可以SET,然后一旦SET就进行一个倒计时,倒计时到了之后,就自动RST。
然后Y0对应的焊接上下气缸和Y3对应的退让气缸D就相互有一个依赖关系:
1、如果手动调试申请执行Y0对应的焊接上下气缸,那么需要Y3对应的退让气缸要处于SET(也就是气缸伸出的状态)
2、如果要RST复位Y3对应的退让气缸,就需要Y0当前不处于SET(也就是气缸伸出的状态)

同理,M24就是手动申请执行SET Y5,也就是取料前后。基本就是只要目前是RST状态就可以SET,然后一旦SET就进行一个倒计时,倒计时到了之后,就自动RST。

同理,M25就是手动申请执行SET Y6,也就是取料上下。基本就是只要目前是RST状态就可以SET,然后一旦SET就进行一个倒计时,倒计时到了之后,就自动RST。

同理,M26就是手动申请执行SET Y7,也就是取料夹子。基本就是只要目前是RST状态就可以SET,然后一旦SET就进行一个倒计时,倒计时到了之后,就自动RST。

手动模式下的代码,基本将Y0到Y7,除了Y4固态都大概清晰了,但是这个Y4固态的注释说明,然后再结合"排气"问题,大致可以猜测焊接后需要用气体将物料冷却的意思。
由于这部分是手动调试模式,能够看出一些强依赖关系,但是看不出工艺流程,工艺流程需要看自动化流程。

第214行代码的主要执行时SET M41,M41的注释为演示指示灯,也就是说在手动模式下,在HMI触摸屏中按下启动开关或者踩下脚踏后,如果当前并不是演示模式下,那么就进入演示模式。
其实我对作者用词的理解,这个演示的意思并不是说自动化演示,而是手动演示的意思。

如果是演示模式下,SET M49 == 1,然后看M49的注释,"连续/单动",我的猜测是演示模式下就是单动,非演示模式下就是连续的。

这段程序,先看执行部分,RST Y4、Y0、Y7,然后做一个延时操作,SET M43和RST M42。

这段接下来执行的程序也有点意思,先是RST Y6,然后一个延时时间到了就ZRST Y0到Y7。

第260行程序逻辑主要的执行在于启动自动程序,也就是通过SET M100来触发,然后埋下一个伏笔,就是当T20 AND 非M100 AND 非M101 AND M119,就ZRST自动程序。

这段程序没什么还多说的,继续看下面的程序:

这一段有一个重要的线索就是先执行夹子气缸B,然后延时一个时间,有脚踏触发,或者自动连续触发,执行夹子气缸C。另外夹子气缸B和夹子气缸C都执行完并且都达到了各气缸的动作时间后,就SET M103进行下一步操作。

然后执行Y3对应的退让气缸,退让气缸执行完之后,注意这里弄了一个T202延时,也就是说,一般对于气缸执行单元都要考虑气缸推出或者收回所需要的时间。然后每个动作执行完后,都需要脚踏触发,或者自动连续标志来触发。

上面代码的逻辑思路跟之前的保持一致,就是执行焊接上下A气缸后,做一个延时,延时到了之后,靠脚踏或者自动连续标志来执行下一步操作,下一步操作就是取料,至于怎么取料就要看后面接下来的操作了。

我以为下一个程序指的是取料逻辑,谁知道来了一个焊接程序,想想也对,毕竟焊接程序还没有讲解清楚。
焊接执行时,执行了一个Y4 固态,对固态的理解,我之前的理解是吹气的过程,也就是吹气冷却。

上面这段程序说明除了固态操作(吹气冷却)外还有一个自然冷却时间T205,只有当自然冷却时间满足后,接下来脚踏触发或者靠自动连续标志位来触发后面的操作。

上面这段程序逻辑并不复杂,只是让我有点疑惑,为什么要等到M108标志位才收回焊接上下A气缸,不是应该早就应该收回吗,焊接上下A气缸一直那样接触着,不就是一直在焊接吗?

ok,终于等来了取料出的执行顺序了。

上面的程序不复杂,我的工艺猜测是,有一个取料前后气缸,当SET Y5,也就是把焊接台用气缸伸出的方式将焊接台推出来,收回进去的地方就是焊接的地方,也就是Y0焊接上下气缸活动的地方。

同理,以上程序我的工艺猜测是,这个焊接台还需要还有上下位置,也就是说,焊接完之后,除了用Y5气缸将焊接台推出来之外,还需要将焊接台降下来。

我继续猜测工艺,焊接台降下来之后,不应该让操作人用手直接把物料从操作台扣出来,而是会有一个Y7取料夹子把焊接好的物料夹紧,然后再松开,从而操作员就获得这个焊接好的物料了。

看到这第447行代码,我才知道我刚刚猜测的工艺流程忽略掉了一个细节,就是焊接好的物料并不是直接通过Y7取料夹子把物料从焊接台上取下来,而是为了用Y7夹紧物料而已,然后再让Y1和Y2的夹子松开。

也就是说,当操作员脚踏或者根据自动连续操作标志位从而让M113==1后,就会让Y6气缸收回,也就是说继续猜测工艺流程就是,焊接台降下来之后,Y7取料夹子就将焊接的物料夹紧,然后让焊接台的Y1和Y2夹子全部松开,此时焊接物料已经被Y7夹子固定住了,焊接物料已经与焊接台脱离开了,然后让焊接台向上移动,也就是靠Y6气缸推动焊接台往上。

继续我的工艺猜测,就是将焊接台前后收回,然后让退让气功Y3也收回。

退让气缸的收回操作完成后,然后整个焊接过程就算是完成了,所以就是做一批RST的操作。

以上就是由于X0 == 1则是自动模式,然后由脚踏或者屏启动,配置好自动化标志M121、M122,然后再接下来的扫描周期中就会按照自动启动程序的逻辑执行。

同理,这里不多讲了。

这块已经很接近"统计运行周期和计数"的逻辑了。我们继续按硬读模式拆,不跨太多。
第566行:
M121
--| |--------------------( T230 K32767 )
|
+-------------------[ MOV T230 D0 ]
M121 注释是"自动指示灯",所以当:
M121 = 1
时,T230 开始计时,设定值是 K32767。
同时,只要 M121=1,下面这条支路每个扫描周期都会执行:
MOV T230 D0
也就是:
把 T230 当前的计时值搬到 D0。
所以这一段不是等 T230 到 K32767 才写 D0,而是运行过程中不断:
T230当前值 → D0
因此 D0 可以先理解为:
当前自动运行累计时间/当前周期计时值的副本。
第575行:
M121
--| |--------------------[ MOV D0 D2 ]
|
+-------------------[ DINC D150 ]
同样,只要:
M121 = 1
就会执行:
MOV D0 D2
也就是:
D2 = D0
而 D2 注释是:
周期
所以看起来作者想把 D0 的计时值传到 D2,用作"周期时间"。
但这里有个很值得注意的地方:
DINC D150
DINC 一般是"双字自增",也就是把 D150/D151 作为32位值,每执行一次就 +1。
因此如果这一支真的是普通常开 M121,那意味着:
只要 M121 一直为1,每个 PLC 扫描周期 D150 都加1。
也就是说它统计的不是"产品个数",而更像是在统计:
PLC扫描次数。
不过 D150 注释叫"计数",所以这里需要继续看上下文,确认作者到底想统计什么。
第587行:
M130
--| |--------------------( T231 K50 )
|
+---- T231 --------[ DMOV K0 D150 ]
这段比较清楚。
当:
M130 = 1
时:
T231开始计时
达到:
K50
后:
T231 = 1
于是下方条件成立:
T231
→ DMOV K0 D150
DMOV 是双字搬运。
因此:
D150/D151 = 0
也就是把这个32位"计数"清零。
所以目前整个结构可以先翻成:
M121 = 自动状态
│
├── T230不断计时
│
├── T230当前值 → D0
│
├── D0 → D2(周期)
│
└── D150不断 +1(计数)
M130 = 1
│
└── T231计时K50
↓
T231到时
↓
D150/D151 清零
这里最关键的是两个疑问。
第一,DINC D150 为什么在 M121 常开条件下直接执行?如果确实如此,那么 D150 会按扫描周期疯狂增加。假设扫描周期是 2ms,那么1秒就大约加500次。
所以这个"计数"很可能不是产品计数,而可能是:
扫描次数、时间辅助计数,或者作者在用扫描次数间接换算时间。
第二,MOV T230 D0 和 MOV D0 D2 看起来有点"绕":
T230 → D0 → D2
从纯数据搬运角度看,好像可以:
T230 → D2
但作者可能让 D0 作为中间变量,后面还有其他地方使用。
所以你现在别急着判断冗余,先做交叉引用:
D0 谁读?
D2 谁读?
D150 谁读?
M130 是什么?
尤其是 D150 和 M130。
这一块目前可以在你的记录里写成:
566~587:自动运行计时/周期统计模块。M121有效时,T230累计时间并写入D0/D2,同时D150进行双字累加;M130持续K50后,将D150双字计数清零。
但 D150 的真实业务含义,目前还不能完全定死。

继续按"硬读模式"。这一段已经接近程序末尾了,601~605 是设备状态映射 ,607~615 是后来新增的脚踏/吹气计时逻辑,619 是程序结束。
先逐行来。
601 行:把复位状态映射给 M200
M0
--| |----------------( M200 )
所以:
M200 = M0
M0 注释是"复位指示灯"。
因此这一行就是:
M0=1 时 M200=1;M0=0 时 M200=0。
这里不是 SET,只是普通线圈,所以 M200 实时跟随 M0。
看标题"设备状态提示",我倾向于认为 M200/M201/M202 是专门整理出来给 HMI 或其他程序使用的状态变量。
603 行:手自动状态映射
这里 X000 是常闭触点:
/X000
--------------------( M201 )
所以:
X000 = 0 → M201 = 1
X000 = 1 → M201 = 0
也就是:
M201 = NOT X000
结合 X000 = 手自动切换,M201 很可能是在生成一个明确的"手动状态"或某种模式显示状态。
具体 M201 给谁用,后面可以交叉引用确认。
605 行:连续/单动状态
M49
--| |----------------( M202 )
因此:
M202 = M49
M49 注释:
连续/单动
所以同样属于状态映射。
目前 601~605 可以整体理解为:
PLC内部真实状态
↓
M0 ─────────→ M200
/X000 ────────→ M201
M49 ─────────→ M202
↓
设备状态提示区
这是一种很常见的做法:
PLC 内部原来的变量比较散,再统一映射到一段专门的 M 地址,方便 HMI、上位机或状态页面读取。
607 行开始是另外一个功能
截图注释已经写得很清楚:
新增吹气功能 2026年3月7日
所以这里不要和上面的设备状态提示混在一起。
607 行
这里的 X001 是常开触点:
X001
--| |----------------[ RST T70 ]
X001 注释:
脚踏
T70 注释:
脚踏计时器
所以:
只要 X001=1,就复位 T70。
即:
X001 = 1
↓
RST T70
↓
T70当前计时值清零
T70完成状态清零
这一行非常重要,因为下一行刚好是反着判断 X001。
610 行
这一行是:
/X001 AND /T70
→ T70 D152
注意这里:
-
X001是常闭触点 -
T70也是常闭触点
因此:
X001 = 0
AND
T70 = 0
的时候:
T70 开始计时
而且这个定时器的设定值不是:
K50
K100
这种常量。
而是:
D152
也就是说:
T70 的目标计时时间由 D152 决定。
这意味着 HMI 很可能可以配置:
D152 = 脚踏/吹气相关的时间参数
比如操作员设置:
排气等待时间:2.0秒
HMI 实际就是修改 D152。
把 607 和 610 放一起看就非常清楚了
X001 = 1 时
第607行:
X001 = 1
↓
RST T70
第610行:
/X001 = false
↓
T70不能计时
所以:
X001 = 1
→ T70被复位
X001 = 0 时
607行:
X001常开 = false
→ 不RST
610行:
/X001 = true
/T70 = true
↓
T70开始计时
所以整体是:
X001 = 1
↓
T70清零
X001:1 → 0
↓
T70开始计时
↓
计到 D152
↓
T70 = 1
因此这个程序实际上是在测量:
X001 变成 0 以后持续了多长时间。
至于物理上的 X001=0 到底表示:
脚踏松开?
还是:
脚踏踩下?
要看脚踏开关实际接线方式。
这一点光靠程序不能下结论。
615 行:真正产生"满足排气时间"
这里:
T70
-------| |-------+
|
M8002 +--------[ SET M2000 ]
-------| |-------+
也就是:
T70 OR M8002
→ SET M2000
M2000 注释:
满足排气时间
所以第一种触发来源非常明确:
X001 = 0
↓
T70计时
↓
达到D152
↓
T70 = 1
↓
SET M2000
↓
M2000 = 1
注意 SET:
一旦 M2000 被置 1,它不会因为 T70 后来变成 0 就自动恢复。
必须程序其他地方有:
RST M2000
才能重新变成 0。
所以现在最值得交叉引用的是:
谁 RST M2000?
找到它以后,这个新增吹气功能的完整闭环基本就出来了。
M8002 又是什么?
这个没有普通变量注释,而且编号非常特殊。
在这类三菱兼容软元件体系里,M8002 通常属于特殊辅助继电器 ,常见含义是 PLC 进入 RUN 后的初始脉冲/首次扫描脉冲。
如果这个工程所用 PLC 对 M8002 的定义也是如此,那么:
PLC刚进入运行
↓
M8002导通一个扫描周期
↓
SET M2000
↓
M2000初始就被置1
这其实很合理。
因为 M2000 叫:
满足排气时间
设备刚上电时,还没有发生一次新的脚踏动作,所以作者可能希望:
默认认为排气时间已经满足。
然后真正开始某次动作时,其他程序:
RST M2000
再重新等待脚踏条件和 T70。
这个需要搜 M2000 验证。
还有一个很值得注意的细节:/T70
610 行作者不是单纯写:
/X001 → T70 D152
而是:
/X001 AND /T70
→ T70 D152
所以 T70 到时:
T70 = 1
↓
/T70 断开
这实际上给 T70 自己加了一个完成后的切断条件。
对于普通非保持定时器,这种写法会让 T70 到时后失去自身计时条件,随后又复位,形成类似周期性的到时脉冲行为。
但这里:
T70 → SET M2000
只需要 T70 到时那一下,就已经:
M2000 = 1
并锁存了。
所以作者并不需要 T70 长期保持 ON。
这整块可以整理成两部分
601~605:状态整理
M0 → M200
/X000 → M201
M49 → M202
可以记:
设备状态提示/状态映射。
607~615:新增脚踏吹气计时
X001 = 1
↓
RST T70
X001 = 0
↓
T70计时 D152
↓
T70到时
↓
SET M2000
↓
满足排气时间
另外:
PLC首次运行
↓
M8002
↓
SET M2000
619 行
END
就是:
本次 PLC 主程序到这里结束。
CPU 执行到 END 后完成当前扫描中的用户程序阶段,之后进入输出刷新、系统处理等,然后开始下一个扫描周期。
所以到这里,这份 620 行主梯形图已经真的读到头了。
而且现在你应该开始有个感觉:620 行看起来很多,真正拆开以后其实就是:
复位程序
手动程序
自动程序
报警/辅助逻辑
计数计时
设备状态
新增功能
END
下一步比继续逐行翻译更有价值的是:把这620行重新整理成"程序模块地图"。这样你会第一次从"我能看懂某一行"提升到"我知道整个620行程序是怎么组织起来的"。