91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

安卓與串口通信入門(mén)之modbus(上)

jf_78858299 ? 來(lái)源:Android技術(shù)之家 ? 作者:Android技術(shù)之家 ? 2023-04-23 17:40 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前言

在之前的兩篇文章中,我們講解了串口的基礎(chǔ)知識(shí)和在安卓中使用串口通信的方法,如果還沒(méi)看過(guò)之前文章的同學(xué)們,建議先看一遍,不然可能會(huì)不理解這篇文章講的某些內(nèi)容。

事實(shí)上,在實(shí)際應(yīng)用中,我們很少會(huì)直接使用串口通信,一般都會(huì)使用到 Modbus。

因?yàn)檎缥疑掀恼滤f(shuō),如果直接使用串口通信的話(huà),需要我們自定義數(shù)據(jù)層協(xié)議,或者干脆就直接發(fā)送一個(gè) byte 的數(shù)字進(jìn)行通信,這顯然是不方便的,也不安全的。

例如我上篇提到過(guò)的一個(gè)問(wèn)題,我所使用的驅(qū)動(dòng)版廠(chǎng)商定義的協(xié)議中沒(méi)有定義數(shù)據(jù)長(zhǎng)度(或者在數(shù)據(jù)中附上數(shù)據(jù)長(zhǎng)度),也沒(méi)有定義停止符號(hào),這會(huì)導(dǎo)致出現(xiàn)“沾包”或“分包”情況時(shí)不好區(qū)分?jǐn)?shù)據(jù)。

并且自定義協(xié)議還需要自己去解析并處理數(shù)據(jù),使用起來(lái)不是那么方便。

所以,我司在嘗試過(guò)直接使用串口通信后,最終還是決定放棄直接使用串口通信,而是改用 Modbus 通信。

本篇文章屬于系列文章的擴(kuò)展篇,我們將講解 Modbus 的基礎(chǔ)知識(shí)以及如何在安卓中使用 Modbus。

本文中部分圖表來(lái)自文末標(biāo)注的參考資料

Modbs 基礎(chǔ)

簡(jiǎn)介

Modbus 是一種應(yīng)用層報(bào)文傳輸協(xié)議,由 Modicon 公司在 1979 年發(fā)布,是為了解決 PLC 通信而研發(fā)的協(xié)議。

因?yàn)?Modbus 是開(kāi)源的且無(wú)著作權(quán)要求、易于部署維護(hù)、可靠性強(qiáng)的特性,所以 Modbus 已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議事實(shí)上的業(yè)界標(biāo)準(zhǔn),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式。

由于 Modbus 定義的只是應(yīng)用層的報(bào)文協(xié)議,所以它可以使用串口(RS232、RS485)、以太網(wǎng)作為物理層接口

Modbus 分為三種傳輸模式:RTU、ASII、TCP。

在使用 Modbus 時(shí),所有設(shè)備的傳輸模式必須相同。

RTU 使用二進(jìn)制數(shù)據(jù)傳輸、ASCII 使用 ASCII 字符傳輸。

使用串口連接時(shí)支持 RTU 和 ASCII 模式。

使用以太網(wǎng)連接時(shí)支持 TCP 模式。

因?yàn)楸鞠盗形恼碌闹攸c(diǎn)在于講解串口通信,所以我們不過(guò)多講解 TCP 模式,同時(shí),由于 ASCII 模式在目前實(shí)際應(yīng)用中比較少,我們一般都是使用的 RTU 模式。故,我們會(huì)重點(diǎn)講解 Modbus RTU。如果對(duì)其他傳輸模式感興趣的可以閱讀參考資料 4 的文檔。

額外說(shuō)明一下,Modbus 和 RS232、RS485 的區(qū)別。

RS232、RS485定義的是物理層標(biāo)準(zhǔn),即接線(xiàn)方式,電平高低,數(shù)據(jù)傳輸方式等。

而 Modbus 是應(yīng)用層協(xié)議,即定義了上述物理層傳輸過(guò)來(lái)的數(shù)據(jù)應(yīng)該以什么樣的格式去解析。

Modbus RTU

使用串口作為物理層協(xié)議時(shí),通常采用的是 RS485 。

而我們?cè)诘谝黄恼戮驼f(shuō)過(guò),RS485 支持一主多從多個(gè)設(shè)備同時(shí)連接,所以使用 RS485 的 Modbus 同樣支持多個(gè)設(shè)備連接。在標(biāo)準(zhǔn)負(fù)載情況下,支持一個(gè)主機(jī)連接最多32個(gè)從機(jī)。并且在連接設(shè)備時(shí),只能使用菊花鏈連接,不能使用星型網(wǎng)絡(luò):

