網(wǎng)站上的個人詞條怎么做的鄭州外貿(mào)網(wǎng)站推廣
一、RTU介紹
MODBUS協(xié)議支持多種功能碼,不同的功能碼對應(yīng)不同的操作:
0x01 | 讀線圈狀態(tài) |
0x02 | 讀離散輸入狀態(tài) |
0x03 | 讀保持寄存器 |
0x04 | 讀輸入寄存器 |
0x05 | 寫單個線圈 |
0x06 | 寫單個保持寄存器 |
0x0F | 寫多個線圈 |
0x10 | 寫多個保持寄存器 |
二、實驗
1.0x03功能碼讀單個保持寄存器
1.1 請求幀格式
從站地址 | 功能碼 | 起始地址(高位) | 起始地址(低位) | 數(shù)量(高位) | 數(shù)量(低位) | 校驗碼(低位) | 校驗碼(高位) |
---|---|---|---|---|---|---|---|
0x01 | 0x03 | 0x00 | 0x45 | 0x00 | 0x01 | XX | XX |
-
0x01:從地址(Slave Address)。這個值表示這是發(fā)送給地址為1的從設(shè)備。
-
0x03:功能碼(Function Code)。這個值表示這是一個讀取保持寄存器(Read Holding Registers)的請求。
-
0x00 0x45:起始地址(Starting Address)。這兩個字節(jié)一起表示從哪個寄存器地址開始讀取。0x0045等于十進(jìn)制的69。
-
0x00 0x01:寄存器數(shù)量(Quantity of Registers)。這兩個字節(jié)一起表示讀取的寄存器數(shù)量。0x0001等于十進(jìn)制的1。
-
XX XX:CRC校驗碼(CRC Checksum)。這是一個錯誤檢測碼,用于驗證數(shù)據(jù)的完整性。實際的值需要根據(jù)前面的數(shù)據(jù)計算得出。
總結(jié):這個Modbus數(shù)據(jù)幀請求讀取從地址為1的設(shè)備從地址69開始的1個保持寄存器。
同理這個Modbus數(shù)據(jù)幀請求讀取從地址為1的設(shè)備從地址66開始的1個保持寄存器。
1.2 應(yīng)答幀格式
從站地址 | 功能碼 | 字節(jié)計數(shù) | 字節(jié)一(高位) | 字節(jié)一(低位) | 校驗碼(低位) | 校驗碼(高位) |
---|---|---|---|---|---|---|
0x01 | 0x03 | 0x02 | 0x00 | 0x00 | YY | YY |
-
0x01:從地址(Slave Address)。這個值表示這是從地址為1的設(shè)備發(fā)出的響應(yīng)。
-
0x03:功能碼(Function Code)。這個值表示這是一個讀取保持寄存器(Read Holding Registers)的響應(yīng)。
-
0x02:字節(jié)數(shù)(Byte Count)。這個值表示響應(yīng)的數(shù)據(jù)部分包含2個字節(jié)。
-
0x00 0x00:數(shù)據(jù)(Data)。這兩個字節(jié)表示從指定的寄存器讀取到的值。在這個例子中,讀取到的值是0x0000,即十進(jìn)制的0。
-
YY YY:CRC校驗碼(CRC Checksum)。這是一個錯誤檢測碼,用于驗證數(shù)據(jù)的完整性。實際的值需要根據(jù)前面的數(shù)據(jù)計算得出。
總結(jié):這個數(shù)據(jù)幀表示從地址為1的設(shè)備,從地址69開始響應(yīng)的數(shù)據(jù)部分包含2個字節(jié)(0x02)。 且從這個指定的寄存器讀取到的值是0x0000。
同理從地址69開始響應(yīng)的數(shù)據(jù)部分包含2個字節(jié)(0x02)。 且從這個指定的寄存器讀取到的值是0x0001。
2.0x06功能碼寫入單個保持寄存器
2.1 請求幀格式
從站地址 | 功能碼 | 寄存器高 | 寄存器低 | 寫入值高 | 寫入值低 | 校驗碼(低位) | 校驗碼(高位) |
---|---|---|---|---|---|---|---|
0x01 | 0x06 | 0x00 | 0x45 | 0x33 | 0x01 | XX | XX |
-
0x01:從地址(Slave Address)。表示這是發(fā)送給地址為1的從設(shè)備。
-
0x06:功能碼(Function Code)。表示這是一個寫單個寄存器的請求。
-
0x00 0x45:寄存器地址(Register Address)。這兩個字節(jié)表示要寫入的寄存器地址。0x0045等于十進(jìn)制的69。
-
0x33 0x01:寄存器值(Register Value)。這兩個字節(jié)表示要寫入寄存器的值。0x3301可以表示為十進(jìn)制的13057。
-
XX XX:CRC校驗碼(CRC Checksum)。這是一個錯誤檢測碼,用于驗證數(shù)據(jù)的完整性。實際的值需要根據(jù)前面的數(shù)據(jù)計算得出。
在寫入之后,可以用0x03功能碼讀取0x45地址的數(shù)據(jù)查看是否寫入成功,可以從圖中驗證看到,0x3301成功寫入0x45地址。
2.2 應(yīng)答幀格式
原報文返回。
3.0x10功能碼寫入多個保持寄存器
3.1 請求幀格式
從站地址 | 功能碼 | 起始地址(高位) | 起始地址(低位) | 數(shù)量(高位) | 數(shù)量(低位) | 字節(jié)數(shù) | 寫入數(shù)值 | 校驗碼(低位) | 校驗碼(高位) |
---|---|---|---|---|---|---|---|---|---|
0x01 | 0x10 | 0x00 | 0x45 | 0x00 | 0x02 | 0x04 | 0x138A 0x1388 | XX | XX |
-
0x01:從地址(Slave Address)。表示這是發(fā)送給地址為1的從設(shè)備。
-
0x10:功能碼(Function Code)。表示這是一個寫多個寄存器的請求。
-
0x00 0x45:起始地址(Starting Address)。這兩個字節(jié)表示要寫入的第一個寄存器地址。0x0045等于十進(jìn)制的69。
-
0x00 0x02:寄存器數(shù)量(Quantity of Registers)。這兩個字節(jié)表示要寫入的寄存器數(shù)量。0x0002等于十進(jìn)制的2。
-
0x04:字節(jié)計數(shù)(Byte Count)。這個值表示接下來要寫入的數(shù)據(jù)字節(jié)數(shù)。在這個例子中兩個寄存器就是是4個字節(jié)。
-
0x138A 0x1388:寄存器值(Register Values)。表示要寫入寄存器的數(shù)據(jù)。由于有兩個寄存器,每個寄存器占兩個字節(jié),所以這里總共4個字節(jié):
- 0x138A
- 0x1388
-
XX XX:CRC校驗碼(CRC Checksum)。這是一個錯誤檢測碼,用于驗證數(shù)據(jù)的完整性。實際的值需要根據(jù)前面的數(shù)據(jù)計算得出。
在寫入之后,可以用0x03功能碼讀取0x45地址的數(shù)據(jù)查看是否寫入成功,可以從圖中驗證看到,0x138A,0x1388成功寫入從0x45開始往后的兩個寄存器地址。
3.2?應(yīng)答幀格式
從站地址 | 功能碼 | 起始地址(高位) | 起始地址(低位) | 數(shù)量(高位) | 數(shù)量(低位) | 校驗碼(低位) | 校驗碼(高位) |
---|---|---|---|---|---|---|---|
0x01 | 0x10 | 0x00 | 0x45 | 0x00 | 0x02 | YY | YY |
-
0x01:從地址(Slave Address)。表示這是從地址為1的從設(shè)備發(fā)出的響應(yīng)。
-
0x10:功能碼(Function Code)。表示這是一個寫多個寄存器的響應(yīng)。
-
0x00 0x45:起始地址(Starting Address)。這兩個字節(jié)表示寫入操作開始的寄存器地址。0x0045等于十進(jìn)制的69。
-
0x00 0x02:寄存器數(shù)量(Quantity of Registers)。這兩個字節(jié)表示寫入的寄存器數(shù)量。0x0002等于十進(jìn)制的2。
-
YY YY:CRC校驗碼(CRC Checksum)。這是一個錯誤檢測碼,用于驗證數(shù)據(jù)的完整性。實際的值需要根據(jù)前面的數(shù)據(jù)計算得出。
4.0x17功能碼寫入多個保持寄存器并讀
4.1 請求幀格式
- 0x01:從地址(Slave Address)。表示這是發(fā)送給地址為1的從設(shè)備。
- 0x17:功能碼(Function Code)。表示這是一個讀取/寫入多個寄存器的請求。
- 0x00 0x45:讀取起始地址(Read Starting Address)。這兩個字節(jié)表示要讀取的寄存器地址。0x0045等于十進(jìn)制的69。
- 0x00 0x02:讀取寄存器數(shù)量(Quantity of Registers to Read)。這兩個字節(jié)表示要讀取的寄存器數(shù)量。0x0002等于十進(jìn)制的2。
- 0x00 0x45:寫入起始地址(Write Starting Address)。這兩個字節(jié)表示要寫入的寄存器地址。0x0045等于十進(jìn)制的69。
- 0x00 0x02:寫入寄存器數(shù)量(Quantity of Registers to Write)。這兩個字節(jié)表示要寫入的寄存器數(shù)量。0x0002等于十進(jìn)制的2。
- 0x04:寫入字節(jié)計數(shù)(Write Byte Count)。表示接下來要寫入的數(shù)據(jù)字節(jié)數(shù)。在這個例子中是4個字節(jié)。
- 0x11 0x22:第一個寄存器的值。表示要寫入的值是0x1122。
- 0x13 0x88:第二個寄存器的值。表示要寫入的值是0x1388。
- 0xA6 0x1C:CRC校驗碼(CRC Checksum)。用于錯誤檢測。
4.2?應(yīng)答幀格式
- 0x01:從地址(Slave Address)。表示這是從地址為1的從設(shè)備發(fā)出的響應(yīng)。
- 0x17:功能碼(Function Code)。表示這是一個讀/寫多個寄存器的響應(yīng)。
- 0x04:字節(jié)計數(shù)(Byte Count)。表示接下來的數(shù)據(jù)字節(jié)數(shù)。在這個例子中是4個字節(jié)。
- 0x11 0x22:讀取的第一個寄存器的值。表示從請求中讀取的值是0x1122。
- 0x13 0x88:讀取的第二個寄存器的值。表示從請求中讀取的值是0x1388。
- 0x51 0x47:CRC校驗碼(CRC Checksum)。用于錯誤檢測。
4.3 寫入數(shù)據(jù)問題總結(jié)
從圖中可見,我在0x46地址寫入0x1313之后,在應(yīng)答幀中讀取顯示0x1310,并沒有寫入成功,這是因為有的寄存器地址存放的數(shù)值是動態(tài)變化的,寫入之后,它又被動態(tài)變化的數(shù)值給覆蓋