技术论坛

 关于IEC定时器,我把自己忽悠了!

返回主题列表
作者 主题
Letham
至圣

经验值: 13885
发帖数: 2000
精华帖: 43
楼主    2017-09-22 14:18:38
主题:关于IEC定时器,我把自己忽悠了! 精华帖 

IEC定时器和计数器,对比S5定时器和计数器有一些优势


--具有更大的计数、定时范围

--IEC定时器比S5定时器性能更佳,计时更准确。

--IEC定时器/计数器不占用CPU系统资源,只占用工作存储区,所以,只要你的存储够大,可以使用无数IEC定  时器、计数器,

有这么多优点,所以,楼主习惯使用IEC定时器/计数器了(对于使用S5定时器/计数器 还是IEC 还是取决于个人习惯)

简单介绍下我测试IEC定时器的程序吧,

1:一个全局数据块 IECTimerInstance-GlobalDB, 里面类容如下:

1个TON_TIME类型的数组IECTimer

2个Bool类型 IECTimer_IN IECTimer_Q

2个Time类型 IECTimer_ET IECTimer_PT


2:一个FB块 IECTimerTest_Fct及其背景DB块 IECTimerTest_Fct_DB

   FB块参数接口和代码如下

Static:多重背景IEC_Timer_Mutiinstance

in_out接口:IEC_Timer_Parinstance

temp:tmpQ,tmpET;



3:IEC定时器的单背景系统数据块“IEC_Timer_0_DB”


4:OB1中调用如下



S7-1500中 IEC定时器指令使用的数据来源有3种方式 1.单背景数据块;2.FB中的多重背景;3,参数实例。

测试中,楼主 对三种方式都进行了测试,具体喜欢那种还是看个人习惯吧,我比较偏向于参数实例和多重背景。


在测试过程中,我犯了自以为是,想当然的的毛病,结果把自己忽悠了!


1.自己想当然地认为 ,IEC定时器指令就是SFB而已,没有认真看完IEC定时器的使用帮助,结果有了自己意想不到的结果;测试完成后,回想起来 ,才慢慢明白为什么 IN和PT必须赋值了,二ET和Q在调用时可以隐藏了;

既然IEC指令都占用一个数据块中的类容,为什么在调用比如TON时,IN和PT接口 必须赋值了?不是调用SFB/FB 所有接口都可以不赋值吗?


所以 我在FB里以单背景数据块方式调用TON指令时,固执地写了 如下代码,IN和PT使用自己背景数据块类容

然后在IEC_Timer_0_DB里直接对IN进行置位后,定时器就是不运行!后来乖乖使用 IECTimerInstance-GlobalDB 的里的IECTimerInstance-GlobalDB_IN和IECTimerInstance-GlobalDB_PT后,定时器指令TON才正确运行;


2:为什么 定时器运行了ET和Q的值不刷新了,对此在帮助手册里写的很清楚了,当程序用到ET和Q时,这2个值才会刷新。所以这2个是可选项,IN和PT端是必选的。因为我在调用TON指令时,没有用到ET和Q,所以在观察数据块里的数值时,ET一直没有增加;

后来在 程序最后加了 几句代码 把定时器的ET和Q 赋值给临时变量tmpET和tmpQ,再次观察,FB的背景数据块,全局数据块,和TON定时器单背景系统数据块后看到里面的ET和Q有变化了。(当然,ET和Q可以在调用指令时,直接赋值,这样比较好)


看样,TON指令和SFB/FB的使用方式还是有点区别的,楼主太想当然了!




人生就像一场旅行!
春天
侠客

经验值: 978
发帖数: 118
精华帖: 0
1楼    2017-09-22 18:52:57
主题:回复:关于IEC定时器,我把自己忽悠了!

以前也习惯使用S5定时器和计数器,看来以后得用IEC定时器。

question
奇侠

经验值: 5453
发帖数: 841
精华帖: 5
2楼    2017-09-22 21:24:28
主题:回复:关于IEC定时器,我把自己忽悠了!


建议楼主把iec定时器放在static 区,这样代码清晰,调用方便。

drongh
Letham
至圣

经验值: 13885
发帖数: 2000
精华帖: 43
3楼    2017-09-22 21:45:04
主题:回复:关于IEC定时器,我把自己忽悠了!

对于FB中,这么做的确不错,代码清晰可以这么认为,但是调用方便谈何说起?IEC不管怎么用调用都方便。

如果在fc,ob中了,我们程序不可能全是FB.所以,参数实例还是挺好的,定义个数据块,把需要的定时器全放在里面。

单背景就是占用太多数据块了,用起来也是一样。

至于 怎么用,各人有各人的看法 还是使用习惯的问题。

人生就像一场旅行!
question
奇侠

经验值: 5453
发帖数: 841
精华帖: 5
4楼    2017-09-22 21:57:34
主题:回复:关于IEC定时器,我把自己忽悠了!

另外可以这样,对于全局的定时器,可以声明一个共享db块,然后定义一个定时器,数据类型为iec_time,

这样就可以在函数内部使用这个定时器了。楼主的方法也可以,但每个定时器都会产生一个数据块。

drongh
Letham
至圣

经验值: 13885
发帖数: 2000
精华帖: 43
5楼    2017-09-22 22:01:18
主题:回复:关于IEC定时器,我把自己忽悠了!

哈哈,你应该是没看我的帖子。

人生就像一场旅行!
question
奇侠

经验值: 5453
发帖数: 841
精华帖: 5
6楼    2017-09-23 09:04:06
主题:回复:关于IEC定时器,我把自己忽悠了!

嗯。看来是没仔细看。

drongh
高山孤影
至圣

经验值: 34741
发帖数: 3236
精华帖: 96
7楼    2017-09-24 20:34:03
主题:回复:关于IEC定时器,我把自己忽悠了!

学习了,学习了。其实很多时候,我们钻的牛角尖,都是由于我们对这个指令的用法理解不到位。所以说,出现这种错误时,我们应该再回头检查一下,深究一下,所谓见怪不怪,其怪自败。

http://blog.163.com/xiuzhang_2000/
Letham
至圣

经验值: 13885
发帖数: 2000
精华帖: 43
8楼    2017-09-26 09:32:27
精华帖  主题:回复:关于IEC定时器,我把自己忽悠了!

是的,很多时候 我们对有些指令的用法,并没有完全掌握 

比如/I指令,就知道 是16位整除 ,对于 这条指令的其他用处,以及对状态位的影响没有去考虑。


比如 以下语句

L MW20    //=18

L MW22  //=4

/I 

T MW 24   // 4

SRW 16

T MW26 // 2

 至于为什么MW26是2 很多人应该不知道,因为 /I指令,不仅得出商还算出余数 分别存放于累加器1的低字和高字中,而大多数人 只知道求商 的用法!


人生就像一场旅行!
Qxlyshy
侠客

经验值: 660
发帖数: 24
精华帖: 0
9楼    2017-11-29 09:54:43
主题:回复:关于IEC定时器,我把自己忽悠了!

我也按斑竹的方法测试了一下,除了斑竹总结的两条,个人在补充一点自己的体会,在参数实例调用时,在OB1赋值的Timer参数其实就相当于定时器的背景数据块,也就是说,此不能通过此timer参数各个值直接赋值给定时器的(就相当于IN和PT不能使用自己背景数据块),需要在调用定时器时赋值。

试试才知道,你是否是我的想要
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。