中國國家標準委員會2004年正式把Modbus作為了國家標準,所以儀器的通訊基本都是用Modbus協議, Modbus RTU(遠端 終端裝置,16進位制字元)和Modbus ASCII(文字命令)主要用於序列通訊領域,而ModbusTCP則常用於乙太網通訊。
Modbus RTU 的格式是 : 地址位 功能程式碼 8位資料 CRC校驗碼
由於電磁干擾(Electromagnetic Interference )會導致儀表通訊受到干擾,而出現通訊錯誤,所以需要一個機制來確認這個資料包是否完整的資料還是被幹擾改變的資料. 最常用的是CRC校驗, 還有和校驗.
CRC即迴圈冗餘校驗碼(Cyclic Redundancy Check),儀表通訊用的是CRC16 ModBus, 多項式值0x8005
我們舉個例子
01-03-40-02-00-01 這個資料加上CRC碼就是01-03-40-02-00-01-30-0A
程式碼裡的0xA0001和0x8005多項式的關係,看一下2個二進位制
0x8005=1000 0000 0000 0101
0xA001=1010 0000 0000 0001
對比兩個二進位制高低位正好是完全相反的,CRC校驗分為正向校驗與反向校驗。
正向校驗高位在左,反向校驗低位在左
正向校驗使用左移位,反向校驗使用右移位
和校驗,通常用於對通訊要求不高的情況, 因為和校驗只有1位,根據儀器不同,有的和校驗只包括資料位;有的則包括功能位,地址位。
byte byteSum=0;for (int i = 0; i < bytes.Length; i++){ bytesWithSum[i] = bytes[i]; //有的儀表的和校驗,不是從0位開始的 if (i>=SumStartIndex) byteSum += bytes[i];}