线下实训
HOME
线下实训
正文内容
PLC编程烧脑 1905 「万泉河」PLC编程,上升沿的那点儿事
发布时间 : 2025-02-07
作者 : 小编
访问数量 : 23
扫码分享至微信

1905 「万泉河」PLC编程,上升沿的那点儿事

【万泉河】PLC编程,上升沿的那点儿事

在PLC编程中,上升沿逻辑经常需要用到。它的功能在于,在一个信号由0变1的瞬间,产生一个状态位,用于触发系统功能。

上升沿的功能原本非常简单,也有一些文章介绍过使用方法。 但仍然有不少人对此比较困惑。 尤其在标准化编程架构下。

标准化编程中, 不可以使用全局变量的M和T,这些我都写过多次文章了。而上升沿和下降沿, 因为比较简单, 就一直没有专门提及。

这回专门介绍一下。

在S7-300/400中,上升沿是个函数:

切换到STL, 指令为:

所以,本质上她就是一个FP的指令,只不过需要消耗一个全局变量。

在PORTAL中,上升沿下降沿的指令变的更复杂了。4对,8个:

调用时这样:

而其实我并不确切明白这4种到底有什么具体的区别。或者说,不明白西门子为啥要给搞到这么复杂。

不管了, 还按老的方式用P_TRIG即可。

S7-200 SMART 中使用就比较简单,一个简单的符号:

而且还到STL语言,它的指令其实叫做EU:

恰恰是这个EU,或者说P指令,害了很多人。

这个P指令,用起来确实简单,不需要加全局变量来区分,拿来就能用。但没有输入辅助变量的地方,就出了大问题,因为这个指令其实是不能重复被调用的。 所以,一个子程序块,如果使用了上升沿指令, 那么这个子程序在同一个CPU程序中,就不可以被重复调用。

所以,如果这个子程序实现的是设备库函数的功能的话,就不可以使用P指令。 一处都不可以。

所以,在SMART 200的标准化编程里面,如果按照我过去同样的语言格式,就应该表达为:好的PLC程序的判断标准,不使用P指令。

过去那些听闻M和T用不得都受不了的人,再听到这个说法,恐怕是要疯掉了。

那么,不让用P指令,如何实现上升沿控制呢?

二十几年来,PLC领域进展翻天覆地。但有的地方其实却是退步了。

我们回到S5来寻找答案。

那个时候,是没有现成指令给你用的,要做上升沿,需要自己编程实现:

STL语句里面:

使用一个辅助变量,简单保存一下输入信号的值,就可以实现了。 只需要这个保存语句,在使用的下方即可。

那么,在SMART200中,库函数中需要上升沿指令的时候,只需要回到S5时代的方法,就可以了。 辅助变量不使用全局变量的问题,老早就讨论过了。

其实,我上面的程序也是在SMART中做的。手头并没有STEP5的软件了。

以同样的道理,在SCL以及其它高级语言中,可以同理参考实现上升沿功能。

通常,使用一个OLD辅助变量

OUT := SIGN AND NOT SIGN_OLD;

SIGN_OLD:=SIGN;

因为下降沿的本质就是信号取反的上升沿,所以本文没有特别关注下降沿,也建议大家不要使用下降沿编程。 那样回过去读程序的时候逻辑会混乱,比较烧脑。

接上篇:PLC间接寻址应用实例程序,求任意连续字节中的整数的和

我是电控阿甘,从事电气工作十余年,专注分享【电工基础知识+自动化控制知识】,助力电工入门和电工进阶电气工程师,点击右上方“关注”我,让我们共同进步,实现薪高一筹!

全文大约2300字,此篇文章虽然字数较上一篇文章少一些,但是主要是关于逻辑方面的理解,可能比较烧脑,初次接触间接寻址和循环指令编程的朋友第一遍可能看不懂,没有好的办法只能多看几遍仔细思考和理解,并且看懂之后最好自己写一写。如有确实想不明白的地方在评论区留言,我看到后会补充讲解。

以下为正文

上一篇文章给大家介绍了数据在PLC中是怎么存储的,并且详细解释了数据访问的两种方式直接寻址和间接寻址,如果你还不清楚间接寻址,看此文章之前建议先看下上一篇文章,链接如下:

想要PLC编程水平更进一步?搞懂直接寻址和间接寻址是基础!

但是上一篇文章只是跟大家讲了概念和原理,很多朋友应该还是觉得间接寻址那么麻烦,翻来覆去绕了一大圈才得到对应存储空间中的数值,有什么用呢?

在文章的结尾我跟大家举例说200个整数值求和,或者求其中的最大值、最小值等类似的问题如果不用间接寻址几乎没办法完成,如果用直接寻址可能要要写几百行程序,当真如此就把PLC编程硬生生的干成了体力活,还是苦力的那种,就算你觉得200个数也不多,肯出这份力,但是你想过那要是1000、10000个数么?

那么今天我就用间接寻址加循环的方法编写一个求任意连续字节中的整数的和这样一个程序,无论有多少个字节,只要提供开始字节和结束字节,就可以直接求出所有字节中的整数和,通过这个程序可以让大家可以感受一下间接寻址加循环的强大,如下图所示:

求和子程序演示

