在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)庫/ 18.2 Modbus 通信協(xié)議介紹
18. RS485 通信與 Modbus 協(xié)議
17.5 A/D 差分輸入信號
15.8 C 語言復(fù)合數(shù)據(jù)類型(結(jié)構(gòu)體,共用體,枚舉類型)
16.3 NEC 協(xié)議紅外遙控器
13.1 單片機通信時序解析
14.4 單片機 EEPROM 單字節(jié)讀寫操作時序
13.3 多個 .c 文件的初步認(rèn)識
18.2 Modbus 通信協(xié)議介紹
15.1 BCD 碼介紹
18.3 單片機 Modbus 多機通信程序設(shè)計
18.1 單片機 RS485 通信接口、控制線、原理圖及程序?qū)嵗?/span>
15. 實時時鐘 DS1302
14.7 單片機 I2C 和 EEPROM 的綜合編程
17. 模數(shù)轉(zhuǎn)換與數(shù)模轉(zhuǎn)換
16.2 紅外遙控通信原理
13.2 1602 液晶整屏移動程序
17.6 D/A 輸出
17.7 單片機信號發(fā)生器程序
16.4 溫度傳感器 DS18B20
14.6 單片機EEPROM的頁寫入
13.4 單片機計算器程序設(shè)計[詳細(xì)]
17.2 A/D(模數(shù)轉(zhuǎn)換)的主要指標(biāo)
17.4 PCF8591 應(yīng)用程序
17.1 A/D 和 D/A 的基本概念
17.3 PCF8591硬件接口(電路圖引腳圖)
14.3 單片機 EEPROM 簡介
13.5 單片機串口通信原理和控制程序
15.5 DS1302 寄存器介紹
15.2 單片機 SPI 通信接口
15.6 DS1302 通信時序介紹
14.5 單片機 EEPROM 多字節(jié)讀寫操作時序
16. 紅外通信與 DS18B20 溫度傳感器
14.1 單片機 I2C 時序介紹
15.3 實時時鐘芯片 DS1302 介紹
15.9 單片機電子時鐘程序設(shè)計
16.1 紅外光的基本原理
15.4 DS1302 的硬件信息
15.7 DS1302 的 BURST 模式
14.2 單片機 I2C 尋址模式
14. 單片機 I2C 總線與 EEPROM
13. 單片機 1602 液晶與串口的應(yīng)用實例

18.2 Modbus 通信協(xié)議介紹

我們前邊學(xué)習(xí) UART、I2C、SPI 這些通信協(xié)議,都是最底層的協(xié)議,是“位”級別的協(xié)議。而我們在學(xué)習(xí)13章做實用串口通信程序的時候,我們通過串口發(fā)給單片機三條指令,讓單片機做了三件不同的事情,分別是“buzz on”、“buzz off”和“showstr”。隨著系統(tǒng)復(fù)雜性的增加,我們希望可以實現(xiàn)更多的指令。而指令越來越多,帶來的后果就是非常雜亂無章,尤其是這個人喜歡寫成“buzz on”、“buzz off”,而另外一個人喜歡寫成“on buzz”、“off buzz”。導(dǎo)致不同開發(fā)人員寫出來的程序代碼不兼容,不同廠家的產(chǎn)品不能掛到一條總線上通信。

隨著這種矛盾的日益嚴(yán)重,就會有聰明人提出更合理的解決方案,提出一些標(biāo)準(zhǔn)來,今后我們的編程必須按照這個標(biāo)準(zhǔn)來,這種標(biāo)準(zhǔn)也是一種通信協(xié)議,但是和 UART、I2C、SPI通信協(xié)議不同的是,這種通信協(xié)議是字節(jié)級別的,叫做應(yīng)用層通信協(xié)議。在1979年由 Modicon(現(xiàn)為施耐德電氣公司的一個品牌)提出了全球第一個真正用于工業(yè)現(xiàn)場總線的協(xié)議,就是 Modbus 協(xié)議。

Modbus 協(xié)議特點

Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其他設(shè)備之間可以通信,已經(jīng)成為一種工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。這種協(xié)議定義了一種控制器能夠認(rèn)識使用的數(shù)據(jù)結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了控制器請求訪問其它設(shè)備的過程,如何回應(yīng)來自其它設(shè)備的請求,以及怎樣偵測錯誤記錄,它制定了通信數(shù)據(jù)的格局和內(nèi)容的公共格式。

在進(jìn)行多機通信的時候,Modbus 協(xié)議規(guī)定每個控制器必須要知道它們的設(shè)備地址,識別按照地址發(fā)送過來的數(shù)據(jù),決定是否要產(chǎn)生動作,產(chǎn)生何種動作,如果要回應(yīng),控制器將生成的反饋信息用 Modbus 協(xié)議發(fā)出。

