技术论坛

重复调用子程序中怎么做定时器?

作者 主题
游民

经验值: 92
发帖数: 16
精华帖: 0
主题:【探讨】重复调用子程序中怎么做定时器?


只看楼主 楼主 2021-05-24 20:23:12

有50多个电机、电动阀,要做运行多长时间停止多长时间。想用一个子程序来重复调用,试着用时间间隔定时器、递增字节来做,当重复调用时都出现了时间不走、时间一样的问题。

请问有没有好的办法来做,谢谢


 
以下网友喜欢您的帖子:

  
重要声明:

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

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

至圣

经验值: 12725
发帖数: 1586
精华帖: 1
回复:重复调用子程序中怎么做定时器?


只看楼主 1楼 2021-05-24 21:02:51

子程序中可以使用SMW22。或者利用BGN_ITIME和CAL_ITIME指令组合。

个人感觉用SMW22结合比较指令会好用点。


努力学习西门子
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:重复调用子程序中怎么做定时器?


只看楼主 2楼 2021-05-24 21:53:27

习惯一下用Btime和Ctime吧。


 
以下网友喜欢您的帖子:

  
游民

经验值: 92
发帖数: 16
精华帖: 0
回复:重复调用子程序中怎么做定时器?


只看楼主 楼主 3楼 2021-05-25 10:33:26


这是我做的重复调用的子程序,大佬们帮我看看有什么问题吗?


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 4243
发帖数: 583
精华帖: 3
回复:重复调用子程序中怎么做定时器?


只看楼主 5楼 2021-05-25 10:42:48

方法有很多,我感觉我之前发的自制定时器更灵活。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 13020
发帖数: 1815
精华帖: 22
回复:重复调用子程序中怎么做定时器?


只看楼主 6楼 2021-05-25 10:43:48

粗看可能不行,P是一个全局变量,多次调用必须先赋值后使用!


 
以下网友喜欢您的帖子:

  
yzs
侠圣

经验值: 3553
发帖数: 441
精华帖: 7
回复:重复调用子程序中怎么做定时器?


只看楼主 7楼 2021-05-25 11:14:57

自己做一个类似300的FC定时器的子程序,这样就可以重复调用了。200和200SMART注意一点就是不要使用上升沿,可以换种方法实现就好。



 
以下网友喜欢您的帖子:

  
yzs
侠圣

经验值: 3553
发帖数: 441
精华帖: 7
回复:重复调用子程序中怎么做定时器?
推荐帖


只看楼主 8楼 2021-05-25 11:53:52

目前我已经很少使用200SMART编程,找了一下以前的200定时器子程序供你参考使用:

定时器的使用方法及TIA的定时器可参考300 的自编写S_ODT定时器FC块这个帖子,里面有比较详细的介绍。

-------------------------------------
下面简单讲讲自编写定时器程序的优点所在:
1.定时器使用了整形变量,便于各种类型的组态软件和触摸屏的定时设定、时间读取和时间比较。
2.FC的使用可以方便的各种嵌套而不容易出现定时器重复的问题。
3.长时间计时并不会出现重因为复调用定时器导致的累计误差,因此此定时器长时间计时是很准确的 。
4.可以灵活运用,特别是ET(已用时间)的运用,通过已用时间的比较可以多个时间段进行各种控制,而不需要使用到多个计时器。
5.定时遵循程序从上到下,从左到右的扫描规律,在程序设计中不会因为异步计时可能导致的各种误解和问题。
6.可能这个需求是大家容易疏忽的,也是一个很重要的优点:那就是很方便的选择断电重上电后定时器的计时状态。如果想选择重上电后计时器继续运行只需要将相关变量设计成掉电保持型即可,如果想选择重上电后计时器重新运行只需将相关变量设计成掉电非保持型即可。



 
以下网友喜欢您的帖子:

  
版主

经验值: 25995
发帖数: 11809
精华帖: 43
回复:重复调用子程序中怎么做定时器?


只看楼主 9楼 2021-05-25 16:15:51

我很好奇,自制定时中要用到 P。


参考系统的定时器,基本是两类:

1、TON类(TOF可归在此类),条件ON开始定时,条件OFF定时器复位。

2、TONR类,条件ON时开始定时(可累计),条件OFF时停止(不复位),复位需要单独发指令。



 
以下网友喜欢您的帖子:

  
至圣

经验值: 12725
发帖数: 1586
精华帖: 1
回复:重复调用子程序中怎么做定时器?


只看楼主 10楼 2021-05-25 23:42:57


没有进行过测试,不知行不行。


努力学习西门子
以下网友喜欢您的帖子:

  
至圣

经验值: 12725
发帖数: 1586
精华帖: 1
回复:重复调用子程序中怎么做定时器?


只看楼主 11楼 2021-05-25 23:59:53



没有进行过测试,不知行不行。!


努力学习西门子
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:重复调用子程序中怎么做定时器?


只看楼主 12楼 2021-05-26 06:57:14

你上面那个AC0就可以用temp了。

下面那个图的not好像没必要吧?cal前面那个比较也可能没必要吧?这样ld5就可以用temp了。

这样就跟我一样了。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:重复调用子程序中怎么做定时器?


只看楼主 13楼 2021-05-26 07:04:08

能用bgntime就不要用smb22因为,3个扫描周期smb22都显示1毫秒,但是bgn只走了2毫秒。22就计多了。它只能显示1,


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 5059
发帖数: 335
精华帖: 6
回复:重复调用子程序中怎么做定时器?


只看楼主 14楼 2021-05-26 07:46:40

如果楼主的计时只需要达到秒级,可以参考我的方式。

设备或阀门块计时总时间,计时当前运行时间,计时当前停止时间。

判断停了多长时间开始运行,运行多长时间开始停止用另外的条件来控制。

整个功能只有一个“秒基”(TP),即M2.0,只保持一个扫描周期



V1028.3为自动选择,V1028.4为自动命令


仰望星空,脚踏实地
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:重复调用子程序中怎么做定时器?


只看楼主 15楼 2021-05-26 08:52:52
以下是引用zbhdm在2021-05-25 23:59:53的发言 >11楼



没有进行过测试,不知行不行。!

注意这个子程序的L0.1和LD1,LD5对应的接口参数寄存器合理的初始化,LD9对应的计时时长用IN变量类型合适些。


工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 12725
发帖数: 1586
精华帖: 1
回复:重复调用子程序中怎么做定时器?


只看楼主 16楼 2021-05-26 12:46:26
以下是引用芳季在2021-05-26 06:57:14的发言 >12楼

你上面那个AC0就可以用temp了。

下面那个图的not好像没必要吧?cal前面那个比较也可能没必要吧?这样ld5就可以用temp了。

这样就跟我一样了。

谢谢芳季老师的指正,如您所说,下面程序的NOT用的画蛇添足了。CAL指令前面的比较主要是我对这个系统时钟不熟悉,我是怕系统时钟跑到最大值再次进入一个新的循环,使得程序出现错误,就像双向计数器,加计数到32767,再来一个脉冲就跑到-32768。


努力学习西门子
以下网友喜欢您的帖子:

  
至圣

经验值: 12725
发帖数: 1586
精华帖: 1
回复:重复调用子程序中怎么做定时器?


只看楼主 17楼 2021-05-26 13:09:18
以下是引用winter938在2021-05-26 08:52:52的发言 >15楼

注意这个子程序的L0.1和LD1,LD5对应的接口参数寄存器合理的初始化,LD9对应的计时时长用IN变量类型合适些。

以下是引用zbhdm在2021-05-25 23:59:53的发言 >11楼:没有进行过测试,不...

引用11楼详细内容:



没有进行过测试,不知行不行。!

谢谢winter938老师的指正。

LD9对应用IN变量类型,这个我是理解了。

对于L0.1和LD1,LD5对应的接口参数寄存器合理的初始化,这个的含义能不能再和我讲解一下。


努力学习西门子
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:重复调用子程序中怎么做定时器?


只看楼主 18楼 2021-05-26 17:48:17

子程序调用时,要给接口参数分配一个内存,这个内存的数值对于IN和IN_OUT型变量在执行子程序前会有一个传入L寄存器的动作,从而影响程序执行的结果,所以要考虑这些内存初始化的问题,除非子程序中可以保证L先赋值后再使用。


工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:重复调用子程序中怎么做定时器?


只看楼主 19楼 2021-05-26 21:23:57
以下是引用芳季在2021-05-26 06:57:14的发言 >

你上面那个AC0就可以用temp了。

下面那个图的not好像没必要吧?cal前面那个比较也可能没必要吧?这样ld5就可以用temp了。

这样就跟我一样了。

你们说的是对的,一个设备连续开20几天,连续关20几天是很正常的,如果这个指令是处理,没符号,32位,那么就是40几天了,到时候真的会出错的


 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:重复调用子程序中怎么做定时器?


只看楼主 20楼 2021-05-27 19:24:28

这种程序结构有一个不好,以前有人提到过。

就是假如做了个子程序做定时器,之后会在众多的上级子程序里面调用。那么上级子程序将要担负起提供变量给这个计时子程序用。可惜,也是作为一个子程序的上级,何来有那么多资源给下级子程序做变量呢?上级自己都要向主程序要资源。这样一级一级的嵌套之后第一级的子程序将会很难管理自己手上的变量。


 
以下网友喜欢您的帖子:

  
收起
重复调用子程序中怎么做定时器?
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。