移植Modbus到STM32F103(3):考慮可能的通訊錯誤,保證控制命令的可靠傳輸

由於各類緣由,傳輸過程當中總會出現各類異常。Modbus有LRC/CRC校驗,有響應返回,還有異常碼,對於傳輸中出現的異常有必定的發現能力。可是Modbus自己不進行糾錯,糾錯和重傳由開發者定義。開發

根據通訊的原理,在一條不可靠的信道上傳輸的任何協議都不可能作到徹底可靠。即便是一個比較可靠的協議,也會存在一些極端狀況,這些狀況一旦出現,會讓協議的糾錯機制徹底失效。對此咱們要當心謹慎,讓這些極端狀況出現的機率儘量小。原理

分析一下Modbus通訊協議可能出現的錯誤,發現主要有四個來源:程序

1)某個查詢/響應的協議幀錯誤,多是PDU錯誤,也多是ADU錯誤,對於ASCII模式,還有多是引導符和結束符錯誤;通信

2)某個查詢/響應丟失,或者沒在約定時間內送達,致使超時;數據

3)主機發出了錯誤的查詢,如對不存在的寄存器進行讀/寫;協議

4)某個查詢/響應的協議PDU傳輸錯誤,並且錯誤的PDU是合法的,剛好LRC/CRC也發生錯誤,協議幀沒有報錯,致使錯誤的查詢/響應被接收。這種狀況的機率比較低,但在噪音比較大的環境裏會出現。查詢

對這些異常狀況進行排列組合,獲得協議的可能狀態:異常

一、主機的查詢從機正確收到,並作出了正常響應,主機接收到正常響應。db

二、主機的查詢從機正確收到,並作出了正常響應,但從機返回的響應丟失或者被幹擾產生了幀錯誤,主機等待超時。開發者

三、(機率較低,這種狀況主機沒法糾錯)主機的查詢從機正確收到,並作出了正常響應,但從機返回的響應PDU傳輸錯誤,並且錯誤的PDU是合法的,剛好LRC/CRC同時發生了錯誤,協議幀沒有報錯,致使主機接收到了錯誤但合法的響應。

四、主機的查詢從機正確收到,可是從機發現命令沒法執行,返回異常響應,主機接收到包含異常碼的響應。

五、主機的查詢從機正確收到,可是從機發現命令沒法執行,返回異常響應,但響應丟失或者包含幀錯誤,主機等待超時。

六、(機率極低,這種狀況主機沒法糾錯,屬於極端狀況,不予考慮)主機的查詢從機正確收到,可是從機發現命令沒法執行,返回異常響應,但從機返回的響應PDU傳輸錯誤,剛好LRC/CRC同時發生了錯誤,協議幀沒有報錯,致使主機接收到了錯誤但合法的響應。

七、主機的查詢從機沒有收到,或從機發現收到的查詢包含幀錯誤,從而不進行響應,主機等待超時。

八、(機率較低,但有可能致使從機執行錯誤的命令,對關鍵命令,須要當心這種狀況的發生)主機的查詢PDU傳輸錯誤,並且錯誤的PDU是合法的,剛好LRC/CRC同時發生了錯誤,協議幀沒有報錯,致使從機接收了錯誤的命令。從機返回了響應,主機接收到響應,發現響應是錯誤的。

九、(機率極低,但有可能致使從機執行錯誤的命令,對關鍵命令,須要當心這種狀況的發生)主機的查詢PDU傳輸錯誤,並且錯誤的PDU是合法的,剛好LRC/CRC同時發生了錯誤,協議幀沒有報錯,致使從機接收了錯誤的命令。從機返回了響應,但從機返回的響應丟失或者被幹擾產生了幀錯誤,主機等待超時。

十、(機率極低,這種狀況主機沒法糾錯,屬於極端狀況,不予考慮)主機的查詢PDU傳輸錯誤,並且錯誤的PDU是合法的,剛好LRC/CRC同時發生了錯誤,協議幀沒有報錯,致使從機接收了錯誤的命令。從機返回了響應,但從機返回的響應PDU傳輸錯誤,並且錯誤的PDU是合法的,剛好LRC/CRC同時發生了錯誤,協議幀沒有報錯,致使主機接收到了「正確」的響應。

考慮對這些狀況進行處理:

    狀況1是正常通訊,狀況4是主機的問題,這裏不考慮;

    狀況6和10出現的機率極低,並且很難糾錯,這裏也不考慮。

    狀況3出現的機率較低,但若是出現的話很難糾錯。因此若是從機的響應結果很重要,最好屢次重複查詢,確保結果的準確。固然這屬於主機端的事情,因此這裏也很少說。

    狀況二、五、七、9從機響應超時,狀況8從機響應錯誤,這幾種狀況主機都能發現錯誤,因此若是給主機增長重傳機制,就能夠提升這幾種狀況下的可靠性。但若是主機發送的是關鍵的控制命令,好比高壓脈衝的開關,剎車系統的啓動,這些命令若是傳輸錯誤,可能帶來沒法挽回的損失。這些關鍵的控制命令,須要準確的送達,光靠主機的出錯重傳沒法保證其可靠性。要提升這些命令傳輸的可靠性,必須對從機程序進行修改。

TCP/IP協議是一個經典的可靠協議,其三次握手四次揮手和給數據段進行編號的機制廣負盛名。這些機制,經過損失有限的速度,便可極大地提升可靠性。

控制命令在Modbus協議裏的傳輸,也能夠採用相似的機制。好比,採用寫寄存器功能碼+控制寄存器地址+執行計數的格式傳輸控制命令,而不用寫寄存器功能碼+控制寄存器地址+固定控制代碼的格式。從機端和主機端分別對控制命令的執行次數計數,只有從機發現本身的計數器等於收到的執行計數-1時,纔會執行,不然返回異常碼0x03。主機收到異常後響應後,查詢從機的計數器。若是主機以前已經發過這個命令,此次是由於錯誤或超時重傳的,且從機的計數器等於於主機的計數器,說明從機已經執行過該命令了,主機結束這一次控制。若是從機的計數不等於主機的計數器或者主機的計數器-1,說明從機或主機可能發生了故障,這時能夠經過寫從機裏的另外一個寄存器來更新從機的計數器。

相關文章
相關標籤/搜索