0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

西门子TIA Portal如何比较两个浮点数相等

工控论坛 来源:工控论坛 2025-01-06 10:07 次阅读

概述:

由于浮点数的定义规则,导致浮点数不能通过二进制精确表示,所以在浮点数计算过程中,会出现两个值一样的浮点数进行比较相等计算时结果并不相等的情况。下面先设计一个实例说明该问题,并给出解决问题的方法。

第1步:

添加 PLC 设备。

选择西门子 CPU 1214C DC/DC/DC

设置 IP 地址:192.168.0.1。

子网掩码:255.255.255.0

951bfcc6-c912-11ef-9310-92fbcf53809c.jpg


图1添加 PLC 设备

第2步:

1. 添加全局数据块。命名为:GdbData。

9534e01a-c912-11ef-9310-92fbcf53809c.png


图 2 浮点数全局数据块

在以上全局数据块中添加浮点数类型变量,tagA、tagB、tagC 和 tagSum,分别设置起始值 0.02、0.03、0.05 和 0.0。

2. 在主程序 Main 中添加接口变量。

95444528-c912-11ef-9310-92fbcf53809c.png

图 3 主程序 Main 的接口变量

3. 编写程序,进行浮点数加法计算并将结果进行相等比较。

955178c4-c912-11ef-9310-92fbcf53809c.png


图 4 编写程序

可以看到浮点数 tagA + tagB = 0.05,和 tagC = 0.05 作相等比较,比较结果并不相等。

4. 在监控表中监视变量值。

9566206c-c912-11ef-9310-92fbcf53809c.png


图 5 变量监视 - 浮点数

956a47d2-c912-11ef-9310-92fbcf53809c.png


图 6 变量监视 - 十六进制

可以看到监视到变量 tagSum 和 tagC 的浮点数值均为 0.05,值相等,而十六进制数值却为 16#3D4C CCCC 和 16#3D4C CCCD,值不相等。在以上程序中浮点数相等的比较过程中实际上比较的是十六进制数,所以得到的结果并不相等。

第3步:

鉴于以上原因,在进行两个浮点数相等比较计算时,可以先计算两个数的差值,然后判断该差值是否在一个很小的数值范围以内,比如在 ±1.0E-6 以内,则认为这 两个浮点数相等。

9579b500-c912-11ef-9310-92fbcf53809c.png


图 7 比较两个浮点数相等

第4步:

功能封装。

定义一个 FC,命名为:RealEqual, 对以上功能进行封装,在以后浮点数相等判断时方便直接调用。

95819072-c912-11ef-9310-92fbcf53809c.png


图 8 功能封装

封装后的调用结果。

959cb776-c912-11ef-9310-92fbcf53809c.png


图 9 功能调用

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • plc
    plc
    +关注

    关注

    5013

    文章

    13321

    浏览量

    463955
  • 西门子
    +关注

    关注

    94

    文章

    3046

    浏览量

    116024
  • 浮点数
    +关注

    关注

    0

    文章

    61

    浏览量

    15875

原文标题:西门子 TIA Portal 如何比较两个浮点数相等

