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