技术论坛

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

作者 主题
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
主题:【分享】关于IEC定时器,我把自己忽悠了!
精华帖精华帖星级5级 推荐帖


只看楼主 只看精华 楼主 2017-09-22 14:18:38

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的使用方式还是有点区别的,楼主太想当然了!





人生就像一场旅行!
精华帖版主置评: 很好的分享帖。值得置精 -yming
以下网友喜欢您的帖子:

  
重要声明:

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

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

侠客

经验值: 978
发帖数: 118
精华帖: 0
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 1楼 2017-09-22 18:52:57

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


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 2楼 2017-09-22 21:24:28


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


drongh
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 楼主 3楼 2017-09-22 21:45:04
以下是引用question在2017-09-22 21:24:28的发言 >2楼


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

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

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

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

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


人生就像一场旅行!
以下网友喜欢您的帖子:

  
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 4楼 2017-09-22 21:57:34
以下是引用Letham在2017-09-22 21:45:04的发言 >

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

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

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

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

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

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


drongh
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 楼主 5楼 2017-09-22 22:01:18
以下是引用question在2017-09-22 21:57:34的发言 >4楼

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

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

以下是引用Letham在2017-09-22 21:45:04的发言 >:对于FB中,这么做...

引用详细内容:

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

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

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

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

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


人生就像一场旅行!
以下网友喜欢您的帖子:

  
奇侠

经验值: 5455
发帖数: 841
精华帖: 5
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 6楼 2017-09-23 09:04:06
以下是引用Letham在2017-09-22 22:01:18的发言 >5楼

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

以下是引用question在2017-09-22 21:57:34的发言 >4楼:另外可以这样,对于...

引用4楼详细内容:

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

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

以下是引用Letham在2017-09-22 21:45:04的发言 >:对于FB中,这么做...

引用详细内容:

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

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

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

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

嗯。看来是没仔细看。


drongh
以下网友喜欢您的帖子:

  
至圣

经验值: 35143
发帖数: 3236
精华帖: 96
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 7楼 2017-09-24 20:34:03

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


http://blog.163.com/xiuzhang_2000/
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:关于IEC定时器,我把自己忽悠了!
精华帖精华帖星级5级 推荐帖 推荐帖


只看楼主 只看精华 楼主 8楼 2017-09-26 09:32:27
以下是引用高山孤影在2017-09-24 20:34:03的发言 >7楼

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

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

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


比如 以下语句

L MW20    //=18

L MW22  //=4

/I 

T MW 24   // 4

SRW 16

T MW26 // 2

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



人生就像一场旅行!
精华帖版主置评: 我来给个精华吧。-yming
推荐帖推荐理由: 比主题更精彩的共享! (推荐人:看雪001)
以下网友喜欢您的帖子:

  
侠客

经验值: 660
发帖数: 24
精华帖: 0
回复:关于IEC定时器,我把自己忽悠了!
推荐帖


只看楼主 只看精华 9楼 2017-11-29 09:54:43

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


试试才知道,你是否是我的想要
以下网友喜欢您的帖子:

  
至圣

经验值: 19840
发帖数: 8834
精华帖: 39
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 10楼 2017-11-29 10:34:34
以下是引用Letham在2017-09-22 21:45:04的发言 >3楼

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

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

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

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

以下是引用question在2017-09-22 21:24:28的发言 >2楼:建议楼主把iec定时器...

引用2楼详细内容:


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

OB中只调用FB/FC

要用到定时器的都用FB,在FB中使用多重背景

你看这个主意怎么样?


 
以下网友喜欢您的帖子:

  
至圣

经验值: 19341
发帖数: 2076
精华帖: 72
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 11楼 2017-11-29 19:46:00
以下是引用Letham在2017-09-26 09:32:27的发言 >8楼

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

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


比如 以下语句

L MW20    //=18

L MW22  //=4

/I 

T MW 24   // 4

SRW 16

T MW26 // 2

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


以下是引用高山孤影在2017-09-24 20:34:03的发言 >7楼:学习了,学习了。其...

引用7楼详细内容:

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

难道是不好意思给自己设精吗?我觉得虽然这楼很少的文字,但的确是更少人会注意到的方法,高16位存储余数,蕾丝真的是毛!