圖片

另外,Modbus 是一種請(qǐng)求/應(yīng)答協(xié)議,即只能通過(guò)主站(主機(jī))發(fā)送請(qǐng)求給從站后,從站響應(yīng)數(shù)據(jù)給主站,而不能從站直接主動(dòng)發(fā)送數(shù)據(jù)給主站。

儲(chǔ)存區(qū)數(shù)據(jù)模型

在 Modbus 中定義了4種不同的數(shù)據(jù)模型,具體如下:

名稱(chēng) 數(shù)據(jù)類(lèi)型 訪(fǎng)問(wèn)類(lèi)型 說(shuō)明
離散量輸入 單個(gè)比特(bit) 只讀 I/O系統(tǒng)提供
線(xiàn)圈 單個(gè)比特(bit) 讀寫(xiě) 可通過(guò)應(yīng)用程序改寫(xiě)
輸入寄存器 字(word,16bit) 只讀 I/O系統(tǒng)提供
保持寄存器 字(word,16bit) 讀寫(xiě) 可通過(guò)應(yīng)用程序改寫(xiě)

其中 線(xiàn)圈 和 離散量輸入 又可以稱(chēng)為 輸出線(xiàn)圈 和 輸入線(xiàn)圈。

它們的數(shù)據(jù)長(zhǎng)度都是一個(gè) bit,即只能表示 1 或 0,表現(xiàn)在程序中就是一個(gè) Boolean 類(lèi)型的數(shù)據(jù)。對(duì)于安卓程序員來(lái)說(shuō),可能會(huì)疑惑啥是線(xiàn)圈,其實(shí)這兩個(gè)模型之所以叫做線(xiàn)圈是因?yàn)?Modbus 是為了 PLC 通信而編寫(xiě)的協(xié)議,而在 PLC 中一些物理設(shè)備(例如繼電器)只有兩種狀態(tài):斷開(kāi)與接通(即 0 或 1 ,或者 Boolean 的 false 與 true ),這些物理設(shè)備的狀態(tài)切換一般都是依賴(lài)于線(xiàn)圈的通/斷電來(lái)實(shí)現(xiàn),所以在 Modbus 中就將這種類(lèi)型的數(shù)據(jù)稱(chēng)為 線(xiàn)圈。

而 輸入寄存器 和 保持寄存器 又可以稱(chēng)為 輸入寄存器 和 輸出寄存器。

它們的數(shù)據(jù)長(zhǎng)度是一個(gè) word,即 16 bit,2 byte,表現(xiàn)在程序中可以看成一個(gè) Int 類(lèi)型。

顯然,在同一個(gè)設(shè)備中不同的數(shù)據(jù)模型肯定不止一個(gè)可用的數(shù)據(jù)區(qū)塊,理論上來(lái)說(shuō),每種數(shù)據(jù)模型最大可以定義 65536 個(gè)數(shù)據(jù)區(qū)塊。

因此,每種數(shù)據(jù)模型的地址定義為如下:

數(shù)據(jù)模型 地址范圍
線(xiàn)圈 00001-09999
離散輸入 10001-19999
輸入寄存器 30001-39999
保持寄存器 40001-49999

可以看到,雖然我們上面說(shuō)每種模型理論上支持 65536 個(gè)數(shù)據(jù)區(qū)塊,但是實(shí)際使用中每種數(shù)據(jù)模型一般都只會(huì)定義最大 10000 個(gè)數(shù)據(jù)區(qū)塊。

Modbus 允許將四種不同的數(shù)據(jù)模型存放在不同的數(shù)據(jù)區(qū)塊,這樣使用不同的功能碼(下面會(huì)說(shuō)什么是功能碼)讀到的是不同的數(shù)據(jù):

圖片

同時(shí),Modbus 也可以將不同的數(shù)據(jù)模型映射到同一個(gè)數(shù)據(jù)區(qū)塊中,這樣一來(lái),不同的功能碼讀取到的可能是相同的數(shù)據(jù):

圖片

功能碼

在上一節(jié)我們介紹了儲(chǔ)存區(qū)數(shù)據(jù)模型,那么我們要如何去讀取不同的數(shù)據(jù)模型數(shù)據(jù)呢?或者說(shuō),在 Modbus 中是怎么區(qū)分不同的數(shù)據(jù)模型?

此時(shí),就要用到 功能碼。

