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

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

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

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

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

Modbus 協(xié)議特點(diǎn)

Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(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í)使用的數(shù)據(jù)結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了控制器請(qǐng)求訪問(wèn)其它設(shè)備的過(guò)程,如何回應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤記錄,它制定了通信數(shù)據(jù)的格局和內(nèi)容的公共格式。

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

Modbus 協(xié)議允許在各種網(wǎng)絡(luò)體系結(jié)構(gòu)內(nèi)進(jìn)行簡(jiǎn)單通信,每種設(shè)備(PLC、人機(jī)界面、控制面板、驅(qū)動(dòng)程序、輸入輸出設(shè)備等)都能使用 Modbus 協(xié)議來(lái)啟動(dòng)遠(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)實(shí)例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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