三菱fx3u plc的指令仿真的研究(一)


先来看代码:

LD X000

LD X001

AND X002

ORB

OR X003

AND M0

OUT Y000

END


对应的梯图为:

image.png


我们来逐步分析这段三菱 PLC 代码对应的逻辑表达式,按照 串联为 “与”(用 * 表示 )、并联为 “或”(用 + 表示 ) 的规则推导:

1. 拆分分支逻辑

  • 第一分支LD X000
    单独的常开触点,逻辑为 X000 。
  • 第二分支LD X001 + AND X002
    LD X001 是加载触点,AND X002 是与 X002 串联,逻辑为 X001 * X002 (“串联 = 与” )。
  • 用 ORB 合并前两个分支
    前两个分支通过 ORB 并联,合并后逻辑为 X000 + (X001 * X002) (“并联 = 或” )。

2. 继续叠加后续逻辑

  • 叠加 OR X003
    在前面合并结果基础上,OR X003 表示再并联 X003,逻辑变为 [X000 + (X001 * X002)] + X003 。
    因为 “或” 运算满足交换律和结合律,也可简化写为 X000 + X001 * X002 + X003 ( 并联关系可直接展开 )。
  • 叠加 AND M0
    最后 AND M0 表示与 M0 串联,整体逻辑为:
    (X000 + X001 * X002 + X003) * M0

3. 对应输出

最终结果驱动 Y000 ,所以完整逻辑表达式就是:
Y000 = (X000 + X001 * X002 + X003) * M0


( 本质是 “(第一分支 或 第二分支 或 X003) 与 M0 驱动 Y000” ,用符号简化后就是上述形式 )



我们可以把逻辑表达式 Y000 = (X000 + X001 * X002 + X003) * M0 转换成二叉树结构来表示。二叉树中:


  • 根节点:表示最终输出 Y000

  • 内部节点:表示逻辑运算符(+ 或 *

  • 叶子节点:表示输入信号(X000X001X002X003M0

逻辑表达式的二叉树结构

          Y000            |            *           / \          /   \         +     M0        /|\       / | \     X000 *  X003         / \       X001 X002



二叉树构建步骤说明

  1. 整体结构
    表达式 (X000 + X001*X002 + X003) * M0 的最外层运算是 *(与 M0 串联),因此根节点是 *,左子树是 (X000 + X001*X002 + X003),右子树是 M0
  2. 处理并联部分
    左子树 X000 + X001*X002 + X003 的运算符是 +(并联),因此分解为三个分支:
    • 第一个分支:X000

    • 第二个分支:X001*X002(内部是串联关系)

    • 第三个分支:X003

  3. 串联分支处理
    第二个分支 X001*X002 是串联关系,因此用 * 节点连接 X001 和 X002

二叉树遍历与表达式对应

  • 前序遍历(根→左→右):Y000 → * → + → X000 → * → X001 → X002 → X003 → M0
    (可用于生成前缀表达式:* + X000 * X001 X002 X003 M0
  • 中序遍历(左→根→右):X000 → + → X001 → * → X002 → + → X003 → * → M0 → = → Y000
    (需添加括号才能正确还原表达式:(X000 + (X001 * X002) + X003) * M0 = Y000
  • 后序遍历(左→右→根):X000 → X001 → X002 → * → X003 → + → M0 → * → Y000
    (可用于生成后缀表达式:X000 X001 X002 * X003 + M0 * Y000


这种二叉树结构清晰展示了逻辑运算的优先级:


  • 并联运算 + 的优先级低于 串联运算 *

  • 括号 用于明确运算顺序(虽然表达式中省略了部分括号,但二叉树结构隐含了正确的运算顺序)



节点层级: 0 节点值: * 左子节点: + 右子节点: M0 ----------------    节点层级: 1    节点值: +    左子节点: X0    右子节点: +    ----------------        节点层级: 2        节点值: X0        左子节点: null        右子节点: null        ----------------        节点层级: 2        节点值: +        左子节点: *        右子节点: X3        ----------------            节点层级: 3            节点值: *            左子节点: X1            右子节点: X2            ----------------                节点层级: 4                节点值: X1                左子节点: null                右子节点: null                ----------------                节点层级: 4                节点值: X2                左子节点: null                右子节点: null                ----------------            节点层级: 3            节点值: X3            左子节点: null            右子节点: null            ----------------    节点层级: 1  // 修正:原输出中这里错误标注为层级2    节点值: M0    左子节点: null    右子节点: null    ----------------


关键修正说明

  1. M0 节点的层级应为 1
    • 原输出中错误地将 M0 节点的层级标为 2,导致缩进混乱。

    • 实际上,M0 是根节点 * 的右子节点,与左子树的 + 节点同级(层级 1)。

  2. 逻辑结构验证
    • 根节点 * 的左子树是 (X0 + X1*X2 + X3),右子树是 M0

    • 左子树中的 + 节点正确展开为三个分支:X0X1*X2X3

    • 每个节点的子节点关系与表达式 (X0 + X1*X2 + X3) * M0 完全一致:

验证方法

你可以通过以下方式验证二叉树结构的正确性:


  1. 逐层构建表达式
    • 层级 0:*

    • 层级 1:左子树 + 和右子树 M0 → (...) * M0

    • 层级 2:左子树的 + 展开为 X0 和 + → (X0 + ...) * M0

    • 层级 3:继续展开 + → (X0 + X1*X2 + X3) * M0

  2. 检查每个节点的子节点
    • 所有叶子节点(X0、X1、X2、X3、M0)的左右子节点均为 null

    • 内部节点(+ 和 *)的子节点符合逻辑运算顺序。


修正后的结构完全符合逻辑表达式的二叉树表示,层级标注也正确反映了节点间的父子关系。



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
本帖最后由 勇哥,很想停止 于 2025-06-04 21:59:41 编辑

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年6月    »
1
2345678
9101112131415
16171819202122
23242526272829
30
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864