在 Modbus 中定義了三種類(lèi)型的功能碼:

  • 公共功能碼 :Modbus 組織定義的標(biāo)準(zhǔn)的公開(kāi)的通用的功能碼,包括已定義的和保留的功能碼
  • 用戶(hù)自定義功能碼 :用戶(hù)可以自定義自己需要的功能碼,范圍在 65-72 和 100-110(都是十進(jìn)制)之間。
  • 保留功能碼 :一些公司的傳統(tǒng)設(shè)備中使用的功能碼,對(duì)公共功能碼無(wú)效。

圖片

公共功能碼定義了如下幾種:

圖片

而我們一般會(huì)使用到的有以下幾種:

圖片

可以看到,我們常用的有 8 個(gè)功能碼,其實(shí)仔細(xì)一看就能看出不過(guò)是讀所有數(shù)據(jù)模型;以及可寫(xiě)數(shù)據(jù)模型和寫(xiě)單個(gè)/寫(xiě)多個(gè)的排列組合。

讀取數(shù)據(jù)時(shí)所有數(shù)據(jù)模型均支持只讀取單個(gè)和同時(shí)讀取多個(gè)數(shù)據(jù),并且使用的都是同一個(gè)功能碼。

寫(xiě)入數(shù)據(jù)同樣支持只寫(xiě)入單個(gè)數(shù)據(jù)和同時(shí)寫(xiě)入多個(gè)數(shù)據(jù),但是寫(xiě)入單個(gè)和寫(xiě)入多個(gè)的功能碼是分開(kāi)的。

可能有細(xì)心的讀者發(fā)現(xiàn)了,為什么表中的所有 寄存器地址 都是一樣的啊,這是因?yàn)樯媳碇械?PLC 地址使用的是絕對(duì)地址,一般用于文檔中或程序中。

而實(shí)際設(shè)備的寄存器地址則使用的是相對(duì)地址。由于我們已經(jīng)通過(guò)功能碼區(qū)分開(kāi)了不同的數(shù)據(jù)區(qū)塊,所以為了節(jié)約傳輸時(shí)的字節(jié)占用,直接使用相對(duì)地址即可(如果使用絕對(duì)地址,那么現(xiàn)在的字節(jié)數(shù)不夠表示所有地址)。

主/從站

上文中提到過(guò),使用串口的 Modbus 是主-從協(xié)議。即,在同一時(shí)刻,只有一個(gè)主節(jié)點(diǎn)和一個(gè)或多個(gè)子節(jié)點(diǎn)連接在同一個(gè)串行總線(xiàn)上。

Modbus 的通信總是由主節(jié)點(diǎn)發(fā)起,子節(jié)點(diǎn)響應(yīng)。并且子節(jié)點(diǎn)之間不會(huì)相互通信。

在 Modbus 中,主節(jié)點(diǎn)沒(méi)有地址,每個(gè)子節(jié)點(diǎn)都有自己唯一的地址(1-247),通常稱(chēng)為從站地址。

主節(jié)點(diǎn)有兩種方式發(fā)出請(qǐng)求:?jiǎn)尾ツJ脚c廣播模式。

圖片

在單播模式中,主站(主節(jié)點(diǎn))發(fā)送一個(gè)帶有從站(子節(jié)點(diǎn))地址的請(qǐng)求給當(dāng)前連接的所有設(shè)備,但是只有從站地址符合的從站會(huì)響應(yīng)該請(qǐng)求,并返回?cái)?shù)據(jù)。其他設(shè)備不會(huì)響應(yīng)也不會(huì)執(zhí)行任何操作(讀取到地址不符合后直接拋棄這個(gè)請(qǐng)求報(bào)文)。在這個(gè)模式中會(huì)產(chǎn)生兩個(gè)報(bào)文:主站的請(qǐng)求報(bào)文和從站的響應(yīng)報(bào)文。

在廣播模式中所有從站都不會(huì)發(fā)送響應(yīng)報(bào)文給主站,但是會(huì)執(zhí)行請(qǐng)求的操作,并且主站的請(qǐng)求會(huì)發(fā)送給所有從站。廣播模式一般用于寫(xiě)數(shù)據(jù)。此時(shí)主站發(fā)送的請(qǐng)求報(bào)文中的從站地址為 0 ,表示廣播。

數(shù)據(jù)幀

一個(gè) Modbus RTU 的報(bào)文幀由 4 個(gè)部分組成:

8位從站地址+8位功能碼+最大252*8位數(shù)據(jù)+16位差錯(cuò)校驗(yàn)

