技术论坛

来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事

作者 主题
官方工程师
西门子官方工程师

经验值: 2465
发帖数: 132
精华帖: 16
主题:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 楼主 2011-04-13 14:02:44
最近在热线上遇到了一个FC 块中使用--(P )RLO 上升沿检测指令导致不能正常计数的编程问题,程序及使用的指令都比较简单,但该问题是大家比较容易忽略的,也比较具有代表性,这里和大家分享一下。
客户:我有一个关于编程的问题百思不得其解,需要你们的帮助。
我:能具体说一下吗?(呃,看来又是一个比较难的问题!)
客户:其实程序比较简单,我把程序放在OB1 中计数没问题,但在FC1中使用形参定义后再在OB1 中调用FC1时计数就不正常,多计了好多数?
我:是否有地址重复使用的情况?
客户:没有。
我:FC1在程序中是否多次调用的情况?是否在FC1 中使用的Temp 变量?
客户:没有,很简单的一个程序,项目中只有OB1, FC1并且只调用一次。
OB 1 中是一个使用时钟存储位M0.5(一秒发一次脉冲),串一个捕捉上升沿指令—(P),再跟一个计数指令。FC1 中是定义 两个in 变量, 再跟一个计数指令。OB1中的程序计数正常, 在FC1 中计数就不正常。已经反复试过多次了,不信你可以试试?
我:(在我的记忆里,如果P 指令的地址有重复使用的或在FC 中使用了Temp 变量又多次调用可能会出现计数不正常的情况,但客户肯定了没有这些情况,只有试试了!)。
我:在step7 中创建 FC3 及在OB1 ( 如下图1),使用S_CU(增计数指令)测试程序,一切正常,没有问题啊!


图1
我:(赶紧联系客户)已经测试,计数值正常啊?向客户描述编程过程。
客户:使用计数器指令S_CU是正常的,但如果使用加法指令(ADD_I),检测上升沿,数值自加1时,在FC 中编程程序就不正常了。
我: (??,不太可能吧!)再次与客户核实编程的步骤,使用的指令及在FC 中定义的变量类型。(客户的编程过程没问题啊?),那我再按您的方法再试试吧!
我:再次测试:在OB1 中直接编写计数程序(见图2)


图2
创建FC1,在FC1 中定义形参编写计数程序,再在 OB1 中调用(见图3)


图3
我: (计数值果然不同,问题到底出现在哪呢?)
忽然想起客户在FC中定义的( P )指令为IN 变量,IN 变量只能接收从外部输入的信号状态,不能再写入,而且FC 中IN 变量占用的是临时变量,无法保存状态,而(P) 指令是边沿存储位(见图4),不但要检测RLO 的状态,而且需要将操作之前的状态存储到该地址中,也就是需要再次写入该地址中。


为了更清楚的发现问题,将FC1程序转换为STL(语句表),可以看到M10.0的状态写入到临时堆栈区L20.1,FC1 也只是读L20.1的状态,并没有把 L20.1的状态写回到M10.0 ( 见图5 )。


于是将程序做如下修改(见图6),将L20.1 的状态写回到M10.0, 测试发现可以正常计数。所以(P)--RLO 上升沿检测指令定义为IN 变量是不行的,应该定义为IN_OUT 变量,既可以读又可以写。


于是创建FC2,在 FC2 中将 --(P)指令的变量声明 为IN_OUT 变量(见图7),再次测试,计数值正常,问题解决。


(其实,到此为止,该问题应该可以解决了,只要告诉客户将 --(P)指令的变量声明由IN 改为IN_OUT 就可以解决问题,但是令我无法想通的是为何使用计数器(S_CU) 时将 --(P)指令定义为IN 变量就可以计数正常呢?如果客户近一步追问该如何解释呢?)为了能够彻底将问题搞清楚,决定继续研究一下。
先看看S_CU 与ADD_I 指令之间的区别:
S_CU :内部有脉冲边沿检测功能,只要输入端有0到1 变化,计数器就加1。所以下面计数器指令中(图8),实际上是不需要加 (P) 指令同样可以进行计数。


图8
ADD_I:内部没有边沿检测指令,EN 端只要为1, IN1与IN2 就会一直进行相加。


