ETH官方钱包

創(chuàng)作內(nèi)容

20 GP

Modbus TCP implement

作者:貓貓風(fēng) ?●ω●?│2018-01-14 22:07:01│巴幣:40│人氣:10532
.















Modbus為工業(yè)上常用的通訊協(xié)定之一

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

然後由Slave 方依據(jù)接到的 Query Message 內(nèi)容準(zhǔn)備 Response Message 回傳給Master

一般使用上,監(jiān)控系統(tǒng)(HMI)都為 Master,PLC、電表、儀表等都為Slave

HMI 系統(tǒng)一直 Polling Slave 的各種 relay and register 最新數(shù)值

然後做顯示及各種邏輯計(jì)算及控制調(diào)整等處理

一般的Modbus為標(biāo)準(zhǔn)的序列通訊,分為兩種

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

詳細(xì)使用/實(shí)作方式可以參考此篇 ->   Modbus RTU Transmit - 以 Arduino 為例

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

以上兩種方式在傳遞資料的結(jié)尾皆需要加上校驗(yàn)又稱錯誤檢查機(jī)制 CRC

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

然而 Modbus 也可以藉由乙太網(wǎng)路 TCP/IP 的方式來進(jìn)行,稱做 Modbus TCP

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

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

如此則表示為同一筆資料的回應(yīng)(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: 讀取當(dāng)前 digital out status
02: 讀取當(dāng)前 digital input status
03: 讀取當(dāng)前 analog out status
04: 讀取當(dāng)前 analog input status
05: 寫入單個  digital out value
06: 寫入單個  analog out value
15: 寫入多個  digital out value
16: 寫入多個  analog out value

實(shí)際上要怎麼用,還是要以裝置 Datasheet 上規(guī)範(fàn)的為主  

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

byte 10-11: 詢問資料長度

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


以下為常用操作碼(function Code)的實(shí)際範(fàn)例

操作碼 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端回應(yīng)的資料長度為 2 bytes ,資料內(nèi)容為 D3  17

回應(yīng)資料的位置為倒著塞

register addr 26 - 19

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

register addr  34 - 27  (此範(fàn)例 暫存器位址只到32  因此多出的補(bǔ)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端回應(yīng)的資料長度為 5 bytes ,資料內(nèi)容為 AA 45 27 83 01

回應(yīng)資料的位置為倒著塞

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端回應(yīng)的資料長度為 4 bytes ,資料內(nèi)容為 00 63  30 30

由於要求的資料為整數(shù)int,因此一個資料佔(zhàn)2bytes

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

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


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

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


操作碼 05: 寫入單點(diǎn) 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: 寫入單點(diǎn) 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

寫入資料為整數(shù) 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: 寫入多點(diǎn) 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: 寫入多點(diǎn) 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

寫入值為 整數(shù)(一個佔(zhàn) 2bytes  總共寫入三個)

Register 40309設(shè)定值:784
Register 40310 設(shè)定值:12706
Register 40311 設(shè)定值:-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 回傳



引用網(wǎng)址:http://www.jamesdambrosio.com/TrackBack.php?sn=3854794
All rights reserved. 版權(quán)所有,保留一切權(quán)利

相關(guān)創(chuàng)作

同標(biāo)籤作品搜尋:arduino|android|C#

留言共 6 篇留言

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

01-14 22:12

貓貓風(fēng) ?●ω●?
打這篇稿到頭很痛@A@01-14 22:13

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

01-15 09:34

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

01-16 14:09

貓貓風(fēng) ?●ω●?
[e34]01-17 21:46

這好厲害哈哈哈哈

01-24 15:47

貓貓風(fēng) ?●ω●?
[e24]03-01 13:45
小刀
同樓上,厲害厲害,果然不凡~

01-25 10:39

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

11-19 11:52

貓貓風(fēng) ?●ω●?
?●ω●?11-19 15:28
我要留言提醒:您尚未登入,請先登入再留言

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

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

追蹤私訊切換新版閱覽

作品資料夾

aaa1357932大家
各位有空可以來我家看看畫作或聽聽我的全創(chuàng)作專輯!看更多22分前


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

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