創作內容

20 GP

Modbus TCP implement

作者:貓貓風 ฅ●ω●ฅ│2018-01-14 22:07:01│巴幣:40│人氣:10025
.















Modbus為工業上常用的通訊協定之一

有一方為 Master 採取主動詢問方式,送出 Query Message 給 Slave 方

然後由Slave 方依據接到的 Query Message 內容準備 Response Message 回傳給Master

一般使用上,監控系統(HMI)都為 Master,PLC、電表、儀表等都為Slave

HMI 系統一直 Polling Slave 的各種 relay and register 最新數值

然後做顯示及各種邏輯計算及控制調整等處理

一般的Modbus為標準的序列通訊,分為兩種

一種為使用二進位表示法來進行資料的傳遞與交換,此方式稱做 Modbus RTU

詳細使用/實作方式可以參考此篇 ->   Modbus RTU Transmit - 以 Arduino 為例

另一種為人類可讀性較高的傳遞方式,稱做 Modbus ASCII

以上兩種方式在傳遞資料的結尾皆需要加上校驗又稱錯誤檢查機制 CRC

CRC的計算方法可以參考此篇 ->  Modbus RTU CRC 計算

然而 Modbus 也可以藉由乙太網路 TCP/IP 的方式來進行,稱做 Modbus TCP

此種通訊格式不需要計算CRC,取而代之的是使用識別碼的方式來進行資料驗正

例如Master傳遞的第一筆資料序號為 01 , 則Slave端收到後的回應資料序號也要為 01

如此則表示為同一筆資料的回應(response)

以下介紹 Modbus TCP request 的基本傳遞格式

TCP Header Address Function Code Start register addr query length data
6bytes 1byte 1byte 2byte 2bytes N bytes

byte 0 - 1 為本次通訊的識別碼

byte 2  - 4 通常為0

byte 5 :為資料長度 (從Address ~ data的總長度)

byte 6:  slave端位址

byte 7: 操作碼 ,主要為以下幾種

01: 讀取當前 digital out status
02: 讀取當前 digital input status
03: 讀取當前 analog out status
04: 讀取當前 analog input status
05: 寫入單個  digital out value
06: 寫入單個  analog out value
15: 寫入多個  digital out value
16: 寫入多個  analog out value

實際上要怎麼用,還是要以裝置 Datasheet 上規範的為主  

byte 8 - 9: 詢問暫存器起始位址

byte 10-11: 詢問資料長度

byte 12 - N: 要傳遞的資料(通常為寫入值,依照不同操作碼會帶有不同長度的資料)


以下為常用操作碼(function Code)的實際範例

操作碼 01 讀取多個 Di   ( Di relay的起始暫存器位址為 00001)

Master Requst

Header
  
addr
  
func
  
Start addr
  
Request length
  
00
  
01
  
00
  
00
  
00
  
06
  
11
  
01
  
00
  
13
  
00
  
0D
  


Master要求讀取裝置位址17從暫存器位址19 ~ 32的資料

Slave Response

Header
  
addr
  
func
  
Byte  count
  
data
  
00
  
01
  
00
  
00
  
06
  
11
  
01
  
02
  
D3
  
17
  

Slave端回應的資料長度為 2 bytes ,資料內容為 D3  17

回應資料的位置為倒著塞

register addr 26 - 19

D3 (HEX) =  1101 0011 -> relay status = ON ON OFF ON  OFF OFF ON ON

