工業級樹莓派可做為工控機使用,型號和功能齊全,除控制器核心外,還包括各類工業協定網關以及IO擴展模塊等。
工業級樹莓派具有高度工業適用性,工作溫度範圍達到-40 ~55 °C ,靜電保護達到4 kV / 8 kV ,且浪湧/爆裂測試以及EMI測試都達到了EN61131-2和IEC 61000-6-2標準的要求。支援Node-RED、Python、或純C等多種編程語言;支援通用的工業物聯網(IIoT )協議,如MQTT和OPC UA;含兩個以太網接口,其中一個可以透過Modbus TCP協議連接工業現場網路,另一個可以連接上級的IT系統或是雲端服務器。
配置 Modbus TCP從站
本例適用於Jessie Image。但並不適用於Wheezy。
在以下示例中,我們提供了一個Modbus TCP主站,它採集RevPi Core的CPU溫度訊息。我們使用的RevPi Core被視為從站。
提醒!在此示例中,我們使用Windows 計算機中的“qModMaster”軟體來模擬Modbus主站。可以在https://sourceforge.net/projects/qmodmaster下載此軟體。
▍正式操作
- 通過RJ45連接器將RevPi Core連接到主站網路。
- 將RevPi Core連接到電源。
首先啟用Modbus-TCP 從站功能。
- 打開網頁瀏覽器。
- 在瀏覽器的地址欄中輸入RevPi Core的IP地址。
之後將進入登錄界面。
- 使用用戶名“admin”登錄。
- 輸入密碼。(可以在RevPi Core側面的標籤上找到)
- 點擊“LOGIN”。
現在你可以看到RevPi Core的當前設備狀態。
- 單擊“SERVICES”標籤。
- 單擊“Enable/Disable ModbusSlave” 行中的“Enabled”。
- 單擊“SAVE ALL”按鈕。

- 點擊“APPS”標籤。
- 點擊“PiCtory”後面的開始按鈕。
進入PiCtory界面。
下面進行Modbus TCP從站配置。
打開設備目錄中的“Virtual Devices”文件夾。
選擇Modbus TCP Slave。
按住鼠標左鍵並將Modbus TCP從站拖到RevPi Core旁。Modbus TCP從站現在將出現在配置面板的最右側。

在“Device Data”窗口中設置該設備的基本設置。此設置是可選的。如果你使用大量設備並希望稍後在另一個程序中處理數據,則此輸入可能非常有用。
在“Value Editor”中,我們進行有關TCP連接的設置。在本示例中的設置是:
TCP_port:502。
根據Modbus規範,TCP端口的預設值為“502”。你可以更改這個值。這是可行的,如果你想在同一網路中實現2個不同的控制器,它們不應相互干擾。
max._modbus_TCP_connections:10。

下面保存PiCtory配置。
點擊“File>Save”以保存文件。
點擊“Tools>Reset Driver”。這將激活設備的更改。
▍ 如何查詢CPU溫度
你可以在命令行中使用以下命令查詢RevPi Core的CPU溫度:
/usr/bin/vcgencmdmeasure_temp
可以得到當前的溫度輸出:

為了在Modbus上處理這個值,需要轉換此輸出量。溫度需要x10即去掉小數點之後再用作輸出量:
/usr/bin/vcgencmdmeasure_temp | awk ‘ { print substr($0,6,2) substr($0,9,1) } ‘

現在使用piTest將數據寫入Modbus寄存器:
piTest-w Output_1, $(/usr/bin/vcgencmd measure_temp | awk ‘ { print substr($0,6,2)substr($0,9,1) } ‘)
為確保溫度不僅一次寫入寄存器,而是連續寫入,整個過程必須循環運行:
whiletrue; do piTest -w Output_1,$(/usr/bin/vcgencmd measure_temp | awk ‘ { printsubstr($0,6,2) substr($0,9,1) } ‘); sleep 1; done &

以下進行Modbus-TCP主站配置。
本例使用工具 “qModMaster” 來查詢值。

針對本示例進行以下設置:
- 通過Modbus TCP連接進行通訊:
Modbus模式:TCP
- 與設備地址為1的從站通訊:
SlaveAddr:1
- 以1000毫秒的周期提取數據:
掃描速率(毫秒):1000
- 數據應作為一個完整的Modbus寄存器被讀取:
功能碼:Read Input Registers (0x04)
- 數據應以十進制形式輸出:
DataFormat:Dec
- 應從Modbus寄存器地址0開始讀取數據:
起始地址:0
- 要讀取完整的寄存器:
寄存器數量:1
單擊“選項”,然後選擇“Modbus TCP”。
在“從站IP”欄中設置RevPi Core的IP地址。
設置TCP口。對於Modbus TCP連接,通常為“502”。

點擊“連接”。這將從站連接到Modbus主站。

點擊“讀/寫”。這將透過Modbus提取值。

現在可以看到值505。這說明RevPi Core的CPU溫度為50.5°C
▎ Modbus 功能
Modbus從站模塊為你提供以下Modbus功能:
- 讀保持寄存器(0x03)
讀輸入
- 讀輸入寄存器(0x04)
讀輸出
- 寫單寄存器(0x06)
寫入一個輸入寄存器
- 寫多個寄存器(0x10)
寫入多個輸入寄存器
接著再介紹一些簡單的操作示例。
首先仍使用主站讀輸入寄存器功能(0x04)來讀取從站的輸出。
將寄存器數量改為5。
點擊“連接”,將從站連接到Modbus主站。

提取數據時可以選擇單次抓取數據:

或者連續抓取數據:

這裡使用連續抓取數據的“掃描”功能。
在已建立的SSH連接的命令行中輸入“piTest -w Output_1,10”,隨後可以在主站中讀取到這個數據。

輸入“piTest -w Output_2,20”,這個數據隨後也出現在主站中。

同樣的,由主站向從站寫入數據也是可行的。
這時將功能碼改為”Write Multiple Registers”(0x10),仍然選擇向前5個寄存器寫入數據,但將Data Format改為“十六進制”。
之後點擊“連接”,將從站連接到Modbus主站。選擇“掃描”方式連續處理數據。在五個寄存器中分別輸入簡單的1,2,3,4,5幾個數據。
然後在命令行中輸入“piTest -r Input_1”來讀取從站輸入口1的數據。

在主站中將1號寄存器的值改為“10”,讀取的從站輸入口1的數據也隨之變化。

▎如何一次性讀取5個從站輸入端口的數據
首先需要明確從站輸入口1 的Offset值。在命令行輸入“piTest-v Input_1”可以獲取詳細訊息。

從顯示的訊息可以看到Input_1的Offset值為11。
這樣就可以使用“piTest -r 11,10,h”命令來讀取從offset11開始的10個字節,並且以十六進制的格式顯示。

一個Modbus TCP從站有32個輸入寄存器和32個輸出寄存器可供使用。如果你需要更多,也可以在PiCtory裡配置多個Modbus TCP從站。