MODBUS簡述

MODBUS簡述

Modbus是一種串行通信協議,是Modicon公司(現在的施耐德電氣Schneider Electric)於1979年爲使用可編程邏輯控制器(PLC)通信而發表。Modbus已經成爲工業領域通信協議的業界標準(De facto),並且現在是工業電子設備之間常用的連接方式。

Modbus可將不同廠商生產的控制設備可以連成工業網絡,進行集中監控,是一種通用工業標準。Modbus是一個master/slave架構的協議,有一個節點是master節點,其他使用Modbus協議參與通信的節點是slave節點,每一個slave設備都有一個唯一的地址。只有被指定爲master節點的節點可以啓動一個命令。所有的Modbus數據幀包含了校驗碼,保證傳輸的正確性。基本的ModBus命令能指令一個slave設備改變它的寄存器的某個值,控制或者讀取一個I/O端口,以及指揮設備回送一個或者多個其寄存器中的數據。

標準的Modbus口是使用一RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號位、傳輸波特率、奇偶校驗。也可以使用RS485甚至TCP傳輸!

RTU模式和ASCII模式

Modbus有兩種傳輸模式,RTU(Remote Terminal Unit)模式和ASCII模式。TRU模式下的數據幀是源數據,效率高,是最常用的傳輸方式,而ASCII模式的數據幀源數據的ASCII碼!在Modbus標準中,RTU是必須要求的,而ASCII是可選項,即作爲一個Modbus通信設備可以只支持RTU,也可以同時支持RTU和ASCII,但不能只支持ASCII。
RTU模式

RTU模式下的數據幀格式如下所示
起始位 設備地址 功能代碼 數據 CRC校驗 結束符
T1-T2-T3-T4 8Bit 8Bit n個8Bit 16Bit T1-T2-T3-T4

消息中的每個8Bit字節包含兩個4Bit的十六進制字符。這種方式的主要優點是:在同樣的波特率下,可比ASCII方式傳送更多的數據。但由於沒有起始位和結束位,協議要求消息幀的發送至少要有3.5個字符時間的停頓間隔!

8位二進制,十六進制數0...9,A...F
消息中的每個8位域都是兩個十六進制字符組成每個字節的位
1個起始位
8個數據位,最小的有效位先發送
1個奇偶校驗位,無校驗則無
1個停止位(有校驗時),2個Bit(無校驗時)
CRC(循環冗長檢測)

ASCII模式

ASCII模式下的數據幀格式如下所示,消息以冒號(:)字符(ASCII碼 3AH)開始,以回車換行符結束(ASCII碼 0DH,0AH)。
起始位 設備地址 功能代碼 數據 LRC校驗 結束符
1個字符 2個字符 2個字符 n個字符 2個字符 2個字符

消息中的每個8Bit字節都作爲兩個ASCII字符發送。這種方式的主要優點是字符發送的時間間隔最長可達到1秒而不產生錯誤。

十六進制,ASCII字符0...9,A...F(注意是大寫字符)
消息中的每個ASCII字符都是一個十六進制字符組成每個字節的位
1個起始位
7個數據位,最小的有效位先發送
1個奇偶校驗位,無校驗則無
1個停止位(有校驗時),2個Bit(無校驗時)
錯誤檢測域:LRC(縱向冗長檢測)

兩種模式數據格式的區別

發送同樣的源數據,RTU和ASCII的區別如下。
源數據 RTU模式 ASCII模式
0x45 0x45

0x34 0x35

比如要發送0xFFFE,RTU模式下是直接發送這個數據的二進制bit流,而ASCII模式是發送這個數據的十六進制的字符!
0XFFFE
F F F E
0X46 0X46 0X46 0X45

將一個數據轉換成ASCII(大寫字符)的代碼如下:
1
2

if(data < 10){data += '0';}
else {data += ('A'-10);}

校驗方法
CRC校驗

CRC即循環冗餘校驗(Cyclic Redundancy Check),是利用約定多項式對信道數據進行計算產生一定位數的校驗碼的一種信道編碼技術,被廣泛用於監測信道傳輸過程中是否誤碼。循環冗餘校驗碼包括n位信息碼和k位校驗碼。循環冗餘校驗碼的字長爲n+k,所以循環冗餘校驗碼又稱爲(n+k,n)碼。通常k位校驗位緊跟在n位數據位的後面。這裏的n位信息碼可以用一個多項式M(x)表示,它的最高次爲xn-1。此外還需要約定一個生成多項式G(x),G(x)表示的是一個長度位k+1的二進制碼,它的最高次爲xk。將M(x)乘以xk(相當於對信息碼進行左移k位),再除以生成多項式G(x),得到的長度爲k的二進制餘數就是校驗位。二進制的除法運算也是模2除法,其計算方法與邏輯異或一致,CRC碼的計算方法可以表示爲公式如下:
CRC = (M(x)·xk )⊕ G(x)
儘管理論上CRC校驗原理的生成多項式G(x)和校驗的數據長度n是任意的,但實際上,行業內規定了各種數據格式生成多項式的國際常用的CRC參數模型,其中MODBUS的多項式公式爲x^{16} + x^{15} + x^2 + 1,校驗碼長度爲16bit。

在使用中可以通過兩種方式對數據進行校驗,一種是直接計算法,另一種是查表法。如果內存不是非常有限,建議使用查表法。

關於CRC的更詳細的內容點這篇博文。進行CRC校驗計算工具點擊這裏。
LRC校驗

縱向冗餘校驗(Longitudinal Redundancy Check,簡稱:LRC)是通信中常用的一種校驗形式,也稱LRC校驗或縱向校驗。它是一種從縱向通道上的特定比特串產生校驗比特的錯誤檢測方法。

具體算法如下:
1、對需要校驗的數據(2n個字符)兩兩組成一個16進制的數值求和。
2、將求和結果與256求模。
3、用256減去所得模值得到校驗結果(另一種方法:將模值按位取反然後加1)。
例如16進制數據:01 A0 7C FF 02
(16進制計算)  求和:01 + A0 + 7C + FF + 02 = 21E  取模:21E % 100 = 1E  計算:100 - 1E = E2
(10進制計算)  求和:01 + 160 + 124 + 255 + 02 = 542  取模:542 % 256 = 30  計算:256 - 30 = 226

LRC校驗計算工具戳這裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章