Modbus-rtu協(xié)議入門講解 以及我司小主機兼容其他公司485設(shè)備的具體要求
1、字Word, 字節(jié)byte, 位bit
1Word=2byte(1個漢字=2個字節(jié),1個英文=1個字節(jié))
1byte=8bit二進制(位)(比特)位是數(shù)據(jù)存儲的最小單位
2、我司環(huán)境監(jiān)控主機兼容通訊協(xié)議的基本參數(shù):
編 碼 |
8位二進制 |
數(shù)據(jù)位 |
8位 |
奇偶校驗位 |
無 |
停止位 |
1位 |
錯誤校驗 |
CRC(冗余循環(huán)碼) |
波特率 |
2400bit/s、4800bit/s、9600 bit/s可設(shè),出廠默認為4800bit/s |
注意:
編碼8位二進制的解釋:業(yè)內(nèi)規(guī)定8位二進制(8bit)稱為一個字節(jié),二進制就是馮2進1,表示11111111,換算成10進制就是255,換算成16進制就是FF。故一個字節(jié)表示16進制的最大表示到FF。
8位數(shù)據(jù)位解釋如下:即485組網(wǎng)中,主站問詢以及設(shè)備應(yīng)答幀結(jié)構(gòu),每一幀數(shù)據(jù)都是1個字節(jié)為單位體現(xiàn)的,而一個字節(jié)就是一個二進制的8位。如下:
主機問詢幀結(jié)構(gòu):
地址碼 | 功能碼 | 寄存器起始地址 | 寄存器長度 | 校驗碼低位 | 校驗碼高位 |
1字節(jié) | 1字節(jié) | 2字節(jié) | 2字節(jié) | 1字節(jié) | 1字節(jié) |
從機應(yīng)答幀結(jié)構(gòu):
地址碼 | 功能碼 | 有效字節(jié)數(shù) | 數(shù)據(jù)一區(qū) | 第二數(shù)據(jù)區(qū) | 第N數(shù)據(jù)區(qū) | 校驗碼 |
1字節(jié) | 1字節(jié) | 1字節(jié) | 2字節(jié) | 2字節(jié) | 2字節(jié) | 2字節(jié) |
從上方表格中可以看出主站問詢及從站應(yīng)答幀結(jié)構(gòu)來看,都是以1個8位二進制即1個字節(jié)為單位傳送的。
數(shù)據(jù)區(qū):數(shù)據(jù)區(qū)是具體通訊數(shù)據(jù),注意16bits數(shù)據(jù)高字節(jié)在前!解釋如下:
再解釋何為高字節(jié)之前,需要了解所有幀結(jié)構(gòu)中的數(shù)值都是16進制的。
舉例說明一:
1、假設(shè)485設(shè)備起始地址為3,我司環(huán)境監(jiān)控主機作為485主站通過0x00 00號和0x00 01號寄存器讀取該485設(shè)備數(shù)據(jù)
主站問詢0x00 00號和0x00 01號寄存器值
地址碼 | 功能碼 | 起始地址 | 數(shù)據(jù)長度 | 校驗碼低位 | 校驗碼高位 |
0x03 | 0x03 | 0x00 0x00 | 0x00 0x02 | 0xC5 | 0xE9 |
從站應(yīng)答幀(例如讀到1號寄存器為65435,0號寄存器為658)
地址碼 | 功能碼 | 有效字節(jié)數(shù) | 0號寄存器值 | 1號寄存器值 | 校驗碼低位 | 校驗碼高位 |
0x03 | 0x03 | 0x04 | 0x02 0x92 | 0xFF 0x9B | 0x79 | 0xFD |
上方表格中,主站問詢了地址為3的485設(shè)備,3號功能碼中0號和1號寄存器;
485設(shè)備作出應(yīng)答,3號設(shè)備3號功能碼數(shù)據(jù)區(qū)應(yīng)答了4個有效字節(jié),數(shù)據(jù)區(qū)0號寄存器兩個字節(jié),數(shù)據(jù)區(qū)1號寄存器2個字節(jié);
從設(shè)備應(yīng)答幀可以看出,485設(shè)備每個數(shù)據(jù)區(qū)寄存器是存了個16位的數(shù)據(jù),即兩個字節(jié)的數(shù)據(jù),即16位二進制,1111111111111111,換算成10進制即是65535,也就是說每個寄存器最大存的10進制數(shù)是65535;
以數(shù)據(jù)區(qū)0號寄存器為例,應(yīng)答 02 92兩個字節(jié),02在前,92在后,02這個字節(jié)就是高字節(jié),帶標數(shù)值的高位(個十百千萬,萬是高位,數(shù)值寫在前方),即代表16進制的數(shù)值292,換算成10進制就是658。
若是低字節(jié)在前,就變成16進制的922了,換算成10進制就是2338
舉例說明二:
2、我司環(huán)境監(jiān)控主機讀取我司20wlux光照度的數(shù)據(jù),我司光照度設(shè)備只用到功能碼0x03(讀取寄存器數(shù)據(jù))。假設(shè)20Wlux光照度485地址為3,以下是我司光照度設(shè)備寄存器地址。
寄存器地址 |
PLC或組態(tài)地址 |
內(nèi)容 |
操作 |
0000 H |
40001 |
濕度 |
只讀 |
0001 H |
40002 |
溫度 |
只讀 |
0002 H |
40003 |
光照度 |
只讀 |
|
|||
0003 H |
40004 |
(只在0~200000Lux啟用,單位1Lux) |
|
0006 H |
40007 |
光照度 |
只讀 |
|
|||
(0~65535單位1Lux |
|||
|
|||
0~200000單位百Lux) |
那么我司環(huán)境監(jiān)控主機作為485主站讀取我司20Wlux光照度的數(shù)據(jù)時,主機問詢幀如下:
地址碼 | 功能碼 | 起始地址 | 數(shù)據(jù)長度 | 校驗碼低位 | 校驗碼高位 |
0x03 | 0x03 | 0x00 0x02 | 0x00 0x02 | 0x65 | 0xCB |
我司光照度應(yīng)答幀如下:(例如讀到光照度為200000 Lux)
地址碼 | 功能碼 | 有效字節(jié)數(shù) | 光照度高位 | 光照度低位 | 校驗碼低位 | 校驗碼高位 |
0x01 | 0x03 | 0x04 | 0x00 0x03 | 0x0D 0x40 | 0x0F | 0x53 |
光照度計算說明:
此協(xié)議只在0~200000Lux量程變送器下使用,單位為1Lux
30D40 H(十六進制) = 200000=> 光照度=200000 Lux
從設(shè)備應(yīng)答幀來看,設(shè)備應(yīng)答了了4個有效字節(jié),第一數(shù)據(jù)區(qū)應(yīng)對應(yīng)的2號寄存器,所存的數(shù)值是20wLUX的數(shù)值高位(03);
第二數(shù)據(jù)區(qū)對應(yīng)的3號寄存器,所存的數(shù)值是20Wlux的數(shù)值低位 (0D 40);
主機作為485主站,整合高位及低位之后形成一個32位無符號的數(shù),16進制下的30D40,換算成10進制,即200000;
注意低字節(jié)D前面的0務(wù)必加上,高字節(jié)3前面的0加不加的無所謂,因為高字節(jié)03前面沒有0以上的數(shù)了,03加上這個0或者不加上這個0都帶表3,低字節(jié)0D若是舍棄這個0,5位數(shù)30D40就變成4位數(shù)3D40了;就像10進制中10100與1100的意思一樣,最高位數(shù)與中間位數(shù)的0是有意義的,而最高位前面加個0,什么都代表不了;
從以上兩個例子中,我們可以做以下總結(jié):
若是需要我司環(huán)境監(jiān)控主機去采集其他公司的485設(shè)備,那么需要該485設(shè)備符合以下條件:
8位數(shù)據(jù)位 |
1位停止位 |
無校驗 |
波特率支持2400,4800,9600任意一種均可 |
寄存器中的數(shù)據(jù)必須都是高字節(jié)在前的! |
且寄存器中的原始數(shù)值轉(zhuǎn)換規(guī)律必須寫清楚才能明確我司環(huán)境監(jiān)控主機是否能采集該485設(shè)備數(shù)據(jù) |
進制簡介:
對于任何一種進制---X進制,就表示某一位置上的數(shù)運算時是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。
2進制是由0,1兩個大小不同的數(shù),馮2進1。
16進制每一位上可以是從小到大為0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F16個大小不同的數(shù),即逢16進1,其中用A,B,C,D,E,F(xiàn)(字母不區(qū)分大小寫)這六個字母來分別表示10,11,12,13,14,15。
當溫度為負的時候:
我司485設(shè)備,當溫度為負的時候,是以補碼的形式存在的,負數(shù)的補碼是在其原碼的基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1。