Modbus 協(xié)議允許在各種網(wǎng)絡(luò)體系結(jié)構(gòu)內(nèi)進(jìn)行簡單通信,每種設(shè)備(PLC、人機界面、控制面板、驅(qū)動程序、輸入輸出設(shè)備等)都能使用 Modbus 協(xié)議來啟動遠(yuǎn)程操作,一些網(wǎng)關(guān)允許在幾種使用 Modbus 協(xié)議的總線或網(wǎng)絡(luò)之間的通信,如圖18-4所示。

http://wiki.jikexueyuan.com/project/mcu-tutorial-three/images/58.png" alt="" />

圖18-4 Modbus 網(wǎng)絡(luò)體系結(jié)構(gòu)實例

Modbus 協(xié)議的整體架構(gòu)和格式比較復(fù)雜和龐大,在我們的課程里,我們重點介紹數(shù)據(jù)幀結(jié)構(gòu)和數(shù)據(jù)通信控制方式,作為一個入門級別的了解。如果大家要詳細(xì)了解,或者使用 Modbus 開發(fā)相關(guān)設(shè)備,可以查閱相關(guān)的國標(biāo)文件再進(jìn)行深入學(xué)習(xí)。

RTU 協(xié)議幀數(shù)據(jù)

Modbus 有兩種通信傳輸方式,一種是 ASCII 模式,一種是 RTU 模式。由于 ASCII 模式的數(shù)據(jù)字節(jié)是 7bit 數(shù)據(jù)位,51單片機無法實現(xiàn),而且實際應(yīng)用的也比較少,所以這里我們只用 RTU 模式。兩種模式相似,會用一種另外一種也就會了。一條典型的 RTU 數(shù)據(jù)幀如圖18-5所示。

http://wiki.jikexueyuan.com/project/mcu-tutorial-three/images/59.png" alt="" />

圖18-5 RTU 數(shù)據(jù)幀

與之前我們講解實用串口通信程序時用的原理相同,一次發(fā)送的數(shù)據(jù)幀必須是作為一個連續(xù)的數(shù)據(jù)流進(jìn)行傳輸。我們在實用串口通信程序中采用的方法是定義 30 ms,如果數(shù)據(jù)接收時超過了 30 ms 還沒有接收到下一個字節(jié),我們就認(rèn)為這次的數(shù)據(jù)結(jié)束。而 Modbus 的 RTU 模式規(guī)定不同數(shù)據(jù)幀之間的間隔是3.5個字節(jié)通信時間以上。如果在一幀數(shù)據(jù)完成之前有超過3.5個字節(jié)時間的停頓,接收設(shè)備將刷新當(dāng)前的消息并假定下一個字節(jié)是一個新的數(shù)據(jù)幀的開始。同樣的,如果一個新消息在小于3.5個字節(jié)時間內(nèi)接著前邊一個數(shù)據(jù)開始,接收設(shè)備將會認(rèn)為它是前一幀數(shù)據(jù)的延續(xù)。這將會導(dǎo)致一個錯誤,因此大家看 RTU 數(shù)據(jù)幀最后還有 16bit 的 CRC 校驗。

起始位和結(jié)束符:圖18-5上代表的是一個數(shù)據(jù)幀,前后都至少有3.5個字節(jié)的時間間隔,起始位和結(jié)束符實際上沒有任何數(shù)據(jù),T1-T2-T3-T4 代表的是時間間隔3.5個字節(jié)以上的時間,而真正有意義的第一個字節(jié)是設(shè)備地址。

設(shè)備地址:很多同學(xué)不理解,在多機通信的時候,數(shù)據(jù)那么多,我們依靠什么判斷這個數(shù)據(jù)幀是哪個設(shè)備的呢?沒錯,就是依靠這個設(shè)備地址字節(jié)。每個設(shè)備都有一個自己的地址,當(dāng)設(shè)備接收到一幀數(shù)據(jù)后,程序首先對設(shè)備地址字節(jié)進(jìn)行判斷比較,如果與自己的地址不同,則對這幀數(shù)據(jù)直接不予理會,如果與自己的地址相同,就要對這幀數(shù)據(jù)進(jìn)行解析,按照之后的功能碼執(zhí)行相應(yīng)的功能。如果地址是 0x00,則認(rèn)為是一個廣播命令,就是所有的從機設(shè)備都要執(zhí)行的指令。

功能代碼:在第二個字節(jié)功能代碼字節(jié)中,Modbus 規(guī)定了部分功能代碼,此外也保留了一部分功能代碼作為備用或者用戶自定義,這些功能碼大家不需要去記憶,甚至都不用去看,直到你用到的那天再過來查這個表格即可,如表18-1所示。

