串口通信數據校驗問題
Modbus協議最初由Modicon公司 開發出來,在1979年末該公司成為施耐德自動化(Schneider Automation)部門的一部分,現在Modbus已經是工業領域全球最流行的協議。此協議支持傳統的RS-232、RS-422、RS-485和以太網設備。許多工業設備,包括PLC,DCS,智能儀表等都在使用Modbus協議作為他們之間的通訊標準。有了它,不同廠商生產的控制設備可以連成工業網絡,進行集中監控。
當在網絡上通信時,Modbus協議決定了每個控制器須要知道它們的設備地址,識別按地址發來的消 息,決定要產生何種行動。如果需要回應,控制器將生成應答并使用Modbus協議發送給詢問方。
Modbus協議包括ASCII、RTU、TCP等,并沒有規定物理層。此協議定義了控制器能夠認識 和使用的消息結構,而不管它們是經過何種網絡進行通信的。標準的Modicon控制器使用RS232C實現串行的Modbus。Modbus的ASCII、RTU協議規定了消息、數據的結構、命令和就答的方式,數據通訊采用Maser/Slave方式,Master端發出數據請求消息,Slave端接收到正確消息后就可以發送數據到Master端以響應請求;Master端也可以直接發消息修改Slave端的數據,實現雙向讀寫。
Modbus協議需要對數據進行校驗,串行協議中除有奇偶校驗外,ASCII模式采用LRC校驗,RTU模 式采用16位CRC校驗,但TCP模式沒有額外規定校驗,因為TCP協議是一個面向連接的可靠協議。另外,Modbus采用主從方式定時收發數據,在實際使用中如果 某Slave站點斷開后(如故障 或關機),Master端可以診 斷出來,而當故障修復后,網絡又可自動接通。因此,Modbus協議的可靠性較好。
下面我來簡單的給大家介紹一下,對于Modbus的ASCII、RTU和TCP協議來說,其中TCP和RTU協議非常類似,我們只要把RTU協議的兩個字節的校驗碼去掉,然后在RTU協議的開始加上5個0和一個6并通過TCP/IP網絡協議發送出去即可。所以在這里我僅介紹一下Modbus的ASCII和RTU協議。
下表是ASCII協議和RTU協議進行的比較:
協議 | 開始標記 | 結束標記 | 校驗 | 傳輸效率 | 程序處理 |
ASCII | :(冒號) | CR,LF | LRC | 低 | 直觀,簡單,易調試 |
RTU | 無 | 無 | CRC | 高 | 不直觀,稍復雜 |
通過比較可以看到,ASCII協議和RTU協議相比擁有開始和結束標記,因此在進行程序處理時能更加方便,而且由于傳輸的都是可見的ASCII字符,所以進行調試時就更加的直觀,另外它的LRC校驗也比較容易。但是因為它傳輸的都是可見的ASCII字符,RTU傳輸的數據每一個字節ASCII都 要用兩個字節來傳輸,比如RTU傳輸一個十六進制數0xF9,ASCII就需要傳輸’F’’9’的ASCII碼0x39和0x46兩個字節,這樣它的傳輸的效率就比較低。所以一般來說,如果所需要傳 輸的數據量較小可以考慮使用ASCII協議,如果所 需傳輸的數據量比較大,最好能使用RTU協議。
下面對兩種協議的校驗進行一下介紹。
1、LRC校驗
LRC域是一個包含一個8位二進制值的 字節。LRC值由傳輸設備來計算并放到消息幀中,接 收設備在接收消息的過程中計算LRC,并將它和接收 到消息中LRC域中的值比較,如果兩值不等,說明有 錯誤。
LRC校驗比較簡單,它在ASCII協議中使 用,檢測了消息域中除開始的冒號及結束的回車換行號外的內容。它僅僅是把每一個需要傳輸的數據按字節疊加后取反加1即可。下面是它的VC代碼:
BYTE GetCheckCode(const char * pSendBuf, int nEnd)//獲得校驗碼
{
BYTE byLrc = 0;
char pBuf[4];
int nData = 0;
for(i=1; i
{
// 每兩個需要發送的ASCII碼轉化為一個十六進制數
pBuf [0] = pSendBuf [i];
pBuf [1] = pSendBuf [i+1];
pBuf [2] = 主站蜘蛛池模板: 阿坝县| 墨玉县| 安仁县| 牡丹江市| 北京市| 城口县| 陈巴尔虎旗| 阳曲县| 滨海县| 买车| 大连市| 崇仁县| 东阿县| 自治县| 太原市| 社会| 芮城县| 北票市| 高雄县| 和龙市| 古蔺县| 丹棱县| 根河市| 潢川县| 长宁县| 诸暨市| 如东县| 凤山市| 汤阴县| 澎湖县| 黔西县| 集贤县| 山丹县| 东明县| 丰台区| 福清市| 茶陵县| 长海县| 诸城市| 防城港市| 清涧县|