大多是用在通訊,因為要轉成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
示範影片:
陳大好 關於暫存區的數值一事想請教
回覆刪除關於使用豐煒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的數值顯示,不曉得設定哪出了錯?希望可請你解惑,謝謝