您现在所在的是:

PLC论坛

回帖:8个,阅读:152 [上一页] [1] [下一页]
1850
czhaii
文章数:316
年度积分:145
历史总积分:1850
注册时间:2016/3/13
发站内信
发表于:2025/6/2 7:52:28
#0楼


附件 负数.jpg

FX3U 32位浮点数  怎么会算出29999.994来的呢

附件 写警告.jpg

不知道点了什么地方 每次编译程序要提示无法与PLC通信

而且输入行注释也不好使了


附件 余-1.jpg
运行DDRVI 会出现+1 或者-1我也忍了

不知道高手会遇到多少不可理喻的过程

简直不能想象



21790
bnnyygy
文章数:6217
年度积分:686
历史总积分:21790
注册时间:2012/3/15
发站内信
2018论坛分享达人
发表于:2025/6/2 8:12:00
#1楼
三菱 PLC 中出现30*1000=29999.994的计算误差,主要与浮点数在计算机中的二进制表示方式有关。以下是详细解释和解决方案:
原因分析
浮点数二进制存储的精度限制
浮点数(如三菱 PLC 使用的 IEEE 754 单精度浮点数)在计算机中以二进制形式存储,无法精确表示所有十进制小数。例如,某些十进制小数会转换为无限循环的二进制小数,导致舍入误差。
舍入误差的累积
乘法运算可能放大这种误差。当两个浮点数相乘时,中间结果可能超出精度范围,最终导致结果偏离预期。
浮点数比较的陷阱
直接比较浮点数是否 “等于” 某个值(如29999.994 == 30000)通常是不可靠的,因为即使微小的误差也会导致比较失败。
解决方案
1. 使用整数运算替代浮点数
如果精度要求高,尽量使用整数运算。例如:
plaintext
// 原错误计算:30.0 * 1000.0(浮点数)
// 修正为:30 * 1000(整数)
// 结果:30000(无误差)

2. 调整浮点数精度
如果必须使用浮点数,可通过以下方式减少误差:
设置容差值(Epsilon):在比较浮点数时,允许一个极小的误差范围。例如:
plaintext
// 判断两个浮点数是否“近似相等”
if (|A - B| < 0.001) {
   // A和B在误差范围内相等
}

四舍五入处理结果:在显示或使用结果前,将浮点数舍入到所需精度。
3. 检查 PLC 程序中的数据类型
确保参与运算的变量均为浮点数类型(如三菱 PLC 中的D寄存器 + 浮点数指令)。
避免在整数和浮点数之间频繁转换,可能导致额外的精度损失。
4. 优化运算顺序
对于复杂计算,调整运算顺序以减少误差累积。例如,先进行除法再乘法,可能比先乘后除更精确。
示例代码(三菱 FX 系列 PLC)
以下是使用整数运算替代浮点数的示例:
plaintext
// 错误示例:浮点数运算
LD D0      // 假设D0=30.0(浮点数)
MUL D2     // 假设D2=1000.0(浮点数)
OUT D4     // 结果:D4=29999.994

// 正确示例:整数运算
LD K30     // 30(整数)
MUL D100   // 假设D100=1000(整数)
OUT D102   // 结果:D102=30000(无误差)
总结
浮点数误差是计算机运算的固有特性,无法完全消除,但可以通过合理的数据类型选择和算法优化来控制。在工业控制场景中,建议优先使用整数运算以确保精度。
+10
37966
cvlsam 版主
文章数:12476
年度积分:577
历史总积分:37966
注册时间:2001/12/22
发站内信
2018论坛贡献奖
2017论坛贡献奖
2016论坛贡献奖
2015论坛贡献奖
2013论坛贡献奖
2012论坛贡献奖
2011论坛贡献奖
2011国庆活动
2010论坛杰出贡献奖
发表于:2025/6/2 8:16:50
#2楼
以下是引用czhaii2025/6/2 7:52:28的发言:


附件 负数.jpg

FX3U 32位浮点数  怎么会算出29999.994来的呢

附件 写警告.jpg

不知道点了什么地方 每次编译程序要提示无法与PLC通信

而且输入行注释也不好使了


附件 余-1.jpg
运行DDRVI 会出现+1 或者-1我也忍了

不知道高手会遇到多少不可理喻的过程

简直不能想象




你可以看下:https://www.cnblogs.com/ofnoname/p/15839927.html

了解一下IEEE754浮点数的精度和误差。

Good Luck~
43648
YXBK 版主
文章数:19998
年度积分:1027
历史总积分:43648
注册时间:2007/4/14
发站内信
2015论坛优秀版主
2015春节活动
2013论坛优秀版主
2012论坛优秀版主
发表于:2025/6/2 8:20:12
#3楼
不知道点了什么地方 每次编译程序要提示无法与PLC通信

点击 工具  选项,是不是红圈位置打勾了


附件 微信截图_20250602081850.jpg




关于注释的设置也在 工具 选项  里面

附件 微信截图_20250602082412.jpg
[此贴子已经被作者于2025/6/2 8:25:11编辑过]
+5
大家一起学习
1538
981183833
文章数:339
年度积分:496
历史总积分:1538
注册时间:2019/3/20
发站内信
发表于:2025/6/2 8:45:24
#4楼
附件 微信图片_20250602084410.jpg
是不是版本不对,还是你程序上哪里赋值不对,你单写一小段程序试试看
+5
26190
ytleaderplc
文章数:10956
年度积分:753
历史总积分:26190
注册时间:2008/6/7
发站内信
发表于:2025/6/2 9:35:26
#5楼
附件 250602.jpg



没有看到这样的问题
PLC 文本显示器 触摸屏 变频 伺服 编程电缆 plc触摸屏编程 维修等
email:  ytleader@126.com
1850
czhaii
文章数:316
年度积分:145
历史总积分:1850
注册时间:2016/3/13
发站内信
发表于:2025/6/2 10:20:56
#6楼
我是把1000和5存储在寄存器中的
代表伺服电机每圈1000脉冲数
每圈5mm螺距
因为出现了小数点
所以导致DDRVI不能执行完毕
有时+1,有时-1.
43648
YXBK 版主
文章数:19998
年度积分:1027
历史总积分:43648
注册时间:2007/4/14
发站内信
2015论坛优秀版主
2015春节活动
2013论坛优秀版主
2012论坛优秀版主
发表于:2025/6/2 10:39:27
#7楼
监看一下实际数据到底是多少,在监看里可以看到小数点后面很多位的

我把5改成5.00001就变成29999.994了


附件 微信截图_20250602103619.jpg
[此贴子已经被作者于2025/6/2 10:41:07编辑过]
大家一起学习
1850
czhaii
文章数:316
年度积分:145
历史总积分:1850
注册时间:2016/3/13
发站内信
发表于:2025/6/2 21:47:49
#8楼
回复 #3楼 YXBK
我都没有勾选那选项
不知道咋点上了
去掉就好了
现在我DDRVI暂时用等于来停机
好像小数点0.006也可以通过
有时间再想办法
谢谢大家

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

78.0005