圖片

在 RTU 中通常使用的錯(cuò)誤校驗(yàn)方式是 CRC 校驗(yàn)(眼熟嗎?CRC 又出現(xiàn)了)

不知道你們有沒(méi)有發(fā)現(xiàn),這里的功能碼使用了 2 byte ,但是上面介紹功能碼時(shí)明明最大才到 127 ,那么剩下的一半去哪兒呢?

在 Modbus 定義中,從機(jī)如果能夠正確處理主機(jī)的請(qǐng)求,則返回報(bào)文中的功能碼將和主機(jī)請(qǐng)求的功能碼一樣,如果出現(xiàn)錯(cuò)誤,無(wú)法正確的處理請(qǐng)求,則從機(jī)返回報(bào)文的功能碼將是最高位為 1 的功能碼,即 128-255 。

數(shù)據(jù)位在不同的功能碼以及主機(jī)請(qǐng)求還有從機(jī)響應(yīng)都有不同的數(shù)據(jù)內(nèi)容和長(zhǎng)度,例如請(qǐng)求讀取線(xiàn)圈則數(shù)據(jù)位的內(nèi)容為:2字節(jié)數(shù)據(jù)表示讀取線(xiàn)圈起始地址+2字節(jié)數(shù)據(jù)表示要讀取的線(xiàn)圈數(shù)量。

此時(shí)從機(jī)將會(huì)按照請(qǐng)求讀取的線(xiàn)圈數(shù)量返回?cái)?shù)據(jù),數(shù)據(jù)格式為:1字節(jié)表示數(shù)據(jù)的字節(jié)數(shù)+N字節(jié)表示讀取到線(xiàn)圈狀態(tài)數(shù)據(jù)。如果讀取到的線(xiàn)圈狀態(tài)數(shù)據(jù)不是 8 位的整數(shù),則會(huì)在后面填充 0 使其滿(mǎn)足 8 位的倍數(shù)。

圖片

數(shù)據(jù)位在某些情況下,可以為空。

下面舉一個(gè)數(shù)據(jù)幀的完整例子(例子來(lái)自參考資料 1)。

我們有一個(gè)從站是溫濕度傳感器,從站地址為 1,它會(huì)將采集到的濕度寫(xiě)入保持寄存器的 40001 區(qū)塊中;溫度寫(xiě)入保持寄存器的 40002 區(qū)塊中。此時(shí)我們發(fā)送讀取保持寄存器請(qǐng)求去獲取它的溫濕度信息。

則,主機(jī)的請(qǐng)求報(bào)文為:

0103040146013B5A59

分別拆解這個(gè)數(shù)據(jù)幀為:

01 :從站地址

03 :功能碼,讀保持寄存器

00 00 :讀取的起始寄存器地址(對(duì)應(yīng) 40001 的相對(duì)地址)

00 02 :讀取的寄存器長(zhǎng)度(這里表示連續(xù)讀取兩個(gè)寄存器)

C4 0B :CRC校驗(yàn)碼

從機(jī)在接收到請(qǐng)求后,響應(yīng)報(bào)文為:

0103040146013B5A59

拆解數(shù)據(jù):

01:從站地址

03: 功能碼,讀保持寄存器

04 :讀取到的數(shù)據(jù)的字節(jié)長(zhǎng)度(這里表示4字節(jié))

01 46 01 3B :讀取到的數(shù)據(jù),前兩個(gè)字節(jié)為濕度(換算成十進(jìn)制為 326 ,即 32.6% ),后兩個(gè)字節(jié)為溫度(十進(jìn)制為 315,即 31.5 攝氏度)

5A 59 :CRC校驗(yàn)碼

