MODBUS-寄存器與功能碼學習


 

分類

簡稱

起始地址

結束地址

能夠使用的功能碼

輸出邏輯線圈/(可讀寫位)/(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采集的信息等

modbus協議功能碼和常見問題

 

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 :116 (在下列各更完整的描述。
MODBUS 服務並同MODBUS 請求提供服務。服務MODBUS 請求
最大數量MODBUS 服務的主要一。數量取決於服務的處理和
將這個實現為“NumberMaxOfServerTransaction必須MODBUS 服務的一個
描述個實現。根據設備,它的取為:116
NumberMaxOfServerTransactionMODBUS 服務
要的是所管理的並發 MODBUS 事務處理的數量可服務器對 MODBUS 請求

 從地址:RTU(1~247,0,作為廣播地址);TCP(不需要,必須使用0xff),0 用作與 MODBUS/TCP 設備直接通信
TCP連接:默認2小時,超過這個時間每隔75s進行詢問一次,連續8次。

指令說明:
這是一條正確的發送指令:
TX:12 34 00 00 00 06 01 03 00 60 00 01
RX:12 34 00 00 00 06 01 03 00 02 12 34
12 34 為報文id(由客戶端發起,一般每次通信之后就要加1以區別不同的通信數據報文)用以 區別不同的發送指令,可以不改;
00 00 表示該條指令遵循 ModbusTCP協議
00 06 示后面 數據的長度,可以自己數一下是否是6個byte;
01為設備地址,這個可以用於 局域網里面的具體的地址,如果目標機器有固定ip,這個就不起作用,直接上寫成 00
03 為功能碼;
00 60 表示讀取寄存器地址0X0000的起始位置;
00 01 表示讀取的寄存器的個數,
00 02 后續字節數
12 34 數據值
 modbusTCP的主從:一般設備作為服務器(從機),PC作為主機(ModbusPoll)
手機組態MODBUS TCP:T eslaMultiSCADA
MTings工具:國產免費軟件,集RTU/TCP一體,可以進行手動觸發和連續周期觸發,很不錯的一個工具
基於B/S的MODBUS_TCP:
 

 

 廣播操作(只能針對寫指令):

   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或者圖標來操作

 

 使用手冊

 

 CAS Modbus Scanner工具:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM