PLC單精浮點數如何轉為十進制數?

電氣自控


看了一下這個問題好像還沒有人答對,我來回答一下!

結合圖片看了你的問題,其實你的問題就是你接收的到的32位數據是450F9000,而且你知道這個數據其實是單精度浮點數,轉換為10進制的結果是2297,你想知道在西門子200PLC中如何實現這個轉換工程?

來說一下解題思路吧:

1:你不知道西門子200PLC中如何實現這個轉換,可能的原因是你對16#450F9000如何轉換為2297可能也有點不理解?

2:你不知道西門子200PLC中應該用什麼樣的指令來實現這個轉換工程!


16#450F9000如何轉換為2297?

來先看一下計算器中的轉換吧:

這是我電腦win10系統中的計算器切換到程序員模式,可以看到16進制的450F 9000轉換為十進制數是1158647808,和你的2297是不一樣的!--但是我在BIN就是二進制這裡畫了紅線,我想說的是你如果對西門子PLC中32位浮點數的數據格式有清楚的理解的話,你根據這段二進制值就可以推算出這個實數的值是多少,因為我(控制研究控)在之前的問答和文章中有說過這個知識點,所以這裡我就不再多說了!---但是我自己計算了一下結果就是2297!

PLC程序中如何將16進制的450F9000轉換為十進制數?

其實西門子PLC中的ROUND指令就是用來取整的將浮點數轉換為整數的,西門子300和200PLC中都有這個指令,所以我都測試了一下!

先看一下西門子300PLC執行的結果:

這個圖片是我在step7項目中建立的一個300CPU項目的簡單程序,可以看到我把16#450F9000這串數據認為是雙正式,通過DI_R指令轉換的結果存儲到MD10中得到的實數值是1.15865e+009,這是一個雙整數轉實數的指令,但是如題目所說開始的16#450F9000它本身就是浮點數格式,因此這裡看做雙整數是不對的!

而我又用round指令,將16#450F9000這個數據轉換為整數,可以看到MD20的結果就是2297,這個結果才是對的。這裡就是已經認定16#450F9000這串數據代表的是32位實數,因此結果正確!

再看一下西門子200PLC中的執行結果:

這個圖片是我在西門子200的非官方模擬器中做的測試程序,可以看到和西門子300PLC的程序是很相似的,指令都是一樣的DI_R雙整數轉實數,和ROUND取整指令!

也可以看到他們執行的結果都是一樣的,最重要的是通過round指令就可以實現將32位浮點數16#450F9000轉換為整數2297,也就是10進制的2297!


以上就是我的回答,很簡單吧,就一個round指令就可以實現浮點數取整的功能,其實這個在模擬量轉換中經常用到的,應該說是一個常見指令,做工控的朋友都應該瞭解!


控制研究控


如果是使用S7-200PLC,無需轉換,只是顯示格式問題

數制問題,都要回到計算機的存儲上來。例如,數10,若按BCD碼存儲(通常所說的10進制存儲),則需以位序列2#00010000等同於16#10存在計算機,若不申明以BCD碼存儲,計算機上就是16#0A。

換句話說,計算機上存儲的都是二進制0、1組成的位序列。這一串位序列,代表什麼意思是依靠人來定義的,它有可能是浮點數、整數、還有可能是字符的ASCAI碼。

16#80賦值給無符號變量,這個變量的值就是+128,若將其賦值給有符號數他就是-128。

儀表與S7-200PLC通信若是Modbus RTU通信,通常是以字為單位傳遞數據,那你可看說明書規定的映射關係4xxxx地址,區分 高低前後。

你用STEP7 MicroWin觀察時讓它顯示為10進制即可。至於你讓它在PLC程序中參與計算,更是不用關注數制問題,而是應該關注賦值給什麼類型變量(整數,還是實數)。

對流量儀表,常常是有小數的,通信時,往往是將實際流量除以某個單位流量得到整數存儲再傳送。例如:2.56L/min,在儀表上可能存儲的時321=16#0100,默認有個單位是0.01L/min。若是這樣,則需要用DI_R指令轉換為實數,然後用DIV_R除以100.0才能得到真正的流量大小。


自控學途與車間


很高興回答你問題

你可以直接的以十進制顯示,這樣自動的轉換成為十進制

比如VB100=16#45,VB101=16#=0F,VB102=16#90,VB103=16#00

直接讀取vd100就可以,就是你需要的值了

以上就是我的理解,希望對你有幫助


小鵬工控


你說的這個vd100我已經試過了。不對的


分享到:


相關文章: