签到有奖
消息提醒
运维工程师专区
官方商城
扫码分享好友 任选多种周边
昨天一个同事向我反应说现场PLC的设备运行时间计算不准确,有时候一个小时能差一分钟,他经过分析认为运行时间计算应该放到中断程序里处理。我跟他说设备运行时间计算完全没有必要放在中断中执行,有误差肯定是编程有问题,然后我把我的算法给他分享了,并且这个算法我用了很久没有出现过明显误差,今天也跟大家分享一下。
程序用到了系统时钟M0.5(设置时钟标记地址为M0)秒方波。具体算法是T_RT_M每秒加1,当它大于3600时表明记录时间超过1小时了,此时给T_RT_H加1,给T_RT_M减3600。最后时间等于T_RT_H+(T_RT_M/3600),用实数表示。因为是用上升沿计数,并且秒信号是保持0.5秒的方波,所以程序扫描时间不大于500ms的情况下肯定能捕捉到,不会丢失脉冲。
以前发现有的程序虽然也采用秒方波计数的方式,但是没用用到两级累计的方法,而是每个脉冲给运行时间累计0.0002778小时,由于浮点数小数精度是不定的,当数据大到一定程度每次累加的小数就会被舍去,造成误差偏大。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1632864&b_id=4&s_id=23&num=12
嗯,自带系统时钟常用!
有用,学习学习!
还是用整型比较好!
如果设备在两个上升缘之间运行了0.9秒,那么这0.9秒算谁的?
如果设备跟M0.5有关联,那么可能每次接通的第一次计秒都是被忽略掉的(可能扫描周期原因等)。
感谢楼主的精彩分享,学习了!
这个很实用,谢谢分享
设备运行时间不需要精确到ms吧,到秒已经足够了。
所以我一般用秒脉冲而不是500ms脉冲。
楼上有人说0.9秒算谁的,算空气的了。
这种事情就不纠结了。
这个运行时间计算主要用于统计设备的运行台时或者用于设备的定期轮换,允许有几秒甚至分钟级别的误差。如果是生产线的节拍控制需要用更精确的算法。
我用的是占空比为50%的秒方波,不是脉冲,所以说只要扫描时间不大于500ms肯定能捕捉到上升沿的,不会丢失信号。
一般计时都是用S为基本单位,而且是用整型数据,浮点型数据太容易有误差了
CONST
unit:=60; //换算率
END_CONST
VAR_INPUT
// Input Parameters
Input_Condition:BOOL:=false; //允许计时
FP_1Sec:BOOL; //单位时基 秒
reset:BOOL; //计时复位
END_VAR
VAR
Impls_1Sec_Aux:BOOL;
Impls_1Sec:BOOL;
pos1,pos2,pos3:BOOL;
VAR_OUTPUT
// Output Parameters
act_second:INT:=0;
act_min:INT:=0;
act_hour:INT:=0;
Impls_1Sec:= FP_1Sec AND (NOT Impls_1Sec_Aux);
Impls_1Sec_Aux:= FP_1Sec;
IF NOT reset THEN
IF Input_Condition AND Impls_1Sec AND NOT pos1 THEN
act_second:= act_second + 1;
pos1:=true;
ELSE
pos1:=false;
END_IF;
IF (act_second >= unit) AND NOT pos2 THEN
act_min:= act_min + 1;
act_second:=0;
pos2:=true;
pos2:=false;
IF (act_min >= unit) AND NOT pos3 THEN
act_hour:=act_hour + 1;
act_min:=0;
pos3:=true;
pos3:=false;
act_hour:=0;
很有用的程序,思路很好。谢谢分享
我更偏向于使用特殊存贮器SMW22。因为Q在一个扫描周期中是不会改变的,每次扫描直接把SMW22的值累加进来就可以了。程序简单很多。
学习了,路过
大哥,我肯这个程序每到3600秒,小时累加一次,可下面为什么又是秒除以3600呢?那为什么不把上面的省略了直接用秒除以3600得出的数不是一样么?
如累积5800秒,以你的程序应该是:
5800-3600=2200 小时累加1
2200/3600=0.61
1+0.61=1.61
那如果5800/3600=不一样等于1.61么?
没错,如果用整数本质上是一样。但我是用浮点数累计计算的,当数据大的时候浮点数是有精度的,你这种方法就不准确了。
每次开关机0.9秒误差,设备不可能一天开关机很多次吧……
基本上运行时间统计我是用双字来累计,以秒为单位。
双字最大 2,147,483,647 秒,约为67.9年,完全足够用了!!
不建议用浮点数,很快会被坑死的。
方法有几种,感谢楼上分享
分享
扫码分享好友 任选多种好礼
收藏
有帮助
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
三日内免验证登录
短信登录
登录