天天看點

Modbus,看這個就行了

Modbus,看這個就行了

Modbus通信協定由Modicon公司(現在的施耐德電氣Schneider Electric)于1979年為可程式設計邏輯控制(即PLC)通信而發表。目前,Modbus已經成為工業領域通信協定的業界标準,并且現在是工業電子裝置之間常用的連接配接方式。Modbus作為目前工業領域應用最廣泛的協定,與其他通信協定相比,有以下特點:

Modbus協定标準開放、公開發表且無版權要求。

Modbus協定支援多種電氣接口,包括RS232、RS485、TCP/IP等,還可以在各種媒體上傳輸,如雙絞線、光纖、紅外、無線等。

Modbus協定消息幀格式簡單、緊湊、通俗易懂。

使用者了解和使用簡單,廠商容易開發和內建,友善形成工業控制網絡 Modbus協定是一種應用層封包傳輸協定,包括ASCII、RTU、TCP三種封包類型,協定本身并沒有定義實體層,隻是定義了控制器能夠認識和使用的消息結構。

Modbus協定使用序列槽傳輸時可以選擇RTU或ASCII模式,并規定了消息、資料結構、指令和應答方式并需要對資料進行校驗。

ASCII 模式采用LRC校驗,RTU模式采用16 位CRC校驗,通過以太網傳輸時使用TCP,這種模式不使用校驗,因為TCP協定是一個面向連接配接的可靠協定。

Modbus協定規定了4個存儲區,這裡以常用的5段長度進行說明,如下表所示:

Modbus,看這個就行了

 Modbus協定同時規定了二十幾種功能碼,但是常用的隻有8種,用于針對上述存儲區的讀寫,如下表所示:

Modbus,看這個就行了

工欲善其事,必先利其器,Modbus學習配合相關的調試軟體,可以達到事半功倍的效果。

Modbus學習必備的三大神器分别是Modbus Poll、Modbus Slave及VSPD,Modbus Poll軟體主要用于仿真Modbus主站或Modbus用戶端,Modbus Slave軟體主要用于仿真Modbus從站或Modbus伺服器,而VSPD全稱Configure Virtual Serial Port Driver,是用來給電腦建立虛拟序列槽使用的。

ModbusRTU與ModbusASCII在封包資料發送格式上幾乎一樣,但也存在一些差別,具體展現在:

1、ModbusASCII有開始字元(:)和結束字元(CR LF),可以作為一幀資料開始和結束的标志,而ModbusRTU沒有這樣的标志,需要用時間間隔來判斷一幀封包的開始和結束,協定規定的時間為3.5個字元周期,就是說一幀封包開始前,必須有大于3.5個字元周期的空閑時間,一幀封包結束後,也必須要有3.5個字元周期的空閑時間否則就會出現粘包的情況。

注意:針對3.5個字元周期,其實是一個具體時間,但是這個時間跟波特率相關。在序列槽通信中,1個字元包括1位起始位、8位資料位(一般情況)、1位校驗位(或者沒有)、1位停止位(一般情況下),是以1個字元包括11個位,那麼3.5個字元就是38.5個位,波特率表示的含義是每秒傳輸的二進制位的個位,是以如果是9600波特率,3.5個字元周期=1000/9600*38.5=4.01ms。

2、兩者校驗方式不同,ModbusRTU是CRC循環備援校驗,ModbusASCII是LCR縱向備援校驗。

3、在Modbus标準中,RTU是必須要求的,而ASCII是可選項,即作為一個Modbus通信裝置可以隻支援RTU,也可以同時支援RTU和ASCII,但不能隻支援ASCII。

下面針對具體封包進行分析,Modbus協定在串行鍊路上的封包格式如下所示:

Modbus,看這個就行了

發送封包格式如下:

Modbus,看這個就行了

發送封包含義:

讀取1号從站輸出線圈,起始位址為0x13=19,對應位址為00020,線圈數量為0x1B=27,即讀取1号從站輸出線圈,位址從00020-00046,共27個線圈的狀态值。

注意:協定中的起始位址指的是索引,後面的位址指的是具體位址,對于任意一個存儲區,索引都是從0開始的,但是對應的具體位址,與存儲區是相關的,比如輸出線圈,0對應00001;輸入線圈,0對應10001;輸入寄存器,0對應30001;保持寄存器,0對應40001。

傳回封包格式如下:

Modbus,看這個就行了

傳回封包含義:

傳回1号從站輸出線圈00020-00046,共27個線圈的狀态值,傳回位元組數為4個,分别為CD 6B B2 05。

CD=1100 1101 對應 00020-00027

6B=0110 1011 對應 00028-00035 

B2=1011 0010 對應 00036-00043

05=0000 0101 對應 00044-00046

Modbus,看這個就行了

讀取1号從站輸入線圈,起始位址為0xC4=196,對應位址為10197,線圈數量為0x1D=29,即讀取1号從站輸入線圈,位址從10197-10225,共29個線圈的狀态值。傳回封包格式如下:

Modbus,看這個就行了

傳回1号從站輸入線圈10197-10225,共29個線圈的狀态值,傳回位元組數為4個,分别為CD 6B B2 05。

CD=1100 1101 對應 10197-10204

6B=0110 1011 對應 10205-10212 

B2=1011 0010 對應 10213-10220

05=0000 0101 對應 10221-10225

Modbus,看這個就行了

讀取1号從站保持寄存器,起始位址為0x6B=107,對應位址為40108,寄存器數量為0x02=2,即讀取1号從站保持寄存器,位址從40108-40109,共2個寄存器的數值。傳回封包格式如下:

Modbus,看這個就行了

傳回1号從站保持寄存器40108-40109,共2個寄存器的數值,傳回位元組數為4個,分别為02 2B 01 06。

40108對應數值為0x022B,

40109對應數值為0x0106。

Modbus,看這個就行了

讀取1号從站輸入寄存器,起始位址為0x6B=107,對應位址為30108,寄存器數量為0x02=2,即讀取1号從站輸入寄存器,位址從30108-30109,共2個寄存器的數值。傳回封包格式如下:

Modbus,看這個就行了

傳回1号從站輸入寄存器30108-30109,共2個寄存器的數值,傳回位元組數為4個,分别為02 2B 01 06。

30108對應數值為0x022B,

30109對應數值為0x0106。

Modbus,看這個就行了

預置1号從站單個線圈的值,線圈位址為0x00AC=172,對應位址為00173,斷通标志0xFF00表示置位,0x0000表示複位,即置位1号從站輸出線圈00173。傳回封包格式如下:

Modbus,看這個就行了

預置單輸出線圈原封包傳回。

Modbus,看這個就行了

預置1号從站單個保持寄存器的值,寄存器位址為0x0087=135,對應位址為40136,寫入值為0x039E,即預置1号從站保持寄存器40136值為0x039E。

Modbus,看這個就行了

預置單保持寄存器原封包傳回。

發送封包格式如下:請忽略這張圖

Modbus,看這個就行了

預置1号從站多個線圈的值,線圈位址為0x0013=19,對應位址為00020,線圈數為0x0A=10,寫入值為0xCD00,即預置1号從站線圈00020-00027=0xCD=1100 1101,00028-00029=0x00=0000 0000。

Modbus,看這個就行了

預置多輸出線圈傳回封包是在原封包基礎上除去位元組數及具體位元組後傳回。

Modbus,看這個就行了

預置1号從站多個寄存器的值,寄存器位址為0x0087=135,起始位址為40136,寄存器數量為0x02=2,結束位址為40137,寫入值為0x0105和0x0A10,即預置1号從站寄存器40136=0x0105,40137=0x0A10。

Modbus,看這個就行了

回封包含義:

預置多保持寄存器傳回封包是在原封包基礎上除去位元組數及具體位元組後傳回。

繼續閱讀