【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 進階用法之使用 Modbus 協議實作( 上 )

前言

世平集團針對 RS485 相關技術整理了一系列博文,下圖為詳細的博文索引架構;筆者希望能夠透過這些博文協助大家更了解如何在 i.MX8 相關平台上使用 RS485,未來筆者也會持續更新此系列的相關博文還懇請支持!而本篇博文會針對 RS485 相關技術索引架構中的【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 進階用法之使用 Modbus 協議實作( 上 ) 這篇文章做介紹。文章中會針對 RS485 的 Modbus 協議與 i.MX8 相關平台的關係做粗略敘述,看完本篇博文後相信各位讀者們會「對 Modbus 的協議更加認識」,再來讓我們繼續看下去吧!

架構1

二. Modbus 概述

Modbus 是由 Modicon 這間公司發表的通訊協定 ( Modicon 已被 Schneider Electric 收購 ) 目前是 Modbus Organization 在維護此協定 ( Modbus Organization 的 Member 眾多 Schneider Electric 也是其中一員 )。Modbus 通訊協定的使用在業界已經行之有年,大多應用在工業控制領域上,比方說 PLC ( Programmable Logic Controller ) 系統裝置就會使用 Modbus 協定做資料傳輸。

補充:PLC 是一種電子控制系統可以做到邏輯、時序、計數等控制。( 例如控制馬達、閘門開關等 )

本系列博文是使用世平集團自製的 OP-Doflamingo ( i.MX8MQ ) 開發板上的 RS485 介面來與 PC 端做資料傳輸。以下圖 OSI Model 概況圖為例,RS485 位於第一層實體層 ( Physical ) 的位置,而 Modbus 運作在第七層應用層 ( Application ) 的位置。接著下一篇博文【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 進階用法之使用 Modbus 協議實作( 下 ) 將會演示「如何在 i.MX8MQ 平台上使用 Modbus 協議與 PC 端互傳資料」。再請各位讀者繼續看下去吧!

圖片參考自 http://jamod.sourceforge.net/kbase/protocol.html

OSI

a. Master 與 Salve 架構概述

Modbus 走的是 Master ( Client ) / Slave ( Server ) 架構 ( 關於 Client / Server 的定義稍後會再做解釋 ),在 Modbus協定中 Slave 無法主動發起通訊,Slave 一定要收到 Master 的訊息才有機會送出資料 ( 請參閱下圖 ) 。因為這個緣故 Master ( Client ) 設備通常只會有一個,其他都是 Slave ( Server ) 設備。 

補充:Master / Client 角色可能是一台 PC 或是一台資料採集機器之類的。

圖片參考自 http://jamod.sourceforge.net/kbase/protocol.html

request

有了 Master 通常只有一個其他都是 Slave 這個觀念之後,再用 Client 與 Server 的角度去想;由於 Modbus 多數設備就像 Server 一樣處於被動的狀態,當 Client 要求資料時 Server 才會有所回應。所以 Master 同等於 Client 而 Slave 同等於 Server。

以下圖片刻劃了 Master ( Client ) 與 Slave ( Server ) 的架構關係,此圖來自 http://www.xuan.idv.tw/wordpress/?p=2427 這篇文章。筆者覺得這篇文章敘述的相當清楚在此借鏡其內容的一部分描述給各位讀者知道。

圖片來自 http://www.xuan.idv.tw/wordpress/?p=2427
架構2

b. 傳輸模式概述

Modbus 的實體傳輸介面可以是乙太網路或 Serial Port ( 本篇博文使用 RS485 ),傳輸模式則分為 TCP ( Transmission Control Protocol )、ASCII ( American Standard Code for Information Interchange )、RTU ( Remote Terminal Unit ) 這 3 種模式;其中 ASCII 與 RTU 模式都是使用 Serial Port 來做資料傳輸,ASCII 與 RTU 的差異是校驗方式的不同;ASCII 是採用 LRC ( Longitudinal Redundancy Check ) 校驗方式,而 RTU 是採用 CRC ( Cyclic Redundancy Check ) 校驗方式 ( 筆者整理了下表幫助釐清 ) 。值得一提的是在同一個 Modbus 網路上的設備都必須選擇一樣的傳輸介面 ( 比如說整個網路都是用 Serial Port 來做傳輸 )。

補充:假設選擇在 Serial 網路下做資料傳輸,請記得 Baud Rate 與 Parity 等設定都要設置成一致。

Mode

補充:RTU 是 Remote Terminal Unit 的簡寫,可以用來監控 Remote 現場的資料並且將資料傳送回 Master。

本篇博文主要是用 Modbus RTU 傳輸模式來與 Slave ( Server ) 做資料傳送,接著讓我們來看一下 Modbus RTU 資料傳輸的 Format 吧!在 Modbus 協議中一筆資料是一個 Frame,一個 Frame 中包含了 Start、Address、Function Code、Data、CRC ( Error Check ) 與 End 等資訊。

在這稍微提及一下 ADU ( Application Data Unit ) 與 PDU ( Protocol Data Unit ) 這兩個名詞 ( 可參考下圖 ),它們的定義如下:

ADU = Address + PDU + CRC

PDU = Function code + Data

ADU

這裡先針對 Address 與 Function Code 做簡單敘述:

1. Address 指的是 Slave Address 或 Slave ID ( 每個 Slave 都應該要有屬於自己的 Address 或 ID )。
如果 Address 是 0 代表廣播模式,值得一提的是 Slave ( Server ) 通常都會針對收到廣播有所動作,但是為了避免 Bus 資源互搶問題發生 Slave 端不會加以回應!

2. Function Code 指的是要向 Server 表明做哪種動作。
較常用的 Function Code 有 0x03、0x06、0x16 等,以下圖片是網路上找到的 Function Code 定義。每個 Function Code 都有自己定義的功能,以 0x03 來說它的定義是可以讀取多個暫存器 ( 本篇博文範例也是使用 0x03 Function Code 實作 )。

圖片來自 https://en.wikipedia.org/wiki/Modbus#Frame_formats

Func_code

以下會介紹 Modbus RTU 模式中,「Master 讀取資料」與 「Slave 回覆資料」的方式,筆者將透過以下例子帶各位讀者解析封包 Format ( 本範例使用的 Function Code 是 0x03;稍早有提到 0x03 Function Code 定義的功能為讀取多個暫存器 ) 。

1. Master ( Client ) 讀取資料 Format:
設備 ID ( Slave Address ) + 0x03 + 讀取資料的起始位置 ( 1 Word ) + 讀取的資料數量 ( 1 Word ) + CRC16 ( 16 Bit )

2. Slave ( Server ) 回覆資料 Format:
設備 ID ( Slave Address ) + 0x03 + 回覆的資料數量 ( 1 Byte ) + 第 1 筆資料 ( 1 Word ) + 第 2 筆資料 ( 1 Word ) + 第 N 筆資料 ( 1 Word ) + CRC16 ( 16 Bit )

了解 Format 後接著讓我們看看實際範例吧!

Master ( Client ) 送出 01 03 00 00 00 0A C5 CD ( 這裡出現的數字都是 16 進制唷! )

Slave ( Server ) 回應 01 03 14 00 00 00 00 00 02 00 00 00 64 00 00 00 00 00 00 00 22 00 7B 2A 7E ( 這裡出現的數字也是 16 進制唷! )

Master ( Client ) 讀取資料的粗略說明如下:
Master ( Client ) 對 Slave Address 是 0x01 的設備發出讀取多個暫存器的請求 ( 0x03 ),資料從 0x00 位置開始讀取,要讀取的資料數量為 10 ( 0x0A ) 筆資料。

Client

Slave ( Server ) 回覆資料的粗略說明如下:
Slave ( Server ) 對 Master ( Client ) 做出回應,Slave Address 是 0x01、Function Code 是 0x03、回覆的資料數量是 20 ( 0x14 ) 個 Byte ( 就是 10 個 Word ) 分別是:
0x00 0x00 ( 第 1 筆資料 )

0x00 0x00 ( 第 2 筆資料 )
0x00 0x02 ( 第 3 筆資料 )
0x00 0x00 ( 第 4 筆資料 )
0x00 0x64 ( 第 5 筆資料 )
0x00 0x00 ( 第 6 筆資料 )
0x00 0x00 ( 第 7 筆資料 )
0x00 0x00 ( 第 8 筆資料 )
0x00 0x22 ( 第 9 筆資料 )
0x00 0x7B ( 第 10 筆資料 )

Master

看到這裡不知道各位讀者們是否對 Modbus 的傳輸格式更加認識了呢?本篇博文將使用世平集團自製的 OP-Doflamingo ( i.MX8MQ ) 開發板與 PC 端做 Modbus 協議的資料傳輸 ( 傳輸以上敘述的資料 ),接著再讓我們繼續看下去吧!


三. 讓 i.MX8MQ 平台與 PC 透過 Modbus 協議傳遞資料架構介紹

a. i.MX8MQ 平台 與 PC 間的 RS485 架構敘述

稍早有介紹到 Modbus 的實體層可以使用 Serial Port 或是 TCP 來做資料傳輸,而本篇博文選擇使用 Serial ( RS485 ) 介面做為實體傳輸資料的接口。以下為本篇博文 RS485 實際硬體接線架構;透過此圖我們可以了解板端 OP-Doflamingo ( i.MX8MQ ) 是如何透過 RS485 與 PC 端連接的。

ARH1

b. i.MX8MQ 平台 與 PC 的 Master / Slave 關係敘述

稍早有介紹到 Master ( Client ) 端通常只會有一個,而 Salve ( Server ) 則可以有多個。當 Master ( Client ) 發出 Request 後,Slave ( Server ) 才會做出 Response。本篇博文將會在 OP-Doflamingo ( i.MX8MQ ) 板端與 PC 端各自安裝程式來 Demo Modbus 的資料傳輸 ( 板端的程式需要編譯、PC 端的程式需要安裝,後續章節會再介紹 ) 。如下圖所示,OP-Doflamingo ( i.MX8MQ ) 扮演的角色是 Master ( Client ),而 PC 的角色是 Slave ( Server );此範例利用 OP-Doflamingo ( i.MX8MQ ) 板端的程式會去跟 PC 端要資料回來並顯示在 OP-Doflamingo ( i.MX8MQ ) 開發板的 Console 畫面上。

arh2

好囉! 本篇博文主要是針對 Modbus 的資料格式與 OP-Doflamingo ( i.MX8MQ ) 和 PC 的角色 ( Master or Slave )做粗略敘述,實際的 Modbus 協議資料傳輸實作還請各位讀者參考下一篇博文【ATU Book-i.MX8 系列-RS485】NXP i.MX8MQ 的 RS485 進階用法之使用 Modbus 協議實作( 下 ) 做了解!

四. 結語

世平集團針對 RS485 相關技術整理了一系列博文,而本篇文章是以世平集團自行製作的 OP-Doflamingo ( i.MX8MQ ) 開發板為例子「示範如何與 PC 端透過 RS485 並使用 Modbus 協議做資料的傳輸」,希望本篇文章的內容可以讓各位讀者對 Modbus 協議有更深入的體會,若未來讀者們有 RS485 或 Modbus 的相關問題歡迎隨時與世平集團做討論,之後筆者將會繼續撰寫「Modbus 協議實作」相關博文,請各位讀者拭目以待。

五. 參考文章
[1] https://zh.wikipedia.org/wiki/OSI%E6%A8%A1%E5%9E%8B
[2] https://zh.wikipedia.org/wiki/Modbus
[3] https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%BC%96%E7%A8%8B%E9%80%BB%E8%BE%91%E6%8E%A7%E5%88%B6%E5%99%A8
[4] https://modbus.org/about_us.php
[5] https://dotblogs.com.tw/Leo_CodeSpace/2018/12/26/185411
[6] https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE
[7] https://zh.wikipedia.org/wiki/ASCII
[8] https://makerpro.cc/2019/08/modbus-protocol/
[9] http://www.xuan.idv.tw/wordpress/?p=2427
[10] https://www.easyatm.com.tw/wiki/modicon
[11] https://www.deltaww.com/zh-tw/products/PLC-Programmable-Logic-Controllers/ALL/
[12] https://www.digikey.tw/zh/blog/what-is-a-plc
[13] https://twgreatdaily.com/MA1JrG4BMH2_cNUgIH_w.html
[14] https://zh.wikipedia.org/wiki/%E8%BF%9C%E7%A8%8B%E7%BB%88%E7%AB%AF%E8%A3%85%E7%BD%AE
[15] https://www.796t.com/content/1543472822.html
[16] https://zh.wikipedia.org/wiki/%E5%86%97%E4%BD%99%E6%A0%A1%E9%AA%8C
[17] https://www.accus.com.tw/msg/msg25.html
[18] https://www.anybus.com/zh/products/gateway-index/anybus-communicator/serial-modbus-rtu
[19] http://jamod.sourceforge.net/kbase/protocol.html
[20] https://www.researchgate.net/figure/MODBUS-Protocol-PDU-and-ADU_fig2_281692567
[21] https://www.gridconnect.com/blogs/news/modbus-in-a-nutshell
[22] https://en.wikipedia.org/wiki/Modbus#Frame_formats
[23] https://blog.softwaretoolbox.com/opc-modbus-function-codes
[24] https://www.ni.com/zh-tw/innovations/white-papers/14/the-modbus-protocol-in-depth.html

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論