恭喜,你发布的帖子
发布于 2020-12-05 18:36:49
7楼
也用过系统时间,计算不同的扫描周期;毕竟精度就是那样,没感觉有什么问题。
至于累积方法我倒是有些想法,不知是否认同。
首先,我们大多的物理量转成测量信号的数字量,ADC都是有精度的。10位的或12位的。这些是绝对的精度。通过算法,可以提高相对精度;但那是估读,置信度有待考虑。
10位ADC是多少?是1024。通过算法,做成了模拟量27468。所以,手册上指明,这个27468的精度只有满量程的3%-3.5%(1024:27468即1: 27);而ADC的原始精度则是 1:1024大约是0.1%。
以上是针对ADC转换而言。
那么对于累积该数值,又要保持最好的精度,当然是直接使用UINT或者INT;将它们累积到UDINT (32位)中。
假如1毫秒采样累积,那么一个UDINT可以连续采样130秒。而不丢失原始精度。
反过来,我们看看实数Real(32位)。它的有效位数只有6位。这意味着,同样的值,每累积10倍(次)就丢失最后一位有效数字,积累1000倍最后3位已经是无效数字了。当十万倍时,这后面5位都是无效的数字。置信度为零。如果同样1毫秒采样积累,那么十万次就是100秒。
看了这个比较,有啥想法?
这就是为什么不用实数来做累积的原因之一。
第二个原因,有些人喜欢将ADC采样的整数转换到实际物理量(实数)再累积。这样做不但再一次增大了误差(转换误差),而且程序通用性不好(把一个无量纲的信号,变成有物理量纲的专用信号)。
基于以上两点原因。我认为只需做个FC,将采样值UINT;一个量纲单位 传入(Input); UDINT+UINT(InOut)累积值(全局变量);实时输出(Output)个计算位物理量的实数。至少它的置信度比较高。
这样的FC就可以通用了。
或FB(累积在背景数据),也可以。
请填写推广理由:
分享
只看
楼主