首頁>Club>
200PLC採用MODBUS RTU協議採集多功能儀表的資料,接收的資料均是32位的單精度浮點數,我怎麼在PLC程式裡面實現單精度浮點數與十進位制之間的轉換?
119
回覆列表
  • 1 # 小鵬工控

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

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

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

  • 2 # 自控學途與車間

    如果是使用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才能得到真正的流量大小。

  • 3 # 控制研究控

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

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

    來說一下解題思路吧:

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

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

    16#450F9000如何轉換為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指令就可以實現浮點數取整的功能,其實這個在模擬量轉換中經常用到的,應該說是一個常見指令,做工控的朋友都應該瞭解!

  • 中秋節和大豐收的關聯?
  • 如何看待被梅姨拐賣15年的申軍良孩子申某被找到?