【PLC编程】亿图系统实战编程案例

文章目录

  • M码判断应用案例
    • 1. 背景知识
      • 关于M码
      • 关于系统变数
      • 关于自定义跳转
    • 2. M码判断模块
      • 相关变数
      • 简单M码示例:M50→A1 ON 延时2s。
      • 简单M码示例:M49→检测气缸
      • 简单M码示例:模块提取
        • 封装
        • 使用
        • 总结

M码判断应用案例

1. 背景知识

关于M码

MTS表示控制器中的三种指令,和G代码一样,使用方式是字母+数字,如:M01,M30。
M码的功能可以通过自定义跳转或者PLC自行实现,其中,系统内置的M码有
在这里插入图片描述
一般来讲,M码用于程序控制,T码用于换刀,S码用于主轴转速。T码和S码的功能需要用户使用自定义跳转自己实现。

关于系统变数

变数功能
SYS10123开启自定义跳转
SYS10250M码指令值, 如:执行M30则显示30
SYS10251T码指令值, 如:执行T1则显示1
SYS10252S码指令值, 如:执行S1000则显示100030
SYS10253G码指令值, 如:执行G01则显示1
SYS16032字母M的值,和自定义跳转相关

SYS16020 ~ SYS16045 分别代表 字母A ~Z的值,其中, SYS160232表示字母M,这一组字母用于自定义跳转。
SYS16046 ~ SYS16049 也是表示自定义跳转的字母。

宏程序指令的实现是系统控制的,比如当我们执行 M30 这句代码的时候,如果我们开启了自定义跳转(SYS10123=1),且我们配置了M30对应的跳转文件,则30这个值会被写入SYS16023;如果没有开启自定义跳转,或者没有配置对应的跳转文件,则会被写入SYS10250。
注1:开启变数和配置了跳转文件是 && 的关系。
注2:只有MTS有另外一个变数,如ABC这些字母,执行A100 如果开启了自定义跳转,但是没有配置跳转文件,则100不会被写入SYS16020,也不会写入别的变数。
注3:无法写入变数意味着HMI和PLC都无法获取到该值,则这句代码未起到任何作用。

关于自定义跳转

自定义跳转的功能是:允许客户用类似G代码的指令调用文件。
一个空系统里支持的宏编程指令仅包含这些通用指令如G00\G01以及上表所示的M码。而其他的功能如T码换刀和S码换速都是要应用工程师自己实现的。那么如何实现这些指令呢?系统提供一种映射配置功能,我们可以通过这个配置,去重新定义MTS等编码的实现。如M50原本不做任何事情,现在我们可以通过自定义跳转绑定M50 和 宏程序文件 test.mc,如图:
在这里插入图片描述
这样,当我们开启变数SYS10123时,再执行M50就可以直接跳转到对应的文件中去了。
注:自定义跳转不支持嵌套,即,如果我们在test.mc中再写一个M50指令,就不会生效了

2. M码判断模块

终于进入正题 

除了使用自定义跳转这种宏程序编程方式去定义M50的功能,我们还可以使用PLC去响应这个指令。
我们要先了解控制器运行程序的大致流程:

  1. 客户在控制器的人机界面也就是HMI输入参数-----这是最顶层,输入的参数会被写进系统变数中。
  2. 执行入口程序(通常是MDI上的程序)----- 宏程序语法被解析,程序开始做事,控制轴或者各种参数
  3. 根据各个参数的变化,PLC做出响应 ---- 这是最底层,全局的,一直在扫描的所有参数(也就是系统变数),客户按按钮、在人机输入参数、以及宏程序运行参数改变等等,都有PLC的响应。

也就是说,HMI、MACRO、PLC三个系统的数据交互都是通过系统变数。
那么,用PLC响应指令自然也是要通过检测系统变数的变化去实现。

相关变数

由前文可知,不开启自定义跳转或未配置跳转文件的情况下,系统运行M码,会把M码写入SYS10250,则我们可以通过SYS10250获取M的当前值。
查阅B1系统手册,我们知道:
在这里插入图片描述
其中,S32和C32对于我们设计PLC功能实现比较重要。
我们知道,当执行M码时S32会ON一个周期,这可以让我们去执行对应的程序。
而C32则标志程序执行完毕,在对应的M码程序执行完之后,我们需要把C32ON起来,告诉系统,这个程序我们已经执行完了,可以执行下一个指令了。
C32默认状态为TRUE,表示可以执行别的程序;若把C32设为FALSE,则系统仅能执行当前M码,相当于程序卡在这个M码。如果这个M码下,未能把C32ON起来,则程序会一直卡在这个M码。

简单M码示例:M50→A1 ON 延时2s。

通过PLC编程设计,我们要实现在执行M50时,A1会ON起来2秒钟。
在这里插入图片描述

简单M码示例:M49→检测气缸

当程序执行M49时,输出O10,表示气缸伸出,气缸到位后得到I10信号,表示程序执行完毕。
这是一个简单的气缸伸出功能:
在这里插入图片描述
简单来讲,就是把上面的A1延时动作换成气缸的伸出/停止动作。我们用b1表示获得M码信号,当获取I10信号时reset掉b1(就像第一个示例中的延时两秒后resetA1一样),最后用b1的取反控制C32,整体与上面的延时案例类似。如下图:
在这里插入图片描述

如果我们想要做得完善一点,可以加上更多得参数,如:
气缸的伸出 cylinder_extend
气缸的缩回 cylinder_restract
我们同时用M码控制这两个动作,就会有这样的问题:
在这里插入图片描述
分析易知,如果仅是将两组M码并列写在一个周期内,则会出现逻辑问题,如:

  1. 当触发cylinder_extand时,C32本已是false,但是最后一行由于cylinder_restract仍是false,便又一次把C32on起来了,则一个周期结束后,C32仍然是true,没卡住。
  2. 当cylinder_extand被触发后,O100被置一,到执行完气缸运动,O100并未reset,这个也要处理。
    我们知道,当多个M码同时存在时,只要其中的任意一个中间变量触发,那么我们的C32就应该reset掉,以卡住程序(不想卡住的单独处理),用最简单的真值表表示大致为:
    1,0 = 0
    0,1 = 0
    1,1 = 0 (虽然这种情况一般不会出现,相当于两个M码同时运行,需要另外的参数控制)
    0,0 = 1
    通过真值表可推论 应该是 a | b = ^c 这样一个关系 通过反演论可得:
    ^a & ^b = c
    则逻辑图如下:(理论上所有M码的临时变量都可以串联进最后一行)
    在这里插入图片描述

简单M码示例:模块提取

从以上三个(或者说两个半)案例中,我们可以发现我们一直用EQ和SYS10250判断M码,如果我们写了1-50M码的动作,那么我们就要用50个这样的函数,如果有一天我们不用SYS10250去表示M码了,那么我们将要修改每一个SYS10250(虽然这种情况不太容易发生),显然,这个小模块可以抽出来作为一个函数块。
我们先明确输入输出:

输入:理论上M码后面的码可能是0-196852667中的任意一个值,不同的值功能是不一样的,那么显然这个M码后面的值就是输入了。
输出:我们使用EQ就是为了判断M码的值是什么,我们已经确定了这个输入的比较的值,那么只要输出相等就好了。
(这个描述确实有点一言难尽所以大家还是直接看图吧)

封装

在这里插入图片描述

使用

在这里插入图片描述

函数块(FB,function block),和函数可以直接调用不同,我们在使用函数块的时候需要创建一个类型为函数块名的变量(也可以称这个变量为该函数块的实例)。函数块实例展示在外部的输入输出变量是可以像变量一样直接访问的,并且他们会保留上一次扫描得到的值。

总结

这个模块的作用,简单来讲就是我们把SYS10250这个变数封装到模块里面了,外面不需要关心这个变数是几,对外减少了冗余信息,让我们更清楚这个模块的功能。(这个输入输出命名为M_IN,M_OUT ,第一次看还是不太好理解哈,,有更好的命名建议欢迎评论)
此外还增加了一个非零判断,这个就看应用需求了。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部