技术论坛

 帮我看看,为啥这个子程序里面的时间跑的特别快。

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

经验值:12452
发帖数:1552
精华帖:1
楼主    2021-06-03 19:04:53
主题:帮我看看,为啥这个子程序里面的时间跑的特别快。 精华帖  精编帖 

用SMW22在子程序中用于计时,就是对SMW22不断的累加。下载程序发现,这个累加的时间跑的的特别快,大约是正常时间的两倍。也就是定时5000ms,大约用时2s就到了。通过监控“时间”变量连接的vw100,也就2秒钟,就跑到了5000多了。

请教各位老师,这个程序编的有问题,还是SMW22用的不合适?




努力学习西门子
yanxiao
版主

经验值:26049
发帖数:11948
精华帖:43
3楼    2021-06-03 23:28:30
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

使用SMW22似乎也有道理,就是不知SMW22有多精准。


使用32位的1ms定时器更好,不会产生定时不准问题。

BITIM、CITIM

芳季
至圣

经验值:66283
发帖数:14657
精华帖:100
8楼    2021-06-04 18:37:20
精华帖  精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

我问你一个问题,扫描周期0.9毫秒,那么这个计时器会写多少毫秒?它只能显示一毫秒,所以一个扫描周期白白多了0.1毫秒,误差就是这么来的了。

你们都没有感觉到有这个问题的吗?用这个来做计时,怎么会准的嘞?

芳季
至圣

经验值:66283
发帖数:14657
精华帖:100
9楼    2021-06-05 06:37:12
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

问题是22是增量,Citime是亚绝对。假设扫描周期是0.5毫秒,22只能最少显示1。3个周期,用22计算的计得3毫秒了。用Citime计算的第一个周期得0毫秒时差,第二周期得1毫秒时差,第三个周期可能还是1毫秒时差。这就是区别了。

22到底刷不刷新都是显示1。你就把这个1加进去了。

winter938
至圣

经验值:10673
发帖数:1561
精华帖:33
10楼    2021-06-05 08:19:46
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

      假设一程序扫描周期为1.4毫秒且是恒稳的周期,观察下面的数据

时刻       0  1.4  2.8  4.2  5.6  7

增量A         1     1     2     1    2(只对时刻的整数部分进行计算)

增量B         1     2     1     2    1  (对时刻数据小数部分四舍五入变成整数后进行计算)

      如果把增量AB拿来做累计都可以得到7这一结果,据此SMW22的数值采用的同样的获取方法的话楼主的程序应该是可以准确计时的。

      假设一程序扫描周期为0.4毫秒且是恒稳的周期,观察下面的数据

时刻       0  0.4  0.8  1.2  1.6  2

增量A         0     0     1     0    1(只对时刻的整数部分进行计算)

增量B         0     1     0     1    0  (对时刻数据小数部分四舍五入变成整数后进行计算)

      如果把增量AB拿来做累计都可以得到2这一结果,据此SMW22的数值采用的同样的获取方法的话楼主的程序也应该是可以准确计时的。

      问题就是SMW22的数值获取机制我们是不得而知的,尤其是后一种情形当扫描周期小于1毫秒时出现增量为0,此时是否还按上面的数据规律给出就有待验证了。如果不是楼主的程序计时在扫描周期小于1毫秒时会有问题。

工控爱好者
芳季
至圣

经验值:66283
发帖数:14657
精华帖:100
13楼    2021-06-05 13:57:23
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

你什么时候看见过22会显示0的?我估计无论什么小数位,都会被进位。就算5.01毫秒也写6毫秒。

有四舍五入当然误差没有那么大。四舍五入的实质是计算内部值是精确的,仅仅舍了出来的值用于非精密用途,所以舍弃也没什么所谓。

但是计时这事情,是不能舍的,每个周期都是3.5毫秒,无论你舍还是进,结果都是错误的,舍了,一直累加3毫秒,少了很多。进了,一直累加4毫秒。多了很多。都错。

唯独citime指令尺度是亚绝对的。随时来读取都是绝对值。0.5毫秒的扫描周期可能读得两个0的结果,

Zane
至圣

经验值:75766
发帖数:19245
精华帖:376
16楼    2021-06-05 22:14:21
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

扫描周期越大,使用SMW22的误差就越小,

10毫秒扫描周期的误差是< 10% , 

20毫秒扫描周期的误差是< 5%

Zane 注册自动化系统工程师 Always save before download
winter938
至圣

