【非标自动化】3、AutoShop快速理解(PLC扫描机制)

发布时间:2026/8/25 11:47:54
【非标自动化】3、AutoShop快速理解(PLC扫描机制) 理解PLC扫描机制需要区分三个东西现场真实输入/输出端子PLC内部的输入映像区和输出映像区MAIN程序中的顺序执行一、PLC一个扫描周期大致做什么以普通循环扫描方式来说一个扫描周期通常可以简化成① 读取所有输入端子 ↓ ② 把输入状态保存到输入映像区 ↓ ③ 从上到下、从左到右执行MAIN程序 ↓ ④ 执行过程中修改输出映像区 ↓ ⑤ 程序执行完成后统一刷新真实输出端子 ↓ ⑥ 通信、诊断等系统处理 ↓ 进入下一个扫描周期因此“扫描周期5ms”一般不是说PLC固定每隔5ms才开始执行一次而且无论程序多少都强制5ms。更准确地说是PLC完成一次“读取输入—执行程序—刷新输出”等过程大约需要5ms。程序越复杂、通信任务越多扫描周期可能越长。二、10条语句是怎样执行的假设MAIN中有10条语句PLC通常会按照程序顺序执行语句1 语句2 语句3 …… 语句10每执行一条语句相关的内部变量、M、D、Y输出映像值等通常会立即在PLC内部发生变化。但是对于普通Y输出程序修改的一般首先是输出映像区中的Y0而不是每执行一条语句都立即给真实Y0端子重新输出一次电压。真实输出端子通常在程序执行完成后统一刷新。三、你的Y0例子会发生什么程序如下语句1 IF X0 1 THEN Y0 : 1; END_IF; 语句2 IF X1 0 THEN Y0 : 0; END_IF;假设本扫描周期开始时X0 1 X1 0执行过程如下。执行语句1PLC读取输入映像区中的X0X0 1条件成立于是输出映像区Y0 1此时PLC内部的Y0逻辑值已经变成1。执行语句2PLC继续读取输入映像区中的X1X1 0条件也成立于是输出映像区Y0 0语句2把语句1刚刚写入的结果覆盖了。扫描结束刷新输出最终输出映像区是Y0 0所以真实Y0端子最终输出OFF。也就是说在同一个扫描周期中同一个输出被写入多次时后执行并且生效的写入结果通常会覆盖前面的结果。常说的就是同一输出后写优先最后结果生效。四、Y0会不会在一个扫描周期内先亮再灭对于普通批量输出刷新机制一般不会在真实端子上明显表现为先ON 再OFF因为程序内部虽然经历了Y0映像值0 → 1 → 0但真实输出通常是在扫描结束时统一获得最终值Y0端子最终为OFF所以外面的灯通常不会先闪一下再灭。但是需要注意有些PLC支持立即输入、立即输出、直接刷新I/O等特殊指令。这类指令可能绕过普通映像区机制立即读取端子或刷新输出。具体要看汇川对应指令说明。基础PLC程序默认先按照“输入统一读取、输出统一刷新”理解即可。五、第二条语句读取的X1是不是现场实时值普通情况下读取的是本次扫描开始时保存下来的输入映像区X1假设扫描开始时X1 1程序执行到一半时现场按钮松开真实端子变成现场X1 0但本扫描周期程序后面的语句通常仍然看到输入映像区X1 1等到下一个扫描周期重新读取输入时程序才会看到X1变成0。时间过程如下扫描开始读取X1 1 ↓ 执行程序过程中现场X1变成0 ↓ 本扫描内程序仍可能读取到X1 1 ↓ 下一扫描开始重新读取 ↓ 程序看到X1 0这使得同一个扫描周期内程序读取到的输入状态相对稳定不会在程序执行一半时突然发生变化。六、内部变量和Y输出有没有区别内部变量的变化通常会立即影响后面的程序。例如网络1M0 ON 网络2如果M0 ON则Y0 ON网络1执行后M0立刻在PLC内部变成ON。因此执行网络2时就能够看到新的M0值。同理前面程序修改了Y0的输出映像后面的程序读取Y0时一般也能看到它被修改后的逻辑值。所以程序执行并不是把10条语句全部单独算完、彼此完全隔离。它是顺序执行的前面语句对内部数据的修改会影响后面的语句。七、为什么不建议在多个地方反复写同一个Y0例如网络1 X0 ─────────( Y0 ) 网络2 X1 ─────────( Y0 )这叫双线圈或重复线圈。因为Y0在两个地方被普通线圈写入。执行网络1时Y0得到一个结果执行网络2时Y0又被重新赋值。最终网络2的结果可能覆盖网络1。比如X0 ON X1 OFF网络1执行Y0 ON网络2执行因为X1不导通所以普通线圈Y0 OFF最终Y0还是OFF。很多初学者会误以为网络1已经让Y0导通为什么最终不亮原因就是后面又写了一次Y0。因此一般建议一个普通输出Y尽量只在一个地方集中赋值。前面不同条件可以先控制M内部变量最后统一决定Y0。例如网络1 X0 ─────────( M0 ) 网络2 X1 ─────────( M1 ) 网络3 M0和M1经过统一逻辑后 ─────────( Y0 )这样容易读也不容易被覆盖。八、MAIN中的“网络”是什么意思截图中的网络1 网络2 网络3 …… 网络15这里的“网络”不是以太网也不是通信网络。它是梯形图中的一个逻辑段可以理解为一段相对独立的梯形图逻辑英文常称Network或Rung区域。一个网络通常负责一个明确功能例如网络1启动停止自锁 网络2运行指示灯 网络3输送带控制 网络4气缸伸出 网络5气缸动作超时报警PLC通常按照网络1 ↓ 网络2 ↓ 网络3 ↓ ……从上到下执行。一个网络内部则按照梯形图逻辑从左到右计算。九、10条语句放一个网络和放10个网络有什么区别从纯粹的顺序逻辑上说只要排列顺序和连接关系一致可能得到相同结果。但是在程序结构上区别很大。全部放在一个网络例如网络1里同时写启动停止 气缸控制 电机控制 报警 计数 定时虽然可能可以运行但会出现梯形图特别宽、特别复杂支路很多难以阅读难以在线监控出现故障时不容易定位很难写清楚网络注释。分开放在多个网络例如网络1设备启停自锁 网络2运行状态生成 网络3运行指示灯 网络4气缸伸出条件 网络5气缸缩回条件 网络6动作超时报警程序更像一份清晰的控制说明书。因此网络的主要作用是将程序按照功能分段组织而不是改变PLC扫描机制。十、什么时候应该放在同一个网络属于同一个完整逻辑表达式的内容通常放在同一个网络。例如启动按钮 并且急停正常 并且没有报警 并且处于自动模式 ↓ 设备允许运行可以写在一个网络中|----[启动]----[急停正常]----[/报警]----[自动模式]----(运行允许)----|因为这些条件共同决定同一个结果。十一、什么时候应该拆成不同网络不同功能、不同结果通常拆开。例如不要全部挤在一个网络中启动自锁 运行灯 蜂鸣器 气缸 产品计数 报警复位可以拆成网络1启动停止自锁 网络2运行灯控制 网络3蜂鸣器控制 网络4气缸控制 网络5产品计数 网络6报警复位一个比较实用的原则是一个网络尽量只表达一个清晰的控制意图。十二、网络分开后会不会增加很多扫描时间单纯把相同的逻辑从一个网络拆成多个网络通常不会产生本质上的性能差异。PLC真正执行的还是触点判断、赋值、指令等逻辑。例如10个触点和线圈放一个网络与分成几个网络主要区别是程序组织和可读性不是因为网络数量变多就显著变慢。当然每个网络如果增加了额外指令扫描时间才会增加。十三、网络之间最需要注意的是执行顺序例如网络1 M0 X0 网络2 Y0 M0因为网络1先执行所以网络2可以读取到本扫描刚更新的M0。如果颠倒网络1 Y0 M0 网络2 M0 X0本扫描执行网络1时M0还可能是上一个扫描周期的结果直到网络2才更新M0。因此Y0可能晚一个扫描周期响应。时间差通常只有几毫秒但逻辑上确实不同。所以PLC程序不仅要看“有哪些语句”还要看这些语句按什么顺序执行。十四、把你的两个问题统一起来可以用下面这张过程图理解扫描开始 │ ├──一次性读取X0、X1等输入到输入映像区 │ ├──执行网络1 │ └──可能修改M、D、Y输出映像 │ ├──执行网络2 │ └──能看到网络1修改后的内部结果 │ ├──执行网络3 │ ├──…… │ ├──执行最后一个网络 │ └──统一把最终Y输出映像刷新到真实输出端子对于同一个Y0网络1写Y0 ON 网络2又写Y0 OFF那么扫描结束时真实Y0 OFF因为后面的结果覆盖了前面的结果。十五、当前可以形成的正确认识输入X 通常在扫描开始时统一读取 MAIN 按程序顺序从上到下执行 网络 MAIN中的逻辑分段按编号顺序执行 内部变量M、D等 前面修改后后面程序可以立即使用新值 输出Y 程序执行过程中修改输出映像通常扫描结束统一刷新端子 同一个Y被多次写 最后一次有效写入通常决定本扫描最终输出所以实际写PLC程序时不只是要让每个网络“单独看起来正确”还必须检查前后网络有没有相互覆盖 同一个输出有没有被重复赋值 程序执行顺序是否符合控制意图