| 分類 |
簡稱 |
起始地址 |
結束地址 |
能夠使用的功能碼 |
| 輸出邏輯線圈/(可讀寫位)/(DI/O)(如繼電器開關控制) |
0x |
00000 |
09999 |
0x01讀一組邏輯線圈 0x05寫單個線圈 0x0f寫多個線圈 |
| 離散量觸點/開關量輸入/只讀位(DI)如按鍵是否按下 |
1x |
10000 |
19999 |
0x02讀一組開關輸入
|
| 輸入寄存器(AI)實時數據如AD采集數據。 |
3x |
30000 |
39999 |
0x04讀一個或多個輸入寄存器
|
| 保持寄存器(AI/O) 如設置的各種參數 |
4x |
40000 |
49999 |
0x03讀一個或多個保持寄存器的值
0X06寫單個保持寄存器 0X10寫多個保持寄存器 |
RTU協議中的指令由地址碼(一個字節),功能碼(一個字節),起始地址(兩個字節),數據(N個字節),校驗碼(兩個字節)五個部分組成
0x01: 讀一組邏輯線圈,如讀8個繼電器輸出狀態。
0x0F: 寫一組邏輯線圈。如同時控制8個繼電器
0x05: 寫單個邏輯線圈,如設定單個繼電器
0x02: 讀一組開關量的輸入,如讀顯示板是否有按鍵按下、水流開關的狀態。
0x03: 讀一個或多個保持寄存器,如讀一個或多個設置參數
0x010: 寫一個或多個保持寄存器,如寫設置參數
0x06: 寫單個保持寄存器,如寫單個設置參數
0x04: 讀一個或多個輸入寄存器,如讀具體的按鍵值,AD采集的信息等
Pasted from <http://blog.csdn.net/educast/article/details/8159510
《Modbus軟件開發實踐指南》參考手冊
1單片機開發與PLC開發的異同:
MODBUS協議是專門針對485總線設備(例PLC)開發,寄存器的定義要嚴格按照其地址范圍;功能碼的功能定義及定義的寄存器地址與功能碼的使用要要嚴格符合。如上圖。
而當單片機開發用串口點對點,可能不會完全遵守MODBUS協議具體體現在2方面:
首先是定義的寄存器地址范圍,應結合不同單片機RAM的大小和項目得實際需求定義起始范圍和大小。方法如在RAM區的不同區域定義不同功能的數組:
IOX[N]:輸出線圈,用來進行繼電器的操作
IX[M]:開關輸入 ,用於識別按鍵是否按下的查詢。
其它:功能碼的使用也不會嚴格限定在指定的PLC地址范圍。
2modbus寄存器的地址說明:
有兩套規則,一套稱為PLC地址,為5位十進制數,例如40001,PLC地址40001意味着該參數類型為保持寄存器。另一套是協議地址,協議地址為0x0000,這里面有對應關系,去掉PLC地址的最高位,然后剩下的減1即可。這會存在一個問題,PLC地址30002和PLC地址40002的協議地址同為0x0001,此時訪問時是不是會沖突呢。親們,當然不會了,30001為輸入寄存器,需要使用04指令訪問,而40001為保持寄存器,可以使用03、06和16指令訪問。注意定義的寄存器地址像數組一樣都是從0開始的,即通訊中的地址比實際地址小“1”
http://blog.sina.com.cn/s/blog_6ab9638f0100vqol.html
3線圈寄存器:就是可以單獨進行位控制的BITS寄存器,類似C51的位帶結構體
Typedef struct
{
Bit:0
Bit:1
..
Bit:14
Bit:15
}COIL_REG
http://blog.sina.com.cn/s/blog_598b27cd0101rphm.html
4modbus幀結構:
ADU:應用數據單元
PUD:協議數據單元
freemodbus中如何判斷幀結束
modbus協議中沒有明顯的開始符和結束符,而是通過幀與幀之間的間隔時間T3.5來判斷的。超過T3.5就認為收到了新的幀。接下來就可
以處理數據了,首當其沖的就是判斷幀的合法性。Modbus通過時間來判斷幀是否接受完成,自然需要單片機中的定時器配合。
使用串口發送完成中斷:避免丟失最后一個字節內容
Pasted from <http://www.360doc.com/content/14/0313/22/7991404_360395398.shtml>
Modbus TCP協議:
Modbus TCP協議則是在RTU協議上加一個MBAP報文頭,由於TCP是基於可靠連接的服務,RTU協議中的CRC校驗碼就不再需要,所以在Modbus TCP協議中是沒有CRC校驗碼,用一句比較通俗的話說就是:Modbus TCP協議就是Modbus RTU協議在前面加上五個0以及一個6,然后去掉兩個CRC校驗碼字節就OK.雖然這句話說得不是特別准確,但是也基本上把RTU與TCP之間的區別說得比較清楚了
http://www.cnblogs.com/woxihuadabai/p/8043188.html
modbusTCP下從設備(每一個從設備一個ip地址)最多247個( ip地址1~247,248-255保留,0地址在請求的報文中請求的地址為0則為廣播模式)。


