物聯網 - 工業物聯 modbus 通訊協議介紹與測試經驗分享

啊木森發表於2023-03-24

作者:李可福

1、簡介

Modbus 協議是一種通訊協議,用於工業自動化系統中的裝置間通訊。該協議最初由 Modicon 公司開發,並於 1979 年釋出。
Modbus 協議透過序列通訊格式進行通訊,在物理層上支援 RS-232、RS-422 和 RS-485 等多種通訊方式。在協議層面,Modbus 協議分為應用層、資料鏈路層和物理層。
應用層定義了 Modbus 訊息的格式和內容,包含功能碼、資料地址、資料長度以及資料內容等資訊。資料鏈路層則負責傳輸 Modbus 訊息,包括幀起始符、幀結束符、校驗位等。物理層則定義了訊息的物理傳輸方式,如電氣特性、傳輸速率等。
Modbus 協議廣泛應用於工業自動化系統中的各種裝置之間的通訊,如 PLC、感測器、伺服控制器等。它已成為一個通用的標準,被廣泛採用和支援。
RS-485 通訊距離可以達到 1200 米,但實際距離取決於許多因素,例如通訊速度、電纜質量、環境噪聲和阻抗匹配等。在高速通訊和長距離通訊的情況下,建議採用特殊的通訊線纜並新增訊號放大器以提高通訊質量。此外,在佈置電纜時要注意避免電纜與強電裝置或其他干擾源的交叉干擾。
註釋:下文描述主機(上位機),從機(下位機)

2、應用場景

目前大部分工業產品,串列埠有線通訊基本上使用 Modbus 協議 RS-485 通訊方式,實現裝置與裝置之間資料傳輸;裝置與裝置直接接線,接線方式很多,比如樹型接線,星型接線,推薦方式為 “手拉手接線(菊花連結法)”,應用方案和場景很多,需要根據實際業務設定,以下簡單介紹,熟悉的應用場景。
1、主控和線控模式:主控作為 “主”,線控作為 “從”,主控自動查詢線控狀態;
2、從機裝置可以為同類產品,也可以不同類產品,舉例子:使用 1-8 從機為溫度控器,9-15 從機為混水控制器,16-20 為新風控制器等

繁雜的應用場景:

遇到這樣的複雜系統測試時,首先不要慌張,先檢視各個產品的通訊協議,逐步拆解到每一個裝置,進行單元測試,確保每一部分的功能正常和資料正常;比如首先使用 modbus poll 模擬主機裝置,測試每一個裝置功能是否正常,資料上報格式是否正常;再次使用 modbus Slave 模擬從機裝置,檢視裝置實際執行邏輯是否正常,獲取從機資料顯示是否正常。如果在整合測試時,遇到問題時,可以使用 SSCOM 軟體,檢視主從機直接通訊情況。

3、RS-485 通訊協議基礎

一、基礎知識

RS485 是一個定義平衡數字多點系統中的驅動器和接收器的電氣特性的標準,該標準由電信行業協會和電子工業聯盟定義。使用該標準的數字通訊網路能在遠距離條件下以及電子噪聲大的環境下有效傳輸訊號。RS-485 使得連線本地網路以及多支路通訊鏈路的配置成為可能。
RS485 有兩線制和四線制兩種接線,四線制只能實現點對點的通訊方式,現很少採用,很多采用的是兩線制接線方式,這種接線方式為匯流排式拓撲結構,在同一匯流排上最多可以掛接 256 個節點,掛最多少節點,決定在於晶片。
在 RS485 通訊網路中一般採 用的是主從通訊方式,即一個主機帶多個從機。
RS485 硬體工具:

二、Modbus 協議

Modbus 協議可以說是工業自動化領域應用最為廣泛的通訊協議,因為他的開放性、可擴充性和標準化使它成為一個通用工業標準。有了它,不同廠商的產品可以簡單可靠的接入網路,實現系統的集中監控,分散控制功能。
在序列通訊中,用 “波特率” 來描述資料的傳輸速率。國際上規定了一個標準波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4Kbps、19.2Kbps、28.8Kbps、33.6Kbps、56Kbps。例如:9600bps,指每秒傳送 9600 位,包含字元的數位和其它必須的數位,如起始位、停止位和奇偶校驗位等。
編碼系統:8 位二進位制,十六進位制 0-9,A-F
資料位: 1 起始位
8 位資料,低位先送
奇/偶校驗時 1 位;無奇偶校驗時 0 位
帶校驗時 1 位停止位;無校驗時 2 位停止位
錯誤校驗區:迴圈冗餘校驗 (CRC)
從站地址設定:資訊地址包括 2 個字元 (ASCII) 或 8 位 (RTU),有效的從機裝置地址範圍 0-247(十進位制)。

三、Modbus 的功能碼


一般使用到功能碼 03、06、16。

03(0x03) 功能碼——查詢多個暫存器

下文中所示例的傳送和接收資料,其格式全部為 16 進位制,例如 01 為 0x01,C5 為 0xC5
整合系統傳送: 01 03 00 00 00 06 C5 C8
整合系統接收: 01 03 0C 00 00 00 02 00 19 00 01 00 00 00 00 3F 11
整合系統傳送碼含義:
第 1 位元組(01)——空調閘道器裝置地址(MODBUS 定義為 Slave ID),出廠預設為 01。如果是 00,表示廣播
第 2 位元組(03)——MODBUS 功能碼,其意義為讀取一系列暫存器的值。
第 3,4 位元組(00 00)——從 00 00 位置開始讀取一系列暫存器的值
第 5,6 位元組(00 06)——從 第 3,4 位元組指定的暫存器開始,共讀取 00 06 個暫存器。
第 7,8 位元組(C5 C8)——該幀資料的校驗位元組(校驗方式:CRC16)
整合系統接收碼含義:
第 1 位元組(01)——空調閘道器裝置地址(MODBUS 定義為 Slave ID)
第 2 位元組(03)——MODBUS 功能碼。
第 3 位元組(0C)——對應於查詢指令,空調閘道器共返回 0C(十進位制:12)個位元組的資料
第 4~15 位元組 —— 空調閘道器返回 12 位元組的被讀取資料
第 16,17 位元組( 3F 11)——該幀資料的校驗位元組(校驗方式:CRC16)

06(0x06) 功能碼——操作單個暫存器

01 06 0F A0 00 01 4B 3C --- 開啟
01 06 0F A0 00 01 4B 3C --- 回覆開啟
整合系統傳送碼含義:
第 1 位元組(01)——空調閘道器裝置地址(MODBUS 定義為 Slave ID)
第 2 位元組(06)——MODBUS 功能碼,其意義為設定一個暫存器的值。
第 3,4 位元組(0F A0)——從 0F A0 位置開始設定一個暫存器的值。
第 5,6 位元組(00 01)——將 第 3,4 位元組所指定的暫存器寫入值 00 01
第 7,8 位元組(4B 3C)——該幀資料的校驗位元組(校驗方式:CRC16)
*整合系統接收碼含義: *
第 1 位元組(01)——空調閘道器裝置地址(MODBUS 定義為 Slave ID)
第 2 位元組(06)——MODBUS 功能碼,其意義為設定一個暫存器的值。
第 3,4 位元組(0F A0)——從 0F A0 位置開始設定一個暫存器的值。
第 5,6 位元組(00 01)——將 第 3,4 位元組所指定的暫存器寫入值 00 01
第 7,8 位元組(4B 3C)——該幀資料的校驗位元組(校驗方式:CRC16)

16(0x10) 功能碼——操作多個連續暫存器

01 10 0F A0 00 04 08 00 01 00 04 00 14 00 03 C0 B1
--- 同時設定 4 項引數 (開啟 送風 20 度 高風) 其中溫度和風向無效
01 10 0F A0 00 04 C2 FC --- 回覆 4 項變更
整合系統傳送碼含義:
第 1 位元組(01)——空調閘道器裝置地址(MODBUS 定義為 Slave ID)
第 2 位元組(10)——MODBUS 功能碼,其意義為一次設定多個暫存器的值。
第 3,4 位元組(0F A0)——從 0F A0 位置開始一次設定多個暫存器的值。
第 5,6 位元組(00 04)——從第 3,4 位元組指定位置開始,一次設定 4 個暫存器的值。
第 7 位元組(08)——要設定寫入的總位元組數為 8( 4 個暫存器 x 2 位元組/暫存器)
第 8~15 位元組 ——要設定的 4 個暫存器的具體值,第 8,9 位元組寫入第一個暫存器,第 10, 11 位元組寫入第 2 個暫存器,第 12,13 位元組寫入第 3 個暫存器,第 14,15 位元組寫入第 4 個暫存器
第 16,17 位元組(C0 B1)——該幀資料的校驗位元組(校驗方式:CRC16)
整合系統接收碼含義:
第 1 位元組(01)——空調閘道器裝置地址(MODBUS 定義為 Slave ID)
第 2 位元組(10)——MODBUS 功能碼,其意義為一次設定多個暫存器的值。
第 3,4 位元組(0F A0)——從 0F A0 位置開始,一次設定多個暫存器的值。
第 5,6 位元組(00 04)——從第 3,4 位元組指定位置開始,一次設定 4 個暫存器的值。
第 7,8 位元組(C2 FC)——該幀資料的校驗位元組(校驗方式:CRC16)
PS:只支援修改連續的暫存器地址值;

4、測試工具介紹

一、SSCOM 軟體使用分享

主要用途:透過 RS485 控制裝置或者監聽同路上接 N 個從機裝置與主機通訊
缺點:需要熟悉 modbus 協議內容,分析資料比較麻煩,需要將看到 16 進位制數轉為 10 進位制數;

配置檔案,檢視產品開發協議文件
舉例子:
埠號(Port):選擇連線電腦 RS485 裝置埠號;
波特率(Baud rate):9600,4800
資料位(Data bits): 8 位
停止位(Stop bits):1
校驗(Parity):N
步驟 1:連線 RS485 工具的埠
步驟 2:設定 modbus 協議的環境引數
步驟 3:選擇連線從機裝置的波特率,如果手中的裝置和設定的波特率不一致,會導致不能正常通訊;
步驟 4:開啟串列埠,連線裝置,若提示以下資訊,說明埠被佔用等;

步驟 5:傳送指令內容;詳情檢視 Modbus 的功能碼講解
舉例子:02 06 10 01 00 00 DC F9 向從機地址 2,1001(開關機),設定 00(關機)
PS:工具功能比較多,不一一講解,詳情自己探索:比如 “擴充套件” 功能自動定時傳送不同指令引數;

二、modbus Poll 軟體使用分享


主要用途:代替為主機,時刻查詢從機裝置狀態,並且實時展現
優點:引數值預設轉為十進位制,檢視引數通俗易懂,設定引數值操作簡單,支援同時查詢多個裝置情況,參數列支援儲存下次繼續使用;
缺點:裝置只能為從機,若裝置為主機協議,需使用 modbus Slave 軟體工具測試;

工具介紹:


1、工具欄:
新鍵配置表、匯入配置表、儲存配置表、列印配置表、取消、配置從機引數、斷開連線、連線裝置、功能碼區域(05/06/15/16/17/22/23)、TC、日誌查詢
2、當前暫存器地址:顯示為十進位制數
3、暫存器地址描述,支援自定義
4、暫存器的讀取引數值

操作介紹:

第一步:設定引數值

第二步:設定從機地址和初始暫存器地址,讀取引數數量

點選 Setup →Read/Write Definition

Slave ID: 當前裝置的 RS485 地址,2 代表當前裝置 RS485 地址為 2
Address:讀取裝置的初始地址,填寫十進位制地址,比如初始地址十六進位制為 1001,轉成十進位制為 4097
Quantity:需讀取引數數量,若超過裝置引數範圍,會導致引數異常的現象
ScanRate :查詢引數的速度值,預設為 1000ms(此引數可能影響到裝置的丟包現象)
TX :表示總共傳送多少次查詢指令
Err:表示返回錯誤值次數(丟包次數)
ID:表示當前的裝置 RS485 地址
F:表示功能嗎:03
SR:表示查詢速率:1000ms

第三步:修改引數值

雙擊引數值後,會彈窗顯示以下內容

舉例子:修改裝置開關機狀態,雙擊開關機地址,在 Value 中填寫 0-關機或者 1-開機,點選 Send 傳送指令。06 和 16 分別表示功能碼,需要檢視裝置是否支援 06 和 16 功能碼。

檢視日誌:

在工具欄中,點選日誌按鈕,支援暫停日誌和儲存日誌功能,若需要分析日誌內容,可以返回檢視基礎講解的 Modbus 的功能碼。
日誌顯示資料為 16 進位制數,因此需要轉換為 10 進位制數

通訊日誌監聽:

在日常工作中,總是想著監聽一些引數值,在一段時間中時刻變化,但又不想著時刻去記錄這些資料,此軟體提供日誌系統,直接輸出到 Excel 或者 Text;
操作步驟:Setup →Excel log 或者 log

