作者 | 主题 |
---|---|
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定时器,我把自己忽悠了!
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不能使用自己背景数据块),需要在调用定时器时赋值。
试试才知道,你是否是我的想要
|