可以看到只有我们填好相应起始字节和结束字节,我们就可以得到求和的结果,并且将程序封装成一个子程序,别的项目使用时直接调用即可,接下来我们来看一下子程序内部程序如何编写,相应的程序及变量表如下图所示:

子程序内程序段1-3

子程序内程序段3-6

子程序内程序段6-8

子程序接口参数

程序编写的整体思路是如下:

1. 先用间接寻址得到要计算一段字节的开始字节和结束字节的底层地址编号。

2. 使用结束字节和开始字节底层地址编号相减可以得到循环结束值。

3. 调用循环指令,填入开始循环值为0,结束循环值为上面程序得到的循环结束值,循环的次数即为循环结束值加1次,每循环一次当前循环计数值加1,从0开始直到达到循环结束值停止,不断重复循环体内计算,直到循环结束。

4. 循环体内计算:

1)每循环一次,根据当前循环计数值和开始字节底层地址编号相加即可顺次得到所有字节的底层地址编号。

2)每循环一次根据相应字节地址编号即可得到相应字节中的值。

3)将每次循环得到的相应字节中值,进行累加即可得到相应的和。

5. 循环结束,此时即可计算完所有字节累加的和的值。

6. 将该值传送给输出接口,程序结束。

注:程序中所有牵涉到数据类型转换的指令都是因为,要使用该变量的指令不支持当前变量的数据类型,因此要将该变量先转换后使用,如FOR循环引脚只能填整数,不能填双整数,因此第一段程序将指针值相减运算,得到循环次数后,还需要将该循环次数由双整数转化成整数。

那上面程序哪里需要特别注意呢?我认为是第5段程序中的MOV_B指令,如下图所示:

子程序中第5段程序MOV_B指令

也许有朋友看出来了第5段指令中利用指针取完值后,又费了很大劲将现将字节转化为整数,又将整数转化为双整数,再提供给第6段程序双整数相加指令使用,着实有点费劲,那可能有的朋友就想了我直接在5段程序中使用个MOV_DW,搞个双字不就可以了,然后直接给第6段程序双整数相加使用,这样不接审了第5段程序中的后面两个转换指令了,完美!可以吗?我们试一下,改写程序后如下图所示:

子程序第5段程序改写后

可以看到程序编译没有问题,那么我们来运行一下看一看,如下图所示:

子程序改写后运行结果

可以看到计算结果出了问题,得到了一个很大的数,那么问题出在哪里了?问题出在了对间接寻址知识掌握不牢固,我们上篇文章说到,间接寻址得到指针之后,想访问字节、字、双字就按照如下规定操作,如果使用MOV_B指令访问的就是一个字节,如果使用MOV_W指令访问的就是一个字,如果使用MOV_DW访问的就是一个双字。

那么在此程序中我们如果使用MOV_DW,那么第一次得到的值就是VD0,第二次得到的就是VD1,如此直到VD9,那么我们知道VD0就是由VB0、VB1、VB2、VB3四个字节组成,同样道理VD1也是由VB1、VB2、VB3、VB4组成,我们来监控下当VB0至VB9分别为1至9时VD0和VD1的值,如下图所示:

VD0和VD1监控值

可以看到其值非常大,VD2到VD9也是同样道理,这就解释了为什么当我们使用MOV_DW时求出来的和是一个非常大的数,因为此时求和是求得VD0至VD9的和,并且相邻两个双字之间还有交叉区域,这种交叉在编程时要特别注意,一定要避免,要不然就会产生数据污染,比如VD0和VD1就有VB1、VB2、VB3三个字节的交叉区域,当我给VD0写数据时就会对VD1中的数据产生污染,反过来也是如此,编程时一定要避免此种情况出现。

当然这只是一个演示间接寻址用法的程序,程序还有许多功能没写,比如当我把起始字节和结束字节引脚填反了,计算结果得到个负数,怎么处理?如果想实现字整数、双字整数求和计算怎么实现?故障和完成位及故障代码要不要通过引脚输出?等等,这些就由各位朋友进行完善了。

同样的各位朋友可以以此程序为思路编写一下求一组数据的最大值、最小值,或者对一组数据进行由大到小,由小到大的排序等程序,练习一下间接寻址的使用。

好了,关于间接寻址实际应用程序今天就给大家聊到这里,如果需要该程序学习的话可以关注我,并私信发送“求和程序”即可 。另外我的主页中有很多关于PLC基础知识的文章和视频,都是一些学习PLC必要的知识,同时考虑到初学者初次理解困难,全部采用大白话讲解的,有兴趣的可以去看下,希望这些文章和视频够帮到大家,如果还有其它关于电工和PLC的问题,可以下方留言讨论,谢谢大家。

相关问答

PLC要如何跟伺服系统连接?

1采用脉冲加方向的方式控制伺服驱动器,计算好脉冲当量,由PLC发出脉冲串,伺服电机就会运行到对应的位置,编程较容易上手,缺点是需要接较多的信号线。2采用...

学编程都有哪些困难?

这个问题我来回答下,我在IT行业工作9年多,主要进行技术架构的设计和核心代码的开发工作,可以说也是软件行业的老司机了。有人觉得编程难,我认为主要是难在这...

 龙血舞姬  鉴真和尚东渡 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2025  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部