<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > modbus通訊協(xié)議詳解

modbus通訊協(xié)議詳解

發(fā)布人:電子禪石 時(shí)間:2021-07-31 來(lái)源:工程師 發(fā)布文章
modbus通訊協(xié)議詳解


1、Modbus 協(xié)議簡(jiǎn)介  

  Modbus協(xié)議是一種已廣泛應用于當今工業(yè)控制領(lǐng)域的通用通訊協(xié)議。通過(guò)此協(xié)議,控制器相互之間、或控制器經(jīng)由網(wǎng)絡(luò )(如以太網(wǎng))可以和其它設備之間進(jìn)行通信。Modbus協(xié)議使用的是主從通訊技術(shù),即由主設備主動(dòng)查詢(xún)和操作從設備。一般將主控設備方所使用的協(xié)議稱(chēng)為Modbus Master,從設備方使用的協(xié)議稱(chēng)為Modbus Slave。典型的主設備包括工控機和工業(yè)控制器等;典型的從設備如PLC可編程控制器等。

  Modbus通訊物理接口可以選用串口(包括RS232、RS485和RS422),也可以選擇以太網(wǎng)口。其通信遵循以下的過(guò)程:

  • 主設備向從設備發(fā)送請求

  • 從設備分析并處理主設備的請求,然后向主設備發(fā)送結果

  • 如果出現任何差錯,從設備將返回一個(gè)異常功能碼 

  此協(xié)議定義了一個(gè)控制器能認識使用的消息結構,而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò )進(jìn)行通信的。它描述了一控制器請求訪(fǎng)問(wèn)其它設備的過(guò)程,如何回應來(lái)自其它設備的請求,以及怎樣偵測錯誤并記錄。它制定了消息域格局和內容的公共格式。 

    當在Modbus網(wǎng)絡(luò )上通信時(shí),此協(xié)議決定了每個(gè)控制器須要知道它們的設備地址,識別按地址發(fā)來(lái)的消息,決定要產(chǎn)生何種行動(dòng)。如果需要回應,控制器將生成反饋信息并用Modbus協(xié)議發(fā)出。在其它網(wǎng)絡(luò )上,包含了Modbus協(xié)議的消息轉換為在此網(wǎng)絡(luò )上使用的幀或包結構。這種轉換也擴展了根據具體的網(wǎng)絡(luò )解決節地址、路由路徑及錯誤檢測的方法。

  Modbus的工作方式是請求/應答,每次通訊都是主站先發(fā)送指令,可以是廣播,或是向特定從站的單播;從站響應指令,并按要求應答,或者報告異常。當主站不發(fā)送請求時(shí),從站不會(huì )自己發(fā)出數據,從站和從站之間不能直接通訊。

  Modbus協(xié)議是應用層(協(xié)議層)報文傳輸協(xié)議,它定義了一個(gè)與物理層無(wú)關(guān)的協(xié)議數據單元(PDU),即PDU=功能碼+數據域,功能碼1byte,數據域不確定。

  Modbus協(xié)議能夠應用在不同類(lèi)型的總線(xiàn)或網(wǎng)絡(luò )。對應不同的總線(xiàn)或網(wǎng)絡(luò ),Modbus協(xié)議引入一些附加域映射成應用數據單元(ADU),即ADU=附加域+PDU,例如modbus tcp/ip------ ADU=MBAP+ADU。

2、Modbus 通訊方式 

  2.1、Modbus三種通訊方式

    Modbus有下列三種通信方式:

   ?。?)、以太網(wǎng):對應的通信模式是Modbus TCP/IP

   ?。?)、異步串行傳輸(各種介質(zhì)如有線(xiàn)RS-232-/422/485/;光纖、無(wú)線(xiàn)等):對應的通信模式是Modbus RTUModbus  ASCII

   ?。?)、高速令牌傳遞網(wǎng)絡(luò ):對應的通信模式是Modbus PLUS

    Modbus RTU和Modbus ASCII協(xié)議應用于串口鏈接(RS232、RS485、RS422),Modbus tcp/ip協(xié)議應用于以太網(wǎng)鏈接。

  2.2、在Modbus網(wǎng)絡(luò )上傳輸

       標準的Modbus口是使用RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號位、傳輸波特率、奇偶校驗??刂破髂苤苯踊蚪?jīng)由Modem組網(wǎng)。 

       控制器通信使用主/從技術(shù),即僅一設備(主設備)能初始化傳輸(查詢(xún))。其它設備(從設備)根據主設備查詢(xún)提供的數據作出相應反應。

         典型的主設備:主機和可編程儀表。

         典型的從設備:可編程控制器。 

      主設備可單獨和從設備通信,也能以廣播方式和所有從設備通信。如果單獨通信,從設備返回一消息作為回應,如果是以廣播方式查詢(xún)的,則不作任何回應。

    Modbus協(xié)議建立了主設備查詢(xún)的格式:設備(或廣播)地址、功能代碼、所有要發(fā)送的數據、一錯誤檢測域。 

      從設備回應消息也由Modbus協(xié)議構成,包括確認要行動(dòng)的域、任何要返回的數據、和一錯誤檢測域。如果在消息接收過(guò)程中發(fā)生一錯誤,或從設備不能執行其命令,從設備將建立一錯誤消息并把它作為回應發(fā)送出去。

  2.3、在其它類(lèi)型網(wǎng)絡(luò )上轉輸

      在其它網(wǎng)絡(luò )上,控制器使用對等技術(shù)通信,故任何控制都能初始和其它控制器的通信。這樣在單獨的通信過(guò)程中,控制器既可作為主設備也可作為從設備。提供的多個(gè)內部通道可允許同時(shí)發(fā)生的傳輸進(jìn)程。 

      在消息位,Modbus協(xié)議仍提供了主/從原則,盡管網(wǎng)絡(luò )通信方法是“對等”。如果一控制器發(fā)送一消息,它只是作為主設備,并期望從從設備得到回應。同樣,當控制器接收到一消息,它將建立一從設備回應格式并返回給發(fā)送的控制器。

  2.4、查詢(xún)---回應

 ?。?)、查詢(xún)

    查詢(xún)消息中的功能代碼告之被選中的從設備要執行何種功能。數據段包含了從設備要執行功能的任何附加信息。例如功能代碼03是要求從設備讀保持寄存器并返回它們的內容。數據段必須包含要告之從設備的信息:從何寄存器開(kāi)始讀及要讀的寄存器數量。錯誤檢測域為從設備提供了一種驗證消息內容是否正確的方法。

 ?。?)、回應

     如果從設備產(chǎn)生正常的回應,在回應消息中的功能代碼是在查詢(xún)消息中的功能代碼的回應。數據段包括了從設備收集的數據:象寄存器值或狀態(tài)。如果有錯誤發(fā)生,功能代碼將被修改以用于指出回應消息是錯誤的,同時(shí)數據段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設備確認消息內容是否可用。