图9
根据— ( P) 指令的解释,每个扫描过程中, RLO 位的信号状态都前一周期获得的结果进行比较,看信号状态是否有变化。 前一周期RLO 的信号状态必须保存在边沿标志位( 例如 M10.0 见图5)中,以进行比较。如果当前与先前的RLO”0” 状态之间有变化,则在操作之后, RLO 将为1。当M0.5 由0变为1 时, M10.0 为0,与之前的逻辑结果比较(之前的RLO =0),发生了变化,所以 RLO=1,此时ADD_I 即会执行加1。由于M0.5 是1秒发一个脉冲,占空比是1:1,在M0.5 为1 的期间,由于M10.0 为IN 变量,并没有将上次的逻辑结果RLO=1写入M10.0,仍然保持了M10.0=0 的状态,所以当下个扫描周期时,程序都认为上一次的RLO=0,当前的RLO=1,所以在M0.5 为1时加法指令会一直执行执行,计数值增加 ( ADD_I 加法指令是只要使能端EN=1,就会一直执行执行),S_CU 由于有检测边沿的功能,所以计数正常。

到此,问题全部搞清楚,联系客户告诉客户解决方案,将— (P)变量声明由IN更改为IN_OUT 。( 呵呵,准备了半天,客户居然没有追问为何使用S_CU 时将P 定义为IN 变量为何可以正常计数。但是为了帮客户彻底弄清问题,避免以后再出问题,还是多花了些时间解释了一下。 )
虽然是个很简单的程序,但解答的过程还是颇费周折的,也花了不少时间测试。其问题关键是要正确理解 -- ( P) RLO 上升沿检测指令的含义,而且在编程时还是需要更加关注细节,注意各个指令使用条件的不同,同样-- (N) RLO 下降沿检测指令使用时也需要注意同样的问题,在FC 中定义形参时要定义为IN_OUT 变量,特此与大家共同分享!

 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=830088&b_id=4&s_id=0&num=28

游士

经验值: 188
发帖数: 23
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 2楼 2011-04-13 17:03:28
我以前也遇到过这样的问题,导致设备乱动。后来发现IN是只能外部改的,就改成了IN_OUT。但是没有分析的这么清楚
 
以下网友喜欢您的帖子:

  
新手

经验值: 20
发帖数: 10
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 3楼 2011-04-13 21:36:26
楼主确实挖到底了 佩服

我简单的认为 因为(p) 或者 (N) 都要产生一个周期的脉冲,要产生脉冲肯定要写这个地址,如果是IN 这些肯定就不能实现咯……

个人认为如果把那个脉冲点改为TEMP 类型 应该也能够实现。
积极发言,有错误请指正!
以下网友喜欢您的帖子:

  
至圣

经验值: 43597
发帖数: 15780
精华帖: 61
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 4楼 2011-04-13 23:25:08
用临时变量是不行的。它不能保存状态。下一个扫描周期就会被清零的。
活到老,学到老!为了生活学习吧!
以下网友喜欢您的帖子:

  
游民

经验值: 103
发帖数: 48
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 5楼 2011-04-14 09:50:29
我正遇到同样的问题,找不到原因.好!
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3651
发帖数: 780
精华帖: 58
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 7楼 2011-04-14 13:45:13
几年以前也遇到过这个情况,当时编了一个电机通用块,为了少填一些参数,用到了间接寻址。一个电机占一个字节,字节的地址由"aalm"定义。毕竟一个项目这样的功能块有上百个。
“aalm"定义为输入BOOL类型。
源程序如下:

L P##aalm
AD DW#16#FFFFFFF8//取字节地址
LAR1