文章出处:【微信号:gkongbbs,微信公众号:工控论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    点数浮点数的区别是什么

    的傅里叶变换后的数据,那么,选择正确的处理方式时,首先要解决的是定点数浮点数的问题。如果使用过单片机的同学,一定会知道定点运算和浮点运算两个概念,那么,定点运算和
    发表于 02-21 07:22

    浮点数的表示方法

    浮点数的表示方法  浮点数,是指小数点在数据中的位置可以左右移动的数据。它通常被表示成:    N = M* RE  这里的M(Mantissa)被称为浮点数
    发表于 10-13 17:13 1.6w次阅读
    <b class='flag-5'>浮点数</b>的表示方法

    浮点数常用的编码方法

    浮点数常用的编码方法  前面已经说到,在计算机内,浮点数被表示为如下格式:    通常情况
    发表于 10-13 17:21 4503次阅读
    <b class='flag-5'>浮点数</b>常用的编码方法

    modbus 如何读取浮点数

    本文为大家介绍modbus读取浮点数两个程序设计。
    发表于 02-08 10:03 1.5w次阅读

    三菱PLC浮点数运算指令

    二进制浮点数比较指令ECMP(FNC110) DECMP(P)指令的使用如图1所示,将两个源操作数进行比较比较结果反映在目标操作数中。如果
    发表于 03-23 14:14 1.7w次阅读
    三菱PLC<b class='flag-5'>浮点数</b>运算指令

    谈一谈浮点数的精度问题

    还是要从浮点数的存储和标识出发来处理该问题,既然浮点数天然就存在一定的误差,而有时候计算又无法获得唯一的数值,如下图所示,浮点数计算出来的实轴上的值都会因为浮点数无法存储标识而近似到其
    的头像 发表于 08-11 14:28 4640次阅读
    谈一谈<b class='flag-5'>浮点数</b>的精度问题

    什么是浮点数浮点数在内存中的存储

    浮点型简单讲就是实数的意思。浮点数在计算机中用以近似表示任意某个实数。
    的头像 发表于 11-09 11:07 5436次阅读
    什么是<b class='flag-5'>浮点数</b>?<b class='flag-5'>浮点数</b>在内存中的存储

    什么是浮点数

    Python数据类型第一种:字符串(str)。 Python数据类型第二种:整数(int)。 Python数据类型第三种:浮点数浮点数的英文名是float,浮点数没有简写。
    的头像 发表于 02-23 14:58 4659次阅读

    西门子PLC 64位浮点数转32位浮点数程序分享

    西门子S7-200测试通过,程序网上而来,献给有需要的各位!
    的头像 发表于 03-29 09:39 2580次阅读

    西门子PLC读取的仪表数据(浮点数)如何转换为整数

    看到一网友的问题,西门子200PLC采用MODBUS RTU协议采集多功能仪表的数据,接收的数据均是32位的单精度浮点数,我怎么在PLC程序里面实现单精度浮点数与十进制之间的转换?且
    的头像 发表于 06-01 10:18 5702次阅读
    <b class='flag-5'>西门子</b>PLC读取的仪表数据(<b class='flag-5'>浮点数</b>)如何转换为整数

    西门子PLC浮点数程序案例分享

    64位浮点数保存于VB0开始的存储区中,转换得出的32位浮点数保存于VD100中。
    发表于 10-27 17:07 3370次阅读
    <b class='flag-5'>西门子</b>PLC<b class='flag-5'>浮点数</b>程序案例分享

    单精度和双精度浮点数的区别

    在计算机科学和数值计算中,浮点数是一种用于表示实数的数据类型。浮点数种精度级别:单精度和双精度。这种精度级别在表示范围、精度和存储空间等方面都有所不同。本文将详细介绍单精度和双精
    的头像 发表于 12-13 10:55 1.1w次阅读

    单精度和双精度浮点数的区别

    单精度和双精度是计算机中表示浮点数种不同的精度。在计算机中,浮点数用来表示带有小数部分的实数,而单精度和双精度用来表示浮点数的精确程度不同。在以下文章中,我将详细介绍单精度和双精度
    的头像 发表于 12-15 10:25 5486次阅读

    modbus浮点数怎么读取

    Modbus是一种通信协议,常用于工业自动化系统中的设备之间的通信。它支持多种数据类型,包括整数、浮点数、字符串等。浮点数在工业领域中广泛应用,因此了解如何读取和处理Modbus浮点数是非
    的头像 发表于 12-28 14:38 6467次阅读

    一文带你秒懂IEEE 754浮点数

    一、简介1、常见的浮点数表示方式是IEEE754标准,它规定了浮点数的存储格式和运算规则,这个标准定义了浮点数表示:单精度和双精度。2、任何一
    的头像 发表于 03-18 08:09 8894次阅读
    一文带你秒懂IEEE 754<b class='flag-5'>浮点数</b>