NnmberMaxofClientTransaction :此參數取值為 1~16 (在下列各章中給出更完整的描述。
MODBUS 服務器可以接收並同時為多個 MODBUS 請求提供服務。服務器可以同時接收 MODBUS 請求
的最大數量是 MODBUS 服務器的主要特性之一。這個數量取決於服務器的設計以及它的處理和存儲能
力。將這個實現參數稱為“NumberMaxOfServerTransaction”,必須作為 MODBUS 服務器的一個特性
描述這個實現參數。根據設備的能力,它的取值范圍為:1~16,。
“NumberMaxOfServerTransaction”參數對 MODBUS 服務器的操作和性能有非常顯著的影響。尤
其重要的是,所管理的並發 MODBUS 事務處理的數量可能影響服務器對 MODBUS 請求的響應時間。
)
從地址:RTU(1~247,0,作為廣播地址);TCP(不需要,必須使用0xff),0 也可以用作與 MODBUS/TCP 設備直接通信
TCP連接:默認2小時,超過這個時間每隔75s進行詢問一次,連續8次。
廣播操作(只能針對寫指令):
RTU主站使用廣播地址(0x0/0xff)發送一條命令報文,全部的從站收到報文后執行,但不發送回應報文。此功能在很多情況下(用廣播方式給所有設備發送設置值,如變頻器速率)很實用。
modbus poll 工具的幾個時間;
- connect timeout:建立連接的時間,超時重連間隔
- response timeout:表示讀取超時(放棄)時間,從站在超時時間內沒有返回數據,則認為通訊失敗,默認1000ms
- delay between polls:每次掃描的最小間隔時間,根據模式,slave數量,PC機特點不同(單個RTU或者TCP可以小於等於20ms,多slave時必須大於20ms,因為windows任務調度周期大概10~20ms,所以該值小於20ms不能保證T3.5。)
- scan rate( 0 ~ 3600000ms):讀數據的時間間隔,一定要比整個來回通訊的時間要長
RTU通訊超時的計算:主站讀取從站的寄存器為例,主站發出請求需要8個字節,從站返回響應為5 2*n個字節。其中n為寄存器個數。
在9600的波特率下,每秒可以傳輸出的楨數為:9600 / (1 + 8 + 1) = 960楨/秒,即960字節/秒。
每傳輸1個字節數據需要的時間為:1秒 / 960 = 1.041ms
(8 +1 +1)/9600=1.04ms/Byte
因此,主站發出響應到從站返回數據的時間周期為:
(8+ 5+ 2*n)*1.04+ T1 +T2,其中n為寄存器個數,T1為從站的響應時間(如果是PLC,則為PLC的掃描時間),T2為通訊余量,一般為20~50ms。
如果讀取10個字的數據,從站響應時間為50ms,則整個周期為:
(8+ 5+ 2*10)*1.04+ 50+ 50=134.32ms。
因此,超時時間必須大於134.32ms,可以設置為150ms以上;
而ModBus協議中超時時間定為:3.5個楨長度為超時時間;
超時時間 = 3.5 * 1 / BaudRate / 10 秒
= 3.5 * 10 / BaudRate 秒
= 3.5 * 10 * 2 / BaudRate *2 秒
= 70 / BaudRate *2 秒
波特率大於19200使用定值:1750us
波特率小於19200使用定值:usTimerT35_50us = ( 7UL * 220000UL ) / ( 2UL * ulBaudRate )=770000/BaudRate; 這usTimerT35_50us 一個單位為50uS,將這個計算結果寫到定時器。每中斷一次為50us * usTimerT35_50us 微秒
————————————————
版權聲明:本文為CSDN博主「sunxboy」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sunxboy/article/details/84499791
單次觸發操作:setup-read/write disable 或快捷鍵shift+F6,然后用F6或者圖標來操作
使用手冊:

