作者 | 主题 |
---|---|
zbhdm 至圣 经验值:14067 发帖数:1739 精华帖:2 |
楼主 2021-06-03 19:04:53
主题:帮我看看,为啥这个子程序里面的时间跑的特别快。 用SMW22在子程序中用于计时,就是对SMW22不断的累加。下载程序发现,这个累加的时间跑的的特别快,大约是正常时间的两倍。也就是定时5000ms,大约用时2s就到了。通过监控“时间”变量连接的vw100,也就2秒钟,就跑到了5000多了。 请教各位老师,这个程序编的有问题,还是SMW22用的不合适?
努力学习西门子
|
yanxiao 版主 经验值:27005 发帖数:11988 精华帖:45 |
3楼 2021-06-03 23:28:30
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 使用SMW22似乎也有道理,就是不知SMW22有多精准。 使用32位的1ms定时器更好,不会产生定时不准问题。 BITIM、CITIM |
芳季 至圣 经验值:68888 发帖数:15078 精华帖:101 |
8楼 2021-06-04 18:37:20
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 我问你一个问题,扫描周期0.9毫秒,那么这个计时器会写多少毫秒?它只能显示一毫秒,所以一个扫描周期白白多了0.1毫秒,误差就是这么来的了。 你们都没有感觉到有这个问题的吗?用这个来做计时,怎么会准的嘞? |
芳季 至圣 经验值:68888 发帖数:15078 精华帖:101 |
9楼 2021-06-05 06:37:12
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 问题是22是增量,Citime是亚绝对。假设扫描周期是0.5毫秒,22只能最少显示1。3个周期,用22计算的计得3毫秒了。用Citime计算的第一个周期得0毫秒时差,第二周期得1毫秒时差,第三个周期可能还是1毫秒时差。这就是区别了。 22到底刷不刷新都是显示1。你就把这个1加进去了。 |
winter938 至圣 经验值:10828 发帖数:1564 精华帖: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毫秒时会有问题。
工控爱好者
|
芳季 至圣 经验值:68888 发帖数:15078 精华帖:101 |
13楼 2021-06-05 13:57:23
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 你什么时候看见过22会显示0的?我估计无论什么小数位,都会被进位。就算5.01毫秒也写6毫秒。 有四舍五入当然误差没有那么大。四舍五入的实质是计算内部值是精确的,仅仅舍了出来的值用于非精密用途,所以舍弃也没什么所谓。 但是计时这事情,是不能舍的,每个周期都是3.5毫秒,无论你舍还是进,结果都是错误的,舍了,一直累加3毫秒,少了很多。进了,一直累加4毫秒。多了很多。都错。 唯独citime指令尺度是亚绝对的。随时来读取都是绝对值。0.5毫秒的扫描周期可能读得两个0的结果, |
Zane 至圣 经验值:78915 发帖数:19732 精华帖:383 |
16楼 2021-06-05 22:14:21
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 扫描周期越大,使用SMW22的误差就越小, 10毫秒扫描周期的误差是< 10% , 20毫秒扫描周期的误差是< 5%
Zane
注册自动化系统工程师
Always save before download
|
winter938 至圣 经验值:10828 发帖数:1564 精华帖:33 |
26楼 2021-06-10 21:31:01
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 从楼主24楼的数据看来T32显示的扫描周期不足1毫秒,SMW22每周期却显示1毫秒,证明芳季的担心是有道理的,可以采用我14楼的程序获取时钟数据。楼主顶楼的程序运行起来估计比实际时间会快一倍左右,拉长扫描周期这个误差会减小一些。如果把扫描周期拉长到1毫秒以上也许会是另外的情况。
工控爱好者
|
芳季 至圣 经验值:68888 发帖数:15078 精华帖:101 |
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 至圣 经验值:72848 发帖数:8229 精华帖: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 至圣 经验值:10828 发帖数:1564 精华帖: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 至圣 经验值:10828 发帖数:1564 精华帖: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 至圣 经验值:10828 发帖数:1564 精华帖:33 |
34楼 2021-06-13 10:37:45
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。
工控爱好者
|
手机用户20200103736849 游侠 经验值:360 发帖数:50 精华帖:0 |
37楼 2021-08-06 14:22:03
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 我也是看视频做了一个通用定时器,结果跟BGN_ITIME和CAL_ITIME做的定时器对比差一半,这个帖子解惑了 |
水煮花生 侠圣 经验值:2492 发帖数:262 精华帖:4 |
38楼 2021-08-06 16:28:47
主题:回复:帮我看看,为啥这个子程序里面的时间跑的特别快。 SMW22在S7-200和S7-200smart中的表现不一样,同样的程序,运行的差异较大。 因此, 有些使用SMW22的指令库,在S7-200里可以使用,在SAMRT有可能会不合适。
多学长知识 多问长见识
|