概述:
由于浮點數(shù)的定義規(guī)則,導(dǎo)致浮點數(shù)不能通過二進制精確表示,所以在浮點數(shù)計算過程中,會出現(xiàn)兩個值一樣的浮點數(shù)進行比較相等計算時結(jié)果并不相等的情況。下面先設(shè)計一個實例說明該問題,并給出解決問題的方法。
第1步:
添加 PLC 設(shè)備。
設(shè)置 IP 地址:192.168.0.1。
子網(wǎng)掩碼:255.255.255.0
圖1添加 PLC 設(shè)備
第2步:
1. 添加全局數(shù)據(jù)塊。命名為:GdbData。
圖 2 浮點數(shù)全局數(shù)據(jù)塊
在以上全局數(shù)據(jù)塊中添加浮點數(shù)類型變量,tagA、tagB、tagC 和 tagSum,分別設(shè)置起始值 0.02、0.03、0.05 和 0.0。
2. 在主程序 Main 中添加接口變量。
圖 3 主程序 Main 的接口變量
3. 編寫程序,進行浮點數(shù)加法計算并將結(jié)果進行相等比較。
圖 4 編寫程序
可以看到浮點數(shù) tagA + tagB = 0.05,和 tagC = 0.05 作相等比較,比較結(jié)果并不相等。
4. 在監(jiān)控表中監(jiān)視變量值。
圖 5 變量監(jiān)視 - 浮點數(shù)
圖 6 變量監(jiān)視 - 十六進制
可以看到監(jiān)視到變量 tagSum 和 tagC 的浮點數(shù)值均為 0.05,值相等,而十六進制數(shù)值卻為 16#3D4C CCCC 和 16#3D4C CCCD,值不相等。在以上程序中浮點數(shù)相等的比較過程中實際上比較的是十六進制數(shù),所以得到的結(jié)果并不相等。
第3步:
鑒于以上原因,在進行兩個浮點數(shù)相等比較計算時,可以先計算兩個數(shù)的差值,然后判斷該差值是否在一個很小的數(shù)值范圍以內(nèi),比如在 ±1.0E-6 以內(nèi),則認為這 兩個浮點數(shù)相等。
圖 7 比較兩個浮點數(shù)相等
第4步:
功能封裝。
定義一個 FC,命名為:RealEqual, 對以上功能進行封裝,在以后浮點數(shù)相等判斷時方便直接調(diào)用。
圖 8 功能封裝
封裝后的調(diào)用結(jié)果。
圖 9 功能調(diào)用
-
plc
+關(guān)注
關(guān)注
5028文章
13615瀏覽量
471231 -
西門子
+關(guān)注
關(guān)注
98文章
3118瀏覽量
117559 -
浮點數(shù)
+關(guān)注
關(guān)注
0文章
61瀏覽量
16059
原文標題:西門子 TIA Portal 如何比較兩個浮點數(shù)相等
文章出處:【微信號:gkongbbs,微信公眾號:工控論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
定點數(shù)和浮點數(shù)的區(qū)別是什么
浮點數(shù)的表示方法

浮點數(shù)常用的編碼方法

三菱PLC浮點數(shù)運算指令

談一談浮點數(shù)的精度問題

什么是浮點數(shù)
西門子PLC 64位浮點數(shù)轉(zhuǎn)32位浮點數(shù)程序分享
西門子PLC讀取的儀表數(shù)據(jù)(浮點數(shù))如何轉(zhuǎn)換為整數(shù)

西門子PLC浮點數(shù)程序案例分享

單精度和雙精度浮點數(shù)的區(qū)別
modbus浮點數(shù)怎么讀取
西門子TIA Portal中函數(shù)FC和函數(shù)塊FB的相互轉(zhuǎn)換

西門子TIA Portal HMI的遠程控制功能

評論