這里提一句,別糾結(jié)為啥讀取到的溫濕度的值要除以 10 才是實(shí)際值,因?yàn)檫@是溫濕度傳感器廠(chǎng)家定義的。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • MODBUS
    +關(guān)注

    關(guān)注

    28

    文章

    2457

    瀏覽量

    83188
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1662

    瀏覽量

    57962
  • 安卓
    +關(guān)注

    關(guān)注

    5

    文章

    2184

    瀏覽量

    60251
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    入門(mén)

    入門(mén)必備!?。。。。。。。。。。。?!
    發(fā)表于 03-11 10:53

    為何選擇智炫胎壓監(jiān)測(cè)?

    本帖最后由 recheid 于 2016-9-24 14:39 編輯 一、目前市場(chǎng)接大屏導(dǎo)航的胎壓監(jiān)測(cè)分為兩種第一種:串口通信胎壓監(jiān)測(cè)。
    發(fā)表于 09-24 10:21

    串口MODBUS教程1_入門(mén)教程

    串口MODBUS教程1_入門(mén)教程
    發(fā)表于 08-05 16:29

    板子下用什么樣的藍(lán)牙串口通信程序遙控

    問(wèn)問(wèn)各位的板子下用什么樣的藍(lán)牙串口通信程序遙控?
    發(fā)表于 07-17 06:58

    為何要將CH340的ATD+Eclipse工程移植到AndroidStudio

    CH340與Android串口通信為何要將CH340的ATD+Eclipse工程移植到AndroidStudio移植的具體步驟CH3
    發(fā)表于 08-09 06:42

    與ESP8266串口WIFI模塊的通信實(shí)現(xiàn)相關(guān)資料推薦

    Button分別對(duì)應(yīng)相應(yīng)的功能鍵。通信實(shí)現(xiàn)原理使用基于tcp協(xié)議的socket通信。串口WiFi模塊配置成tcp Service模式,然后
    發(fā)表于 01-18 08:34

    HAL庫(kù)入門(mén)串口通信學(xué)習(xí)經(jīng)驗(yàn)分享

    HAL庫(kù)入門(mén)串口通信學(xué)習(xí)經(jīng)驗(yàn)分享
    發(fā)表于 02-15 06:56

    設(shè)備如何通過(guò)USB與多串設(shè)備通信?

    本Demo僅適用于支持USB Host功能的設(shè)備與單個(gè)CH9342/CH9344多串設(shè)備通信。 點(diǎn)擊Scan按鈕,掃描并顯示多串設(shè)備,如下圖所示 點(diǎn)擊打開(kāi)相應(yīng)的設(shè)備,將自動(dòng)獲取串口
    發(fā)表于 07-11 07:47

    單片機(jī)串口通信485modbus

    單片機(jī)串口通信485modbus.doc單片機(jī)串口通信485modbus.doc
    發(fā)表于 07-12 10:42 ?131次下載

    【HAL庫(kù)】串口通信

    HAL庫(kù)入門(mén)串口通信學(xué)習(xí)經(jīng)驗(yàn)分享
    發(fā)表于 12-16 16:58 ?5次下載
    【HAL庫(kù)】<b class='flag-5'>串口</b><b class='flag-5'>通信</b>

    用單片機(jī)串口modbus poll 進(jìn)行通信

    由于程序中我的stm32單片機(jī)都是做的從機(jī)來(lái)和主機(jī)進(jìn)行通信的,都是modbus協(xié)議通過(guò)串口來(lái)實(shí)現(xiàn)通信的。之前為了調(diào)通串口,所以用的是單片機(jī)的
    發(fā)表于 12-28 20:04 ?23次下載
    用單片機(jī)<b class='flag-5'>串口</b>和<b class='flag-5'>modbus</b> poll 進(jìn)行<b class='flag-5'>通信</b>

    串口通信入門(mén)modbus(下)

    在之前的兩篇文章中,我們講解了串口的基礎(chǔ)知識(shí)和在中使用串口通信的方法,如果還沒(méi)看過(guò)之前文章的同學(xué)們,建議先看一遍,不然可能會(huì)不理解這篇文
    的頭像 發(fā)表于 04-23 17:40 ?7152次閱讀
    <b class='flag-5'>安</b><b class='flag-5'>卓</b>與<b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>入門(mén)</b><b class='flag-5'>之</b><b class='flag-5'>modbus</b>(下)

    端的串口通信實(shí)踐講解2

    這篇文章我們將講解端的串口通信實(shí)踐,即如何使用串口通信實(shí)現(xiàn)
    的頭像 發(fā)表于 04-23 17:59 ?2563次閱讀
    <b class='flag-5'>安</b><b class='flag-5'>卓</b>端的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>實(shí)踐講解2

    端的串口通信實(shí)踐講解1

    這篇文章我們將講解端的串口通信實(shí)踐,即如何使用串口通信實(shí)現(xiàn)
    的頭像 發(fā)表于 04-23 17:59 ?3812次閱讀
    <b class='flag-5'>安</b><b class='flag-5'>卓</b>端的<b class='flag-5'>串口</b><b class='flag-5'>通信</b>實(shí)踐講解1

    串口Modbus教程1_入門(mén)教程V1.0

    串口Modbus教程1_入門(mén)教程V1.0
    發(fā)表于 04-29 13:29 ?21次下載