表 18-1 Modbus 功能碼
功能碼 名稱 作用
01 讀取線圈狀態(tài) 取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF)
02 讀取輸入狀態(tài) 取得一組開關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF)
03 讀取保持寄存器 在一個或多個保持寄存器中取得當(dāng)前的二進(jìn)制值
04 讀取輸入寄存器 在一個或多個輸入寄存器中取得當(dāng)前的二進(jìn)制值
05 強置單線圈 強置一個邏輯線圈的通斷狀態(tài)
06 預(yù)置單寄存器 把具體二進(jìn)值裝入一個保持寄存器
07 讀取異常狀態(tài) 取得?8?個內(nèi)部線圈的通斷狀態(tài),這?8?個線圈的地址由
控制器決定,用戶邏輯可以將這些線圈定義,以說明
從機狀態(tài),短報文適宜于迅速讀取狀態(tài)
08 回送診斷校驗 把診斷校驗報文送從機,以對通信處理進(jìn)行評鑒
09 編程(只用于?484) 使主機模擬編程器作用,修改?PC?從機邏輯
10 控詢(只用于?484) 可使主機與一臺正在執(zhí)行長程序任務(wù)從機通信,探詢
該從機是否已完成其操作任務(wù),僅在含有功能碼?9
的報文發(fā)送后,本功能碼才發(fā)送
11 讀取事件計數(shù) 可使主機發(fā)出單詢問,并隨即判定操作是否成功,尤
其是該命令或其它應(yīng)答產(chǎn)生通信錯誤時
12 讀取通信事件記錄 可使主機檢索每臺從機的?ModBus?事務(wù)處理通信事件
記錄。如果某項事務(wù)處理完成,記錄會給出有關(guān)錯誤
13 編程(184/384?484?584?) 可使主機模擬編程器功能修改?PC?從機邏輯
14 探詢(184/384?484?584) 可使主機與正在執(zhí)行任務(wù)的從機通信,定期控詢該從
機是否已完成其程序操作,僅在含有功能?13?的報文
發(fā)送后,本功能碼才得發(fā)送
15 強置多線圈 強置一串連續(xù)邏輯線圈的通斷
16 預(yù)置多寄存器 把具體的二進(jìn)制值裝入一串連續(xù)的保持寄存器
17 報告從機標(biāo)識 可使主機判斷編址從機的類型及該從機運行指示燈
的狀態(tài)
18 884?和?MICRO?84 可使主機模擬編程功能,修改?PC?狀態(tài)邏輯
19 重置通信鏈路 發(fā)生非可修改錯誤后,是從機復(fù)位于已知狀態(tài),可重
置順序字節(jié)
20 讀取通用參數(shù)(584L) 顯示擴(kuò)展存儲器文件中的數(shù)據(jù)信息
21 寫入通用參數(shù)(584L) 把通用參數(shù)寫入擴(kuò)展存儲文件,或修改
22~64 保留作擴(kuò)展功能備用 ?
65~72 保留以備用戶功能所用 留作用戶功能的擴(kuò)展編碼
73~119 非法功能 ?
120~127 保留 留作內(nèi)部作用
128~255 保留 用于異常應(yīng)答

程序?qū)δ艽a的處理,就是來檢測這個字節(jié)的數(shù)值,然后根據(jù)其數(shù)值來做相應(yīng)的功能處理。

數(shù)據(jù):跟在功能代碼后邊的是 n 個 8bit 的數(shù)據(jù)。這個 n 值的到底是多少,是功能代碼來確定的,不同的功能代碼后邊跟的數(shù)據(jù)數(shù)量不同。舉個例子,如果功能碼是 0x03,也就是讀保持寄存器,那么主機發(fā)送數(shù)據(jù) n 的組成部分就是:2個字節(jié)的寄存器起始地址,加2個字節(jié)的寄存器數(shù)量 N。從機數(shù)據(jù) n 的組成部分是:1個字節(jié)的字節(jié)數(shù),因為我們回復(fù)的寄存器的值是2個字節(jié),所以這個字節(jié)數(shù)也就是 2N 個,再加上 2N 個寄存器的值,如圖18-6所示。

http://wiki.jikexueyuan.com/project/mcu-tutorial-three/images/60.png" alt="" />

圖18-6 讀保持寄存器數(shù)據(jù)結(jié)構(gòu)

CRC 校驗:CRC 校驗是一種數(shù)據(jù)算法,是用來校驗數(shù)據(jù)對錯的。CRC 校驗函數(shù)把一幀數(shù)據(jù)除最后兩個字節(jié)外,前邊所有的字節(jié)進(jìn)行特定的算法計算,計算完后生成了一個 16bit 的數(shù)據(jù),作為 CRC 校驗碼,添加在一幀數(shù)據(jù)的最后。接收方接收到數(shù)據(jù)后,同樣會把前邊的字節(jié)進(jìn)行 CRC 計算,計算完了再和發(fā)過來的 16bit 的 CRC 數(shù)據(jù)進(jìn)行比較,如果相同則認(rèn)為數(shù)據(jù)正常,沒有出錯,如果比較不相同,則說明數(shù)據(jù)在傳輸中發(fā)生了錯誤,這幀數(shù)據(jù)將被丟棄,就像沒收到一樣,而發(fā)送方會在得不到回應(yīng)后做相應(yīng)的處理錯誤處理。

RTU 模式的每個字節(jié)的位是這樣分布的:1個起始位、8個數(shù)據(jù)位,最小有效位先發(fā)送、1個奇偶校驗位(如果無校驗則沒有這一位)、1位停止位(有校驗位時)或者2個停止位(無校驗位時)。