A(
A #DRV //开机失败,撤除驱动并报警
L S5T#3S
SD #DELAY_TIMER
NOP 0
NOP 0
NOP 0
A #DELAY_TIMER
)
AN #RUN
R #DRV
S [AR1,P#0.1]//置报警位

A #DOWN //联锁跳
FN [AR1,P#0.3]//下跳沿暂存位
AN #UNLOCK
A #RUN
S [AR1,P#0.1]//置报警位
R #DRV
当时在OB1中用LAD去调用这个功能块时,也出现楼主描述的问题,把LAD转成STL发现实际上传送到功能块的输入参数都是L地址,当时没想到把aalm参数放到IN/OUT参数中,最后的解决方案是全部使用STL编程。
呵呵,想问一下为什么LAD编程时会把所有的输入放到L区,然后再做为参数传送呢?。
 
以下网友喜欢您的帖子:

  
侠客

经验值: 629
发帖数: 416
精华帖: 4
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 8楼 2011-04-14 17:01:41
我也试验了下为什么在OB1中m10.1会一直为0呢
m10.3的上升沿也是没有接通但是OB1中的MW104和106都是在计数的呢
十日画一水,五日画一石
以下网友喜欢您的帖子:

  
侠圣

经验值: 2191
发帖数: 671
精华帖: 1
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 9楼 2011-04-14 19:14:59
呵呵原来一直没注意这些,谢谢,解释的非常清楚。
 
以下网友喜欢您的帖子:

  
侠士

经验值: 1890
发帖数: 66
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 10楼 2011-04-14 19:36:44
分析的很好,学习了

 
以下网友喜欢您的帖子:

  
奇侠

经验值: 9086
发帖数: 2334
精华帖: 30
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 11楼 2011-04-14 19:44:44
这个问题很久以前就讨论过,要么用inout变量,
要么用FB做,用静态变量。
这个上升沿是要与上扫描周期作比较的。

学习ing!学习!
以下网友喜欢您的帖子:

  
至圣

经验值: 13059
发帖数: 4961
精华帖: 81
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 12楼 2011-04-14 21:37:25
梯形图往往会使用临时变量而不容易被发现,转成STL则显而易见
如果直接用STL来写程序不使用临时变量则没这个问题,给FC传入M区数据是直接传址,有兴趣的朋友不妨试试
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2170
发帖数: 756
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 13楼 2011-04-15 12:06:17
上升沿是带数据保存下才有效的,楼主发的看了下,他是用IN,而不是IN/OUT作为上升沿,那会不计数的
 
以下网友喜欢您的帖子:

  
游士

经验值: 200
发帖数: 47
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 14楼 2011-04-15 17:58:39
最初也没有注意这个问题,有一次听西门子的培训,老师专门讲了这个问题印象比较深了,没有犯个类似的问题!
 
以下网友喜欢您的帖子:

  
新手

经验值: 46
发帖数: 14
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 15楼 2011-04-15 23:14:09
学习啊。。。支持论坛多发点实际遇到的问题
工控下人。欢迎交流。
以下网友喜欢您的帖子:

  
游民

经验值: 124
发帖数: 10
精华帖: 1
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 16楼 2011-04-18 11:38:37
不管In或Out,一般全设为In-Out。
淡泊明志,宁静致远
以下网友喜欢您的帖子:

  
侠士

经验值: 1279
发帖数: 850
精华帖: 1
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 18楼 2011-04-20 17:08:47
感谢楼主,这个细节问题还真的没有发现
止于至善——独学而无友,则孤陋而寡闻。
以下网友喜欢您的帖子:

  
至圣

经验值: 28602
发帖数: 10825
精华帖: 131
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 21楼 2011-04-25 09:35:24
S_CU自己有捕捉上升沿的功能。
微信公众号:PLC标准化编程,ZHO6371995
以下网友喜欢您的帖子:

  
至圣

经验值: 28602
发帖数: 10825
精华帖: 131
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 22楼 2011-04-25 09:38:36
再有,楼主讨论了in 与 in_out的区别
其实 out与 in_out的区别也大有讲究呢!

如果是out,就不可以读在先。
那么
对于自保持逻辑
A Q1
O IN1
AN IN2
=Q1

这个时候Q1可以为OUT吗?
微信公众号:PLC标准化编程,ZHO6371995
以下网友喜欢您的帖子:

  
奇侠

经验值: 9086
发帖数: 2334
精华帖: 30
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 23楼 2011-04-28 09:13:13
偶觉得不可以!
学习ing!学习!
以下网友喜欢您的帖子:

  
新手

经验值: 37
发帖数: 5
精华帖: 0
回复:来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事


只看楼主 24楼 2011-05-10 11:48:44
最近做一项目用到累计也成功实现了,偶然看到本贴。提出一些疑惑,结合图片大家再讨论一下。我在FB5中形参定义边沿检测P为IN并未按楼主所说的定义为IN-OUT 自加用的不是ADD-I而是ADD-R,做了一个多重背景块调用,即在FB2中多次调用FB5,计数完全正常。现给图说明:




 
以下网友喜欢您的帖子:

  
收起
来自西门子技术支持热线的故事:关于在FC块中使用--(P )RLO上升沿检测指令的一个小故事
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。