引數值顯示型別切換:

在日常工作中,遇到引數為 Bit 型別引數,如果使用十進位制數檢視比較麻煩,需要轉換為二進位制,軟體支援顯示型別轉換;如果引數為 Bit 型別,請使用 Binary 型別

三、Modbus Slave 軟體使用分享


主要用途:模擬從機裝置,並且支援同時模擬多個從機裝置;
優點:引數值預設轉為十進位制,檢視引數通俗易懂,設定引數值操作簡單,支援同時模擬多個從機裝置情況,參數列支援儲存下次繼續使用;

工具介紹


1、工具欄:
新鍵配置表、匯入配置表、儲存配置表、列印配置表、配置從機引數、斷開連線、連線裝置
2、狀態列:
ID=10 表示模擬從機地址為 10 的裝置
F = 03 表示功能碼為 03

01 Coil Status 暫存器地址用於獲取數字輸出(Coil)的狀態資訊。這些數字輸出通常是硬體上的繼電器或開關等,可以透過 Modbus 協議進行控制。讀取 01 Coil Status 暫存器地址將返回一個點陣圖(bitmap),每個位代表一個數字輸出的狀態,通常為 0 或 1,表示關閉或開啟。
02 Input Status 暫存器地址用於獲取數字輸入(Input)的狀態資訊。這些數字輸入通常是感測器或其他裝置提供的訊號,可以透過 Modbus 協議獲取。讀取 02 Input Status 暫存器地址將返回一個點陣圖,每個位代表一個數字輸入的狀態,通常為 0 或 1,表示低電平或高電平。
03 Holding Register 暫存器地址用於讀取和寫入模擬量輸出(Holding Register)的值。這些模擬量輸出通常是一些裝置的狀態量或控制量,可以透過 Modbus 協議進行讀寫操作。讀取 03 Holding Register 暫存器地址將返回一個字(16 位),表示模擬量輸出的當前值;寫入 03 Holding Register 暫存器地址將設定模擬量輸出的目標值。
04 Input Registers 暫存器地址用於讀取模擬量輸入(Input Registers)的值。這些模擬量輸入通常是感測器或其他裝置提供的模擬量訊號,可以透過 Modbus 協議獲取。讀取 04 Input Registers 暫存器地址將返回一個字(16 位),表示模擬量輸入的當前值。
3、暫存器地址描述,支援自定義
4、暫存器的寫入引數值,若遇到寫入的值為 Bit 型別時,選擇需要引數值,右鍵選擇 “Format” 改成 Binary

3、引數設定:

Slave ID:表示模擬從機地址
Address:表示初始地址
Quantity: 表示模擬 39 位資料
Fit ot Quantity:表示垂直顯示資料

檢視日誌:

在工具欄 “Display“,點選 communication Traffic,支援暫停日誌和儲存日誌功能,若需要分析日誌內容,可以返回檢視基礎講解的 Modbus 的功能碼。
日誌顯示資料為 16 進位制數,因此需要轉換為 10 進位制數

5、測試事項介紹

Modbus RS-485 通訊測試方法和 APP 測試相似,比如穩定性測試,功能邏輯,引數邊界值、等價值測試等;
1、RS-485 引數值輸入範圍僅支援-32768 到 32767 整數範圍;
2、在 RS-485 修改引數時,需要結合引數公式轉換,比如溫度值上報 225,顯示端應顯示為 “22.5”℃
3、主要協議點位計量單位,比如協議中單位為 W,但是顯示端(APP 或者裝置)需要顯示為 kW,因此 10000W,最終應該顯示為 10kW
4、遇到複雜的裝置系統時,比如多裝置直接互相通訊時,先確認每一個對接產品的功能是否正常,再組裝成完整系統測試;

一、基本功能測試

產品 RS-485 協議文件中,規定當前值的型別和引數範圍如下所示:
PS:DIGI1,TEMP1 定義由自己公司制定,沒有統一標準
DIGI1:表示無符號 byte,單位 1,顯示 123 時,資料傳輸是 123。
TEMP1:有符號 byte,0.1℃解析度,公式:T*10,溫度範圍為-30~97℃(顯示 25 度時,其協議傳輸的資料根據上述公式是 250;顯示-25 度時,其協議傳輸的資料是-250;bit15 為 1 時表示負數,bit15 為 0 時,表示整數;),當該值為 32767 時表示對應感測器故障。

