有人云調試
- 調試過程
- 問題
- 1. 關于modbus rtu協議,實質上有三種
- modbus基本原理
- modbus 格式
- 2. 關于modbus crc16通信校驗
- 3. 關于在ubuntu阿里云服務器端,監聽網絡數據之調試mNetAssist
之前的一個項目,再拿出來回顧下。
調試過程
-
先 要在有人云,用手機號注冊一個服務賬號,官網顯示目前只支持手機號注冊。
-
再添加一個網關,一般的設備而言,選擇不添加SN方式。設置好后,會自動生成一個賬號和密碼
這個是要配置到設備的GM5端的。 -
添加設備
點擊【設備管理】—【設備列表】—【添加設備】,其他的設置都是比較簡單的,詳細可以參考官方文檔。這里重點說下,關聯設備模板,這個也是自己不是很理解的點。 --> 此步官方文檔說是為設備配置變量,添加點表。其表述如下:設備模板,它具備批量管理設備的通訊協議、采集方式、變量(點表)采集規則的能力。這里主要指的是modbusRTU標準的協議。所以得對這個協議了解下,詳見問題部分。
這里要注意,設置 寄存器時的問題,和組態軟件是一樣的,都要將要設置的值+1。也就是實際協議用到值是減1,如讀寄存器功能碼為03,但要設置成04 ,起始地址為00,就要設置成01。 -
設置GM5模塊,通過程序來實現的話,主要就是設置這些選項
#define AT_HEART "AT+HEARTEN=ON"
#define AT_HEARTP "AT+HEARTTP=COM"
#define AT_HEARTDT "AT+HEARTDT=773467"//w4g
#define AT_HEARTTM "AT+HEARTTM=30" //heart set#define AT_REG "AT+REGEN=ON"
#define AT_REGTP "AT+REGTP=CLOUD"
#define AT_CLOUD "AT+CLOUD=00052025000000000001,ZLEc9aUg"
問題
1. 關于modbus rtu協議,實質上有三種
Modbus RTU(Remote Terminal Unit 遠程終端單元):這種方式常采用RS-485做為物理層,一般利用芯片的串口實現數據報文的收發,報文數據采用二進制數據進行通信。
Modbus ASCII :報文使用 ASCII 字符。ASCII 格式使用縱向冗余校驗和。Modbus ASCII 報文由冒號 (“:”)開始 和換行符 (CR/LF) 結尾構成。
Modbus TCP,上面兩種支持串口,而Modbus TCP是最近開發的協議擴展,允許Modbus協議通過TCP / IP網絡傳輸。 通過網絡進行通信的固有延遲和其他方面,需要對如何保持請求和響應彼此同步進行一些修改,并確保不從從設備接收錯誤數據。
與Modbus RTU相比,Modbus TCP在PDU的包裝方式上有所不同。 包含PDU的TCP幀以2字節的MODBUS應用協議(MBAP)事務標識符開始,而不是從ID。 當TCP層處理該功能時,也不需要CRC執行錯誤檢查。
參照人家的寫的,多熟悉下。
modbus基本原理
由于要進行通信,所以要有傳輸數據的存儲區,線圈,表示的是位,而寄存器,表示的占16個位,數據,也就是說表示的是最小單位,至于為什么叫這些名字,主要是modbus最初就是為了解決電線多了之后亂的問題。
存儲區的范圍:5位標準地址(也有擴展到6位的),Y XXXX//第一位表示哪個存儲區,后面4位表示地址,表示類型的位,沒有2,這個是規定好的。也沒有0000這個地址,而是從0001開始
線圈寄存器(Coil Register)(輸出線圈)bool、00001 - 09999、可讀可寫
離散輸入寄存器(Discrete Input Register)(輸入線圈)bool、10001 - 19999、只讀
輸入寄存器(Input Register)16位值、30001 - 39999、只讀
保持寄存器(Holding Register)(輸出寄存器)16位值、40001 - 49999、可讀可寫
存儲區的概念僅是為了人與人之間交流,理解之用,實際協議使用的是后面的地址,因為前面根據功能碼可以判斷出讀、寫的類型。
關于功能碼編碼問題:有兩種類型數據 寄存器和線圈 + 兩種操作 可讀可寫 + 寫兩種方式 一次是單個還是多個,也就是說總共有6種組合。讀輸出線圈 01 讀輸入線圈 02 讀輸出寄存器 03 讀輸入寄存器 04 寫單個線圈 05 寫單個寄存器06
寫多個輸出線圈 15 寫多個輸出寄存器 16(十進制表示)
modbus 格式
modbus主要采用主請求,從應答的方式,也就是主機要數據,其數據結構都是:
- 地址:1個字節 ,取值范圍是0-247,如果是0,就是主站廣播報文;如果是1-247,則有可能是主站請求或者從站應答。
- 功能碼:1個字節,也就是報文命令,代表主站對從站的操作,讀或者寫
- 數據:0~ 252個字節,數據字段,主請求報文,從應答報文會有所差異。也就是說假設抓取總線報文,如何區分是主站請求還是從站應答,則需要通過數據字段進行區分了。
- CRC校驗:2 個字節 采樣CRC16,16位循環冗余校驗。
基本的讀取通信流程: 主機發送,寫其是一樣的
第1 字節ARD : 從機地址碼(=001~254)
第 2 字節03H : 讀寄存器值功能碼
第3、4 字節 : 要讀的寄存器開始地址
第5、6 字節 : 要讀的寄存器數量
第7、8 字節 : 從字節1 到6 的CRC16 校驗和
從機應答:
第1 字節ARD : 從機地址碼(=001~254)
第2 字節03H : 返回讀功能碼
第3 字節 : 字節總數,字節計數
第4~7 字節 : 寄存器數據
第8、9 字節 : 從字節1 到7 的CRC16 校驗和
2. 關于modbus crc16通信校驗
/***********************CRC查表法校驗*************************/// CRC 高位字節值表
unsigned char code auchCRCHi[260] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0