設(shè)備清單:
1、高精度溫濕度傳感器變送器工業(yè)級RS485 sht20探頭 x1個,某寶 27元
2、工業(yè)級usb轉(zhuǎn)rs485通訊模塊雙向半雙工串口線轉(zhuǎn)換器 x1個,某寶 11元
3、調(diào)試工具--串口調(diào)試工具或modbus調(diào)試轉(zhuǎn)手(推薦:USR-TCP232-Test-V1.3或MODBUS調(diào)試助手)
接線方式:
探頭A(黃色)-------轉(zhuǎn)換器A
探頭B(白色)-------轉(zhuǎn)換器B
探頭正極(紅色)-----轉(zhuǎn)換器+5V
探頭負極(黑色)-----轉(zhuǎn)換器 GND
AUTO是這個探頭支持得普通協(xié)議。自報
產(chǎn)品所用功能碼:
0x03:讀保持寄存器
0x04: 讀輸入寄存器
0x06:寫單個保持寄存器
0x10:寫多個保持寄存器
寄存器類型 | 寄存器地址 | 數(shù)據(jù)內(nèi)容 | 字節(jié)數(shù) |
輸入寄存器 | 0x0001 | 溫度值 | 2 |
0x0002 | 濕度值 | 2 | |
保持寄存器 | 0x0101 | 設(shè)備地址 (1~247) | 2 |
0x0102 | 波特率 0:9600 1:14400 2:19200 | 2 | |
0x0103 | 溫度修正值(/10) -10.0~10.0 | 2 | |
0x0104 | 濕度修正值(/10) -10.0~10.0 | 2 |
Modbus通訊格式:
主機發(fā)送數(shù)據(jù)幀:
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器數(shù)量 高字節(jié) | 寄存器數(shù)量 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
從機響應數(shù)據(jù)幀:
從機地址 | 響應功能碼 | 字節(jié)數(shù) | 寄存器1數(shù)據(jù) 高字節(jié) | 寄存器1數(shù)據(jù) 低字節(jié) | 寄存器N數(shù)據(jù) 高字節(jié) | 寄存器N數(shù)據(jù) 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
MODBUS命令幀主機讀取溫度命令幀(0x04):
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器數(shù)量 高字節(jié) | 寄存器數(shù)量 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x04 | 0x00 | 0x01 | 0x00 | 0x01 | 0x60 | 0x0a |
從機響應數(shù)據(jù)幀:
從機地址 | 功能碼 | 字節(jié)數(shù) | 溫度 高字節(jié) | 溫度 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x04 | 0x02 | 0x01 | 0x31 | 0x79 | 0x74 |
溫度值=0x131,轉(zhuǎn)換成十進制305,實際溫度值 = 305 / 10 = 30.5℃
注:溫度是有符號16進制數(shù),溫度值=0xFF33,轉(zhuǎn)換成十進制 -205,實際溫度= -20.5℃;
主機讀取濕度命令幀(0x04):
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器數(shù)量 高字節(jié) | 寄存器數(shù)量 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x04 | 0x00 | 0x02 | 0x00 | 0x01 | 0x90 | 0x0A |
從機響應數(shù)據(jù)幀:
從機地址 | 功能碼 | 字節(jié)數(shù) | 濕度 高字節(jié) | 濕度 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x04 | 0x02 | 0x02 | 0x22 | 0xD1 | 0xBA |
濕度值=0x222,轉(zhuǎn)換成十進制546,實際濕度值=546 / 10 = 54.6%;
連續(xù)讀取溫濕度命令幀(0x04):
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器數(shù)量 高字節(jié) | 寄存器數(shù)量 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x04 | 0x00 | 0x01 | 0x00 | 0x02 | 0x20 | 0x0B |
從機響應數(shù)據(jù)幀:
從機地址 | 功能碼 | 字節(jié)數(shù) | 溫度 高字節(jié) | 溫度 低字節(jié) | 濕度 高字節(jié) | 濕度 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x04 | 0x04 | 0x01 | 0x31 | 0x02 | 0x22 | 0x2A | 0xCE |
讀取保持寄存器得內(nèi)容(0x03):
以讀取從機地址為例:
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器數(shù)量 高字節(jié) | 寄存器數(shù)量 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x03 | 0x01 | 0x01 | 0x00 | 0x01 | 0xD4 | 0x36 |
從機響應幀:
從機地址 | 功能碼 | 字節(jié)數(shù) | 從機地址 高字節(jié) | 從機地址 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x03 | 0x02 | 0x00 | 0x01 | 0x30 | 0x18 |
修改保持寄存器得內(nèi)容(0x06):
以修改從機地址為例:
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器值 高字節(jié) | 寄存器值 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x06 | 0x01 | 0x01 | 0x00 | 0x08 | 0xD8 | 0x30 |
修改從機地址:0x08 = 8
從機響應幀(與發(fā)送相同):
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器值 高字節(jié) | 寄存器值 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x06 | 0x01 | 0x01 | 0x00 | 0x08 | 0xD4 | 0x0F |
連續(xù)修改保持寄存器(0x10):
從機地址 | 功能碼 | 起始地址 高字節(jié) | 起始地址 低字節(jié) | 寄存器數(shù)量 高字節(jié) | 寄存器數(shù)量 低字節(jié) | 字節(jié)數(shù) | 寄存器1高字節(jié) | 寄存器1低字節(jié) | 寄存器2高字節(jié) | 寄存器2低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x10 | 0x01 | 0x01 | 0x00 | 0x02 | 0x04 | 0x00 | 0x20 | 0x25 | 0x80 | 0x25 | 0x09 |
修改從機地址:0x20 = 32
波特率:0x2580 = 9600
從機響應幀:
從機地址 | 功能碼 | 寄存器地址 高字節(jié) | 寄存器地址 低字節(jié) | 寄存器數(shù)量 高字節(jié) | 寄存器數(shù)量 低字節(jié) | CRC 高字節(jié) | CRC 低字節(jié) |
0x01 | 0x10 | 0x00 | 0x11 | 0x00 | 0x04 | 0xD4 | 0x0F |
普通版本協(xié)議
波特率默認9600(用戶可自行設(shè)定),8位數(shù)據(jù),1位停止,無校驗
RS485通信
串口命令 | 說明 |
READ | 觸發(fā)一次溫濕度上報 (27.4℃,67.7% 溫度27.4℃濕度67.7%) |
AUTO | 啟動溫濕度自動上報功能 (同上) |
STOP | 停止溫濕度自動上報功能 |
BR:XXXX | 設(shè)置波特率 9600~19200 (BR:9600 波特率為9600) |
TC:XX.X | 設(shè)置溫度校準 (-10.0~10.0) (TC:02.0溫度修正值為2.0℃) |
HC:XX.X | 設(shè)置濕度校準 (-10.0~10.0) (HC:-05.1 濕度修正值為 -5.1%) |
HZ:XXX | 設(shè)置溫濕度上報速率 (0.5,1,2,5,10) (HZ:2 自動上報速率 2Hz) |
PARAM | 讀取系統(tǒng)當前設(shè)置 |
PARAM指令:
TC:0.0,HC:0.0,BR:9600,HZ:1 ->溫度修正值0.0濕度修正值0.0波特率9600上報速率 1Hz
SLAVE_ADD:1 ->MODBUS從機地址 0x01
具體操作之前,先普及幾個名詞:
用到modbus協(xié)議,本質(zhì)上很簡單,只是第壹次接觸,被這些詞語搞得云里霧里得。這里整理一下,方便以后查詢:
0x01: 讀線圈寄存器
0x02: 讀離散輸入寄存器
0x03: 讀保持寄存器
0x04: 讀輸入寄存器
0x05: 寫單個線圈寄存器
0x06: 寫單個保持寄存器
0x0f: 寫多個線圈寄存器
0x10: 寫多個保持寄存器
如上所示一共8種功能碼。這其中有涉及到線圈、離散輸入、保持、輸入四種寄存器。
線圈寄存器:實際上就可以類比為開關(guān)量(繼電器狀態(tài)),每一個bit對應一個信號得開關(guān)狀態(tài)。所以一個byte就可以同時控制8路得信號。比如控制外部8路io得高低。 線圈寄存器支持讀也支持寫,寫在功能碼里面又分為寫單個線圈寄存器和寫多個線圈寄存器。對應上面得功能碼也就是:0x01 0x05 0x0f
離散輸入寄存器:如果線圈寄存器理解了這個自然也明白了。離散輸入寄存器就相當于線圈寄存器得只讀模式,他也是每個bit表示一個開關(guān)量,而他得開關(guān)量只能讀取輸入得開關(guān)信號,是不能夠?qū)懙谩1热珥易x取外部按鍵得按下還是松開。所以功能碼也簡單就一個讀得 0x02
保持寄存器:這個寄存器得單位不再是bit而是兩個byte,也就是可以存放具體得數(shù)據(jù)量得,并且是可讀寫得。一般對應參數(shù)設(shè)置,比如硪硪設(shè)置時間年月日,不但可以寫也可以讀出來現(xiàn)在得時間。寫也分為單個寫和多個寫,所以功能碼有對應得三個:0x03 0x06 0x10
輸入寄存器:這個和保持寄存器類似,但是也是只支持讀而不能寫,一般是讀取各種實時數(shù)據(jù)。一個寄存器也是占據(jù)兩個byte得空間。類比硪硪通過讀取輸入寄存器獲取現(xiàn)在得AD采集值。對應得功能碼也就一個 0x04
使用操作過程說明:
注:寄存器地址是十進制格式,任意指令是十六進制格式。