Modbus通訊協議簡單介紹
二、Modbus的通訊方式
如何理解Modbus協議是一種單主/多從的通信協議?
Modbus通訊總是由主設備發起,當從設備沒有收到來自主設備的請求時,不會主動發送數據。從設備之間不能相互通信,主設備同時只能啟動一個Modbus訪問事務處理。
主設備可以採用兩種方式向從設備發送Modbus請求報文,即主設備可以對指定的單個設備或者線路上所有的從設備發送請求報文,而從設備只能被動接收請求報文後給出響應報文即應答。
下列狀態圖描述了在伺服器側MODBUS事務處理的一般處理過程。
這兩種模式如下:
1)單播模式:主設備僅僅定址單個從設備。從設備接收到並處理請求之後,向主設備返回一個響應報文,即應答。在這種模式下,一個Modbus事務處理包含兩個報文,一個是主設備的請求報文,一個是從設備的響應報文。
每個從設備必須有唯一的地址(地址範圍1-247),這樣才能區別於其他從設備從而可以獨立被定址,而主設備不佔用地址。
2)廣播模式:此種模式下,主設備可以向所有的從設備發送請求指令。而從設備在接受到廣播指令後,僅僅進行相關指令的事務處理而不要求返回應答。基於此廣播模式下,請求指令必須是Modbus標準功能中的寫指令。根據Modbus標準協議的要求,所有從設備必須接受廣播模式下的寫指令,且地址0被保留用來識別廣播通信。
如何理解Modbus協議是一個請求/應答協議?
1)請求
主設備發送的請求報文主要包括從設備地址(或者廣播地址0)、功能碼、傳輸的數據以及差錯檢測欄位。
查詢消息中的功能碼告之被選中的從設備要執行何種功能、數據段包含了從設備要執行功能的任何附加信息。例如功能代碼03要求從設備讀保持寄存器並返回其內容。
數據段必須包含要告之從設備的信息,從何寄存器開始讀取及讀取的寄存器數量。差錯檢測域為從設備提供了一種驗證消息內容是否正確的方法。
2)應答
從設備的應答報文包括地址,功能嗎,差錯檢測域等。如果從設備產生一個正常的回應,則在回應消息中的功能代碼時查詢消息的功能代碼的回應。數據段包括了從設備收集的數據如寄存器或狀態。如果有錯誤發生,功能代碼將被修改以用於指出回應消息是錯誤的,同時數據段包含了描述此錯誤信息的代碼。差錯檢測域允許主設備確認消息內容是否可用。
例如,客戶機能夠讀一組離散量輸出或輸入的開/關狀態,或者客戶機能夠讀/寫一組寄存器的數據內容。
當伺服器對客戶機響應時,它使用功能碼域來指示正常(無差錯)響應或者出現某種差錯(稱為異常響應)。對於一個正常響應來說,伺服器僅對原始功能碼響應。
如下圖為MODBUS事務處理(無差錯)
對於異常響應,伺服器返回一個原始功能碼等同的碼,設置該原始功能碼的最高有效位為邏輯1
三、Modbus串列消息幀格式
Modbus ASCII或RTU模式僅適用於標準的Modbus協議串列網路,它定義了這些網路上連續傳輸的消息端的每一個位元組,以及決定怎樣將信息打包成消息域和如何解碼等功能。
ModBus通訊協議分為RTU協議和ASCII協議,下面就ModBus RTU協議簡要介紹如下:
這裡兩個縮略詞以前不知道,但是現在要明白指的是什麼,「ADU」「PDU」
ADU: 應用數據單元
PDU: 協議數據單元
報文
一個報文就是一幀數據,一個數據幀就一個報文: 指的是一串完整的指令數據,就像上面的一串數據。
1)所謂地址域,指的就是Modbus通許幀中的地址欄位,其內容為從設備地址。
Modbus消息幀的地址域包含2個字元(ASCII模式)或者1個位元組(RTU模式)。
2)功能碼在Modbus協議中用於表示消息幀的功能。
最常用功能碼:
下面「線圈」「寄存器」其實分別直的就是「位變數」「16位變數」
01 (0x01) 讀線圈
02 (0x02) 讀離散量輸入
03 (0x03) 讀保持寄存器
04(0x04) 讀輸入寄存器
05 (0x05) 寫單個線圈
06 (0x06) 寫單個寄存器
15 (0x0F) 寫多個線圈
16 (0x10) 寫多個寄存器
數據區:數據區包含需要從機執行什麼動作或由從機採集的返送信息。這些信息可以是數值、參考地址等等。例如,功能碼告訴從機讀取寄存器的值,則數據區必需包含要讀取寄存器的起始地址及讀取長度。對於不同的從機,地址和數據信息都不相同。
四、調試與實踐
我們的USB轉485模塊虛擬出的是COM5,波特率9600,無校驗位,數據位是8位,1位是停止位,設備地址假設為1.寫寄存器的時候,如果我們要把01寫到一個地址是0000的寄存器地址里,點一下「寫入」,就會出現發送指令:01 06 00 00 00 01 48 0A。
我們來分析一下這幀數據,其中01是設備地址,06是功能碼,代表寫寄存器這個功能,後面跟00 00表示的是要寫入寄存器的地址,00 01就是要寫入的數據,48 0A就是CRC校驗碼,這是軟體自動算出來了。而根據Modbus協議,當寫寄存器的時候,從機成功完成該指令的操作後,會把主機發送的指令直接返回,我們的調試精靈會接受到這樣一幀數據:01 06 00 00 00 01 48 0A。
假如我們現在要從寄存器地址0002開始讀取寄存器,並且讀取的數量是2個。點一下「讀出」,就會出現發送指令:01 03 00 02 00 02 65 CB。其中01是設備地址,03是功能碼,代表寫寄存器這個功能,00 02就是讀寄存器的起始地址,後一個00 02就是要讀取2個寄存器的數值,65 CB就是CRC校驗。而接收到的數據是:01 03 04 00 00 00 00 FA 33。其中01是設備地址,03是功能碼,04代表的是後邊讀到的數據位元組數是4個,00 00 00 00分別是地址為00 02和00 03的寄存器內部的數據,而FA 33就是CRC校驗了。


TAG:shareeyes |
※Siemens保護裝置Modbus通訊協議的配置注意事項及報文解析
※Ouroboros協議
※以太坊與Minds&Machines簽署協議
※資訊:科幻戰棋:《Obsidian Protocol-黑曜協議》
※Apple Music與唱片公司Ministry of Sound達成獨家協議
※Siemens MPI協議解析
※Cerveau Technologies, Inc.與日本東京都老人綜合研究所簽訂研究協議
※Inmarsat 和Addvalue簽協議 提供星座連續通信
※Facebook公布Rift S和Quest攝像頭隱私協議
※圖靈獎得主Sivio Micali的Algorand區塊鏈協議簡介
※Newbee教練借賬號直播玩《Artifact》違反協議被開除
※Blackstone牽頭財團與湯森路透簽署合作協議
※華為與Fraunhofer IIS簽署音頻專利協議
※睿思科技(Fresco Logic)推出創新的F-One多通訊協議信號聚合技術
※從微博motan看rpc基於netty4遠程通訊設計5-協議編解碼與序列化
※OpenFlow協議學習
※睿思科技(Fresco Logic)推出創新的F-One?多通訊協議信號聚合技術
※使用Wireshark詳解TCP協議
※關於NVMe over Fabric協議和IO流程
※代理協議Proxy protocol