| Address
(10 進位制) | Function | Content | | Byte length | mode | Description | Remark |
| --- | --- | --- | --- | --- | --- | --- | --- |
| 1001 | 03/16/06 | 開關機 | | 雙位元組 | 讀/寫 | 0-關機/1-開機 | DIGI1 |
| 1002 | 03/16/06 | 設定溫度 | | 雙位元組 | 讀/寫 | 5.0℃~50.0℃ | TEMP1 |

舉例子:
1、設定溫度型別為 “TEMP1” 型別,若需要設定溫度為 25.5℃,需要在協議中輸入 “255”,並同時檢視介面顯示值為 25.5℃;
2、設定開關機型別為 “DIGI1” 型別,若設定 1-開機,則輸入 “1”,並檢視介面確認裝置是否開機;
3、超過範圍值輸入,需求不一樣,呈現效果不一樣;
比如需求為超過範圍值時,設定成為範圍值最大或者最小值,比如設定溫度最小值為 5℃,最大值為 50℃,因此輸入 40(4℃),會直接設定為 50(5℃),若輸入為 611(61.1℃),會設定為 500(50℃);
比如需求為超過範圍值時,設定成為範圍值不處理,比如當前設定溫度值為 200(20℃),輸入 40(4℃),不接收,依然為 200(20℃);

二、通訊丟包率測試

我司測試標準,檢視 Err 標識數,通訊在 1/100000 丟包率;

三、穩定性測試

方法一、裝置為從機情況下,透過 SSCOM 軟體中 “擴充套件” 功能,設定迴圈執行的指令
勾選迴圈傳送,會無限迴圈傳送指令
傳送字串內容,可以為讀取 03 指令,寫入 06 或者 16 指令,同時內容為異常值和正常值

方法二、透過編寫自動化指令碼,迴圈傳送指定指令內容(後期講解)

四、測試遇到問題及解決方案

1、短距離通訊時,遇到丟包率比較高的現象

原因分析:
一、通訊程式碼邏輯問題,初代產品時,遇到過此現象;
二、產品周圍存在訊號干擾;
解決方案:
一、最佳化程式碼邏輯,比如將響應時間變短;
二、使用雙層的遮蔽線,或者直接將訊號干擾源關閉

2、裝置手拉手通訊,長距離時遇到遠距離的裝置,通訊異常

原因分析:
通訊訊號隨著距離增加效能將降低;
解決方案:
在 485 通訊距離超過 300 米的情況下,要在 485 通訊的開始端和結束端增加終端電阻或者在僅一端加電阻。

註釋:圖片來源電子發燒友

3、接線時遇到燒掉 RS485 晶片

原因分析:
RS485-A 和 RS485-B 接到供電口,直接燒壞晶片
解決方案:
接線時,主要 RS485-AB 口不能接到供電口,並且 RS485-A 接對應 RS485-A 口,RS485-B 接對應 RS485-B 口

4、測試業務功能時,需要記錄某段時間內,點位資料變化情況

解決方案:
如果裝置為從機時,使用 modbus Poll 軟體中 “通訊日誌監聽” 功能,會輸出 exlce 表或者 Log 表,同時帶有時間標識;比如在測試睡眠功能時,需求是每個小時都會將設定溫度調節,因此使用此功能,第二天過來,將表格過濾分析,就知道測試結果。

5、遇到過主機裝置,接 16 臺裝置超過裝置會通訊異常現象,都是有一些產品可以支援 32 臺裝置通訊

原因分析:
RS-485 晶片的效能問題
解決方案:
使用高效能的 RS-485 晶片,或者限制裝置僅支援裝置數量;
對接裝置越多,輪詢時間越長,使用者體驗越差;目前我司產品,最多支援 32 臺裝置聯動

6、單主控,多從機,如何讓從機每一個狀態都與主控同步

一、備份和同步邏輯
二、廣播指令機制下發引數
三、定時查詢全部裝置

7、遇到裝置端存在丟包或者不響應的問題

解決方案:主控存在重發機制,比如傳送第一包資料,沒回應,會觸發重發機制,再次傳送兩次,判定是否 RS-485 線上(斷開)

8、裝置遇到資料包錯位情況

舉例子:主控傳送 A 資料段查詢,從機回應 B 資料內容
解決方案:回應的資料段中,包含當前資料段標識值,比如 A 段包中有某個點位引數中包含 A 識別符號;

相關文章