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