经验值:10673
发帖数:1561
精华帖:33
26楼    2021-06-10 21:31:01
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

从楼主24楼的数据看来T32显示的扫描周期不足1毫秒,SMW22每周期却显示1毫秒,证明芳季的担心是有道理的,可以采用我14楼的程序获取时钟数据。楼主顶楼的程序运行起来估计比实际时间会快一倍左右,拉长扫描周期这个误差会减小一些。如果把扫描周期拉长到1毫秒以上也许会是另外的情况。

工控爱好者
芳季
至圣

经验值:66283
发帖数:14657
精华帖:100
27楼    2021-06-10 22:58:50
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

1毫秒以上就变成1.1毫秒扫描周期,smw22每次都显示2毫秒,

20.1毫秒扫描周期,smw22显示21毫秒。

反正bitime就不会这么错啦。用bitime啦。


SUBROUTINE_BLOCK 星角启动:SBR12

TITLE=程序目的:

//  仅使用一个触点控制星三角启动的三个输出线圈。达到普遍的转换过程。

//  一个子程序允许通过多次调用,控制多个电机进行启动。

//  

//  适用范围:

//  仅建议在主程序中无条件调用。用有条件调用也可,但不推荐。

//  

//  程序接口:

//  启动 用这个触点控制电机的运行。

//  设定值 启动时间。单位毫秒。

//  间隔 启动过后,经历间隔时间进入运行。单位毫秒。

//  

//  过程值 程序运行需要的一个双字的储存空间。用户不要修改此值。

//  主线圈;启动圈;运行圈。对应的输出,控制接触器。

//  

//  执行过程:

//  【启动】端未接通时子程序一直进行内部跳转。

//  【启动】端接通,随即【启动圈】和【主线圈】同时接通。

//  经过【设定值】时间后,启动圈断开,主线圈保留。

//  经过【间隔】时间后,【主线圈】和【运行圈】同时接通。

//  运行线圈接通后,大部分程序也再跳转。消耗很少的执行时间。

//  【启动】端随时断开,输出点即时断开。

// 

//  补充说明:

//  本程序免费使用。也许不会适用于你的程序。当由于任何原因不适用时,程序作者不负有责任。请用户仔细复核程序内容,再继续使用。

//  

//  程序密码:XJQD

// 

VAR_INPUT

启动:BOOL;

设定值:DINT;

间隔:DINT;

END_VAR

VAR_IN_OUT

过程值:DINT;

主线圈:BOOL;

启动圈:BOOL;

运行圈:BOOL;

END_VAR

VAR

当前值:DINT;

间隔当前:DINT;

END_VAR

BEGIN

Network 1 

LDN    L0.0

R      L13.0, 3

CRET

Network 2 

LD     L13.0

JMP    0

Network 3 

LD     SM0.0

BITIM  LD9

=      L13.0

=      L13.1

Network 4 

LBL    0

Network 5 

LD     L13.2

JMP    1

Network 6 

LD     L0.0

CITIM  LD9, LD14

MOVD   LD1, LD18

+D     LD5, LD18

Network 7 

LDD>=  LD14, LD1

R      L13.1, 1

Network 8 

LDD>=  LD14, LD18

=      L13.2

Network 9 

LBL    1

END_SUBROUTINE_BLOCK

这程序我很早之前发过的了。我自己一直在用。


WWCWWC
至圣

经验值:71501
发帖数:7980
精华帖:145
28楼    2021-06-10 23:29:13
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

22楼W侠的程序今天白天看到,当时想,如果仅仅是这样的验证,这个SMW22  的时间测试应该是一样的,因为测试程序中仅仅只是这些相对固定的程序在运行,24楼的测试结果也非常清楚了。

至于T37的测试,看到的结果也是预料之中的事情,原因还是那个大于1mS定时器的刷新机制问题,测试结果会有相对大的“波动”。

楼上季侠说的有同感,我理解为时间的分辨率,200及200smart的PLC中时间最小分辨率就是1mS,大于0mS,不到1mS,包含1mS的折算为1mS。同样,大于1mS,不到2mS的折算为2mS计算。

如果要相对的精度,我建议采用楼上季侠的那个间隔定时器,精度(分辨率1mS),且对程序的运行没有影响到运行的精度。

相对200(200smart)的精度问题,之前一直想找一种方式,那个能够区分分辨1mS以内的定时方式,则耐,找了很长时间也没有找到我想要的方法,所以对此有一些认识。


winter938
至圣