大道至简,知易行难
以下网友喜欢您的帖子:

  
至圣

经验值: 19341
发帖数: 2076
精华帖: 72
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 12楼 2017-11-29 20:12:56

大家试着做做这道小学数学题,估计大部分人会做错的!

今天这个回帖很享受(学某人的语气),不仅仅是推荐帖被采纳为精华帖(感谢y版!),而是认真看了整个帖子有收获。也感谢楼主的用心分享!


大道至简,知易行难
以下网友喜欢您的帖子:

  
至圣

经验值: 19840
发帖数: 8834
精华帖: 39
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 13楼 2017-11-30 12:10:08
以下是引用看雪001在2017-11-29 20:12:56的发言 >12楼

大家试着做做这道小学数学题,估计大部分人会做错的!

今天这个回帖很享受(学某人的语气),不仅仅是推荐帖被采纳为精华帖(感谢y版!),而是认真看了整个帖子有收获。也感谢楼主的用心分享!

坑太多。。

类似的题目被坑过之后都不想再去做了


 
以下网友喜欢您的帖子:

  
至圣

经验值: 19341
发帖数: 2076
精华帖: 72
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 14楼 2017-11-30 13:57:47
以下是引用shine在2017-11-30 12:10:08的发言 >

坑太多。。

类似的题目被坑过之后都不想再去做了

@shine  看到了你的评论                                               

“其实,只要认真的看过每一条指令的说明的,都能发现。比如200中的DIV和DIV_I指令的区别。”

 这确实让我想起了200的整数除法,求余的整数除法有单独的指令,不像300的整数求余除法,直接将累加器右移16位。300比200多了累加器指令!1500我没试过,看这样子也是累加器右移。

 记得教授曾将讲过,他说1500的cpu没有累加器了。


大道至简,知易行难
以下网友喜欢您的帖子:

  
至圣

经验值: 13934
发帖数: 2007
精华帖: 43
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 楼主 15楼 2017-11-30 15:42:30
以下是引用看雪001在2017-11-30 13:57:47的发言 >14楼

@shine  看到了你的评论                                               

“其实,只要认真的看过每一条指令的说明的,都能发现。比如200中的DIV和DIV_I指令的区别。”

 这确实让我想起了200的整数除法,求余的整数除法有单独的指令,不像300的整数求余除法,直接将累加器右移16位。300比200多了累加器指令!1500我没试过,看这样子也是累加器右移。

 记得教授曾将讲过,他说1500的cpu没有累加器了。

以下是引用shine在2017-11-30 12:10:08的发言 >:坑太多。。类似的题...

引用详细内容:

坑太多。。

类似的题目被坑过之后都不想再去做了

记得教授曾将讲过,他说1500的cpu没有累加器了。

CPU的硬件中的确不存在累加器 等了,但是为了兼容STL,所以 虚拟了累加器 等。。。


人生就像一场旅行!
以下网友喜欢您的帖子:

  
游侠

经验值: 556
发帖数: 116
精华帖: 0
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 16楼 2017-12-03 13:46:27
回去做个实验先!
全球 Woai020. aqlxghao
以下网友喜欢您的帖子:

  
侠圣

经验值: 2461
发帖数: 227
精华帖: 0
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 17楼 2018-01-04 16:10:00


做个试验试试


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 3596
发帖数: 303
精华帖: 2
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 18楼 2018-01-04 16:17:48

我第一次使用IEC是也走误区了,然后看帮助研究了下。


只为成功找方法,不为失败找借口!
以下网友喜欢您的帖子:

  
侠圣

经验值: 2347
发帖数: 668
精华帖: 1
回复:关于IEC定时器,我把自己忽悠了!


只看楼主 只看精华 19楼 2018-01-05 14:08:40
以下是引用看雪001在2017-11-29 20:12:56的发言 >12楼

大家试着做做这道小学数学题,估计大部分人会做错的!

今天这个回帖很享受(学某人的语气),不仅仅是推荐帖被采纳为精华帖(感谢y版!),而是认真看了整个帖子有收获。也感谢楼主的用心分享!

这个有什么特别的吗?是不是等于20?为什么大部分人会做错?我也做错了?


 
以下网友喜欢您的帖子:

  
收起
关于IEC定时器,我把自己忽悠了!
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。