3、三種通訊方式的報文格式

  Modbus協(xié)議的報文(或幀)的基本格式是:表頭 + 功能碼 + 數據區 + 校驗碼

  功能碼和數據區在不同類(lèi)型的網(wǎng)絡(luò )都是固定不變的,表頭和校驗碼則因網(wǎng)絡(luò )底層的實(shí)現方式不同而有所區別。表頭包含了從站的地址,功能碼告訴從站要執行何種功能,數據區是具體的信息。

  對于不同類(lèi)型的網(wǎng)絡(luò ),Modbus的協(xié)議層實(shí)現是一樣的,區別在于下層的實(shí)現方式,常見(jiàn)的有TCP/IP和串行通訊兩種。

  Modbus TCP基于以太網(wǎng)和TCP/IP協(xié)議,Modbus RTU和Modbus ASCII則是使用異步串行傳輸(通常是RS-232/422/485)。

 

  如圖所示,串行傳輸的物理層是RS-485或RS-232,數據鏈路層是Modbus的串行傳輸協(xié)議;Modbus TCP傳輸的1、2、3、4層實(shí)現和日常所見(jiàn)的以太網(wǎng)、因特網(wǎng)一樣,Modbus默認采用的TCP端口號是502。

  3.1、以太網(wǎng)(modbus  tcp/ip)

  對于Modbus TCP而言,主站通常稱(chēng)為Client,從站稱(chēng)為Server;而對于Modbus RTU和Modbus ASCII來(lái)說(shuō),主站是Master,從站是Slave。

  ModbusTCP的數據幀可分為兩部分:ADU=MBAP+PDU = MBAP + 功能碼 + 數據域,MBAP  7byte,功能碼1byte,數據域不確定,由具體功能決定。

  MBAP為報文頭,長(cháng)度為7字節,組成如下:

事務(wù)處理標識協(xié)議標識長(cháng)度單元標識符
2byte2byte2byte1byte

 

 

 

內容解釋
事務(wù)處理標識可以理解為報文的序列號,一般每次通信之后就要加1以區別不同的通信數據報文
協(xié)議標識符00 00表示ModbusTCP協(xié)議
長(cháng)度表示接下來(lái)的數據長(cháng)度,單位為字節
單元標識符可以理解為設備地址

   

 

 

 

 

 

 

  下圖說(shuō)明了Modbus TCP的改動(dòng):

 ?。?)、取消了校驗位。數據鏈路層上就進(jìn)行了CRC-32的校驗,TCP/IP是面向連接的可靠性的協(xié)議,因此沒(méi)必要再加上校驗位。

 ?。?)、Slave地址換成了Unit Identifier。當網(wǎng)絡(luò )里的設備全是使用TCP/IP,這個(gè)地址是沒(méi)有意義的,因為IP就能進(jìn)行路由尋址。如果網(wǎng)絡(luò )里還有串行通訊的設備,則需要網(wǎng)關(guān)來(lái)實(shí)現Modbus TCP到Modbus RTU或ASCII之間的協(xié)議轉換,這時(shí)用Unit Identifier來(lái)標識網(wǎng)關(guān)后面的每個(gè)串行通訊設備。

 ?。?)、Length是指后面的字節總數。實(shí)際上數據區的長(cháng)度是能確定的,有的功能碼就可以確定數據區的長(cháng)度,有的功能碼雖不能確定數據區長(cháng)度,但是數據區有字節計數,參見(jiàn)上文舉的從站應答的例子。表頭增加的Length是為了應對有些情況下TCP/IP協(xié)議會(huì )將應用層的數據拆包傳輸。

 ?。?)、Transaction Identifier和Protocol Identifier由Client生成,Server的響應將復制這些參數。

    3.1.1、modbus tcp/ip通信方式

    Modbus設備可分為主站(poll)和從站(slave)。主站只有一個(gè),從站有多個(gè),主站向各從站發(fā)送請求幀,從站給予響應。在使用TCP通信時(shí),主站為client端,主動(dòng)建立連接;從站為server端,等待連接。


    • 主站請求:功能碼+數據

    • 從站正常響應:請求功能碼+響應數據

    • 從站異常響應:異常功能碼+異常碼,其中異常功能碼即將請求功能碼的最高有效位置1,異常碼指示差錯類(lèi)型

    • 注意:需要超時(shí)管理機制,避免無(wú)期限的等待可能不出現的應答


    IANA(Internet Assigned Numbers Authority,互聯(lián)網(wǎng)編號分配管理機構)給Modbus協(xié)議賦予TCP端口號為502,這是目前在儀表與自動(dòng)化行業(yè)中唯一分配到的端口號。

    3.1.2、通信過(guò)程

      A、connect 建立TCP連接

      B、準備Modbus報文

      C、使用send命令發(fā)送報文

      D、在同一連接下等待應答

      E、使用recv命令讀取報文,完成一次數據交換

      F、通信任務(wù)結束時(shí),關(guān)閉TCP連接

  3.2、異步串行傳輸的兩種傳輸方式(modbus RTU和modbus ASCII)

     異步串行傳輸時(shí), 控制器可以設置為兩種傳輸模式(ASCII或RTU)中的任何一種在標準的Modbus網(wǎng)絡(luò )通信。用戶(hù)選擇想要的模式,包括串口通信參數(波特率、校驗方式等),在配置每個(gè)控制器的時(shí)候,在一個(gè)Modbus網(wǎng)絡(luò )上的所有設備都必須選擇相同的傳輸模式和串口參數。

    ASCII模式:

起始位設備地址功能代碼數據數量數據LRC高字節LRC低字節結束符
2*8bit2*8bitnn*8bit8bit8bitCR、LF(回車(chē)、換行)

 

  

 

  RTU模式:

起始位設備地址功能代碼數據數量數據CRC低字節CRC高字節結束符
無(wú)8bit8bitnn*8bit8bit8bit無(wú)

     

    

 

    3.2.1、ASCII模式

      當控制器設為在Modbus網(wǎng)絡(luò )上以ASCII(美國標準信息交換代碼)模式通信,在消息中的每個(gè)8Bit字節都作為兩個(gè)ASCII字符發(fā)送。這種方式的主要優(yōu)點(diǎn)是字符發(fā)送的時(shí)間間隔可達到1秒而不產(chǎn)生錯誤。

    代碼系統:


    • 十六進(jìn)制,ASCII字符0...9,A...F

    • 消息中的每個(gè)ASCII字符都是一個(gè)十六進(jìn)制字符組成

    • 每個(gè)字節的位:1個(gè)起始位、7個(gè)數據位(最小的有效位先發(fā)送)、1個(gè)奇偶校驗位(無(wú)校驗則無(wú))、1個(gè)停止位(有校驗時(shí))、2個(gè)Bit(無(wú)校驗時(shí))

    • 錯誤檢測域:LRC(縱向冗長(cháng)檢測)


    3.2.2、RTU模式

       當控制器設為在Modbus網(wǎng)絡(luò )上以RTU(遠程終端單元)模式通信,在消息中的每個(gè)8Bit字節包含兩個(gè)4Bit的十六進(jìn)制字符。這種方式的主要優(yōu)點(diǎn)是:在同樣的波特率下,可比ASCII方式傳送更多的數據。

    代碼系統:


    • 8位二進(jìn)制,十六進(jìn)制數0...9,A...F

    • 消息中的每個(gè)8位域都是兩個(gè)十六進(jìn)制字符組成

    • 每個(gè)字節的位:1個(gè)起始位、8個(gè)數據位(最小的有效位先發(fā)送)、1個(gè)奇偶校驗位(無(wú)校驗則無(wú))、1個(gè)停止位(有校驗時(shí)),2個(gè)Bit(無(wú)校驗時(shí))

    • 錯誤檢測域:CRC(循環(huán)冗長(cháng)檢測)


    3.2.3、RTU和ASCII的區別

   ?。?)、RTU模式下,一個(gè)字節的數據,傳輸的就是一個(gè)字節。ASCII模式下,同樣一個(gè)字節數據用了兩個(gè)字節來(lái)傳輸。例如,要傳輸數字0x5B,RTU傳輸的是0101 1011(二進(jìn)制),而ASCII傳輸的是00110101和01000010??梢?jiàn),ASCII傳輸的速率是RTU的一半?! ?/p>

   ?。?)、ASCII模式采用LRC校驗,RTU模式采用16位CRC校驗。

   ?。?)、ASCII有開(kāi)始標記和結束標記,RTU沒(méi)有

4、Modbus RTU和Modbus ASCII消息幀

     兩種傳輸模式中(ASCII或RTU),傳輸設備以將Modbus消息轉為有起點(diǎn)和終點(diǎn)的幀,這就允許接收的設備在消息起始處開(kāi)始工作,讀地址分配信息,判斷哪一個(gè)設備被選中(廣播方式則傳給所有設備),判知何時(shí)信息已完成。部分的消息也能偵測到并且錯誤能設置為返回結果。

  4.1、ASCII幀

   使用ASCII模式,消息以冒號(:)字符(ASCII碼 3AH)開(kāi)始,以回車(chē)換行符結束(ASCII碼 0DH,0AH)。 

   其它域可以使用的傳輸字符是十六進(jìn)制的0...9,A...F。網(wǎng)絡(luò )上的設備不斷偵測“:”字符,當有一個(gè)冒號接收到時(shí),每個(gè)設備都解碼下個(gè)域(地址域)來(lái)判斷是否發(fā)給自己的。 

   消息中字符間發(fā)送的時(shí)間間隔最長(cháng)不能超過(guò)1秒,否則接收的設備將認為傳輸錯誤。一個(gè)典型消息幀如下所示:

起始位設備地址功能代碼數據LRC校驗結束符
1個(gè)字符2個(gè)字符2個(gè)字符n個(gè)字符2個(gè)字符2個(gè)字符

 

  

 

  4.2、RTU幀

    使用RTU模式,消息發(fā)送至少要以3.5個(gè)字符時(shí)間的停頓間隔開(kāi)始。在網(wǎng)絡(luò )波特率下多樣的字符時(shí)間,這是最容易實(shí)現的(如下圖的T1-T2-T3-T4所示)。傳輸的第一個(gè)域是設備地址??梢允褂玫膫鬏斪址鞘M(jìn)制的0...9,A...F。網(wǎng)絡(luò )設備不斷偵測網(wǎng)絡(luò )總線(xiàn),包括停頓間隔時(shí)間內。當第一個(gè)域(地址域)接收到,每個(gè)設備都進(jìn)行解碼以判斷是否發(fā)往自己的。在最后一個(gè)傳輸字符之后,一個(gè)至少3.5個(gè)字符時(shí)間的停頓標定了消息的結束。一個(gè)新的消息可在此停頓后開(kāi)始。 

    整個(gè)消息幀必須作為一連續的流轉輸。如果在幀完成之前有超過(guò)1.5個(gè)字符時(shí)間的停頓時(shí)間,接收設備將刷新不完整的消息并假定下一字節是一個(gè)新消息的地址域。同樣地,如果一個(gè)新消息在小于3.5個(gè)字符時(shí)間內接著(zhù)前個(gè)消息開(kāi)始,接收的設備將認為它是前一消息的延續。這將導致一個(gè)錯誤,因為在最后的CRC域的值不可能是正確的。一典型的消息幀如下所示:

起始位設備地址功能代碼數據CRC校驗結束符
T1-T2-T3-T48Bit8Bitn個(gè)8Bit16BitT1-T2-T3-T4

 

  

 

  4.3、兩種幀的分析

 ?。?)、地址域

    消息幀的地址域包含兩個(gè)字節(ASCII)或一個(gè)字節(RTU)??赡艿膹脑O備地址是0...247 (十進(jìn)制)。單個(gè)設備的地址范圍是1...247。主設備通過(guò)將要聯(lián)絡(luò )的從設備的地址放入消息中的地址域來(lái)選通從設備。當從設備發(fā)送回應消息時(shí),它把自己的地址放入回應的地址域中,以便主設備知道是哪一個(gè)設備作出回應。 

    地址0是用作廣播地址,以使所有的從設備都能認識。當Modbus協(xié)議用于更高水準的網(wǎng)絡(luò ),廣播可能不允許或以其它方式代替。

 ?。?)、如何處理功能域

    消息幀中的功能代碼域包含了兩個(gè)字節(ASCII)或一個(gè)字節(RTU)??赡艿拇a范圍是十進(jìn)制的1...255。當然,有些代碼是適用于所有控制器,有此是應用于某種控制器,還有些保留以備后用。 

    當消息從主設備發(fā)往從設備時(shí),功能代碼域將告之從設備需要執行哪些行為。例如去讀取輸入的開(kāi)關(guān)狀態(tài),讀一組寄存器的數據內容,讀從設備的診斷狀態(tài),允許調入、記錄、校驗在從設備中的程序等。 

    當從設備回應時(shí),它使用功能代碼域來(lái)指示是正?;貞?無(wú)誤)還是有某種錯誤發(fā)生(稱(chēng)作異議回應)。對正?;貞?,從設備僅回應相應的功能代碼。對異議回應,從設備返回一等同于正常代碼的代碼,但最重要的位置為邏輯1。

    例如:一從主設備發(fā)往從設備的消息要求讀一組保持寄存器,將產(chǎn)生如下功能代碼:0 0 0 0 0 0 1 1 (十六進(jìn)制03H)

    對正?;貞?,從設備僅回應同樣的功能代碼。對異議回應,它返回:1 0 0 0 0 0 1 1 (十六進(jìn)制83H)

    除功能代碼因異議錯誤作了修改外,從設備將一獨特的代碼放到回應消息的數據域中,這能告訴主設備發(fā)生了什么錯誤。

    主設備應用程序得到異議的回應后,典型的處理過(guò)程是重發(fā)消息,或者診斷發(fā)給從設備的消息并報告給操作員。

 ?。?)、數據域

     數據域是由兩個(gè)十六進(jìn)制數集合構成的,范圍00...FF。根據網(wǎng)絡(luò )傳輸模式,這可以是由一對ASCII字符組成或由一RTU字符組成。

     從主設備發(fā)給從設備消息的數據域包含附加的信息:從設備必須用于進(jìn)行執行由功能代碼所定義的所為。這包括了象不連續的寄存器地址,要處理項的數目,域中實(shí)際數據字節數。

     例如,如果主設備需要從設備讀取一組保持寄存器(功能代碼03),數據域指定了起始寄存器以及要讀的寄存器數量。如果主設備寫(xiě)一組從設備的寄存器(功能代碼10十六進(jìn)制),數據域則指明了要寫(xiě)的起始寄存器以及要寫(xiě)的寄存器數量,數據域的數據字節數,要寫(xiě)入寄存器的數據。

     如果沒(méi)有錯誤發(fā)生,從從設備返回的數據域包含請求的數據。如果有錯誤發(fā)生,此域包含一異議代碼,主設備應用程序可以用來(lái)判斷采取下一步行動(dòng)。

     在某種消息中數據域可以是不存在的(0長(cháng)度)。例如,主設備要求從設備回應通信事件記錄(功能代碼0B十六進(jìn)制),從設備不需任何附加的信息。

 ?。?)、錯誤檢測域

    標準的Modbus網(wǎng)絡(luò )有兩種錯誤檢測方法。錯誤檢測域的內容視所選的檢測方法而定。

  ASCII:當選用ASCII模式作字符幀,錯誤檢測域包含兩個(gè)ASCII字符。這是使用LRC(縱向冗長(cháng)檢測)方法對消息內容計算得出的,不包括開(kāi)始的冒號符及回車(chē)換行符。LRC字符附加在回車(chē)換行符前面。

  RTU: 當選用RTU模式作字符幀,錯誤檢測域包含一16Bits值(用兩個(gè)8位的字符來(lái)實(shí)現)。錯誤檢測域的內容是通過(guò)對消息內容進(jìn)行循環(huán)冗長(cháng)檢測方法得出的。CRC域附加在消息的最后,添加時(shí)先是低字節然后是高字節。故CRC的高位字節是發(fā)送消息的最后一個(gè)字節。

 ?。?)、字符的連續傳輸

     當消息在標準的Modbus系列網(wǎng)絡(luò )傳輸時(shí),每個(gè)字符或字節以如下方式發(fā)送(從左到右):

     最低有效位...最高有效位

     使用ASCII字符幀時(shí),位的序列是:

     有奇偶校驗

啟始位1234567奇偶位停止位
 

  

  無(wú)奇偶校驗:

啟始位1234567停止位停止位

 

 

    使用RTU字符幀時(shí),位的序列是:

     有奇偶校驗

啟始位12345678奇偶位停止位

 

 

     無(wú)奇偶校驗

啟始位12345678停止位停止位

 

 

5、錯誤檢測方法

    標準的Modbus串行網(wǎng)絡(luò )采用兩種錯誤檢測方法。奇偶校驗對每個(gè)字符都可用,幀檢測(LRC或CRC)應用于整個(gè)消息。它們都是在消息發(fā)送前由主設備產(chǎn)生的,從設備在接收過(guò)程中檢測每個(gè)字符和整個(gè)消息幀。

    用戶(hù)要給主設備配置一預先定義的超時(shí)時(shí)間間隔,這個(gè)時(shí)間間隔要足夠長(cháng),以使任何從設備都能作為正常反應。如果從設備測到一傳輸錯誤,消息將不會(huì )接收,也不會(huì )向主設備作出回應。這樣超時(shí)事件將觸發(fā)主設備來(lái)處理錯誤。發(fā)往不存在的從設備的地址也會(huì )產(chǎn)生超時(shí)。 

  5.1、奇偶校驗

      用戶(hù)可以配置控制器是奇或偶校驗,或無(wú)校驗。這將決定了每個(gè)字符中的奇偶校驗位是如何設置的。

      如果指定了奇或偶校驗,“1”的位數將算到每個(gè)字符的位數中(ASCII模式7個(gè)數據位,RTU中8個(gè)數據位)。例如RTU字符幀中包含以下8個(gè)數據位:1 1 0 0 0 1 0 1

      整個(gè)“1”的數目是4個(gè)。如果便用了偶校驗,幀的奇偶校驗位將是0,便得整個(gè)“1”的個(gè)數仍是4個(gè)。如果便用了奇校驗,幀的奇偶校驗位將是1,便得整個(gè)“1”的個(gè)數是5個(gè)。

      如果沒(méi)有指定奇偶校驗位,傳輸時(shí)就沒(méi)有校驗位,也不進(jìn)行校驗檢測。代替一附加的停止位填充至要傳輸的字符幀中。

  5.2、LRC檢測 

     使用ASCII模式,消息包括了一基于LRC方法的錯誤檢測域。LRC域檢測了消息域中除開(kāi)始的冒號及結束的回車(chē)換行號外的內容。

      LRC域是一個(gè)包含一個(gè)8位二進(jìn)制值的字節。LRC值由傳輸設備來(lái)計算并放到消息幀中,接收設備在接收消息的過(guò)程中計算LRC,并將它和接收到消息中LRC域中的值比較,如果兩值不等,說(shuō)明有錯誤。

      LRC方法是將消息中的8Bit的字節連續累加,丟棄了進(jìn)位。

      LRC簡(jiǎn)單函數如下:

復制代碼
 1 ///C代碼
 2 static unsigned char LRC(auchMsg,usDataLen)
 3 
 4 unsigned char *auchMsg ; /* 要進(jìn)行計算的消息 */
 5 unsigned short usDataLen ; /* LRC 要處理的字節的數量*/
 6 
 7 { 
 8   unsigned char uchLRC = 0 ; /* LRC 字節初始化 */
 9   while (usDataLen--) /* 傳送消息 */
10   uchLRC += *auchMsg++ ; /* 累加*/
11 
12   return ((unsigned char)(-((char_uchLRC))) ;
13 }
復制代碼

  5.3、CRC檢測

     使用RTU模式,消息包括了一基于CRC方法的錯誤檢測域。CRC域檢測了整個(gè)消息的內容。

     CRC域是兩個(gè)字節,包含一16位的二進(jìn)制值。它由傳輸設備計算后加入到消息中。接收設備重新計算收到消息的CRC,并與接收到的CRC域中的值比較,如果兩值不同,則有誤。

     CRC是先調入一值是全“1”的16位寄存器,然后調用一過(guò)程將消息中連續的8位字節各當前寄存器中的值進(jìn)行處理。僅每個(gè)字符中的8Bit數據對CRC有效,起始位和停止位以及奇偶校驗位均無(wú)效。

     CRC產(chǎn)生過(guò)程中,每個(gè)8位字符都單獨和寄存器內容相或(OR),結果向最低有效位方向移動(dòng),最高有效位以0填充。LSB被提取出來(lái)檢測,如果LSB為1,寄存器單獨和預置的值或一下,如果LSB為0,則不進(jìn)行。整個(gè)過(guò)程要重復8次。在最后一位(第8位)完成后,下一個(gè)8位字節又單獨和寄存器的當前值相或。最終寄存器中的值,是消息中所有的字節都執行之后的CRC值。

    CRC添加到消息中時(shí),低字節先加入,然后高字節。  

  計算CRC碼的步驟為:

  • 預置16位寄存器為十六進(jìn)制FFFF(即全為1)。稱(chēng)此寄存器為CRC寄存器;

  • 把第一個(gè)8位數據與16位CRC寄存器的低位相異或,把結果放于CRC寄存器;

  • 把寄存器的內容右移一位(朝低位),用0填補最高位,檢查最低位;

  • 如果最低位為0:重復第3步(再次移位); 如果最低位為1:CRC寄存器與多項式A001(1010 0000 0000 0001)進(jìn)行異或;

  • 重復步驟3和4,直到右移8次,這樣整個(gè)8位數據全部進(jìn)行了處理;

  • 重復步驟2到步驟5,進(jìn)行下一個(gè)8位數據的處理;

  • 最后得到的CRC寄存器即為CRC碼。

復制代碼
 1 /** 2   * @brief modbus rtu校驗 3   * @param p_data:要校驗的數據的地址 4   *        data_len:要校驗數據的長(cháng)度(字節) 5   *        data_crc:數據的校驗碼 6   * @retval 無(wú) 7   */ 8 void CRC_Checkout_16(uint8_t *p_data,uint32_t data_ len,uint8_t *data_crc) 9 {10   uint16_t wcrc = 0xFFFF; 
11   uint8_t temp; 
12   uint32_t i=0,j=0; 
13   for(i=0;i<data_len;i++) 
14   {15     temp = *p_data & 0X00FF; 
16     p_data++; 
17     wcrc = wcrc^temp; 
18     for(j=0;j<8;j++) 
19     {20       if(wcrc & 0X0001) 
21       {22         wcrc>>=1; 
23         wcrc^=0XA001; 
24       }25       else 26       {27         wcrc>>=1; 
28       }29     }30   }31   temp=wcrc;32 33   data_crc[0]=wcrc; 
34   data_crc[1]=wcrc>>8; 
35 36   return ;37 }
復制代碼
復制代碼
 1 /* CRC 高位字節值表 */ 2 static unsigned char auchCRCHi[] = 
 3 { 4   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 5   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 6   0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 7   0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 8   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 9   0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,10   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,11   0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,12   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,13   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,14   0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,15   0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,16   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,17   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,18   0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,19   0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,20   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,21   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,22   0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,23   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,24   0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,25   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,26   0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,27   0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,28   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,29   0x80, 0x41, 0x00, 0xC1, 0x81, 0x4030 } ;31 32 /* CRC低位字節值表*/33 static char auchCRCLo[] =34  {35   0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,36   0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,37   0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,38   0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,39   0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,40   0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,41   0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,42   0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,43   0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,44   0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,45   0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,46   0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,47   0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,48   0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,49   0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,50   0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,51   0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,52   0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,53   0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,54   0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,55   0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,56   0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,57   0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,58   0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,59   0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,60   0x43, 0x83, 0x41, 0x81, 0x80, 0x4061 } ;
復制代碼

 CRC冗余碼在線(xiàn)計算****: http://www.ip33.com/crc.html

6、Modbus的四種數據類(lèi)型

  輸出線(xiàn)圈:大小只有1bit,ON或OFF,可讀可寫(xiě),既可以是一個(gè)輸出量輸出點(diǎn),也可以是數字量輸入點(diǎn),有效的地址范圍是1-9999。

  輸入離散量:大小只有1bit,ON或OFF,只讀,即數字量輸出點(diǎn),有效地址范圍是10001-19999。

  輸入寄存器:16bit的寄存器,只讀,可以用作模擬量或16位打包輸入點(diǎn),有效地址范圍是30001-39999。

  保持寄存器:16bit的寄存器,可讀可寫(xiě),既可以是一個(gè)模擬量或16位打包輸入點(diǎn),也可以是模擬量或16位打包輸出點(diǎn),有效地址范圍是40001-49999。

  在PLC或DCS上用點(diǎn)名標記不同的變量,在Modbus則以數據地址來(lái)標記每個(gè)點(diǎn)。以上所說(shuō)的地址都是參考地址,而不是實(shí)際的物理地址。上述的地址是在設備中的地址,按照PLC的習慣從1開(kāi)始遞增,而Modbus報文中是從0開(kāi)始遞增。例如地址偏移為4、5、6的Holding Register,其實(shí)是指參考地址是40005、40006、40007的寄存器。

 ?。?)、Coil和Register

  Modbus中定義的兩種數據類(lèi)型:Coil是位(bit)變量;Register是整型(Word,即16-bit)變量。

  (2)、Slave和Master與Server和Client

    同一種設備在不同領(lǐng)域的不同叫法。
      Slave: 工業(yè)自動(dòng)化用語(yǔ);響應請求;
      Master:工業(yè)自動(dòng)化用語(yǔ);發(fā)送請求;
      Server:IT用語(yǔ);響應請求;
      Client:IT用語(yǔ);發(fā)送請求;
    在Modbus中,Slave和Server意思相同,Master和Client意思相同。

 ?。?)Modbus數據模型

    Modbus中,數據可以分為兩大類(lèi),分別為位變量(Coil)和整形變量(Register),每一種數據,根據讀寫(xiě)方式的不同,又可細分為兩種(只讀,讀寫(xiě))。

    Modbus四種數據類(lèi)型:

Discretes Input

位變量

只讀

Coils

位變量

讀寫(xiě)

Input Registers

16-bit整型

只讀

Holding Registers

16-bit整型

讀寫(xiě)

 

 ?。?)、Modbus地址范圍對應表

設備地址

Modbus地址

描述

功能

R/W

1~10000

address-1

Coils(Output)

0

R/W

10001~20000

address-10001

Discrete Inputs

01

R

30001~40000

address-30001

Input Registers

04

R

40001~50000

address-40001

Holding Registers

03

R/W

 

 ?。?)、Modbus變量地址

映射地址

Function Code

地址類(lèi)型

R/W

描述

0xxxx

01,05,15

Coil

R/W

---

1xxxx

02

離散輸入

R

---

2xxxx

03,04,06,16

浮點(diǎn)寄存器

R/W

兩個(gè)連續16-bit寄存器表示一個(gè)浮點(diǎn)數(IEEE754)

3xxxx

04

輸入寄存器 

R

每個(gè)寄存器表示一個(gè)16-bit無(wú)符號整數(0~65535)

4xxxx

03,06,16

保持寄存器

R/W

---

5xxxx

03,04,06,16

ASCII字符

R/W

每個(gè)寄存器表示兩個(gè)ASCII字符



7、modbus協(xié)議的功能碼

地址碼功能碼數據區錯誤校驗碼
8bit8bitn*8bit2*8bit

 

  Modbus的操作對象有四種:線(xiàn)圈、離散輸入、輸入寄存器、保持寄存器。

對象含義
線(xiàn)圈PLC的輸出位,開(kāi)關(guān)量,在Modbus中可讀可寫(xiě)
離散量PLC的輸入位,開(kāi)關(guān)量,在Modbus中只讀
輸入寄存器PLC中只能從模擬量輸入端改變的寄存器,在Modbus中只讀
保持寄存器PLC中用于輸出模擬量信號的寄存器,在Modbus中可讀可寫(xiě)

 

  根據對象的不同,Modbus的功能碼有:

功能碼名稱(chēng)功能
01讀線(xiàn)圈狀態(tài)讀位(讀N個(gè)bit)---讀從機線(xiàn)圈寄存器,位操作
02讀輸入離散量讀位(讀N個(gè)bit)---讀離散輸入寄存器,位操作
03讀多個(gè)寄存器讀整型、字符型、狀態(tài)字、浮點(diǎn)型(讀N個(gè)words)---讀保持寄存器,字節操作
04讀輸入寄存器讀整型、狀態(tài)字、浮點(diǎn)型(讀N個(gè)words)---讀輸入寄存器,字節操作
05寫(xiě)單個(gè)線(xiàn)圈寫(xiě)位(寫(xiě)一個(gè)bit)---寫(xiě)線(xiàn)圈寄存器,位操作
06寫(xiě)單個(gè)保持寄存器寫(xiě)整型、字符型、狀態(tài)字、浮點(diǎn)型(寫(xiě)一個(gè)word)---寫(xiě)保持寄存器,字節操作
07讀取異常狀態(tài)

取得8個(gè)內部線(xiàn)圈的通斷狀態(tài),這8個(gè)線(xiàn)圈的地址由控制器決定,用戶(hù)邏輯可以將這些線(xiàn)圈定義,以說(shuō)明從機狀態(tài),短報文適宜于迅速讀取狀態(tài)

08回送診斷校驗把診斷校驗報文送從機,以對通信處理進(jìn)行評鑒
09編程(只用于484)使主機模擬編程器作用,修改PC從機邏輯
0A控詢(xún)(只用于484)

可使主機與一臺正在執行長(cháng)程序任務(wù)從機通信,探詢(xún)該從機是否已完成其操作任務(wù),僅在含有功能碼9的報文發(fā)送后,本功能碼才發(fā)送

0B讀取事件計數可使主機發(fā)出單詢(xún)問(wèn),并隨即判定操作是否成功,尤其是該命令或其他應答產(chǎn)生通信錯誤時(shí)
0C讀取通訊事件記錄可是主機檢索每臺從機的ModBus事務(wù)處理通信事件記錄。如果某項事務(wù)處理完成,記錄會(huì )給出有關(guān)錯誤
0D編程(184/384/484/584)可使主機模擬編程器功能修改PC從機邏輯
0E探詢(xún)(184/384/484/584)

可使主機與正在執行任務(wù)的從機通信,定期控詢(xún)該從機是否已完成其程序操作,僅在含有功能13的報文發(fā)送后,本功能碼才得發(fā)送

0F寫(xiě)多個(gè)線(xiàn)圈可以寫(xiě)多個(gè)線(xiàn)圈---強置一串連續邏輯線(xiàn)圈的通斷
10寫(xiě)多個(gè)保持寄存器寫(xiě)多個(gè)保持寄存器---把具體的二進(jìn)制值裝入一串連續的保持寄存器
11報告從機標識可使主機判斷編址從機的類(lèi)型及該從機運行指示燈的狀態(tài)
12(884和MICRO84)可使主機模擬編程功能,修改PC狀態(tài)邏輯
13重置通信鏈路發(fā)生非可修改錯誤后,是從機復位于已知狀態(tài),可重置順序字節
14讀取通用參數(584L)顯示擴展存儲文件中的數據信息
15寫(xiě)入通用參數(584L)把通用參數寫(xiě)入擴展存儲文件
16~40保留做擴展功能備用
41~48保留以備用戶(hù)功能所用留作用戶(hù)功能的擴展編碼
49~77非法功能
78~7F保留留作內部作用
80~FF保留用于異常應答

 

  常用功能碼如下:

功能碼名稱(chēng)功能對應的地址類(lèi)型
01讀線(xiàn)圈狀態(tài)讀位(讀N個(gè)bit)---讀從機線(xiàn)圈寄存器,位操作0x
02讀輸入離散量讀位(讀N個(gè)bit)---讀離散輸入寄存器,位操作1x
03讀多個(gè)寄存器讀整型、字符型、狀態(tài)字、浮點(diǎn)型(讀N個(gè)words)---讀保持寄存器,字節操作4X
04讀輸入寄存器讀整型、狀態(tài)字、浮點(diǎn)型(讀N個(gè)words)---讀輸入寄存器,字節操作3x
05寫(xiě)單個(gè)線(xiàn)圈寫(xiě)位(寫(xiě)一個(gè)bit)---寫(xiě)線(xiàn)圈寄存器,位操作0x
06寫(xiě)單個(gè)保持寄存器寫(xiě)整型、字符型、狀態(tài)字、浮點(diǎn)型(寫(xiě)一個(gè)word)---寫(xiě)保持寄存器,字節操作4x
0F寫(xiě)多個(gè)線(xiàn)圈寫(xiě)位(寫(xiě)n個(gè)bit)---強置一串連續邏輯線(xiàn)圈的通斷0x
10寫(xiě)多個(gè)保持寄存器寫(xiě)整形、字符型、狀態(tài)字、浮點(diǎn)型(寫(xiě)n個(gè)word)---把具體的二進(jìn)制值裝入一串連續的保持寄存器4x

 

8、PDU詳細結構

 ?。?)、0x01:讀線(xiàn)圈

    在從站中讀1~2000個(gè)連續線(xiàn)圈狀態(tài),ON=1,OFF=0


    • 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)

    • 響應:MBAP 功能碼 數據長(cháng)度 數據(一個(gè)地址的數據為1位)

    • 如:在從站0x01中,讀取開(kāi)始地址為0x0002的線(xiàn)圈數據,讀0x0008位------------------00 01 00 00 00 06 01 01 00 02 00 08

    • 回:數據長(cháng)度為0x01個(gè)字節,數據為0x01,第一個(gè)線(xiàn)圈為ON,其余為OFF------------00 01 00 00 00 04 01 01 01 01


 ?。?)、0x05:寫(xiě)單個(gè)線(xiàn)圈

    將從站中的一個(gè)輸出寫(xiě)成ON或OFF,0xFF00請求輸出為ON,0x000請求輸出為OFF


    • 請求:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)

    • 響應:MBAP 功能碼 輸出地址H 輸出地址L 輸出值H 輸出值L(共12字節)

    • 如:將地址為0x0003的線(xiàn)圈設為ON---------------00 01 00 00 00 06 01 05 00 03 FF 00

    • 回:寫(xiě)入成功--------------------------------------------00 01 00 00 00 06 01 05 00 03 FF 00


 ?。?)、0x0F:寫(xiě)多個(gè)線(xiàn)圈

    將一個(gè)從站中的一個(gè)線(xiàn)圈序列的每個(gè)線(xiàn)圈都強制為ON或OFF,數據域中置1的位請求相應輸出位ON,置0的位請求響應輸出為OFF


    • 請求:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L 字節長(cháng)度 輸出值H 輸出值L

    • 響應:MBAP 功能碼 起始地址H 起始地址L 輸出數量H 輸出數量L


 ?。?)、0x02:讀離散量輸入

    從一個(gè)從站中讀1~2000個(gè)連續的離散量輸入狀態(tài)


    • 請求:MBAP 功能碼 起始地址H 起始地址L 數量H 數量L(共12字節)

    • 響應:MBAP 功能碼 數據長(cháng)度 數據(長(cháng)度:9+ceil(數量/8))

    • 如:從地址0x0000開(kāi)始讀0x0012個(gè)離散量輸入-------------------------------------------------------------------------------------------------00 01 00 00 00 06 01 02 00 00 00 12

    • 回:數據長(cháng)度為0x03個(gè)字節,數據為0x01 04 00,表示第一個(gè)離散量輸入和第11個(gè)離散量輸入為ON,其余為OFF----------00 01 00 00 00 06 01 02 03 01 04 00


 ?。?)、0x04:讀輸入寄存器

    從一個(gè)遠程設備中讀1~2000個(gè)連續輸入寄存器


    • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)

    • 響應:MBAP 功能碼 數據長(cháng)度 寄存器數據(長(cháng)度:9+寄存器數量×2)

    • 如:讀起始地址為0x0002,數量為0x0005的寄存器數據----------------------------00 01 00 00 00 06 01 04 00 02 00 05

    • 回:數據長(cháng)度為0x0A,第一個(gè)寄存器的數據為0x0c,其余為0x00----------------00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00


 ?。?)、0x03:讀保持寄存器

    從遠程設備中讀保持寄存器連續塊的內容


    • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)

    • 響應:MBAP 功能碼 數據長(cháng)度 寄存器數據(長(cháng)度:9+寄存器數量×2)

    • 如:起始地址是0x0000,寄存器數量是 0x0003----------------------------------00 01 00 00 00 06 01 03 00 00 00 03

    • 回:數據長(cháng)度為0x06,第一個(gè)寄存器的數據為0x21,其余為0x00-----------00 01 00 00 00 09 01 03 06 00 21 00 00 00 00


 ?。?)、0x06:寫(xiě)單個(gè)保持寄存器

    在一個(gè)遠程設備中寫(xiě)一個(gè)保持寄存器


    • 請求:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)

    • 響應:MBAP 功能碼 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字節)

    • 如:向地址是0x0000的寄存器寫(xiě)入數據0x000A------------------00 01 00 00 00 06 01 06 00 00 00 0A

    • 回:寫(xiě)入成功--------------------------------------------------------------00 01 00 00 00 06 01 06 00 00 00 0A


 ?。?)、0x10:寫(xiě)多個(gè)保持寄存器

    在一個(gè)遠程設備中寫(xiě)連續寄存器塊(1~123個(gè)寄存器)


    • 請求:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L 字節長(cháng)度 寄存器值(13+寄存器數量×2)

    • 響應:MBAP 功能碼 起始地址H 起始地址L 寄存器數量H 寄存器數量L(共12字節)

    • 如:向起始地址為0x0000,數量為0x0001的寄存器寫(xiě)入數據,數據長(cháng)度為0x02,數據為0x000F-----------00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F

    • 回:寫(xiě)入成功------------------------------------------------------------------------------------------------------------------------00 01 00 00 00 06 01 10 00 00 00 01


9、數據解析

  ModBus  TCP/IP與串行鏈路Modbus的數據域是一致的,具體數據域可以參考串行modbus。這里給出幾個(gè)ModbusTcp的鏈路解析說(shuō)明,輔助新人分析報文。

 ?。?)、數據請求

97 76 00 00 00 06 04  04 00 7D 00 7D


示例

長(cháng)度

說(shuō)明

備注

Map報文頭

0x97

1

事務(wù)處理標識符Hi

客戶(hù)機發(fā)起,服務(wù)器復制,用于事務(wù)處理配對

0x96

1

事務(wù)處理標識符Lo

0x0000

2

協(xié)議標識符號

客戶(hù)機發(fā)起,服務(wù)器復制

Modbus協(xié)議 = 0.

0x0006

2

長(cháng)度

從本字節下一個(gè)到最后

 

0x04

1

單元標識符

客戶(hù)機發(fā)起,服務(wù)器復制

串口鏈路或其他總線(xiàn)上遠程終端標識

功能碼

0x04

1

功能碼,讀寄存器

參考標準modbus協(xié)議

數據

0x007D

2

起始地址


0x 007D

2

寄存器數量


校驗


 ?。?)、數據請求回復

97 76 00 00 00 FD 04 04 FA AB 9E 41 18 7A E1 3F 94 7A E1 3F 94 0A 3D 3F 97 51 EC 3F 98 CC CD C0 6C 33 33 C0 E3 CC CD C0 EC EB 85 41 F1 D7 0A 41 E9 47 AE 41 ED EB 85 41 F1 19 9A 43 D0 E6 66 43 C9 4C CD 43 CF EB 85 41 F3 66 66 42 0F CC CD 41 C2 E6 66 44 0A 1E B8 41 FB A3 D7 42 0C CC CD 41 BC C0 00 44 0A B8 52 41 F6 5C 29 42 0F 47 AE 41 D1 C6 66 44 0A 00 00 00 00 C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F C9 9E FF 7F 05 16 00 00 04 11 00 00 05 16 00 00 04 11 00 00 05 16 00 00 04 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 0A 00 0A 00 0A 00 04 00 04 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0F


示例

長(cháng)度

說(shuō)明

備注

Map報文頭

0x97

1

事務(wù)處理標識符Hi

客戶(hù)機發(fā)起,服務(wù)器復制,用于事務(wù)處理配對

0x96

1

事務(wù)處理標識符Lo

0x0000

2

協(xié)議標識符號

客戶(hù)機發(fā)起,服務(wù)器復制

Modbus協(xié)議 = 0.

0x00FD

2

長(cháng)度

從本字節下一個(gè)到最后

 

0x04

1

單元標識符

客戶(hù)機發(fā)起,服務(wù)器復制

串口鏈路或其他總線(xiàn)上遠程終端標識

功能碼

0x04

1

功能碼,讀寄存器

參考標準modbus協(xié)議

數據

0x FA

1

字節個(gè)數


0x----


數據

校驗


 ?。?)、寫(xiě)多個(gè)寄存器

97 79 00 00 00 09 04 10 00 00 00 01 02 00 01


示例

長(cháng)度

說(shuō)明

備注

Map報文頭

0x97

1

事務(wù)處理標識符Hi

客戶(hù)機發(fā)起,服務(wù)器復制,用于事務(wù)處理配對

0x79

1

事務(wù)處理標識符Lo

0x0000

2

協(xié)議標識符號

客戶(hù)機發(fā)起,服務(wù)器復制

Modbus協(xié)議 = 0.

0x0009

2

長(cháng)度

從本字節下一個(gè)到最后

 

0x04

1

單元標識符

客戶(hù)機發(fā)起,服務(wù)器復制

串口鏈路或其他總線(xiàn)上遠程終端標識

功能碼

0x10

1

功能碼,讀寄存器

參考標準modbus協(xié)議

數據

0x0000

2

起始地址


0x 0001

2

寫(xiě)寄存器數量


0x 02

1

寫(xiě)字節的個(gè)數


00 01

2

目標值


校驗


 ?。?)、寫(xiě)多個(gè)寄存器響應

97 79 00 00 00 06 04 10 00 00 00 01


示例

長(cháng)度

說(shuō)明

備注

Map報文頭

0x97

1

事務(wù)處理標識符Hi

客戶(hù)機發(fā)起,服務(wù)器復制,用于事務(wù)處理配對

0x79

1

事務(wù)處理標識符Lo

0x0000

2

協(xié)議標識符號

客戶(hù)機發(fā)起,服務(wù)器復制

Modbus協(xié)議 = 0.

0x0006

2

長(cháng)度

從本字節下一個(gè)到最后

 

0x04

1

單元標識符

客戶(hù)機發(fā)起,服務(wù)器復制

串口鏈路或其他總線(xiàn)上遠程終端標識

功能碼

0x10

1

功能碼,讀寄存器

參考標準modbus協(xié)議

數據

0x0000

2

起始地址


0x 0001

2

寄存器個(gè)數


校驗


10、五種量的概念

  在工業(yè)自動(dòng)化控制中,經(jīng)常會(huì )遇到開(kāi)關(guān)量,數字量,模擬量,離散量,脈沖量等各種概念,而人們在實(shí)際應用中,對于這些概念又很容易混淆?,F將各種概念羅列如下:

 ?。?)、開(kāi)關(guān)量

  一般指的是觸點(diǎn)的“開(kāi)”與“關(guān)”的狀態(tài),一般在計算機設備中也會(huì )用“0”或“1”來(lái)表示開(kāi)關(guān)量的狀態(tài)。開(kāi)關(guān)量分為有源開(kāi)關(guān)量信號和無(wú)源開(kāi)關(guān)量信號,有源開(kāi)關(guān)量信號指的是“開(kāi)”與“關(guān)”的狀態(tài)是帶電源的信號,專(zhuān)業(yè)叫法為躍階信號,可以理解為脈沖量,一般的都有220VAC,?110VAC,24VDC,12VDC等信號,無(wú)源開(kāi)關(guān)量信號指的是“開(kāi)”和“關(guān)”的狀態(tài)時(shí)不帶電源的信號,一般又稱(chēng)之為干接點(diǎn)。電阻測試法為電阻0或無(wú)窮大。

 ?。?)、數字量

  很多人會(huì )將數字量與開(kāi)關(guān)量混淆,也將其與模擬量混淆。數字量在時(shí)間和數量上都是離散的物理量,其表示的信號則為數字信號。數字量是由0和1組成的信號,經(jīng)過(guò)編碼形成有規律的信號,量化后的模擬量就是數字量。

 ?。?)、模擬量

  模擬量的概念與數字量相對應,但是經(jīng)過(guò)量化之后又可以轉化為數字量。模擬量是在時(shí)間和數量上都是連續的物理量,其表示的信號則為模擬信號。模擬量在連續的變化過(guò)程中任何一個(gè)取值都是一個(gè)具體有意義的物理量,如溫度,電壓,電流等。

 ?。?)、離散量

  離散量是將模擬量離散化之后得到的物理量。即任何儀器設備對于模擬量都不可能有個(gè)完全精確的表示,因為他們都有一個(gè)采樣周期,在該采樣周期內,其物理量的數值都是不變的,而實(shí)際上的模擬量則是變化的。這樣就將模擬量離散化,成為了離散量。

 ?。?)、脈沖量

  脈沖量就是瞬間電壓或電流由某一值躍變到另一值的信號量。在量化后,其變化持續有規律就是數字量,如果其由0變成某一固定值并保持不變,其就是開(kāi)關(guān)量。

  綜上所述,模擬量就是在某個(gè)過(guò)程中時(shí)間和數量連續變化的物理量,由于在實(shí)際的應用中,所有的儀器設備對于外界數據的采集都有一個(gè)采樣周期,其采集的數據只有在下一個(gè)采樣周期開(kāi)始時(shí)才有變動(dòng),采樣周期內其數值并不隨模擬量的變化而變動(dòng)。

  這樣就將模擬量離散化了,例如:某設備的采樣周期為1秒,其在第五秒的時(shí)間采集的溫度為35度,而第六秒的溫度為36度,該設備就只能標稱(chēng)第五秒時(shí)間溫度35度,第六秒時(shí)間溫度36度,而第五點(diǎn)五秒的時(shí)間其標稱(chēng)也只是35度,但是其實(shí)際的模擬量是35.5度。這樣就將模擬信號離散化。其采集的數據就是離散化了,不再是連續的模擬量信號。

  由于計算機只識別0和1兩個(gè)信號,即開(kāi)關(guān)量信號,用其來(lái)表示數值都是使用數字串來(lái)表示,由于計算能力的問(wèn)題,其數字串不能無(wú)限長(cháng),即其表達的精度也是有限的,同樣的以溫度為例,由于數字串限制,其表達溫度的精度只能達到0.1度,小于該單位的數值則不能被標稱(chēng),這樣就必須將離散量進(jìn)行量化,將其變?yōu)閿底至?。?5.68度的溫度則表示為35.6度。

  這種方式的主要優(yōu)點(diǎn)是字符發(fā)送的時(shí)間間隔可達到1秒而不產(chǎn)生錯誤。

modbus通訊協(xié)議詳解 - 孤情劍客 - 博客園 (cnblogs.com)

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: modbus

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>