register addr  34 - 27  (此範例 暫存器位址只到32  因此多出的補0

17 (HEX) = 0001 0111 -> relay status = OFF OFF OFF ON   OFF ON ON ON


操作碼 02: 讀取多個 Do   (Do relay的起始暫存器位址為 10001)

Master Requst

Header
  
addr
  
func
  
Start addr
  
Request length
  
00
  
01
  
00
  
00
  
00
  
06
  
17
  
02
  
00
  
65
  
00
  
21
  

Master要求讀取裝置位址23從暫存器位址10101 ~ 10134的資料

Slave Response

Header
  
addr
  
func
  
byte count
  
DATA
  
00
  
01
  
00
  
00
  
00
  
06
  
17
  
02
  
05
  
AA
  
45
  
27
  
83
  
01
  

Slave端回應的資料長度為 5 bytes ,資料內容為 AA 45 27 83 01

回應資料的位置為倒著塞

register addr 10108 - 10101

AA (HEX) =  1010 1010 -> relay status = ON OFF ON OFF  ON OFF ON OFF

register addr  10116 - 10109

45 (HEX) = 0100 0101 -> relay status = OFF ON OFF OFF   OFF ON OFF ON

以下依此類推.........


操作碼 03: 讀取多個 Ao   (Ao起始站存器位置為 40001

Master Requst

Header
  
addr
  
func
  
Start  addr
  
Request  length
  
00
  
01
  
00
  
00
  
00
  
06
  
29
  
03
  
02
  
FC
  
00
  
02
  

Master要求讀取裝置位址25從暫存器位址40764 ~ 40766的資料

Slave Response

Header
  
addr
  
func
  
Byte  count
  
Data1
  
Data1
  
Data2
  
Data2
  
00
  
01
  
00
  
00
  
00
  
06
  
29
  
03
  
04
  
00
  
63
  
30
  
30
  

Slave端回應的資料長度為 4 bytes ,資料內容為 00 63  30 30

由於要求的資料為整數int,因此一個資料佔2bytes

data1 = 00 63 (HEX) = 99 (DEC)

data2 = 30 30 (HEX)=  12336 (DEC)


操作碼 04: 讀取多個 Ai  (Ao起始站存器位置為 30001

動作原理與操作碼三完全相同,只有操作的function code與暫存器起始位置不同


操作碼 05: 寫入單點 Do (Start = 10001

Master Requst

Header
  
addr
  
func
  
Start  addr
  
Writedata
  
00
  
01
  
00
  
00
  
00
  
06
  
0A
  
05
  
00
  
0B
  
FF
  
00
  
  
Master要求寫入資料到裝置位址10的暫存器位址10012

寫入 FF 00 表示  讓 Relay ON

Slave Response

Header
  
addr
  
func
  
Start  addr
  
Writedata
  
00
  
01
  
00
  
00
  
00
  
06
  
0A
  
05
  
00
  
0B
  
FF
  
00
  

Slave會 Echo相同訊息  表示寫入成功


操作碼 06: 寫入單點 Ao  (Start = 40001

Master Requst

Header
  
addr
  
func
  
Start  addr
  
Write  data
  
00
  
01
  
00
  
00
  
00
  
06
  
0D
  
06
  
00
  
6F
  
03
  
E7
  

Master要求寫入資料到裝置位址13的暫存器位址40112

寫入資料為整數 03 E7(HEX) = 999

Slave Response

Header
addr
func
Start addr
Write data
00
01
00
00
00
06
0D
06
00
6F
03
E7

Slave會 Echo相同訊息  表示寫入成功


操作碼 15: 寫入多點 Do  (Start = 10001

Master Requst

Header
  
addr
  
func
  
Start  addr
  
Data  lenth
  
Byte  count
  
data
  
00
  
01
  
00
  
00
  
00
  
06
  
11
  
0F
  
00
  
0A
  
00
  
0C
  
02
  
55
  
03
  

Master要求寫入資料到裝置位址15的暫存器位址10010 - 10022

資料的位置為倒著塞

register 17 - 10

55 (HEX) = 0101 0101 = OFF ON OFF ON    OFF ON OFF ON

03(HEX) = 0000 0011 = OFF OFF OFF OFF  OFF OFF ON ON


Slave Response

Header
  
addr
  
func
  
Start  addr
  
Data  lenth
  
00
  
01
  
00
  
00
  
00
  
06
  
11
  
0F
  
00
  
0A
  
00
  
0C
  

以 request的前 6byte 作為 response 回傳


操作碼 16: 寫入多點 Ao  (Start = 40001

Header
  
addr
  
func
  
Start  addr
  
Data  lenth
  
Byte  count
  
Data1
  
Data1
  
Data2
  
Data2
  
Data3
  
Data3
  
 
00
  
01
  
00
  
00
  
00
  
06
  
27
  
10
  
01
  
35
  
00
  
03
  
06
  
03
  
10
  
31
  
A2
  
C0
  
C9
  

Master要求寫入資料到裝置位址39的暫存器位址40309 - 40311

寫入值為 整數(一個佔 2bytes  總共寫入三個)

Register 40309設定值:784
Register 40310 設定值:12706
Register 40311 設定值:-16183

Slave Response

Header
  
addr
  
func
  
Start  addr
  
Data  lenth
  
00
  
01
  
00
  
00
  
00
  
06
  
27
  
10
  
01
  
35
  
00  03
  

以 request的前 6byte 作為 response 回傳



引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3854794
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:arduino|android|C#

留言共 6 篇留言

珀伽索斯(Ama)
以前畫過這樣的表,那時候學這個非常辛苦,
真虧貓貓風還記得這麼清楚[e19]

01-14 22:12

貓貓風 ฅ●ω●ฅ
打這篇稿到頭很痛@A@01-14 22:13

已收藏,我好需要這個阿阿阿阿阿(大哭)
最近在重整系統被指派要使用這個
我根本沒有概念(崩潰

01-15 09:34

貓貓風 ฅ●ω●ฅ
由於工作繁忙,晚回了不好意思 ><
詳細請看信件的回復01-15 13:27
昭君出塞因地制宜
すげえ~

01-16 14:09

貓貓風 ฅ●ω●ฅ
[e34]01-17 21:46

這好厲害哈哈哈哈

01-24 15:47

貓貓風 ฅ●ω●ฅ
[e24]03-01 13:45
小刀
同樓上,厲害厲害,果然不凡~

01-25 10:39

貓貓風 ฅ●ω●ฅ
謝謝刀姊唷
03-01 13:45
〝雨落花開×燕返時〃
大大的文章又幫到我了 哈哈XD!!

11-19 11:52

貓貓風 ฅ●ω●ฅ
ฅ●ω●ฅ11-19 15:28
我要留言提醒:您尚未登入,請先登入再留言

20喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:Android SQLi... 後一篇:Arduino micr...

追蹤私訊切換新版閱覽

作品資料夾

l5257802所有人
求你了 看一下我的文看更多我要大聲說1小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】