【非标自动化】硬核阅读理解620行梯形图(70~619行)

前面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 D0MOV D0 D2 看起来有点"绕":

复制代码
T230 → D0 → D2

从纯数据搬运角度看,好像可以:

复制代码
T230 → D2

但作者可能让 D0 作为中间变量,后面还有其他地方使用。

所以你现在别急着判断冗余,先做交叉引用:

复制代码
D0 谁读?
D2 谁读?
D150 谁读?
M130 是什么?

尤其是 D150M130

这一块目前可以在你的记录里写成:

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行程序是怎么组织起来的"。

相关推荐
七夜zippoe1 小时前
OpenClaw 测试策略实战:AI Agent 自动化测试体系搭建与落地
人工智能·ai·自动化·agent·测试体系·openclaw
深念Y2 小时前
CPA-Auto池方案总结
人工智能·ai·自动化·路由·代理·账号·轮询
向上的车轮2 小时前
GitHub Actions 自动化运维实战:Java + TypeScript 全栈项目 CI/CD 至阿里云
运维·自动化·github
重庆小透明2 小时前
深入探寻微服务【第三篇微服务的组件】
运维·微服务·架构
智脑API2 小时前
Codex config.toml check_for_update_on_startup 怎么关闭?离线环境与版本提醒排查
运维·服务器·前端
2401_8685347811 小时前
数仓开发落地手册
linux·运维
正在走向自律12 小时前
使用atop工具监控Linux系统指标
linux·运维·php·实时监控·atop分析内存
yyy(十一月限定版)14 小时前
017【入门】最小栈
linux·运维·服务器
2401_8949155315 小时前
GEO 源码部署如何实现精准地域分发?核心配置参数深度讲解
java·运维·服务器·后端·开源