登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:累积流量不准的问题总结

点击:4942 回复:24

没有做过累积流量的项目,这里讨论的只是累积流量在PLC中需要如何才能实现相对高精度累积的问题。
问题的提出其实完全是闲得发慌,偶然看到很多人讨论累积流量不准的问题,我就想不如我来验证一下倒地如何不准的。
我没有对瞬时流量进行单位方面的转换,这个不影响我的讨论验证。不过还是需要首先来说说如何进行瞬时流量累积相关的转换。
流量单位其实比较复杂,我们讨论的是体积流量,一般也就是m3/h或l/s之类。质量流量很复杂,需要考虑流体温度压力,还是交给检测仪表吧。信号接收无外乎几种:通讯、模拟信号、脉冲信号和频率信号。如果流量仪有累积流量的输出也就没有讨论的必要了,准不准确就看仪表的了。通讯最好了,几乎不用操心信号传输中的不准确问题。模拟和脉冲信号最常见,频率信号目前我还没有想过如何处理,暂不讨论,大家可以说说如何处理的。
脉冲信号需要看仪表输出的最高频率,如果频率高需要使用PLC的高速脉冲计数器才能有效接收。模拟信号在接收问题上最容易实现,硬件上可能需要注意使用信号隔离器件。
18-04-02 13:00
瞬时流量其实也不是说瞬时的流量,瞬时没有流量的概念,因为瞬间如何有流量呢?所以所谓瞬时流量也是一小段时间内的流量,比如1s,100ms、500ms。看很多帖子也说是m3/h的,这个是说如果瞬时流量在一个小时内保持不变的话,那么累积一个小时的流量就是刚才接收到的瞬时流量值m3/h了。由于瞬时流量实时变化,所以需要把瞬时流量离散到所需的等分。比如1s采样一次则需要把瞬时流量m3/h离散为3600等分,这样才是一个采样周期所得到的瞬时流量值,用这个瞬时流量值再来进行累积得到累积流量。
一般为了保证足够准确,采样周期最好做到最够小,如果100ms采用一次,那么离散后的数值就很小了。
通过后面的验证我认为如果可以的话,流量仪输出的瞬时流量时间单位越小越好,数值单位也越小越好,这样可以避免离散得到一个比较小的数值。比如可以选择l/s甚至l/ms。
最后修改:2018/4/2 13:12:16
18-04-02 13:11
呵呵,如果参照电能计量(数字电度表),其实就是简单的累加,厂家只要做的就是把采样频率玩命的提高,最好是做到小数点三位以后(单位是秒,也就是1毫秒左右一次),这是供电管理部门很乐意的,我们做工控的可以参照一下。表情
18-04-02 13:29
累积一般通过定时循环中断来做累积统计,时间越短当然越好,但这个要根据PLC完成的功能来平衡。一般要避免PLC有除累积流量外有太多的中断存在,因为PLC不能同时处理几个中断,有太多中断可能会影响采样周期的稳定性。特别是有通讯需要用中断处理的话在保证实时性的同时应该使通讯中断的时间长一些。
接下来是讨论正题了。
18-04-02 13:30
对了,脉冲信号类似楼上提到的电能远传,脉冲当量*接收到的脉冲数做累积。不过也还是存在接下来讨论的问题。
18-04-02 13:34
平时我一般只作过逻辑方面的项目,数据采集方面很少接触,也就对浮点数没有太多认识。
这次算是拓展了一回。
我没有用中断,而是简单地每扫描周期累积一次,这样可以很快做完验证。
首先是一个固定的瞬时流量值0.01(不带单位,已经是视作外部程序处理后的瞬时流量了)做累积,先是做了普通想当然的累积:rFlowACC = 0.01+0.01+0.01....开始做了10000次累积,很快结束,有误差,但不大。具体累积结果我没有记录。
接着做了10*10000次累积和100*10000次累积,误差加大到了错误结果的程度。特别是我让PLC运行了一次隔夜验证,开始加上了一个初始值260000.0,第二天起来一看数值保持为一个恒值不再累积了,而累积计算还在继续。
最后修改:2018/4/2 18:15:41
18-04-02 13:44
我试着把瞬时流量值改大做对比,0.1,和0.01比起来误差出现在累积更多次数的时候。
我只好搜资料看,看看问题出在哪里了。很多资料,我也不能理解所有的内容。总之,问题出在浮点数的定义。
S7-1200浮点数是32位,64位LReal浮点数需要1500或400支持。浮点数的精度是由尾数决定的,精度高意味着小数点后的有效位数越多,32位浮点数的尾数可以表示的精度为6~7位,一般认为能够可靠表示是6位,我遇到的是7位。也就是说超过7位的值和7位是一样的了,比如0.12345673和0.1234567其实在计算机里32位浮点数是同一个数,都是0.1234567。(这里本来是用0.12345678来做比的,后来发现不对,还是用0.12345673来做比好些)
超过有效位的位如何处理呢?截断或舍入,总之不能精确表示了。
除了有效位数外,浮点数计算还有个问题就是小数点后的数在二进制表示时其实是不精确的,这就是为什么0.01+0.01可能是0.0199999的原因。(打比方,不一定是这个结果)
这是产生误差的原因。
18-04-02 14:03
大数加小数出现小数丢失的问题也是这个原因,这就是第二天起来看累积结果不再继续了。一个大数加一个小数结果出现了超过精度的值,超过的位被丢弃,下次依然被丢掉,这样结果还是原来的值,无论几百万次累积也白搭了。
一定有人解决了,就搜解决方案看吧。
首先得到的解决方案是这样的:
要避免大数加小数,就只能是同等量级的数累积。比如1000倍率的数可以正常累积,就把小累积量累积到1000倍率,超过该值就把小累积值出现的整数部分暂存到一个变量中去,看作累积流量的整数部分,然后截断该小累积量的整数部分只取小数部分保留继续累积。以此方式循环累积。这样得到了累积值的整数部分和小数部分。
好主意呀,累积的时候就是同级别的数累积了。
18-04-02 14:17
我马上验证。
也是隔夜累积,1000*10000次累积。第二天累积在继续,观察了好一会累积次数到了,结果和第一种普通方法比起来:能够累积没有出现停止的问题了,但是,结果不对呀,差太多了,简直可以用结果错误来说了。
具体累积值没有记录,打比方说理论值应该是2603400.0,累积结果是260960.0,就这么大,错误了。
问题还是没解决。
我给第一种普通累积取名叫方案1,刚才的同级累积叫方案2,以便以后描述简便。
18-04-02 14:26
今天暂时到这,看看大家有没有看法。
18-04-02 14:27

上一页下一页

工控新闻

更多新闻资讯