经验值:10673
发帖数:1561
精华帖:33
29楼    2021-06-11 08:49:02
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

     24楼楼主的T32的数据前后两个扫描周期的差值可否替代SMW22来实现毫秒分辨率的精确计时?它是否相当于BITIME?如果可以为何SMW22不采用类似的机制还是只是SMW22在1毫秒以下的扫描周期表现出异常(SMW22最小就是1不会出现0,事实是1毫秒以下扫描周期累计计时会出现增量不足1毫秒此时简单处理为1就会出问题)?

      如果我10楼的帖子符合SMW22在1毫秒以上扫描周期的计时规律,那么定时误差不是1/(扫描周期),而是(扫描周期)/(定时长度)。

      SMW22的计时规律需要通过调节扫描周期并逐周期记录观察分析。

工控爱好者
winter938
至圣

经验值:10673
发帖数:1561
精华帖:33
30楼    2021-06-11 09:51:05
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

 假设一程序扫描周期为1.4毫秒且是恒稳的周期,观察下面的数据

时刻                          0  1.4  2.8  4.2  5.6  7

增量A                            1     1     2     1    1或2(只对时刻的整数部分进行计算)

增量B                            1     2     1     2    1  (对时刻数据小数部分四舍五入变成整数后进行计算)

增量C                            2     1     2     1    1或2   (对时刻数据向上取整后进行计算)

可能的SMW22增量       2     1     2     1    1或2      (SMW22最小为1)


 假设一程序扫描周期为3.4毫秒且是恒稳的周期,观察下面的数据

时刻                     0   3.4  6.8  10.2  13.6  17

增量A                        3     3     4      3       3或4(只对时刻的整数部分进行计算)

增量B                        3     4     3      4       3  (对时刻数据小数部分四舍五入变成整数后进行计算)

增量C                        4     3     4      3       3或4    (对时刻数据向上取整进行计算)

可能的SMW22增量   4     3     4      3       3或4      (SMW22最小为1)


 假设一程序扫描周期为0.4毫秒且是恒稳的周期,观察下面的数据

时刻                      0  0.4  0.8  1.2  1.6  2

增量A                        0     0     1     0    0或1(只对时刻的整数部分进行计算)

增量B                        0     1     0     1    0  (对时刻数据小数部分四舍五入变成整数后进行计算)

增量C                        1     0     1     0    0或1    (对时刻数据向上取整进行计算)

可能的SMW22增量   1     1      1     1    1      (SMW22最小为1)

        

 假设一程序扫描周期为0.8毫秒且是恒稳的周期,观察下面的数据

时刻                      0  0.8  1.6  2.4  3.2  4

增量A                        0     1     1     1    0或1(只对时刻的整数部分进行计算)

增量B                        1     1     0     1    1  (对时刻数据小数部分四舍五入变成整数后进行计算)

增量C                        1     1     1     1    0或1    (对时刻数据向上取整进行计算)

可能的SMW22增量   1     1      1     1    1      (SMW22最小为1)


 假设一程序扫描周期为0.3毫秒且是恒稳的周期,观察下面的数据

时刻                      0  0.6  0.9  1.2  1.5  1.8  2.1   2.4  2.7  3

增量A                        0     0     1     0    0     1      0    0     0或1(只对时刻的整数部分进行计算)

增量B                        1     0     0     1    0     0      0    1     0(对时刻数据小数部分四舍五入变成整数后进行计算)

增量C                        1     0     1     0    0     1      0    0     0或1(对时刻数据向上取整进行计算)

可能的SMW22增量   1     1      1     1    1    1      1     1     1(SMW22最小为1



鉴于以上数据建议楼主把程序扫描周期拉长到1毫秒以上再观察。可能会有意想不到的效果。

工控爱好者
winter938
至圣

经验值:10673
发帖数:1561
精华帖:33
34楼    2021-06-13 10:37:45
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。
工控爱好者
手机用户20200103736849
游侠

经验值:358
发帖数:50
精华帖:0
37楼    2021-08-06 14:22:03
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

我也是看视频做了一个通用定时器,结果跟BGN_ITIME和CAL_ITIME做的定时器对比差一半,这个帖子解惑了

水煮花生
侠士

经验值:1973
发帖数:209
精华帖:3
38楼    2021-08-06 16:28:47
精编帖  主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。

SMW22在S7-200和S7-200smart中的表现不一样,同样的程序,运行的差异较大。

因此, 有些使用SMW22的指令库,在S7-200里可以使用,在SAMRT有可能会不合适。

多学长知识 多问长见识
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。