如果要我形容Modbus:
就像是一個班級,有一個老師(Master),跟一群小學生(slave)
(只有一個Master端.其他slave端。)
上課當中,只有老師(Master)能說話,小學生(slave)不能主動說話,但是可以回應。
(資料的傳送都是由Master端開始,slave只是回應。)
老師可以傳給小學生資訊,也可以問小學生的狀況。
(Master可以送給slave資料,或是詢問slave的資料。)
小學生的名字太多,所以有座號。
(slave 都是以站號來區別。)
老師在教室裡講話,或是學生回話,不管老師或學生都聽得到。
(Master 或Slave 發話,每一站都聽得到。)
============================
Modbus傳送的內容
============================
如果是老師(PLC)問小學生1(站號=1)的身高(位址1000H=150)。
Modbus傳送內容:
PLC會發送: 站號 1 + 問 + 1000H + 1筆資料
站號1回覆: 站號1 + 問 + 1筆資料+ 150
-----------------
如果是要問1000H 跟1001H 兩筆資料:會變成
1000H的內容=150,1001H的內容=160
Modbus傳送內容:
PLC會發送: 站號 1 + 問 + #1000 + 2筆資料
站號1回覆: 站號1 + 問 + 2筆資料+ 150 + 160
注意: 在傳送時,需要再加上起始碼、結束碼、檢查碼,才是完整的發送資訊。
如下例:就是主站(Master)要問站號1的200H的連續兩筆資料。
問的功能碼是03
如果是寫入就比較單純:
=============
有基本認識後,開始介紹比較細部的內容:
1.Modbus的硬體:目前有RS422、RS485、Ethernet。
2.Modbus的硬體:傳送的資料格式(不是內容)
ASCII及RTU:
主要差別:如要表示數字0
ASCII的0=30H 最少需要7bit
RTU的0=0直接以16進制表示。只需要4bit(但不能傳非16進制內容0~9+A~F)
所以當一個封包在傳送時,相同是8bit的資料,
ASCII只能傳1個數字,而RTU可以傳送2個數字。
因應資料格式的不同,所以傳送內容也不同。
之前範例裡面有非數字內容(CR、LF、:),
RTU無法傳送,所以RTU有另一種格式,
相同的詢問範例,RTU的內容會變成以下。
可以發現,都是16進制可以表示的內容。
3.功能碼的種類:
常見的
讀取單筆、多筆都可以用03H
寫入單筆,用06H
寫入多筆資料,用10H
其他功能碼,需要考慮外部裝置是否可接受,就不介紹。
4.檢查碼
檢查碼的用意,就是確認傳輸過程,資料是否被干擾,變成不同的數字,
可以利用檢查碼,來檢查傳送的內容,是否被變動。
ASCII的檢查碼是用LRC(Longitudinal Redundancy Check)方式:
將所有位元組相加,捨去進位,然後取2的補數,即為 LRC 的演算法。
例:
以上圖的LRC結果:
7FH + 03H + 05H + C4H + 00H + 01H = 14CH,捨去進位1,只取 4CH。
4CH 取2的補數為:B4H。
RTU的檢查碼是用CRC(Cyclic redundancy check)方式:
STEP1:載入一個內容為 FFFFH 之 16-bits 暫存器,稱之為『CRC』暫存器。
STEP2:將命令訊息的第一個位元組與 16-bits CRC 暫存器的低位元組進行 Exclusive
OR 運算,並將結果存回 CRC 暫存器。
STEP3:檢查 CRC 暫存器的最低位元(LSB),若此位元為 0,則右移一位元;若此位元為 1,則 CRC 暫存器值右移一位元後,再與 A001H 進行 Exclusive OR 運算。
STEP4:回到步驟三,直到STEP3已被執行過 8 次,才進到STEP5。
STEP5:對命令訊息的下一個位元組重複STEP2到STEP4,直到所有位元組皆完全處理
過,此時 CRC 暫存器的內容即是 CRC 偵誤值。
請看維基百科。
註:有很多Modbus模組,會自動產生檢查碼,不一定要自已做。
5.通訊的位址怎麼查?
通訊的位址,就是我們主要讀取外部裝置的資料,
可以從各家裝置的手冊去查。
例1:台達A2伺服手冊
在參數表格的右方,就有通訊位址,
如果要讀P0-00韌體版本,就可以讀取0000H的位址,2筆資料。
如果是參數04-01就是0401H的位址
例3:安川變頻器 手冊
通訊的位址集中在2500H以後。
例4:OMRON E5EK溫控器(有RS485,但不是MODBUS格式)
格式有點像MODBUS,但功能碼,FCS方式都不同。
也有提供通訊的位址。
淺顯易懂,受益良多!
回覆刪除