2016年5月16日 星期一

[PLC基礎篇]2進制、10進制、BCD碼、ASCII碼轉換

先來2進制、10進制、16進制、BCD碼之間的轉換表:



最近遇到不少人問,要怎麼換成10進制?
大多是用在通訊,因為要轉成ASCII碼






============
基本認識PLC內部儲存:
在PLC內部暫存器,其實都是以位元在儲存,
所以1個WORD的暫存器,其實是16個位元(2進制)在表示。
而16個位元就等於4個16進制的位數。

請問給你16位元,要怎麼表示成10進制?
給3個位元,只能存到0-7
給4個位元,能存到0-15,浪費10~15的部份。

而給4個位元,來當10進制儲存的方式,就叫做BCD。
所以你在手冊進找不到2進制(16進制)轉10進制的方式。
(有2進制浮點數轉10進制浮點數的功能)


註:不管是人機或是PLC編輯軟體,都有自動換算成10進制的功能,
換算是指顯示10進制的內容給你看,而非儲存。
所以平常時,真的用不到2進制轉16進制功能。

============
本篇重點,如何把D暫存器的值(2進制),轉成ASCII。
1.先把D暫存器轉成BCD碼,用BCD指令。
2.再用ASC
I指令,把BCD轉成ASCII碼

1.BCD指令說明
指令格式:
BCD S D
S 來源BIN值範圍0~9999
D 變換的結果。
為什麼限制來源是0-9999,因為每1個位數的10進制轉換後會佔4個位元。
9999 4位數=會佔16位元,等於1個暫存器。
所以當過9999時,就佔用到第2個暫存器,就要用DBCD。
=================
ASCI

把HEX(16進制)轉成ASCII
指令格式:
ASCI S D n
S是來源
D是目的
n是位數

因為轉換後的位置比較難算,用個手冊上的範例來說明:
範例是把ASCI D10 D20 K4
轉4個ASCII碼,從D10的最低16進制開始轉。
但在放的時候,因為ASCII碼是0-127,會佔8位元,1個D(word)只能放2個ASCII。
D10的內容是0123H,所以結果會佔D20、D21。

而排放的順序,比較難敘述,
重點原則:D10(來源)的低位元會先轉換,放到D20、D21(目的)的最高(允許)位元。
例:D10=0123H
D20的低8位元是放0的ASCII
D20的高8位元是放1的ASCII
D21的低8位元是放2的ASCII
D21的高8位元是放3的ASCII

如果是:
ASCI D10 D20 K3
D10=0123H  因為K3,只會轉123H
D20的低8位元是放1的ASCII
D20的高8位元是放2的ASCII
D21的低8位元是放3的ASCII

示範影片:













1 則留言:

  1. 陳大好 關於暫存區的數值一事想請教
    關於使用豐煒PLC_VS_ENET模組 設定
    IP:192.168.16.29 PORT:502
    模組:Multi-Server
    Modbus PORT:502 SN-1不勾選
    通訊速率:19200
    ----------------------------------
    專案下的CP2通訊阜 設定
    類型:VS Computer link slave
    速率:19200
    站號:0
    ----------------------------------
    使用Modbus Poll_
    Connection 設定
    模式:Modbus TCP/IP
    IP:192.168.16.29 PORT:502
    Slave ID:0
    Function:03 Read Holding Registers(4x)
    Adress mode:Dec
    Adress 7000 plc address:47001

    使用Modbus poll可直接在欄位中修改數值寫入PLC暫存區
    但為何無法成功抓取到D7000的數值顯示,不曉得設定哪出了錯?希望可請你解惑,謝謝

    回覆刪除