
首先我們要清楚:Modbus是一種串行鏈路上的主從協議,在通信線路上只能有一個主機存在,不會有多主機存在的情況。雖然主機只有一個,但是從機是可以有多個的。
(相關資料圖)
Modbus的通信過程都是由主機發起的,從機在接收到主機的請求后再進行響應,從機不會主動進行數據的發送。并且從機之間也不會互相發送數據。
Modbus中的每個從機為了能在通信時被主機識別,都會有一個地址,也稱為從節點地址。
從節點地址對從設備而言必須是唯一的,在總線上也只能有唯一的一個設備地址,即從機設備的地址在總線上也不能沖突。
從機是有唯一的設備地址的,而主機本身是沒有地址的。
Modbus支持的尋址空間為256個,如下:
從上圖中可以看到,給子節點使用的地址范圍是1 ~ 247,248 ~255是被保留著的。非常重要的一點,0是廣播地址,所有的子節點都必須要能夠識別廣播地址。
Modbus的通信模式有兩種:單播模式和廣播模式。
(1)單播模式
單播模式:主機要訪問某個子節點的時候,是通過子節點的地址進行的一對一的訪問方式。子節點在收到主節點發過來的請求以后,根據請求的類型完成相應處理后,子節點會向主節點返回一個報文,也就是我們常說的“應答”。示意圖如下:
從上圖中是可以看到的:主節點通過發送請求命令到從節點,從節點會從總線上接收到來自主節點的請求,然后解析主節點的請求指令,根據指令完成相應的動作,然后再給主節點的請求作出一個回應,便完成了一次單播通信的過程。
其實大家應該也能看到:在單播模式下,一個Modbus的事務它包含了兩個報文,一個是由主機主動發出的“請求”報文,另一個是由從機返回的“應答”報文。
并且主機能準備訪問到某個從機是通過從機的唯一地址實現的,從機識別主機發出的指令是否是發送到自己這邊的,也是通過從機的唯一地址進行甄別的。
(2)廣播模式
廣播模式是主機用于向總線上的所有的從機發送請求的指令。
主機的廣播指令一般都是用于寫命令的,對于來自于主機的廣播指令,從機是不需要進行應答的。廣播模式的示意圖如下:
從圖中可以看出,廣播模式時單向的,主機發送出廣播指令,而從機不再對廣播指令進行應答,數據流只在一個方向上流動。
注意:總線上所有的從機都必須要能夠識別主機的廣播指令,并且地址0是用于廣播的,不能作為從機的地址。
既然Modbus是主從機的通信模式,那么在通信過程中就需要清楚主從機之間的狀態,通過狀態去理解Modbus的通信流程。
(1)主機的狀態特征
如下圖:
根據上圖可以分析得到主機的通信過程的一些信息:
1)"空閑" = 無等待的請求。 這一般是在初始上電之后所處的狀態。 主機只有在"空閑"狀態才能發送請求。發送一個請求后,主機會離開"空閑"狀態, 進入“忙”的狀態,此時不能再發送其他的請求。
2)當單播請求發送到一個從機上,主機將進入"等待應答" 狀態, 同時一個臨界超時定時計數器會啟動。這個超時稱為 "響應超時"。 它避免主節點永遠處于"等待應答" 狀態。 響應超時的時間依賴于實際的應用場景。
3)當收到一個應答時,主節點在處理數據之前檢驗應答。在某些情況下,檢驗的結果可能為錯誤。如收到來自非期望的子節點的應答,或接收的幀錯誤,響應超時繼續計時;當檢測到幀錯時,可以執行一個重試。
4)響應超時但沒有收到應答時,則產生一個錯誤。那么主節點會重新進入”空閑” 狀態, 并發出一個重試請求。重試的最大次數取決于主節點 的設置。
5)當廣播請求發送到串行總線上,沒有響應從子節點返回。然而主節點需要進行延遲以便使子節點在發送新的請求處理完當前請求。該延遲被稱作 "轉換延遲"。因此,主節點會在返回能夠發送另一個請求的“空閑”狀態之前,到" 等待轉換延遲"狀態。
6)在單播方式,響應超時必須設置到足夠的長度以使任何子節點都能處理完請求并返回響應。而廣播轉換延遲必須有足夠的長度以使任何子節點都能只處理完請求而可以接收新的請求。 因此,轉換延遲應該比響應超時要短。
幀錯誤常見的有:對每個字符的奇偶校驗、 對整個幀的冗余校驗。
(2)從機的狀態特征
如下圖:
從上圖中可以知道:
1)“空閑” = 沒有等待的請求。 這一般是初始上電后的狀態。
2)當收到一個請求時,子節點在處理請求中要求的動作前要先檢驗報文包。當檢測到錯誤時,必須向主節點發送應答告知錯誤。(錯誤包含:請求的格式錯誤、非法動作、非法的訪問地址......)。
3)當要求的動作完成后,單播報文要求必須按格式應答主節點。
4)如果子節點在接收到的幀中檢測到錯誤, 則沒有響應返回到主節點。
5)任何子節點均應該定義并管理 Modbus 診斷計數器以提供診斷信息。通過使用 Modbus 診斷功能碼,可以得到這些計數值。
最后再補充一個主從機的通信時序圖:
上面的時序圖中描述的就是上面所說的主從機狀態特征,對比來看就能看明白是什么意思了。
標簽: