帶你認識物聯網 Modbus 通訊協議(二)

更新於 發佈於 閱讀時間約 6 分鐘
The Modbus Protocol

The Modbus Protocol

上一篇文章裡,我們已經介紹了本系列的前三個部分,包含機器通訊的運作原理,0 與 1 構成的計算機結構,數據要如何用二進位與十六進位來表示以及通訊上什麼是 Master-Slave 的主從式架構,雖然知識都是有點硬卻也是後續要聊的 Modbus 通訊協議的重要基礎,如果還沒看過第一篇的人,建議點選上面連結先回去看看。從第二篇開始,我們就要正式來進入 Modbus 通訊協議主題了,這次我們會談談:

  1. 什麼是通訊協議,了解 Modbus.org 為何要規範通訊協議
  2. 完整的一句話該怎麼說,了解如何用協議規範組合成 PDU
  3. ADU & CRC,了解 ADU 的組成方式與 CRC 數據檢核機制

協議就是一種共同語言

以前當 RD 在開發系統產品的時候需要控制很多硬體設備,韌體工程師有說硬體控制可以走自定義的通訊格式,需要搭配一張指令對照表,按表組成命令下給終端設備,設備們接收到正確的指令後才會做出正確的回應(對於不認識的指令,設備會只會已讀不回!)。仔細看對照表裡面有各種動作或設定代碼,例如:可以用讀取的功能代碼再加上存放某個電壓或電流的記憶體位址就能組成來提取要監控的電壓、電流等數值的指令。原則上,每一類設備會有自己的對照表,裝置總類何其多,難道要逐一客製所有的通訊功能嗎?有沒有更簡單的方法呢?

Modbus.org 協會起了大作用,他們是負責定義跟標準化 Modbus 通訊協議的組織。

所謂的「協議」指的是經過談判、協商後所決議共同遵守的約定。

在官網所提供的的白皮書裡有也有交代協會已經把通訊主要的動作代碼整成一張表了,總共有 65 個標準動作,這些官方指定動作代碼也叫做 function code,功能碼意思。只要設備商們有按表實作協議要求的通訊功能的話,我們就能預期機器接收指令後該有的反應。這就是有標準協議的好處,大家講好規則,對照表一張就夠了。

Table of function codes.

Table of function codes.

如果還是覺得協議感覺很抽象的話,不妨把協議想成我們日常使用的任意一種語言。就以英文為例好了,英文明確規定所有的單字都是 26 個字母組成,每一個單字都有明確的發音規則,文法裡也定義了各種組合多個單字來表達意思的規則… 也因為我們人類有了這套「英文聽說讀寫的協議」,我們才能正確理解對方,才不會有看到或聽到「Apple」卻不曉得對方講的是「蘋果」的窘境。同理在物聯網的 Modbus 通訊協議就是人類幫機器們在工業通訊領域所規範的一套語言,有了共同語言就能提高溝通的正確性與效率。

用 PDU 說出完整的一句話

在我們的語言裡,要組合出一句有意義的話,對機器來講是非常困難的,在這複雜的語系裡面有代表你我他的主詞、有代表行為的動詞、有代表具體事務的名詞、有用來描述物體的形容詞,修飾動詞的副詞、連接詞、介系詞… 片與、慣用語、成語、文法有這麼多特性的詞語特性所構成的龐大體系,一個普通人要學會一套新的語言,絕對要有個幾年修為。而 Modubs 通訊協議作為給機器用的語言有著簡單易懂的特性,想要組成一句話,就只要動詞、名詞、跟量詞就可以了。

Modbus 通訊協議裡面有 65 個官方功能碼可以運用。這些功能碼又可以區分為讀跟寫兩大類,按照讀寫的目標對象不同,還可以進行細部分類。例如:如果我們想要讀寫一個線圈(或叫做開關)就可以用 01 (讀) 跟 05 (寫) 來起頭串接指令。假設我們要的開關的記憶體位置在 x5678(十六進位表示),那麼 05 5678 01 的意思可以把 5678 這個開關打開,05 5678 00 就是關閉開關,用功能碼+記憶體位址+數值組成的一句話就叫做 PDU,Protocol Data Unit,也叫做協議資料單元。

ADU & CRC

PDU 被定義為與底層無關的應用層級的資料格式,什麼叫做底層無關的應用層級資料呢?我想大家都有寄送過包裹的經驗對不對?在選擇實體的物流上我們可以指定不同的運輸方式,例如:透過郵局寄掛號或超商宅急便,不管用哪一種寄送方式送包裹,裡面的內容物 (PDU) 永遠不變,此時負責實體物流的郵局、宅急便就對應到不同的通訊底層。 Modbus 協議的目標就是不管底層通訊要走的哪一種類型傳輸介面都可以,確保送出去給對方裝置的 PDU 是不變的,這就是應用層級資料內容的概念。

要注意的是不同底層通訊介面需要對 PDU 將行二次包裝。就像我們不能直接拿貼有郵票的包裹直接叫超商宅急便收貨寄件,必須按宅急便的要求二次包裝跟寫單據。同理,當 PDU 要走不同的實體通訊介面時,也該根據不同介面要求來二次包裝 PDU,經過包裝過的 PDU 就會變成 ADU,Application Data Unit,也叫做應用資料單元。再來借用 RS485 的 Modbus ASCII 為例,ADU = 裝置 ID + PDU + CRC, 由於 RS485 定義的主從式通訊架構的 Master 底下可以有多個 Slave 裝置,所以 Master 在發送訊息的給特定的 Slave 裝置時就要帶上 Slave 的 ID 作為識別。

ADU = 裝置 ID + PDU + CRC

ADU = 裝置 ID + PDU + CRC

這裡的 CRC 叫做 Cyclic Redundancy Check 也叫做循環冗余校驗,它就是一種用來檢查 PDU 內容是否有錯誤的一種檢查碼演算機制,兩個互相傳遞訊息的 Master 或 Slave 會各自計算跟比對來源的 CRC 來確認 PDU 的正確性。只有收到的跟計算的 CRC 一致,裝置才會開始解讀 PDU 執行裡面的指令。

結語

我本身很少引用宗教的語言,實在不好意思班門弄斧。不過 Modbus 通訊協議與於人類的語言還真的有幾分上帝按照自身形象造人的味道。我們人類本身就是這些機器裝置的設計者(造物主),而由人類為它們定義的各種通訊方式與通訊協議也都模擬了人與人的溝通方式,時而單字單詞,時而完整語句,就算不小心聽錯或者沒聽懂的時候也都有相互確認機制來讓溝通持續下去,所以機器裝置間的溝通還真的跟人的溝通本質上真的沒有太大的不同啊。說完了 Modbus 通訊協議的基礎,接下來,我們準備進入第三篇,正式來看 Modbus TCP 這個 Turbo 版本的 Modbus 通訊協議,並實際看看一個完整的數據搜集系統的架構的樣貌。那我們就下一篇見了。

avatar-img
15會員
61內容數
WarrenLo's 軟體設計武功祕笈
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Warren Lo的沙龍 的其他內容
Modbus 是一種定義在通訊應用層的協議,會根據資料跑在不同的實體介面上而有不同的「版本」,例如:應用在 RS232/RS485 串列埠介面的就是 Modbus RTU/ASCII,應用在 TCP/IP 的就是 Modbus TCP 也 SCADA 的主要應用協議。
每個人都在心裡有了自己對智慧工廠的想像(陰影?),不少人也開始結合自己的經驗得出自己的見解,直接把智慧工廠直接跟某個特定主題直接劃上等號,這種化繁為簡的總結能力對人類學習很有用處,人類是不斷的學習總結來擴展知識能力。但是使用不當或過度簡化也會走歪掉形成「偏見」,而強烈固執的偏見就會升級為「迷思」
只要關鍵字谷歌一下,瞬間一堆資源在眼前,這讓我深刻感覺到,找到學習資源已經沒有困難可言了。可是當我看到 IPQC 被客戶震撼教育的時候,我才發現看似唾手可得的知識也不是每人人都能了解。
RealTime SPC,Real Time 就是即時的意思。習慣用語當然是「越快越好」,那麼到底多快才叫做即時並沒有一定的答案,從數據發生到進入 SPC 系統完成判定是需要花費幾秒到幾分鐘的時間才能完成這個主流程,包含:資料進點處理 ETL、監控規則判定、異常告警觸發、管制圖確認
第一篇聊到了 SPC 的運作原理是基於隨機資料與常態分佈的理論基礎;第二篇談到了實際應用的工具「管制圖」,認識了代表客戶的規格線、品管內部控制的管制界線、ABC 區、八大監控法則還有選擇管制圖的分類。實際應用上還需要回答一個關鍵問題「到底做的好不好?」,有沒有量化的指標來幫助我們判斷製程能力好壞?
能不能用最簡單的言語來總結?所以現在再問我一次這個問題,我的回答是:「SPC 就是管制圖」,所有你在 SPC 需要知道的事情在一張管制圖上都可以看到。
Modbus 是一種定義在通訊應用層的協議,會根據資料跑在不同的實體介面上而有不同的「版本」,例如:應用在 RS232/RS485 串列埠介面的就是 Modbus RTU/ASCII,應用在 TCP/IP 的就是 Modbus TCP 也 SCADA 的主要應用協議。
每個人都在心裡有了自己對智慧工廠的想像(陰影?),不少人也開始結合自己的經驗得出自己的見解,直接把智慧工廠直接跟某個特定主題直接劃上等號,這種化繁為簡的總結能力對人類學習很有用處,人類是不斷的學習總結來擴展知識能力。但是使用不當或過度簡化也會走歪掉形成「偏見」,而強烈固執的偏見就會升級為「迷思」
只要關鍵字谷歌一下,瞬間一堆資源在眼前,這讓我深刻感覺到,找到學習資源已經沒有困難可言了。可是當我看到 IPQC 被客戶震撼教育的時候,我才發現看似唾手可得的知識也不是每人人都能了解。
RealTime SPC,Real Time 就是即時的意思。習慣用語當然是「越快越好」,那麼到底多快才叫做即時並沒有一定的答案,從數據發生到進入 SPC 系統完成判定是需要花費幾秒到幾分鐘的時間才能完成這個主流程,包含:資料進點處理 ETL、監控規則判定、異常告警觸發、管制圖確認
第一篇聊到了 SPC 的運作原理是基於隨機資料與常態分佈的理論基礎;第二篇談到了實際應用的工具「管制圖」,認識了代表客戶的規格線、品管內部控制的管制界線、ABC 區、八大監控法則還有選擇管制圖的分類。實際應用上還需要回答一個關鍵問題「到底做的好不好?」,有沒有量化的指標來幫助我們判斷製程能力好壞?
能不能用最簡單的言語來總結?所以現在再問我一次這個問題,我的回答是:「SPC 就是管制圖」,所有你在 SPC 需要知道的事情在一張管制圖上都可以看到。
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章分享如何操作檯達CTA計時器,使用MODBUS RTU通訊模式進行讀取與寫入資料的完整過程。從硬體連接、通訊設定到ISPSoft的軟體配置,詳細介紹每一步驟,並提供實際的程式碼範例。適合希望瞭解CTA通訊設定以及MODBUS應用的技術人員或工程師。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
今天要來介紹的是Python中資料型別的函數, 這幾天學習的素材是Youtube上“程式柴大大的Python 6 小時初學者課程”,一步一步帶著大家操作並解,學習中也別忘了要多多練習,練習的部分我是把我學到的東西請Chatgpt幫我出類似的題型並讓我練習。 以下我先寫出一個簡單的code,再加以
※ 介面是什麼: 介面:人跟電腦互相溝通的管道。 使用者與電腦互相溝通的方式稱為使用者的介面。 ※ 使用者的介面類型: 文字使用者介面:CUI。使用純鍵盤來下指令溝通,對象是伺服器(SERVER)。 圖型使用者介面:GUI。使用圖像去做點擊或拖拉的方式。 ※ 命令列(Command li
對於程序式編程來說,程式是由一系列的指令組成,例如計算數值、印出訊息、修改變數、呼叫子程序、配置變數的記憶體空間等。定義函式是為了讓一些程序可以重複利用,因此稱為子程序,其中參數為子程序中特別的變數,讓我們能夠透過它們控制子程序的行為。函式的回傳值只是一種方便將結果帶回來的方法,但一般只能回傳一個值
Thumbnail
與電腦溝通之方法說明 不須使用任何程式軟體工具,能與電腦溝通,使用Command line執行後,將依自己設定之條件,直接將結果選出,提供後續運用
使用ADC時必須注意 MCU上會有Vref腳位,這兩個腳位必須接上VDD及GND。 這兩個腳位是專門給ADC使用的,ADC在轉換時會需要參考電壓來轉換成digital。公式如下 ​digital = (Vin / Vref) * 2^12 digital:是電腦讀取到的數值。 Vin:輸
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
這篇文章分享如何操作檯達CTA計時器,使用MODBUS RTU通訊模式進行讀取與寫入資料的完整過程。從硬體連接、通訊設定到ISPSoft的軟體配置,詳細介紹每一步驟,並提供實際的程式碼範例。適合希望瞭解CTA通訊設定以及MODBUS應用的技術人員或工程師。
Thumbnail
這篇內容,將會講解什麼是腳本函式,以及與腳本函式相關的知識。包括腳本的簡介、使用函式(或全域變數)的注意事項、定義全域變數、定義函式、什麼是宣告、局部變數的應用。
Thumbnail
今天要來介紹的是Python中資料型別的函數, 這幾天學習的素材是Youtube上“程式柴大大的Python 6 小時初學者課程”,一步一步帶著大家操作並解,學習中也別忘了要多多練習,練習的部分我是把我學到的東西請Chatgpt幫我出類似的題型並讓我練習。 以下我先寫出一個簡單的code,再加以
※ 介面是什麼: 介面:人跟電腦互相溝通的管道。 使用者與電腦互相溝通的方式稱為使用者的介面。 ※ 使用者的介面類型: 文字使用者介面:CUI。使用純鍵盤來下指令溝通,對象是伺服器(SERVER)。 圖型使用者介面:GUI。使用圖像去做點擊或拖拉的方式。 ※ 命令列(Command li
對於程序式編程來說,程式是由一系列的指令組成,例如計算數值、印出訊息、修改變數、呼叫子程序、配置變數的記憶體空間等。定義函式是為了讓一些程序可以重複利用,因此稱為子程序,其中參數為子程序中特別的變數,讓我們能夠透過它們控制子程序的行為。函式的回傳值只是一種方便將結果帶回來的方法,但一般只能回傳一個值
Thumbnail
與電腦溝通之方法說明 不須使用任何程式軟體工具,能與電腦溝通,使用Command line執行後,將依自己設定之條件,直接將結果選出,提供後續運用
使用ADC時必須注意 MCU上會有Vref腳位,這兩個腳位必須接上VDD及GND。 這兩個腳位是專門給ADC使用的,ADC在轉換時會需要參考電壓來轉換成digital。公式如下 ​digital = (Vin / Vref) * 2^12 digital:是電腦讀取到的數值。 Vin:輸
Thumbnail
宣告變數 變數是程式中用來儲存和表示數據的標識符號​,並將變數存放在某個記憶體位子 可以用ID的方法查找變數存在哪個記憶體,此方法有利於以後查找問題用。 在大多數程式語言中,變數需要事先聲明(宣告)並賦值。 而Python是一種動態類型語言,不需要顯式宣告變數類型,而是在賦值時自動進行推斷。